PDA

Просмотр полной версии : Подключение по Modbus TCP Slave к панели оператора. Сброс регистров после выключения



hermano
14.04.2022, 00:41
Здравствуйте, подключаю панель оператора (Modbus TCP Master) к плк 210 (Modbus TCP Slave) с последней прошивкой под SP16.

Тестовый проект, несколько переменных как в обучающем видео и вебинаре.
Все работает, но holding регистры после остановки или отключения питания контроллера сбрасываются на ноль. Переменные Retain работают нормально, как только привязываю одну из них к регистру, то эта переменная начинает сбрасываться на 0. Так и должно быть?
Не очень понятно тогда как работать с настройками, которые должны быть изменены с панели оператора... Если после отключения питания они стираются.

и второй вопрос, Slave ID (или Unit ID) можно поменять (в sp16)? Связь работает только с 0, а где изменить я не нашел.

Евгений Кислов
14.04.2022, 07:04
Здравствуйте, подключаю панель оператора (Modbus TCP Master) к плк 210 (Modbus TCP Slave) с последней прошивкой под SP16.

Тестовый проект, несколько переменных как в обучающем видео и вебинаре.
Все работает, но holding регистры после остановки или отключения питания контроллера сбрасываются на ноль. Переменные Retain работают нормально, как только привязываю одну из них к регистру, то эта переменная начинает сбрасываться на 0. Так и должно быть?
Не очень понятно тогда как работать с настройками, которые должны быть изменены с панели оператора... Если после отключения питания они стираются.

и второй вопрос, Slave ID (или Unit ID) можно поменять (в sp16)? Связь работает только с 0, а где изменить я не нашел.

Добрый день.


Так и должно быть?

Да.
Вы можете настроить Modbus TCP Slave через библиотеку OwenCommunication - тогда можно будет объявить данные слэйва как RETAIN и они не будут обнуляться при перезагрузке.
https://youtu.be/Cv9kxIT1eOA?t=4947


и второй вопрос, Slave ID (или Unit ID) можно поменять (в sp16)? Связь работает только с 0, а где изменить я не нашел.

В SP16 слэйв отвечает только на запросы с Unit ID = 0 и 255. Изменить это поведение нельзя.
В более старых и более новых версиях - отвечает на запросы с любыми Unit ID.

Опять же, если использовать OwenCommunucation - можно задать слэйву конкретный Unit ID.

hermano
14.04.2022, 07:21
Большое спасибо!

hermano
14.04.2022, 10:49
Сделал проект на OwenCommunication. Все работает.
В вашем примере в функцию MB_TcpSlave передается указатель на буфер, который состоит из массива слов. И для того чтобы передать туда переменные типа Bool и Real используются функции преобразования.
Я использовал вместо массива слов структуру с Bit, int, real и т.д. и передаю указатель на нее. Все работает нормально и не надо преобразования делать. Можно сразу использовать данные из буфера или просто копировать их.
Может быть есть какие-то подводные камни при использовании структур вместо массива в этой функции?

Евгений Кислов
14.04.2022, 10:52
Сделал проект на OwenCommunication. Все работает.
В вашем примере в функцию MB_TcpSlave передается указатель на буфер, который состоит из массива слов. И для того чтобы передать туда переменные типа Bool и Real используются функции преобразования.
Я использовал вместо массива слов структуру с Bit, int, real и т.д. и передаю указатель на нее. Все работает нормально и не надо преобразования делать. Можно сразу использовать данные из буфера или просто копировать их.
Может быть есть какие-то подводные камни при использовании структур вместо массива в этой функции?

Из подводных камней - выравнивание в структурах, об этом рассказывается в видео по ссылке выше.
Вообще, использовать структуру в качестве карты регистров слэйва - очень удобный и разумный подход.

hermano
14.04.2022, 10:57
Теперь понял, я смотрел видео с сайта, а вашу ссылку не заметил. На сайте ссылка на другое видео с массивами.