См. мой пост выше, я дополнил.
См. мой пост выше, я дополнил.
Решил пока с CASE не заморачиваться, так как с IFами должно работать. В общем, добился хоть какого-нибудь результат с кодом:
При этом переменные на один регистр завязалКод:IF NOT strt_panel THEN p_hh:=hour; p_mm:=minute; p_ss:=second; p_dd:=day; p_mh:=month; p_yy:=year; IF p_hh_day<>hh_day THEN hh_day:=p_hh_day; os_hh_day:=hh_day; END_IF; p_hh_day:=hh_day; IF b_modemLine=3 THEN IF is_hh_day<>os_hh_day THEN hh_day:=is_hh_day; p_hh_day:=hh_day; END_IF; os_hh_day:=hh_day; END_IF; END_IF;
1.PNG 2.PNG
Проблема, как я понял, кроется в скорости обмена данными со скадой по gprs. То есть алгоритм работает, если ставить задержку на
Но время этой задержки из-за gprs вычислить нереально и соответственно изменение уставки срабатывает через раз.Код:IF is_hh_day<>os_hh_day THEN /*Здесь нужна задержка*/ hh_day:=is_hh_day; p_hh_day:=hh_day; END_IF;
Читал, я конечно, общую суть понял, но не сообразил пока как это применить к своему случаю, на досуге ещё покумекаю конечно.в первоисточнике не пробовали прочитать http://www.kipshop.ru/CoDeSys/steps/codesys_v23_ru.pdf
В общем, пока ломаю голову дальше...
p.s. насчёт табов понятно, просто пока тестю, мне так нагляднее, где что меняю
Последний раз редактировалось energvk; 30.09.2014 в 12:12.
Не очень понял мысль насчёт задержки, но сомневаюсь что там где-то нужна задержка, это противоречит самой сути задачи, 95% что это неправильный путь. Или вам важно именно отследить момент, что в действительности сменило уставку последним - панель или скада, даже если разница в 1 секунду? Если да, то можно например вместе с новой уставкой передавать точное время в миллисекундах, которое было на тот момент, конечно тогда нужно будет его периодически синхронизировать, чтобы не успевала набежать значительная ошибка.
Соседняя тема http://www.owen.ru/forum/showthread.php?t=18199 заставила перечитать "owen_plc-configuration.pdf".
Если ПЛК является слейвом для обоих мест, то возможно два варианта решения доступа к одним и тем же переменным из разных мест без копирования в промежуточные переменные
1. Использовать несколько портов для одного Modbus Slave
1.png---->2.png
Для этого варианта все переменные будут общими для обоих мест.
2. Вставить Modbus Slave в другой Modbus Slave
3.png----->4.png
Для этого варианта только переменные встроенного Modbus Slave общими для обоих мест.
Второй вариант наверно можно приспособить и для случая, когда для одного места ПЛК слейв, а для другого мастер.
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Мой канал на РУТУБЕ
https://rutube.ru/channel/23641433/
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg
petera
Спасибо, это должно решить проблему и ощутимо уменьшить и упростить код. Буду тестить...
Когда ПЛК является слейвом для обоих мест, то оба варианта работают на ура.
Но если мастер встроить в слейв, то слейв реально видит(и читает и пишет) во вложенном мастере только модули Register output, а Register input всегда отображаются в слейве с нулевым содержимым.
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Мой канал на РУТУБЕ
https://rutube.ru/channel/23641433/
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg
SysLibCom - и область io-мастера легко совмещается со слейвом. В любом количестве
В таком варианте нет. Только если сделать в мастере два модуля Register input(Work mode значение By poll time) и Register Output(Work mode значение By value change) с одинаковым адресом регистра. Т.е значение из панели сначала попадет в скаду(Register Output), а скада перешлет его(Register input) обратно в ПЛК. По другому у меня не получилось.![]()
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Мой канал на РУТУБЕ
https://rutube.ru/channel/23641433/
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg