Вход

Просмотр полной версии : Не получается подключить датчик через modbus rtu



Juan Esteban
03.10.2024, 08:40
Здравствуйте! Надо подключить датчик влажности Микрофор ДВ2ТС-В к ПЛК 110-30[М02] по RS485-2 (так как на RS485-1 располагаются другие модули с другой скоростью). Для связи использую библиотеку Modbus.lib, открываю порт COM2, отправляю запросы, как в инструкции - выдается ошибка таймаута.

Я подключил датчик к компу через Овен AC4 и с помощью Serial Port Monitor опросил - датчик отвечает нормально. Так же послушал запросы из ПЛК - тоже нормально шлёт и даже считывает ответ, который я послал ему вручную. Но непосредственно ПЛК и датчик сконнектиться не могут. В чем может быть причина?

Инструкция к датчику: https://microfor.ru/htm/dv2tsa/modbus.htm

Файл кодесиса во вложении. Я там много наворотил экспериментируя, поэтому много закомменчено.

In_Da_Cher_A
03.10.2024, 09:29
В чем может быть причина?в несоответствии 1)сетевых настроек 2)адресов данных 3)типов данных и вытекающих отсюда 4)команд на чтение

Так же послушал запросы из ПЛКвозьмите любую нормальную программу для модбас протокола и считайте с вашими настройками обмена данные из датчика

Juan Esteban
03.10.2024, 09:35
в несоответствии 1)сетевых настроек 2)адресов данных 3)типов данных и вытекающих отсюда 4)команд на чтение
возьмите любую нормальную программу для модбас протокола и считайте с вашими настройками обмена данные из датчика

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

Какую нормальную программу для модбас протокола использовать? Чем плох Serial Port Monitor, там есть представление modbus.

kondor3000
03.10.2024, 09:38
Сделайте новый проект, где Одна программа.
Откройте пример на сайте Обмен через биб-ки и посмотрите как надо делать программу по шагам CASE.
Один раз открыли порт в правильными настройками, потом даёте команду на преобразование и ждёте 2 секунды, только после выполнения, переходите к чтению.

Juan Esteban
03.10.2024, 09:51
Сделайте новый проект, где Одна программа.
Откройте пример на сайте и посмотрите как надо делать программу по шагам CASE.
Один раз открыли порт в правильными настройками, потом даёте команду на преобразование и ждёте 2 секунды, только после выполнения, переходите к чтению.

Для запуска преобразования используется нестандартная команда 08h, а я не уверен, что использую блок MB_UNI_IO правильно, так как нигде не нашел примера его использования.

Тем не менее, проблема сейчас не в этом. Запуск преобразования я запускал через утилиту датчика, идущую в комплекте, с компа. Я говорю, что при обращении с компа он выдает нормальный ответ.

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

kondor3000
03.10.2024, 09:56
Для запуска преобразования используется нестандартная команда 08h, а я не уверен, что использую блок MB_UNI_IO правильно, так как нигде не нашел примера его использования.

Тем не менее, проблема сейчас не в этом. Запуск преобразования я запускал через утилиту датчика, идущую в комплекте, с компа. Я говорю, что при обращении с компа он выдает нормальный ответ.

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

Переход к следующему шагу, только после завершения предыдущего, в этом весь смысл. Это в любом примере обмена.
У вас же всё одновременно происходит. Два порта открываете и начинаете опрос и одновременно команду, параллельно в 5 программах

Juan Esteban
03.10.2024, 10:07
Укажите, пожалуйста, пример правильного использования.

Я сделал отдельный проект. Открыл порт. После его открытия послал запрос c помощью блока MB_RD_HOLD_REGS. Результат - таймаут. Какие шаги здесь происходят одновременно, почему два порта, не понимаю.

kondor3000
03.10.2024, 10:30
Читайте инструкцию, то что вы делаете не правильно. Сначала команду на преобразование, потом пауза 2 сек, потом чтение.

Примеры подключения стороннего оборудования и устройств с нестандартными протоколами
3 UNM - библиотека, позволяющая принимать/отсылать в порты RS-232/485 любую информацию.
https://owen.ru/product/codesys_v2/example_program

Пример не совсем подходящий, но другого нет

Juan Esteban
03.10.2024, 10:40
Спасибо, буду пробовать.

melky
03.10.2024, 10:50
Что-то я не виду в Modbus функции 0х19, 0х08 есть такая - Диагностика. А первой на Wiki как-то не указано.

И тут что-то не нашел https://modbus.org/docs/Modbus_Application_Protocol_V1_1b.pdf

kondor3000
03.10.2024, 13:06
Что-то я не виду в Modbus функции 0х19, 0х08 есть такая - Диагностика. А первой на Wiki как-то не указано.

И тут что-то не нашел https://modbus.org/docs/Modbus_Application_Protocol_V1_1b.pdf

На сколько я понял функция 0х19, это чтение одного регистра. Так как можно использовать 3 и 4 функции для чтения, то нафик она никому нужна.
А вот 8 функцию, надо использовать для команды, перед чтением.

melky
03.10.2024, 14:02
kondor3000 я к тому, что в документации на Modbus такой команды нет, а в устройстве вот она, есть :)

Juan Esteban
07.10.2024, 06:25
Снова здравствуйте. Попробовал всё переписать в двух вариантах:

1) через modbus.lib все сделал по шагам CASE, с командой 08h через MB_UNI_IO и таймером на 2 с, ничего не изменилось, всё так же ошибка таймаута. Причем таймаут в том числе от команды 08h, а буфер с командой 08h после отправки заполняется (первые 6 байтов) какими-то мусорными значениями. Хотя с компа при посылке этой команды ответ датчика равен команде.

2) через библиотеку unm.lib - делал по инструкции, но на первой же отправке выдается ошибка отправки. Плюс возникло ограничение - отправляемые команды должны быть строками, и если формировать команду в виде строки из шестнацатиричных значений, он воспринимает нулевые байты, которые присутствуют в команде, как конец строки, поэтому не знаю, как это можно обойти.

Так и не могу понять, что не так с запросами modbus. Даже на стандартные запросы по команде 03h с ПЛК датчик не отвечает - и не надо говорить, что без команды 08h он не будет отвечать - с компа он нормально отвечает и без этой команды. Она нужна, как я понимаю, только для обновления значений в опрашиваемых регистрах прибора.

Juan Esteban
07.10.2024, 07:51
Кроме того, есть такая особенность. Для понимания того, что происходит, я на одну линию RS485 подключил ПЛК, датчик и комп через Овен AC4. При наличии ПЛК в этой линии, датчик перестает отвечать на запросы компа - как при ручных запросах, так и через ОРС, при отключении плк - отвечает. При том, что никаких левых команд, судя по монитору ком-порта, с него не поступает.

МихаилГл
07.10.2024, 07:57
С двумя мастерами на линии хотите работать? Ну это так не работает. Либо ПЛК, либо ПК.

Juan Esteban
07.10.2024, 08:12
А физически как он определяет, что два мастера, если плк не посылает запросы (остановлен)?

Upd. Хотя, наверное, вы правы. Фоновое напряжение, которое он подаёт, перебивает все запросы. Тем не менее, проблема не в этом - напрямую без компа все равно подключение не работает.

1exan
07.10.2024, 08:29
Кроме того, есть такая особенность. Для понимания того, что происходит, я на одну линию RS485 подключил ПЛК, датчик и комп через Овен AC4. При наличии ПЛК в этой линии, датчик перестает отвечать на запросы компа - как при ручных запросах, так и через ОРС, при отключении плк - отвечает. При том, что никаких левых команд, судя по монитору ком-порта, с него не поступает.

Резисторы какие-нибудь в АС4 подключены?

kondor3000
07.10.2024, 08:35
А физически как он определяет, что два мастера, если плк не посылает запросы (остановлен)?

Upd. Хотя, наверное, вы правы. Фоновое напряжение, которое он подаёт, перебивает все запросы. Тем не менее, проблема не в этом - напрямую без компа все равно подключение не работает.

Один мастер открыл порт, второй не сможет уже открыть, до физичекого отключения порта и полной перезагрузки всего.
Начинайте всё сначала, теперь с ПЛК. Если нет связи, значит не правильно настроены параметры сети.
Например для 8N1, должны быть все нули, а у вас стоп бит 1. Если не нужна команда 08, как вы пишите, то просто читайте входы.

Juan Esteban
07.10.2024, 08:39
Пытался и так, и так. Производитель говорит, что он и с одним, и с двумя стоп-битами работает. С компа действительно работает и так, и так.

Juan Esteban
07.10.2024, 08:45
Пробовал также через конфигурацию плк опрашивать. Выдает ошибку 81 (тайм-аут).

Впрочем, я не говорил, что команда 8 не нужна. Просто она не обязательна для чтения регистров. Поэтому посылать её все равно придется.

Juan Esteban
07.10.2024, 09:07
Резисторы какие-нибудь в АС4 подключены?

Нет, не подключены (оба рычажка в верхнем положении).

Валенок
07.10.2024, 09:52
А-B на датчике меняли местами?


и не надо говорить, что без команды 08h он не будет отвечать - с компа он нормально отвечает и без этой команды. Она нужна, как я понимаю, только для обновления значений в опрашиваемых регистрах прибора.
Ну и напишите без 8 для начала. Накой воткнули то её.

Juan Esteban
07.10.2024, 10:01
А-B на датчике меняли местами?


Ну и напишите без 8 для начала. Накой воткнули то её.

Делал и без 8й, все равно не работает.

А и В менял - тоже не работает.

Валенок
07.10.2024, 10:09
dataSize_08h: BYTE := 8;
какого 8? 6

Juan Esteban
07.10.2024, 10:12
dataSize_08h: BYTE := 8;
какого 8? 6

Да, это я уже заметил и исправил, но лучше не стало.

Валенок
07.10.2024, 10:17
Делал и без 8й, все равно не работает.
.
Отключаете датчик и всех от линии Rs-2
Меняете на другом мастере Rs-1 на 232 (временено)
Делаете на Rs-1 слейв с 3-мя регистрами и с настройками/адресом как датчик
Соединяеняе Rs-1 и Rs-2
Смотрите результат чтения без юзания 8

Juan Esteban
07.10.2024, 10:28
Отключаете датчик и всех от линии Rs-2
Меняете на другом мастере Rs-1 на 232 (временено)
Делаете на Rs-1 слейв с 3-мя регистрами и с настройками/адресом как датчик
Соединяеняе Rs-1 и Rs-2
Смотрите результат чтения без юзания 8

Спасибо за идею. Попробую завтра.

Валенок
07.10.2024, 12:51
В общем если рез-т будет - проблема в линии/датчике+настройке
если нет - в коде проекта

kondor3000
07.10.2024, 16:15
Спасибо за идею. Попробую завтра.

Уже проверил, через слейв в ПЛК, есть пара ошибок, шаги тупо стоят на первом, except_send = 0, надо поменять на 1 7915079161
тогда будут работать шаги второй и далее,
при приёме 03 функцией, в полученном результате надо переставить байты. Типа так

Hum_int:=BYTE_TO_WORD(answerBuffer[1]) OR SHL(BYTE_TO_WORD(answerBuffer[0]),8);

Точнее надо проверить, правильность байт из модуля.

Juan Esteban
08.10.2024, 07:07
Отключаете датчик и всех от линии Rs-2
Меняете на другом мастере Rs-1 на 232 (временено)
Делаете на Rs-1 слейв с 3-мя регистрами и с настройками/адресом как датчик
Соединяеняе Rs-1 и Rs-2
Смотрите результат чтения без юзания 8

Итак, попробовал. Код работает (по крайней мере в плане опроса командой 03h). Действительно, байты надо переставить, но сути проблемы это не решает - сам блок опроса работает и получает данные. С датчиком этот же код вызывает ошибку таймаута (255).

Валенок
08.10.2024, 14:09
Код работает
Ок. Код и порт - рабочие.


.. С датчиком этот же код вызывает ошибку таймаута (255).
вертайте всё назад, но ф8 пока нету (закомменчено/удалено )
подключаете только датчик
после (или перед, что тоже самое) ф3 делаете паузу от 50..70мс
пробуете также ф4

если всё никак - звоните авторам датчика, говорите "фи"

Juan Esteban
08.10.2024, 15:08
Ок. Код и порт - рабочие.


вертайте всё назад, но ф8 пока нету (закомменчено/удалено )
подключаете только датчик
после (или перед, что тоже самое) ф3 делаете паузу от 50..70мс
пробуете также ф4

если всё никак - звоните авторам датчика, говорите "фи"
Попробую. С техподдержкой уже связался, они пока чешут тыковку.

В принципе, есть обходное решение - можно опрашивать его через ОРС сервер через переходник. Я написал скриптик, чтобы он (ОРС) отсылал 8ю команду, и все вроде работает, регистры читаются, значения обновляются. Но, конечно, хотелось бы разобраться в этом, чтобы не пришлось задействовать дополнительные переходники и получилось их подружить.

Juan Esteban
10.10.2024, 07:20
Ок. Код и порт - рабочие.


вертайте всё назад, но ф8 пока нету (закомменчено/удалено )
подключаете только датчик
после (или перед, что тоже самое) ф3 делаете паузу от 50..70мс
пробуете также ф4


Ни пауза, ни смена функции не помогли :(

Техподдержка обещала подумать и что-то молчит...

Валенок
10.10.2024, 08:32
сниффер на линию и смотрим (и показываем)
а после смотрим (и показываем) того, кто работает без ф8

если заявлено что ф3 (или ф4) работает и без ф8, значит должна работать.
Не обновляются данные/порядок байт - все вторично и в сад, пусть техподдержка не компостирует мозг (если что).

Juan Esteban
10.10.2024, 09:03
сниффер на линию и смотрим (и показываем)
а после смотрим (и показываем) того, кто работает без ф8

если заявлено что ф3 (или ф4) работает и без ф8, значит должна работать.
Не обновляются данные/порядок байт - все вторично и в сад, пусть техподдержка не компостирует мозг (если что).

Не знаю, правильно ли я понял, но вот таблицы монитора ком-порта (прошу прощения за архив - html-файлы форум не хочет загружать):

В первом (Humidity_OPC_rs485.html) таблица опроса ПК-датчик - сначала идёт опрос через ОРС. Ответ от датчика почему-то воспринимается как отдельные байты. В конце таблицы - я вручную посылал команды из монитора ком-порта.

Во втором (PLC_rs485.html) - таблица опроса ПЛК-ПК, только команда 03h (остальное закомменчено).

Валенок
10.10.2024, 13:37
Вот этот ОПС без ф8 можно? Чтоб одно и тоже
Не помешала бы оцилограмма с мкс/нс
Пока снифер видит что плк отправляет тоже самое что и ОПС, но датчик молчит. Мож датчик в корзину?

Juan Esteban
14.10.2024, 08:57
Вот этот ОПС без ф8 можно? Чтоб одно и тоже
Не помешала бы оцилограмма с мкс/нс
Пока снифер видит что плк отправляет тоже самое что и ОПС, но датчик молчит. Мож датчик в корзину?

К сожалению, нет у меня осцилографа под рукой. А без ф8 там все то же самое, как с ф8, только без ф8.

Техподдержка мне так толком и не ответила. В итоге опрашиваем датчик из ОРС через шлюз МКОН, благо валялся без дела (пришлось только подправить скрипт под Modbus/TCP для отправки ф8).