PDA

Просмотр полной версии : Инициализация Modbus slave (Retain) переменных



Спорягин Кирилл
07.03.2016, 16:41
Добрый вечер, форумчане.
Прикрепляю небольшой тестовый проект TestModbusSlaveRetain.pro.
Проект создан для контроллера ПЛК110-24.30.Р-М [M02], т.е. речь идет об обновленной линейке.
В проекте созданы две retain переменных: RetainReal и SlaveReal. Первая расположена в классической области retain переменных. Вторая в области Modbus (Slave) и потому также является retain-переменной.
При первоначальной загрузке программы в контроллер обе переменные инициализируются начальными значениями, заданными при объявлении:
RetainReal : REAL := 11;
SlaveReal AT %QD6.1.0 : REAL := 22;

Далее, если я делаю "Сброс (заводской)" и снова загружаю проект, переменная RetainReal принимает начальное значение 11, а вот переменная SlaveReal равна нулю (см. рисунок).

Как добиться того, чтобы после заводского сброса переменные из области Modbus (slave) принимали свои начальные значения?

Спорягин Кирилл
07.03.2016, 18:47
И еще почему-то по команде "Сброс" переменные сбрасываются в 0, что для Retain-переменных не должно быть.

Спорягин Кирилл
09.03.2016, 19:04
Вопрос актуален.

Спорягин Кирилл
09.03.2016, 20:52
Кажется это похоже на ответ: http://www.owen.ru/forum/showthread.php?t=22738&highlight=%F0%E5%F1%F2%E0%F0%F2+opc

amn
09.03.2016, 23:11
При заводском сбросе ретаин переменные не сохраняются. Это же не отключение питания. Наоборот, ПЛК приходит в исходное заводское состояние, и все что там было записано удаляется и создается с нуля. Вполне возможно, что регистры слэйва конфигурации и переменные ретаин хранятся в разных файлах, и при загрузке сначала считываются переменные, сохраненные в файле слэйва конфигурации, потом из файла ретаин переменных (если он уже есть).


Как добиться того, чтобы после заводского сброса переменные из области Modbus (slave) принимали свои начальные значения?

Можно в одном из регистров слэйва хранить какое-нибудь "определенное число" (кроме нуля). При загрузке программы смотреть, что в этом регистре. Если 0, то "вручную" инициализировать регистры нужными начальными значениями, если "определенное число", то ретаин считались правильно и ничего инициализировать не надо.

Спорягин Кирилл
10.03.2016, 08:43
При заводском сбросе ретаин переменные не сохраняются.

Это понятно, но RetainReal при этом принимает значение 11, т.е. то, которое задано при инициализации, а вот переменная SlaveReal из области Modbus, принимает значение 0. И это не понятно.
Так же не понятно, почему при простом сбросе (Онлайн - Сброс) переменная SlaveReal сбрасывается, хотя не должна. Так переменная RetainReal при простом сбросе сохраняет свое значение.

capzap
10.03.2016, 08:48
Это понятно, но RetainReal при этом принимает значение 11, т.е. то, которое задано при инициализации, а вот переменная SlaveReal из области Modbus, принимает значение 0. И это не понятно.
Так же не понятно, почему при простом сбросе (Онлайн - Сброс) переменная SlaveReal сбрасывается, хотя не должна. Так переменная RetainReal при простом сбросе сохраняет свое значение.
а какая вобще жизненная необходимость делать сброс?

amn
10.03.2016, 09:18
Это понятно, но RetainReal при этом принимает значение 11, т.е. то, которое задано при инициализации, а вот переменная SlaveReal из области Modbus, принимает значение 0. И это не понятно.

Предположу, что может быть так: после заводского сброса еще нет сохраненного файла с переменной RetainReal, поэтому инициализация идет из области объявления переменных. А в слэйв конфигурации считывается значение из файла (заводского, где изначально все нули).

Филоненко Владислав
10.03.2016, 20:45
Это понятно, но RetainReal при этом принимает значение 11, т.е. то, которое задано при инициализации, а вот переменная SlaveReal из области Modbus, принимает значение 0. И это не понятно.
Так же не понятно, почему при простом сбросе (Онлайн - Сброс) переменная SlaveReal сбрасывается, хотя не должна. Так переменная RetainReal при простом сбросе сохраняет свое значение.
Потому, что RetainReal это для CoDeSys ретайн, а SlaveReal - переменная.
Ретайн для SlaveReal делается нашей системой. Т.к. проект тот-же самый - ретайн остаются как и были, а не отстутствуют. И контроллер при загрузке перетирает число 22 числом 0.

Спорягин Кирилл
10.03.2016, 21:58
Потому, что RetainReal это для CoDeSys ретайн, а SlaveReal - переменная.
Ретайн для SlaveReal делается нашей системой. Т.к. проект тот-же самый - ретайн остаются как и были, а не отстутствуют. И контроллер при загрузке перетирает число 22 числом 0.

Вопрос 1.
А почему по комаде "Сброс" сбрасывается SlaveReal?
Но это не самое плохое. Хуже если я внес изменения в проект, которые не могут быть загружены как горячее обновление кода. Тогда при загрузке он обнуляет все Modbus slave переменные.

Вопрос 2.
И вопрос связанный же с областью Modbus Slave. Команда "Онлайн - Сброс (заводской)"
отличается от сброса по переключателю на контроллере (обновленный ПЛК110 М02)?

Поясню суть вопроса 2. Для того, чтобы заново проинициализировать Modbus slave переменные мне необходимо проделывать следующую вещь.
1. Сброс (заводской);
2. Отключение;
3. Сброс по переключателю (Работа - Стоп - Сброс);
4. Изменение области Modbus slave (например добавление переменной в конфигурации);
5. Загрузка контроллера.

Только после этого контроллер инициализирует Modbus slave переменные повторно после первоначальной загрузки.

Валенок
11.03.2016, 00:01
А кокой вообще смысл ретайна для области слейва ?
Если там текущая инфа с этого же плк - она им успешно и запишется
Если туда сливает инфу внешний мастер, то при включении связи еще и нету - зачем юзать тени прошлых сеансов ?

Спорягин Кирилл
11.03.2016, 00:31
Я в этой области храню настройки, которые пользователь может ввести с АРМа оператора. Например, верхние и нижние границы аналогового датчика. Их устанавливают с АРМа оператора, но при этом они должны сохраниться при отключении питания с контроллера.

Валенок
11.03.2016, 00:33
Ну и берите их со слейва и переносите в ретайн. 2-3 строчки

capzap
11.03.2016, 06:29
Ну и берите их со слейва и переносите в ретайн. 2-3 строчки

а лучше такие вещи самостоятельно писать/читать в файл, а не пологаться на ретайн

Спорягин Кирилл
11.03.2016, 20:44
Меня в целом устраивает стандартный механизм, только не пойму почему не работает вышеизложенное?

capzap
12.03.2016, 07:24
Меня в целом устраивает стандартный механизм, только не пойму почему не работает вышеизложенное?

вышеизложенное ни где не применяется, если Вы хотите воспроизвести ситуацию с незапланированной перегрузкой плк, то делайте её с помощью бесконечного цикла. Сброс из КДС это только сброс, сделать его могут только намеренно и даже если Вы что то придумаете от этого, злоумышленник найдет другой способ уничтожить данные, в конце концов есть кувалда

Спорягин Кирилл
12.03.2016, 21:59
Нет. Меня интересует процесс инициализации. Почему он не работает?

capzap
12.03.2016, 22:14
а где Вы задаете инициализацию в слейве? Инициализация конфиг обнуляет, ни какого отношения к сохранению последних значений она(инициализация) не имеет. Вас тогда должно удивлять, что ФБ не сохраняют, свои внутренние сохраненные значения, после сброса

Филоненко Владислав
13.03.2016, 08:36
Описанные "странности" никакого отошения к штатной работе не имеют. Это процесс отладки.
Для сохранения данных в момент отладки Вам необходимо реализовать механизм сериализации (например считывание массива ОЗУ Slave в файл перед отладкой и восстановление после).
Ничего тут сложного нет. Но стандартным такой механизм никогда не будет.

Тем более если вы меняете код программы - ПЛК обязан сбросить всё, т.к. у него нет никакой информации о том, что следует сохранять.

Спорягин Кирилл
13.03.2016, 14:14
Владислав, попробую объяснить по-другому, что мне не нравиться. И если Вы подскажете, что можно сделать, то я буду благодарен.
Как я уже писал, если я вношу изменения в проект, которые не поддерживают горячее обновление кода, то после загрузки нового проекта, все переменные из области Modbus Slave становятся равны нулю, даже если им заданы начальные значения, как это сделано в проекте из поста №1.
Чтобы проинициализировать их мне нужно сделать следующее:
1. Сброс (заводской);
2. Сброс по переключателю на ПЛК110 М02;
3. Изменение конфигурации контроллера (например, добавление переменной в область Modbus Slave);
4. Загрузка проекта.
5. Переменные из области Modbus slave принимают начальные значения.

Ввиду того, что контроллер от инженерной станции находится на значительном расстоянии (5 км), то пункт 2 представляет наибольшее неудобство. Дополнительно отмечу, что те же действия без пункта 2 или без пункта 3 не приводят к желаемому результату, т.е. сброс по переключателю и изменение конфигурации обязательны.
Отсюда мои вопросы.

Вопрос 1.
Команда CoDeSys "Сброс (заводской)" и сброс по переключателю на ПЛК110, как видно, не одно и то же. В чем разница? Что сбрасывает одна и что вторая?

Вопрос 2.
Почему переменные из области Modbus slave при первоначальной загрузке принимают начальные значения, заданные в программе, а при заводском сбросе их не инициализируют этими значениями? Это невозможно реализовать? Или это ошибка?

Филоненко Владислав
14.03.2016, 08:17
Это не ошибка, а особенность. Модуль slave идентифицирует соответствие проекта и retain по структуре переменных slave.
Попробуйте сделать новый загрузочный проект (с той-же структурой slave), не останавливая старый. Online->Отказаться от загрузки->Create boot project и выключить-включить питание. Retain сохраняются при выключении питания.
Питание можно выключать через реле на самом ПЛК.