PDA

Просмотр полной версии : Инициализация Modbus переменных после перезапуска



Сергей Панишев
01.08.2024, 07:58
Добрый день.

Имеется конфигурация
- ПЛК200-01-CS (+ модули расширения) - Modbus TCP Slave.
- панель СП307-Р - Modbus TCP Master.
- SCADA Master Scada 4D

Задача: обеспечить сохранение заданных пользователем значений Modbus переменных после перезагрузки контроллера (пропадание питания).

В чем проблема: в прошивке контроллера созданы переменные, которые добавлены в "карту" ModbusTCP_Slave_Device. Доступ к переменным есть как с панели, так и со скады. Все работает - изменить значение в контроллере можно и с панели, и со скада. После сброса питания все переменные, которые используются в Modbus сбрасываются в 0. Переменные размещены в области VAR_GLOBAL RETAIN.
Что я смог прочитать по данному вопросу проблему не решает. Как я понял, если переменная добавлена в Modbus после перезапуска контроллера она инициализируется тем, что есть в карте на данный момент, а не значением из энергонезависимой памяти. А т.к. устройства Master пишут значения в контроллер не постоянно, то соответственно после перезапуска контроллера - там нули.
В панели пробовал создать функциональные области, писать в ней значения в энергонезависимую память и потом в режиме "постоянно" копировать из этих регистров значения в переменные Modbus, которые уже уходят в контроллер. Но в данной связке отваливается запись значений со SCADA.

Как можно решить данную проблему?

Валенок
01.08.2024, 08:27
Сами же по сути и сказали - на старте ПЛК переписать слейв тем что надо.
Уставки должен хранить тот, кому они нужны для работы. Причем ту панели/скады? Они просто окошко редактирования

Сергей Панишев
01.08.2024, 08:39
У меня вопрос, как это сделать.

1. Панель пишет значения (например, уставку), только после изменения их непосредственно с панели. Читает - постоянно.
2. Скада - аналогично панели. Пишет при изменении, читает - постоянно.
3. После сброса пиатания контроллера все переменные Modbus принимают значение "0".
Чем их инициализировать? Значениями по умолчанию также не получится.

melky
01.08.2024, 08:46
Скорее всего, что панель вам и пишет значения при запуске, а там нули в панели.
Modbus Slave переменные и так должны быть энергонезависимы в ПЛК, без добавления в глобальные, точнее они и есть глобальные в данном случае.
Проверяйте свои программы.

Или может Scada. В общем отключите по очереди одно и другое и все разом и проверьте, подключившись сторонним средством, которое точно не пишет, модпул или еще чем-то

Валенок
01.08.2024, 08:47
как вариант


var retain
x : ....

var //не ретайн
init : bool;

где-то в слейве. Пофиг - ретайн там или не ратайн...
_x : ....

----------------
if not init then
init := true;
_x := x;
end_if
x := _x;

... //работа с x

1exan
01.08.2024, 08:49
Есть вот такая галочка в настройках модуля (https://ftp.owen.ru/CoDeSys3/11_Documentation/03_3.5.11.5/CDSv3.5_Modbus_v2.1.pdf) - может в ней дело?
77743

Валенок
01.08.2024, 08:49
Скорее всего, что панель вам и пишет значения при запуске, а там нули в панели.
Мастера в панелях (да и везде) 1-ую операцию после включения/восстановления связи должны делать чтением. Иначе на хрен они нужны такие.

melky
01.08.2024, 08:53
Валенок так может там программой, скриптом или еще чем наваяли проверку и запись, мало ли?

Сергей Панишев
01.08.2024, 08:55
Есть вот такая галочка в настройках модуля (https://ftp.owen.ru/CoDeSys3/11_Documentation/03_3.5.11.5/CDSv3.5_Modbus_v2.1.pdf) - может в ней дело?
77743

Галочки этой нет.

77744

Сергей Панишев
01.08.2024, 08:57
Валенок так может там программой, скриптом или еще чем наваяли проверку и запись, мало ли?


Нет. Master устройства не изменяют точно. Ну и для проверки оставлял контроллер без сети - только подключенный к нему ноут + контроллер в сети.

kondor3000
01.08.2024, 08:58
Вообще то слейв переменные, все по умолчанию энергонезависимые и RETAIN, если они у вас при старте обнуляются, значит их перезаписывает в ноль или панель или скада. Или же программа в ПЛК.
Значит надо эти переменные записывать и хранить отдельно, а при включении инициализировать их где надо. Или править программу в ПЛК.

Можете проверить, просто добавив пару переменных в слейв, которые не опрашивают панель со скадой, после загрузки руками забейте в них что нибудь и посмотрите останутся данные после перезагрузки

Сергей Панишев
01.08.2024, 09:23
Вообще то слейв переменные, все по умолчанию энергонезависимые и RETAIN, если они у вас при старте обнуляются, значит их перезаписывает в ноль или панель или скада. Или же программа в ПЛК.
Значит надо эти переменные записывать и хранить отдельно, а при включении инициализировать их где надо. Или править программу в ПЛК.

Еще раз повторюсь: для проверки я отключил контроллер от общей сети. Подключил к нему ноут для проверки состояния переменных. Все Master устройства отключены от контроллера.
Про то, что все Slave переменные должны быть retain я уже прочитал. Но реальность другая.

В программе для записи применяются только уставки разные. Они не обрабатываются ничем, являются входами для блоков.

Вот так объявлены переменные (это я для примера вынес одну в retain блок)
77745

Вот так в программе переменная применена
77746

Вот так она объявлена в Modbus Slave для работы с ней
77747

Как я понимаю - при перезагрузке контроллер производится переинициализация переменных. Обычные переменные (это попробовал), есди они не в Modbus и добавлены в retain область, инициализируются последним заданным значением. При перезагрузке в карте Modbus переменных нет значений (никто туда ничего не пишет) т.е. там 0. Соответственно т.к. переменная привязана к карте с нулевыми значениями она и становится равной 0. Это так?

Попробую через промежуточную перемнную, как написали выше сделать. Пока вариантов не собо вижу.

kondor3000
01.08.2024, 09:49
Почему переменная в регистрах временного хранения, должна вроде как быть во входных регистрах 77765