Нет интрпретации верхнего и нижнего регистра нету в codesys. почему не задаються значения)
Вид для печати
если поможете скину проект.
начиная с первой строчки ao.IN:=AO_1Цитата:
oa(
IN:=AO_1 ,
IN_MIN:=0,
IN_MAX:=100 ,
OUT_MIN:=0 ,
OUT_MAX:=32768 ,
OUT=>,
ERROR=> );
ao_1:=REAL_TO_WORD(oa.OUT);
во второй AO_1 := ao.OUT;
где здесь логика, приходящее значение от нуля до ста процентов пропорционально изменяете и присваиваете обратно этой же переменной, далее если выполняется какое то условие то опять присваиваете ей значение от нуля до пяти
вот интересно а когда выполниться условие во втором кейсе?Цитата:
2:
IF Ton_3x.Q THEN
step_3x:= 1;
END_IF;
...
TON_3x(IN:=(STEP_3x =0), PT:= time_3x);
Здравствуйте! имеется ПЛК110 и пара модулей МВ110-8А и МВ110-8АС
процессор опрашивает их по протоколу OWEN
Подскажите пожалуйста, как можно программно определить, что конкретный модуль отвалился со связи?
значение LAST_ERROR = 81 в переменных программного модуля OWEN[MASTER] не подходит, так как оно характеризует отвал любого из модулей
спасибо большое!
Как в содесис на языке ст сделать следующее:
Процесс1 ( здесь алгоритм)
Процесс 2 ( здесь другой алгоритм)
Процесс 3 (здесь 3 алгоритм)
А потом если выполнился первый процесс через 10 секунд начать выполнять 2 процесс . и Т.Д.
Например так
Вложение 26185
Здесь вызов процессов зациклен, т.е. после выполнения Процесс 3 через 10 секунд цепочка процессов будет повторятся
Или так
Вложение 26186
Здесь процессы будут выполнены по очереди один раз и в дальнейшем не выполняются. Для повторного выполнения цепочки нужно принудительно задать state:=0 в любом месте программы.
Люди добрые в чем косяк кода посмотрите уже задолЦитата:
PROGRAM oo
VAR
oa: LIN_TRAFO;
temp_delta_real:REAL;
temp_delta_3X:REAL;
TON_3X:TON;
time_3x:TIME;
step_3x:BYTE;
out_ao:REAL;
END_VAR
oa(
IN:=(REAL_TO_WORD(AO_1)) ,
IN_MIN:=0,
IN_MAX:=32768 ,
OUT_MIN:=0 ,
OUT_MAX:=100 ,
OUT=>out_ao,
ERROR=> );
temp_delta_real:= TEMP_K1 - TEMP_GI1;
CASE STEP_3x OF (*управление 3x*)
0:
IF START_CAM1 AND NOT ERROR_SET THEN
STEP_3x:=1;
END_IF;
1:
IF Ton_3x.Q AND temp_delta_real > temp_delta_3x THEN
out_ao:=5;
step_3x:=2;
END_IF;
2:
IF temp_delta_real <= temp_delta_3x THEN
step_3x:= 1;
END_IF;
END_CASE;
TON_3x(IN:=(STEP_3x =0), PT:= time_3x);
Уже бошка трящит. не хочет работать и все тут.
Люди добрые в чем косяк кода посмотрите уже задолТех задание.Цитата:
PROGRAM oo
VAR
oa: LIN_TRAFO;
temp_delta_real:REAL;
temp_delta_3X:REAL;
TON_3X:TON;
time_3x:TIME;
step_3x:BYTE;
out_ao:REAL;
END_VAR
oa(
IN:=(REAL_TO_WORD(AO_1)) ,
IN_MIN:=0,
IN_MAX:=32768 ,
OUT_MIN:=0 ,
OUT_MAX:=100 ,
OUT=>out_ao,
ERROR=> );
temp_delta_real:= TEMP_K1 - TEMP_GI1;
CASE STEP_3x OF (*управление 3x*)
0:
IF START_CAM1 AND NOT ERROR_SET THEN
STEP_3x:=1;
END_IF;
1:
IF temp_delta_real > temp_delta_3x THEN
out_ao:=5;
step_3x:=2;
END_IF;
2:
IF Ton_3x.Q then
step_3x:=1;
3:
IF temp_delta_real <= temp_delta_3x THEN
out_ao:=0;
END_IF;
END_CASE;
TON_3x(IN:=(STEP_3x =0), PT:= time_3x);
У нас есть 2 температуры и 1 дельта по которым должен работать 3х ходовой клапан.
1 температура - это температура входящего гликоля в 3х ходовой клапан.
2 температура- это температура камеры
3.температура дельты - для гликоля входящего.
Устройство управление электродвигатель на 04 20 мА с ходом 20 шток управляющейся 1 AO сигналом.
Принцип работы :
Если температура камеры - температура входящего гликоля > чем температура дельты то
Открыть клапан на 5%
следующий этап это таймер например с выдержкой 30 секунд после прохождения времени условие проверяется еще раз и если не равно то клапан открывается еще то есть будет плавный гистерезис.
Следующие условие если температура камеры - температура входящего гликоля <= температуры дельты то
Клапан возвращается в исходную точку то есть закрывается в ноль. тем самым закрываю подачу входящего гликоля.
Следующие условие если воздухохладитель и насос выключаются то клапан также возвращается в состояние ноль. и при старте программы клапан должен находиться в состоянии ноль.
Гидравлическая схема приложена.
AO сигнал типа WORD 04 20 мА.
Павел, проблема была есть и осталась.
Проблема (ИМХО) кроется в том, что Вы слабо представляя ту задачу, которая Вам нужна, пытаетесь её программировать не имея достаточного опыта.
Почему Вы так упорно сопротивляетесь графически изложить Ваш алгоритм?
И не надо притворяться новичком, по коду Вы давно не новичок.
Нарисовав и поняв то, что нужно сделать - намного проще программировать.
Давай тебя бесплатно поучу этой рисовайке. Дам примеры (только по почте). Не все же ради денег)
Шаг за шагом.
Process_N() - вызов одноименной программы
Вложение 26196
Таких программ здесь три.
Естественно " туда можно свой алгоритм записать"
Вот то, что написал г-н Petera
Вложение 26197
Люди как сделать проверку условия при помощи таймера тон каждые 60 секунд.
CASE step OF
0:
IF t1 > t2 THEN
out_1:=5;
step:=1;
END_IF;
1:
IF ton_1.Q THEN
step:=0;
END_IF;
END_CASE;
TON_1(IN:=(step = 0) , PT:=time_1);
чет я туплю и таймер не запускается.
Потому, что когда происходит
IF t1 > t2 THEN
out_1:=5;
step:=1;
END_IF;
step становится 1, а CASE для этого состояния будет выполнятся только в следующем цикле. А строка TON_1(IN:=(step = 0) , PT:=time_1); будет выполнена в текущем цикле, соответственно TON_1 сбросится (ведь step уже не равно 0).
Таким образом условие IF ton_1.Q не выполнится никогда.
Например так http://www.owen.ru/forum/showthread....l=1#post219606
т.е. смените ноль на единицу
TON_1(IN:=(step = 1) , PT:=time_1)
Господа я все никак не могу запустить таймер в кодесис на st. пишу как указано в руководстве. и каждый раз разные ошибки. помогите пожалуйста. может есть какой то нюанс!?
Все разобрался, просто тип TPinst устанавливается не как обычная переменная, а с библиотеки.
вот это в руководстве не написано!
Не могу понять, что происходит с расчётами. Прикладываю скрин эмуляции, где разные значения обратных вычислений.
Вложение 26233
Не понимаю, то лыжи не едут, то ли я идиот. Перепробовал уже кучу вариантов, с переприсвоениями промежуточными и т.п. в итоге результат неправильный. Вплоть до формулы c:=a-b, где a и b REAL переменные. В режиме эмуляции присваиваю им соответственно 90916050086-90916000000, получаю с=50112 вместо 50086. Это как так может быть?
Ну Вы даете!
Если диапазон представления чисел для REAL от -3.4028E+38 до 3.4028E+38, то это вовсе не означает, что можно одиннадцати разрядные числа использовать!
Ведь для мантиссы отводится всего 23 бита из 32. В стандарте IEEE 754 несколько значений данного типа зарезервировано для обеспечения возможности представления специальных значений. К ним относятся значения NaN (Not a Number, «не число») и +/-INF (Infinity, бесконечность), получающихся в результате операций деления на ноль или при превышении числового диапазона. Также сюда попадают денормализованные числа, у которых мантисса меньше единицы.
В любом случае числа REAL то приблизительные и точность ограничена разрядной сеткой процессора.
Для обычного REAL число десятичных знаков д.б. не более семи, а Вы пытаетесь скормить кодесису одиннадцать. Не знаю, как компилятор округляет, например, 90916050086 может так 9.0916052992E10?
https://ru.wikipedia.org/wiki/%D0%A7...82%D0%BE%D0%B9
Вложение 26236
TIME()-old>=T#10s - условие: если прошло не меньше 10 секунд, то выражение будет TRUE иначе будет FALSE.
BOOL_TO_INT преобразует тип BOOL в тип INT. То есть если значение выло true, то в результате будет 1, а если false, то будет 0.
Аналогично можно было записать так:
...
1: IF TIME()-old>=T#10s THEN
state:=2;
END_IF
...
Petera, спасибо за ликбез. В общем суть понял. Что осталось непонятным, это то,что на скриншоте вычисления с 1 по 9-ю строку и с 12 по 14-ю выполняются правильно. Вообще, я пытался обработать ваше гениальное решение по преобразованию времени в одну переменную для ПР200. И если значение даты удалось обработать, то на времени получается то что на скрине ((
+100500%
Не надо заниматься ерундой, в кодесис переменные DATA_AND_TIME или DT уже упакованы в 32-х битную величину, которая не что иное как время UNIX или другое название - POSIX. Это число секунд с 0 часов 1 января 1970г. Дискретность в 1 секунду считается достаточной для большинства практических задач.
Осталось только передать в ПР значение DWORD в двух соседних регистрах и "склеит" их в ПР в одну переменную.
Для извлечения отдельных значений года, дня, месяца и т.д. нужно будет делать макросы. Вроде я где-то показывал, как в кодесисе их извлекать.
Для расширения кругозора почитайте статью И.Петрова Программируем временные сложности