This is topic МРВ в качестве Modbus TCP сервера in forum Работа с приложениями (ODBC-SQL/OPC/DDE) at Форум TRACE MODE: техническая поддержка.


To visit this topic, use this URL:
http://forum.adastra.ru/ultimatebb.php/ubb/get_topic/f/41/t/000115.html

Posted by Voldemar2201 (Участник № / Member № 4367) on :
 
Добрый день!
В моей задаче необходимо запустить МРВ в качестве Modbus TCP сервера, посмотрел видео и собрал демонстрационный проект.
В качестве клиента планирую использовать стороннее ПО.
Как понял из документации, ID канала это и есть номер регистра Modbus. Адресация Holding Register начинается с 40001 адреса, ID канала в этом случае должен быть 1 или 40001?
Сторонний клиент подключается к МРВ Modbus TCP серверу, но при запросе данных функцией 03 возвращает ошибку.
Проект можно скачать по ссылке. Подскажите пожалуйста, что в проекте выполнено не верно.

[ 17.03.2020, 11:52: Сообщение отредактировал / Message edited by AdAstra Technical Support ]
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
См. справку: Обмен с контроллерами и УСО - Обмен по встроенным протоколам - МРВ как сервер протоколов поверх TCP/IP:
Oбмeн в peжимe ModBus TCP/IP Slave нe paбoтaeт для нулeвыx узлoв пpoekтa. Hулeвoй узeл – узeл, coздaнный caмым пepвым в cлoe Система и имeющий индekc 0.
В Вашем проекте есть только один узел - нулевой. (имя скомпилированного проекта заканчивается на *_0.dbb)
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Согласно протоколу ModBus, адресация регистров в интервале от 0x0000 до 0xFFFF.

Например, первый AO Holding Register, имеет номер 40001, но его адрес равен 0x0000
(https://ipc2u.ru/articles/prostye-resheniya/modbus-rtu/#write_some_discr_out)

В Trace Mode при использовании МРВ как ModBus TCP сервера адресация начинается с ID 1.
 
Posted by Voldemar2201 (Участник № / Member № 4367) on :
 
Не учел смещение в адресации регистров, после этого все заработало. И я думал достаточно будет изменить индивидуальный номер узла в проекте, без удаления узла в проекте.
Спасибо за поддержку.

Но остался вопрос с адресацией...
Представим, я задал 3 канала класса HEX32, с идентификаторами 7001, 7002, 7003.
Клиент в запросе говорит, дай мне 6 регистров с начальным адресом 70001.(функция 03)
В результате получаю значения:
регистры Modbus 7001 и 7002 - канал 7001
регистры Modbus 7003 и 7004 - канал 7002
регистры Modbus 7005 и 7007 - канал 7003
В другом запросе клиент говорит, дай мне два регистра с начальным адресом 7003.(функция 03)
В результате получаю значения:
регистры Modbus 7003 и 7004 -канал 7003

Как сделать так, чтобы при разных запросах клиента в регистрах 7003 и 7004 были значения канала 7002?
 
Posted by Nico (Участник № / Member № 5342) on :
 
каждый канал TM всегда 2 регистра
 
Posted by Voldemar2201 (Участник № / Member № 4367) on :
 
quote:
Отправитель / Originally posted by Nico:
каждый канал TM всегда 2 регистра

Это я уже заметил, когда использовал HEX16. HEX16 занимает 2 регистра, хотя используется только 2 байта.

По условии задачи клиент может обратиться к любому регистру в допустимой области памяти и запросить от 1 до 100 регистров в соответствии с протоколом Modbus.

Вопрос заключается в том, что клиент получает разные данные по одному и тому же регистру, если в запросах отличается начальный регистр.
Предполагаю, связано это с тем что TM интерпретирует запрос начального регистра с ID канала и начинает отсчет каналов относительно него, выделяя под каждый ID канала 4 байта (2 регистра).
Вопрос в том как этого избежать? Как сделать так, чтобы при разных запросах клиента, данные по одному и тому же регистру были одинаковыми?
 
Posted by Nico (Участник № / Member № 5342) on :
 
-задавать другие начальные адреса для разных запросов
-проще и быстрее считать необходимые данные несколькими групповыми запросами
 
Posted by Voldemar2201 (Участник № / Member № 4367) on :
 
quote:
Отправитель / Originally posted by Nico:
-задавать другие начальные адреса для разных запросов
-проще и быстрее считать необходимые данные несколькими групповыми запросами

Клиент, это стороннее ПО. Он может считывать данные с регистров одним запросом, или может сделать это за несколько, заранее неизвестных количествах запросах.

Вопрос в том, можно для этих задач использовать Trace Mode в качестве Modbus TCP сервера или нельзя? Если это возможно, жду предложения конкретного решения. Если этого сделать нельзя, вопрос закрыт.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Вы к вопросу подходите не с той стороны.
Trace Mode как сервер ModBus TCP предоставляет "карту сигналов" (id канала - начальный адрес регистра).
Далее все работает строго по протоколу ModBus.

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

Запрашивать один и тот же регистр неизвестным количеством запросов - странное решение. Запросы должны быть точно определены и оптимизированы.

Видеоурок+пример
http://www.adastra.ru/products/overview/openness/
 


Новости АСУ ТП / News | SCADA / HMI | Обучение / Trainings | Свяжитесь с нами / Contact Us



Powered by Infopop Corporation
UBB.classic™ 6.7.2