PDA

Просмотр полной версии : MS4D modbus tcp slave



AlexF
15.08.2025, 15:21
Всем добрый день.
Столкнулся с проблемой. Настраиваю мастер-скаду как modbus tcp slave устройство (эмуляция WAGO 750-362). При попытке записи холдинг-регистра получаю ошибку. Анализ пакетов показал что в ответе мастер-скада не правильно передает байты значения. Изменение параметра узла "Последовательность байт в Modbus" ни какого результата не дала. Кто-нибудь сталкивался с похожей проблемой ?

MS4D - версия 1.3.8

Валенок
17.08.2025, 12:15
А где неправильно то?

AlexF
17.08.2025, 13:25
А где неправильно то?

Запрос:
Modbus
.000 0110 = Function Code: Write Single Register (6)
Reference Number: 512
Register 512 (UINT16): 1
[Register Number: 512]
Register Value (UINT16): 1

Ответ:
Modbus
.000 0110 = Function Code: Write Single Register (6)
[Request Frame: 1364]
[Time from request: 197.000 microseconds]
Reference Number: 512
Register 512 (UINT16): 256
[Register Number: 512]
Register Value (UINT16): 256

Валенок
17.08.2025, 15:59
тогда про 6 забывайте и пробуйте 16

и да, вот эта мутотень

.000 0110 = Function Code: Write Single Register (6)
[Request Frame: 1364]
[Time from request: 197.000 microseconds]
Reference Number: 512
не нужна. Суть приводите

AlexF
17.08.2025, 19:00
тогда про 6 забывайте и пробуйте 16

и да, вот эта мутотень

не нужна. Суть приводите
То ПО которое пишет не моё, там только 6.
В силу некоторых нюансов MS4D для меня удобнее для реализации задачи. Если вместо мастер-скады реализую задачу (тестовый стенд) на python, java или openscada то все работает.

Валенок
17.08.2025, 20:55
В MS4D-техподдержку - писали? Они что на это что предлагают?

AlexF
18.08.2025, 07:54
В MS4D-техподдержку - писали? Они что на это что предлагают?

Запрос открыл, жду ответа. Думаю в понедельник что-нибудь ответят.

МихаилГл
18.08.2025, 08:07
Запрос открыл, жду ответа. Думаю в понедельник что-нибудь ответят.

У вас какой часовой пояс?) Уже понедельник...

melky
18.08.2025, 08:16
перестановка байт внутри регистра. 00 01 и 01 00 - 1 и 256 соответственно.

AlexF
18.08.2025, 08:17
У вас какой часовой пояс?) Уже понедельник...

GMT+6, в Москве думаю еще не проснулись

AlexF
18.08.2025, 08:20
перестановка байт внутри регистра. 00 01 и 01 00 - 1 и 256 соответственно.

Вопрос в том как это исправить ?

capzap
18.08.2025, 08:21
перестановка байт внутри регистра. 00 01 и 01 00 - 1 и 256 соответственно.

послушайте, КапитанОчевидность, прежде чем написать тут, как насчет разобраться в озвученной проблеме?

melky
18.08.2025, 08:30
capzap так спросить техподдержку, почему так происходит, не? Попробовать перед записью поменять скриптом. То есть подать 1 в команде, изменить скриптом, передать в устройство. По крайней мере когда с железками работаешь, это нормальное явление. Почему такое на ПК хз, может у них там по умолчанию так сделано для чего-то.

capzap
18.08.2025, 08:35
capzap так спросить техподдержку, почему так происходит, не? Попробовать перед записью поменять скриптом. То есть подать 1 в команде, изменить скриптом, передать в устройство. По крайней мере когда с железками работаешь, это нормальное явление. Почему такое на ПК хз, может у них там по умолчанию так сделано для чего-то.

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

melky
18.08.2025, 08:40
capzap это вопрос к MS4D, позволяет ли она в slave переставлять байты и регистры в зависимости как их посылает master. Имхо, как бы должна предоставлять такую возможность по простой причине, ПК работает в LittleEndian если не ошибаюсь, а вот всякие ПЛК могут работать по своему. Отсюда и возможен такой эффект, который и должен устраняться средствами scada.

AlexF
18.08.2025, 08:43
... пользователь ни как не влияет на ответ слейва, он только предоставляет данные для функций чтения, а функции записи уже заполняют переменные проекта, в каком месте пользователь должен что то местами менять?

Причем в проекте переменная получает правильное значение. И такое поведение MS4D наблюдалось еще на версии 1.2. Тогда на это забил, а сейчас решил в ТП обратиться и на форуме спросить, может кто еще с таким сталкивался.

Валенок
18.08.2025, 08:50
capzap это вопрос к MS4D, позволяет ли она в slave переставлять байты и регистры в зависимости как их посылает master. Имхо, как бы должна предоставлять такую возможность по простой причине, ПК работает в LittleEndian если не ошибаюсь, а вот всякие ПЛК могут работать по своему. Отсюда и возможен такой эффект, который и должен устраняться средствами scada.
Вы не поняли - можно как угодно переставлять, но в 6й функции ответ повторяет запрос. Иное - не модбас

melky
18.08.2025, 08:51
Валенок а лог ответа/запроса прямо из MS4D ?

AlexF
18.08.2025, 08:54
Валенок а лог ответа/запроса прямо из MS4D ?

Из Wireshark-а

Валенок
18.08.2025, 08:59
Валенок а лог ответа/запроса прямо из MS4D ?
Откуда - выше сказали. Добавлю, ответ=запрос на уровне tcp

melky
18.08.2025, 09:03
не вижу, где было бы сказано откуда взят лог, если честно. а, теперь вижу.
По этому перестановка байт вполне может быть причиной. Как возникает и как настраивать (если настраивается) должно быть в справке.

Ведь MS4D вполне может воспринимать значение как 256 и честно отправлять его обратно.

MasterSCADA 4D в роли SLave > Внешние каналы > (Справка)

При этом откроется диалоговое окно, в котором нужно указать место хранения и имя csv-файла.

и в этом csv файле есть ByteOrder

AlexF
18.08.2025, 09:09
не вижу, где было бы сказано откуда взят лог, если честно. а, теперь вижу.
По этому перестановка байт вполне может быть причиной. Как возникает и как настраивать (если настраивается) должно быть в справке.

Ведь MS4D вполне может воспринимать значение как 256 и честно отправлять его обратно.

Те кто работает с сетями с разу узнают "брата Петьку" :) (tcpdump/wireshark).
А вы внимательно прочитали первое сообщение данной дискуссии ? "... Изменение параметра узла "Последовательность байт в Modbus" ни какого результата не дала ..."

Валенок
18.08.2025, 09:14
А вы внимательно прочитали ...
)) Еще бы добавил для melky (2й раз) - причем тут перестановка когда ответ должен быть равен запросу

melky
18.08.2025, 09:14
AlexF а действует ли это для slave? может это только для мастера? а для slave надо настраивать этот csv файл, как указано в справке? вот в чем вопрос то...


)) Еще бы добавил (2й раз) - причем тут перестановка когда ответ должен быть равен запросу еще раз, MS4D воспринимает значение как 1 ? лог именно MS4D покажите, если он у нее есть.

MS4D воспринимает значение так, как заточено его ПО (восприняло как 256) и абсолютно честно отправило его обратно. Лог то не из MS4D а в серединке, до восприятия значения скадой.

AlexF
18.08.2025, 09:18
AlexF а действует ли это для slave? может это только для мастера? а для slave надо настраивать этот csv файл, как указано в справке? вот в чем вопрос то...

Отвечу цитатой из документации -
"...
Последовательность байт в Modbus - Если MasterSCADA 4D RT выступает в роли Modbus Slave, то для обмена с Master будет использоваться данная последовательность байт.
..."
https://support.mps-soft.ru/Help-web/index.html?uzel.html

Валенок
18.08.2025, 09:19
.. Кто-нибудь сталкивался с похожей проблемой ?
Я сталкивался. Но с другой стороны т.к. несколько лет назад был автором именно такого)) Мой модбас-tcp сервер (для ПЛК110) отвечал именно так на 6-ую. Банальный про..б. Непроверил т.к просто непонимаю надобность 6й при наличии 16й, да еще и по tcp
Исправление было - 4 символа в нужном месте.

melky
18.08.2025, 09:23
AlexF ну в вашем случае легко проверить, просто пошлите в slave 256, если вернется 1, то явно переставляет scada. Ошибка это или еще что, это уже программеры MS4D скажут.

Данная это какая? 3 2 1 0 7 6 5 4 ? для одного регистра 3 2 1 0 ? ну так для ПК она должна быть 0 1 2 3 если не ошибаюсь.

capzap
18.08.2025, 09:26
AlexF а действует ли это для slave? может это только для мастера? а для slave надо настраивать этот csv файл, как указано в справке? вот в чем вопрос то...

еще раз, MS4D воспринимает значение как 1 ? лог именно MS4D покажите, если он у нее есть.

MS4D воспринимает значение так, как заточено его ПО (восприняло как 256) и абсолютно честно отправило его обратно. Лог то не из MS4D а в серединке, до восприятия значения скадой.

Вы же недавно анансировали что заказ на MS4 поступил и не знаете есть там лог или нет, слова ТС
Причем в проекте переменная получает правильное значение. И такое поведение MS4D наблюдалось еще на версии 1.2. Тогда на это забил, а сейчас решил в ТП обратиться и на форуме спросить, может кто еще с таким сталкивался.

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

melky
18.08.2025, 09:30
Вы же недавно анонсировали что заказ на MS4 поступил и не знаете есть там лог или нет, слова ТС меня интересовала архитектура, а не нюансы логирования и прочего. Да и slave мне там был ни к чему.

AlexF
18.08.2025, 09:31
AlexF ну в вашем случае легко проверить, просто пошлите в slave 256, если вернется 1, то явно переставляет scada. Ошибка это или еще что, это уже программеры MS4D скажут.

Попробуйте осмыслить вот эти сообщения -
https://owen.ru/forum/showthread.php?t=41780&p=470076&viewfull=1#post470076

https://owen.ru/forum/showthread.php?t=41780&p=470081&viewfull=1#post470081

https://owen.ru/forum/showthread.php?t=41780&p=470085&viewfull=1#post470085

"... Изменение параметра узла "Последовательность байт в Modbus" ни какого результата не дала ..." - это означает что пробовал все возможные варианты.

melky
18.08.2025, 09:33
AlexF ну так забудьте немного о том, что вы видите в логе Шарка. Вы послали "нечто", это нечто было воспринято как значение 256 и честно отправлено обратно.

Валенок
18.08.2025, 09:34
Вот это то вот

Данная это какая? 3 2 1 0 7 6 5 4 ? для одного регистра 3 2 1 0 ? ну так для ПК она должна быть 0 1 2 3 если не ошибаюсь.
к чему?


AlexF... Ошибка это или еще что, это уже программеры MS4D скажут..
Что они могут сказать если ответ не соответствует протоколу?

AlexF
18.08.2025, 09:41
AlexF ну так забудьте немного о том, что вы видите в логе Шарка. Вы послали "нечто", это нечто было воспринято как значение 256 и честно отправлено обратно.

Попробуйте понять следующую концепцию.
Разработчиками MS4D заявлено что данное ПО может выступать в роли MODBUS Slave устройства.
Протокол MODBUS требует что бы ответ на команду 6 был такой же как и запрос (регистр/значение).
Без каких то перестановок байтов.

Валенок
18.08.2025, 09:52
to AlexF. Всё что нужно было показать

запрос

.... 00 00 00 00 00 06 01 06 02 00 00 01

ответ

.... 00 00 00 00 00 06 01 06 02 00 01 00
не модбас
Может melky это не увидел поэтому и не въезжает

melky
18.08.2025, 09:54
Валенок я все прекрасно увидел. вы зуп даете, что Scada это восприняла как 00 01 ?


Протокол MODBUS требует что бы ответ на команду 6 был такой же как и запрос (регистр/значение).
Без каких то перестановок байтов. простите, в вашем случае с х---ли ?

Валенок
18.08.2025, 10:19
.. простите, в вашем случае с х---ли ?
Потому что это MODBUS


Валенок я все прекрасно увидел. вы зуп даете, что Scada это восприняла как 00 01 ?
А причем тут Scada, если речь tcp? Вам доставщик пиццы привез её верх ногами потому что слейв так отгрузил. А вот почему так отгрузил - это к слейву. Просто про..бали, без всяких умных слов

melky
18.08.2025, 10:21
Валенок это для вас это Modbus TCP, а что там для MS4D один разработчик ведает :D ведь легко же проверить кто это делает, послав заведомо значение наоборот.

AlexF
18.08.2025, 10:24
Валенок я все прекрасно увидел. вы зуп даете, что Scada это восприняла как 00 01 ?

простите, в вашем случае с х---ли ?

Для не внимательных - "... Причем в проекте переменная получает правильное значение ..."

https://owen.ru/forum/showthread.php?t=41780&p=470075&viewfull=1#post470075

melky
18.08.2025, 10:32
AlexF да по.... отсылает она правильное значение? вы же видите наоборот. Пошлите 256, покажет 256 но отправит 1 ?

Валенок
18.08.2025, 10:40
AlexF да по.... отсылает она правильное значение? вы же видите наоборот. Пошлите 256, покажет 256 но отправит 1 ?
melky, у Вас сегодня какое-то торможение.
Побоку что посылается - сервер это норм получает. Но на запрос-посылку есть еще и ответ от сервера - ответ не модбас. Клиент видит этот мусор и говорит что запрос тю-тю.

melky
18.08.2025, 10:45
я это понимаю, ответ тоже Modbus, просто не такой, как ожидалось :) Интересно, слейвом в MS4D никто не пользуется с версии 1.2? и никто не выкатил ранее в баг репорт и никто не исправил?

Валенок
18.08.2025, 10:45
Валенок это для вас это Modbus TCP, а что там для MS4D один разработчик ведает.
Ну да. Это не Modbus TCP. Пусть так и напишет в доках - протокол NotModbus-TCP
Это банальный про..б, что бы там не говорил разраб. Причем элементарно исправляемый, опять же, какие бы песни не пел разраб


я это понимаю, ответ тоже Modbus, просто не такой, как ожидалось..
Неа. Ответ либо по протоколу либо мусор.

AlexF
18.08.2025, 10:48
AlexF да по.... отсылает она правильное значение? вы же видите наоборот. Пошлите 256, покажет 256 но отправит 1 ?

Да все это проверялось, более того если послать значение которое при перемене байт не меняет значение то обмен проходит без ошибок например если послать 55 55 55 55 или 01 01 01 01. Это почти однозначная ошибка в реализации протокола (ну может быть есть некая не описанная в документации настройка, но я честно в этом сомневаюсь) и существует она несколько лет с версии 1.2.

AlexF
18.08.2025, 10:49
я это понимаю, ответ тоже Modbus, просто не такой, как ожидалось :) Интересно, слейвом в MS4D никто не пользуется с версии 1.2? и никто не выкатил ранее в баг репорт и никто не исправил?

Вот ! Именно это меня и удивляет :)

Валенок
18.08.2025, 10:55
... и никто не выкатил ранее в баг репорт и никто не исправил?
Ну я, чисто для примера, если обращаюсь к модбас-tcp серверу даже не думаю о 6-й если есть 16. Все сервера которые встречал имеют 16. Т.е. не могу даже сказать, а как у них с 6. Слейвы же (485) которые имели только 6 всегда были норм.

Валенок
18.08.2025, 10:58
Это почти однозначная ошибка в реализации протокола.
почти - лишнее слово

AlexF
18.08.2025, 11:02
Ну я, чисто для примера, если обращаюсь к модбас-tcp серверу даже не думаю о 6-й если есть 16. Все сервера которые встречал имеют 16. Т.е. не могу даже сказать, а как у них с 6. Слейвы же (485) которые имели только 6 всегда были норм.

Тут ситуация вот какая, есть аппаратно-программный комплекс (иностранного производства). В данном комплексе есть своя среда разработки с поддержкой определенного набора устройств. Нужно включить в работу устройство не из этого списка. Среди поддерживаемого оборудования есть WAGO 750-362. Вот только ПО этого комплекса не использует для записи команду 16, а только 6.

Валенок
18.08.2025, 11:15
Тут ситуация вот какая, есть аппаратно-программный комплекс (иностранного производства). В данном комплексе есть своя среда разработки с поддержкой определенного набора устройств. Нужно включить в работу устройство не из этого списка. Среди поддерживаемого оборудования есть WAGO 750-362. Вот только ПО этого комплекса не использует для записи команду 16, а только 6.
Ну так этот "аппаратно-программный комплекс (иностранного производства)" всегда будет говорить что запрос битый. Вы знаете его дальнейшую логику (переповторять до усрачки/положить болт/....)?
Но раз вы просто эмулируете вагу для проверки, исходите из того что вага - норм, а на эмулятор на МS4D сами кладите болт.
Если же эта МS4D как эмулятор чем-то так мила, но с 6-й сложно эмулировать - сделайте прозрачную прокладку которая ответ на ф.6 приводит в нужный вид.

AlexF
18.08.2025, 11:31
Ну так этот "аппаратно-программный комплекс (иностранного производства)" всегда будет говорить что запрос битый. Вы знаете его дальнейшую логику (переповторять до усрачки/положить болт/....)?
Но раз вы просто эмулируете вагу для проверки, исходите из того что вага - норм, а на эмулятор на МS4D сами кладите болт.
Если же эта МS4D как эмулятор чем-то так мила, но 6-ую сложно эмулировать - сделайте прозрачную прокладку которая ответ на ф6 приводит в нужный вид.

Именно так и происходит, 10 попыток записи и БОЛТ (не шмогла я), 10 раз запись разных значений и ПОЛНЫЙ БОЛТ на устройство (да ну его нафиг) :) .
В 20-21-ом году обошел проблему тем что установку значений перенес в MS4D а в зарубежном ПО оставил только чтение. В этот раз решил немножко заморочиться. Открыл запрос в ТП и спросил на форуме (прикольная дискуссия получилась :) ). А вариантов решения есть целых три Python, Java и OpenScada (это те которые на тестовом проекте проверены и работают)
Ну нравится мне MS4D, нравится :) .
С прослойкой на уровне tcp заморачиваться лениво, а вот идею вы подали - использовать для обмена COM-порт. Это надо обдумать.

melky
18.08.2025, 11:32
ну и чем вам прослойка не угодила? ну по крайней мере до момента исправления проблемы как минимум.

AlexF
18.08.2025, 11:37
ну и чем вам прослойка не угодила? ну по крайней мере до момента исправления проблемы как минимум.

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

Валенок
18.08.2025, 11:49
Ну нравится мне MS4D, нравится .
или

Мне проще на питоне, джаве или опенскаде эмуляцию ваги реализовать.
Ну так определитесь. За вас то не сможем




нужно разбирать весь поток
Тык там почти не нужно, там поток четко "пакетизируется". Все условия-то по tcp
if (от MS4D) & (размер = 12) & ([7] = 6) then swap [10] и [11]

melky
18.08.2025, 11:49
а если попробовать в OPC UA ? MS4D ведь с ней работает. правда я не пробовал Modbus slave, который есть в RapidScada преобразовывать в OPC UA (надо будет попробовать). Ну и Modbus slave там правда платный от разраба.

В смысле не занимаясь разбором пакетов, просто as is так сказать.

AlexF
18.08.2025, 11:50
или

Ну так определитесь. За вас то не сможем

Не раньше чем ТП чего-нибудь ответит.
Проверил работу через СОМ-порт - такая же фигня.

AlexF
18.08.2025, 12:11
или

Тык там почти не нужно, там поток четко "пакетизируется". Все условия-то по tcp
if (от MS4D) & (размер = 12) & ([7] = 6) then swap [10] и [11]

Хм, с такой точки зрения я что то не смотрел на проблему. Спасибо. Подумаю в эту сторону.

melky
18.08.2025, 12:17
И вероятно еще пересчитать CRC придется.

Валенок
18.08.2025, 12:42
И вероятно еще пересчитать CRC придется.
Не нужно. По tcp же. Ниже - само пересчитается

melky
18.08.2025, 13:12
ну, тут палка о двух концах. Перевод в RTU в MS4D по справке указанием порта 0. и вот как оно там что формирует обратный пакет непонятно. При этом ошибка со слов и в TCP и в RTU режиме.
Возможно еще до расчета CRC, который либо считается либо нет при уже явном определении через что ответ (TCP или RTU)

Валенок
18.08.2025, 13:20
ну, тут палка о двух концах. Перевод в RTU в ...
какое RTU?

... modbus tcp slave устройство (эмуляция WAGO 750-362)...


открыл tcp-сервер
постучались в сервер -> открыл tcp-клиента в сторону MS4D


OnRecv из MS4D
если нужное -> swap //см. выше
отправил постучавшемуся


OnRecv от постучавшего
отправил в MS4D


OnDisconnect от MS4D
close постучавшемуся


OnDisconnect постучавшего
close для MS4D
Запустил сервер
Настроил на него "аппаратно-программный комплекс (иностранного производства)"
Всё

melky
18.08.2025, 13:23
какое RTU? выше AlexF проверил через COM порт в том числе https://owen.ru/forum/showthread.php?t=41780&p=470121&viewfull=1#post470121

Валенок
18.08.2025, 13:38
выше AlexF проверил через COM порт..
только проверил

А что будет делать через com - не озвучено. Только

Это надо обдумать.
но

...Проверил работу через СОМ-порт - такая же фигня.

Собсно что проще?

AlexF
29.08.2025, 09:18
Первая линия техподдержки передала проблему разработчикам.

AlexF
23.10.2025, 19:13
Первая линия техподдержки передала проблему разработчикам.

Разработчики ответили:
"Баг по Вашей Заявке был исправлен, но пока находится на итоговой проверке в бета-версии.
Когда правки попадут в релиз, то мы Вам дополнительно сообщим."
Жду.
:)