Последний раз редактировалось feLoNy; 23.04.2015 в 12:44.
Пока все молчат... Мысль следующая (не молчите, хочу мнения специалистов)
Будет ли работать в реальности??? Или что то где то я ошибся??? Нет пока возможности проверить на живом ПЛККод:VAR plcoutbits: BYTE; plcout1: BOOL; plcout2: BOOL; plcout3: BOOL; plcout4: BOOL; END_VAR VAR CONSTANT MRxhi: ARRAY[0..5] OF BYTE := 2#1000, 2#1100, 2#1110, 2#1111, 2#1111; END_VAR plcoutbits := MRxhi [TRUNC(pw1) MOD 1000/10]; IF plcoutbits.0 THEN out1:=1.0; ELSE out1:=0.0; END_IF IF plcoutbits.1 THEN out2:=1.0; ELSE out2:=0.0; END_IF IF plcoutbits.2 THEN out3:=1.0; ELSE out3:=0.0; END_IF IF plcoutbits.3 THEN out4:=1.0; ELSE out4:=0.0; END_IF
и вопрос:актуален как никогдаА как сравнивать байты?... Например нужно включить выход out5 при PWlo от 1 до 9 а при нуле выключить с задержкой через TOF
В любом варианте хоть с бубном, хоть без для "out1-out4 - 4 "шага" по 100 кВт... Суммарная мощность 500 кВт!"
нужно добавить такой фрагмент
ou1, out2, out3 и out4 должны быть объявлены как BOOL, ведь я полагался на "out1-out4 - 4 "шага" по 100 кВт... Суммарная мощность 500 кВт!", т.е. это дискретные выходы.Код:out1:=(TRUNC(pw1)/100)>=1; out2:=(TRUNC(pw1)/100)>=2; out3:=(TRUNC(pw1)/100)>=3; out4:=(TRUNC(pw1)/100)>=4;
А Вы судя по ошибке "невозможно преобразовать BOOL в REAL" пытаетесь ou1, out2, out3 и out4 объявить как REAL.
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Мой канал на РУТУБЕ
https://rutube.ru/channel/23641433/
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg
ЗЫ. Не заметил, что исходные данные были
Т.е. ПЛК 73/63?
Тогда так нужно обойти ошибку
Захват-1.png
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Мой канал на РУТУБЕ
https://rutube.ru/channel/23641433/
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg
Если я правильно понимаю, на выходах тэны (ну или иные нагреватели) и мощность каждого устройства ломает весь математический ряд, отсюда и своя система исчислений.
Чтобы набрать 5 кВт надо подать 7 а не 4+1 ну и т.д. То есть надо привести соответствие некой величины к необходимой битовой маске на выходе.
Ну тогда так
Захват-1.pngКод:VAR pw1: REAL; mrout1: BOOL; mrout2: BOOL; mrout3: BOOL; mrout4: BOOL; mrout5: BOOL; mrout6: BOOL; mrout7: BOOL; mrout8: BOOL; loPW1: INT; hiPW1: INT; END_VAR loPW1:=TRUNC(pw1) MOD 10; hiPW1:=(TRUNC(pw1) MOD 100)/10; (*включение выхода*) mrout1:=((loPW1 MOD 5)MOD 2)=1; mrout2:=(loPW1 MOD 5)>1; mrout3:=loPW1=9 OR loPW1=4; mrout4:=loPW1>=5; mrout5:=(hiPW1 MOD 5) =1 OR (hiPW1 MOD 5)>2; mrout6:=hiPW1>8 OR hiPW1=4; mrout7:=(hiPW1 MOD 5)>=2; mrout8:=hiPW1>=5;
ЗЫ. Ну если в посте #5 не нравится ряд мощностей для тэнов в двоичном формате, то можно двоично-десятичный применить
Код:(* mrout1:=TRUE; #1 кВт mrout2:=TRUE; #2 кВт mrout3:=TRUE; #4 кВт mrout4:=TRUE; #8 кВт mrout5:=TRUE; #10 кВт mrout6:=TRUE; #20 кВт mrout7:=TRUE; #40 кВт mrout8:=TRUE; #80 кВт *) bPW1:=INT_TO_BCD(TRUNC(pw1)); mrout1:=bPW1.0; mrout2:=bPW1.1; mrout3:=bPW1.2; mrout4:=bPW1.3; mrout5:=bPW1.4; mrout6:=bPW1.5; mrout7:=bPW1.6; mrout8:=bPW1.7;
Последний раз редактировалось petera; 27.03.2015 в 10:46.
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Мой канал на РУТУБЕ
https://rutube.ru/channel/23641433/
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg
... petera вызывает злых духов. mrout5 можно ещё упростить, наверное, лишь бы вселенная обратно в сингулярность не схлопнулась.Код:loPW1:=TRUNC(pw1) MOD 10; hiPW1:=(TRUNC(pw1) MOD 100)/10; (*включение выхода*) mrout1:=((loPW1 MOD 5)MOD 2)=1; mrout2:=(loPW1 MOD 5)>1; mrout3:=loPW1=9 OR loPW1=4; mrout4:=loPW1>=5; mrout5:=(hiPW1 MOD 5) =1 OR (hiPW1 MOD 5)>2; mrout6:=hiPW1>8 OR hiPW1=4; mrout7:=(hiPW1 MOD 5)>=2; mrout8:=hiPW1>=5;
Ну тогда без бубна
В вашем варианте
Не 100 значений набивать, а всего 20. Вероятность ошибиться меньше, да и модифицировать константы проще, если "десятки" или "единицы" другие будут.Код:VAR mrbits: BYTE; pw1: REAL; mrout1: BOOL; mrout2: BOOL; mrout3: BOOL; mrout4: BOOL; mrout5: BOOL; mrout6: BOOL; mrout7: BOOL; mrout8: BOOL; END_VAR VAR CONSTANT MRlo: ARRAY[0..9] OF BYTE := 2#00000000, 2#00000001, 2#00000010, 2#00000011, 2#00000110, 2#00001000, 2#00001001, 2#00001010, 2#00001011, 2#00001110; MRhi:ARRAY[0..9] OF BYTE := 2#00000000, 2#00010000, 2#01000000, 2#01010000, 2#01110000, 2#10000000, 2#10010000, 2#11000000, 2#11010000, 2#11110000; END_VAR mrbits := MRlo[TRUNC(pw1) MOD 10] + MRhi[(TRUNC(pw1) MOD 100)/10]; mrout1 := mrbits.0; mrout2 := mrbits.1; mrout3 := mrbits.2; mrout4 := mrbits.3; mrout5 := mrbits.4; mrout6 := mrbits.5; mrout7 := mrbits.6; mrout8 := mrbits.7;
Последний раз редактировалось petera; 27.03.2015 в 14:03.
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Мой канал на РУТУБЕ
https://rutube.ru/channel/23641433/
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg
Да, так чистенько. Только комментарии добавить типа (* маска на единицы кВт *), (* маска на десятки кВт *) и + на OR заменить, чтобы при вероятной попытке что-то поменять две единицы на одной позиции бадабум какой-нибудь не устроили.