Просмотр полной версии : Инициализация 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:39
У меня вопрос, как это сделать.
1. Панель пишет значения (например, уставку), только после изменения их непосредственно с панели. Читает - постоянно.
2. Скада - аналогично панели. Пишет при изменении, читает - постоянно.
3. После сброса пиатания контроллера все переменные Modbus принимают значение "0".
Чем их инициализировать? Значениями по умолчанию также не получится.
Скорее всего, что панель вам и пишет значения при запуске, а там нули в панели.
Modbus Slave переменные и так должны быть энергонезависимы в ПЛК, без добавления в глобальные, точнее они и есть глобальные в данном случае.
Проверяйте свои программы.
Или может Scada. В общем отключите по очереди одно и другое и все разом и проверьте, подключившись сторонним средством, которое точно не пишет, модпул или еще чем-то
как вариант
var retain
x : ....
var //не ретайн
init : bool;
где-то в слейве. Пофиг - ретайн там или не ратайн...
_x : ....
----------------
if not init then
init := true;
_x := x;
end_if
x := _x;
... //работа с x
Есть вот такая галочка в настройках модуля (https://ftp.owen.ru/CoDeSys3/11_Documentation/03_3.5.11.5/CDSv3.5_Modbus_v2.1.pdf) - может в ней дело?
77743
Скорее всего, что панель вам и пишет значения при запуске, а там нули в панели.
Мастера в панелях (да и везде) 1-ую операцию после включения/восстановления связи должны делать чтением. Иначе на хрен они нужны такие.
Валенок так может там программой, скриптом или еще чем наваяли проверку и запись, мало ли?
Сергей Панишев
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
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot