См. мой пост выше, я дополнил.
Вид для печати
См. мой пост выше, я дополнил.
Решил пока с 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;
Вложение 14553 Вложение 14554
Проблема, как я понял, кроется в скорости обмена данными со скадой по gprs. То есть алгоритм работает, если ставить задержку на
Но время этой задержки из-за gprs вычислить нереально и соответственно изменение уставки срабатывает через раз.Код:IF is_hh_day<>os_hh_day THEN
/*Здесь нужна задержка*/
hh_day:=is_hh_day;
p_hh_day:=hh_day;
END_IF;
Читал, я конечно, общую суть понял, но не сообразил пока как это применить к своему случаю, на досуге ещё покумекаю конечно.Цитата:
В общем, пока ломаю голову дальше...
p.s. насчёт табов понятно, просто пока тестю, мне так нагляднее, где что меняю
Не очень понял мысль насчёт задержки, но сомневаюсь что там где-то нужна задержка, это противоречит самой сути задачи, 95% что это неправильный путь. Или вам важно именно отследить момент, что в действительности сменило уставку последним - панель или скада, даже если разница в 1 секунду? Если да, то можно например вместе с новой уставкой передавать точное время в миллисекундах, которое было на тот момент, конечно тогда нужно будет его периодически синхронизировать, чтобы не успевала набежать значительная ошибка.
Соседняя тема http://www.owen.ru/forum/showthread.php?t=18199 заставила перечитать "owen_plc-configuration.pdf".
Если ПЛК является слейвом для обоих мест, то возможно два варианта решения доступа к одним и тем же переменным из разных мест без копирования в промежуточные переменные
1. Использовать несколько портов для одного Modbus Slave
Вложение 14575---->Вложение 14576
Для этого варианта все переменные будут общими для обоих мест.
2. Вставить Modbus Slave в другой Modbus Slave
Вложение 14577----->Вложение 14578
Для этого варианта только переменные встроенного Modbus Slave общими для обоих мест.
Второй вариант наверно можно приспособить и для случая, когда для одного места ПЛК слейв, а для другого мастер.
petera
Спасибо, это должно решить проблему и ощутимо уменьшить и упростить код. Буду тестить...
Когда ПЛК является слейвом для обоих мест, то оба варианта работают на ура.:rolleyes:
Но если мастер встроить в слейв, то слейв реально видит(и читает и пишет) во вложенном мастере только модули Register output, а Register input всегда отображаются в слейве с нулевым содержимым:(.
SysLibCom - и область io-мастера легко совмещается со слейвом. В любом количестве
В таком варианте нет. Только если сделать в мастере два модуля Register input(Work mode значение By poll time) и Register Output(Work mode значение By value change) с одинаковым адресом регистра. Т.е значение из панели сначала попадет в скаду(Register Output), а скада перешлет его(Register input) обратно в ПЛК. По другому у меня не получилось.:(