Возможно, читайте РЭ на модуль. Никто не запрещает множественной командой записывать и один регистр.
Возможно, читайте РЭ на модуль. Никто не запрещает множественной командой записывать и один регистр.
Спасибо. Действительно, в РЭ запись только группы регистров. И запись командой WriteMultipleRegisters в один регистр тоже работает.
А в библиотекеNModbus есть инструментарий для контроля утери пакетов или их целостности, подсчет контрольных сумм? Или как то своими силами это организовывать? Где об этом есть информация, пусть даже на английском?
Еще есть вопрос. Нужно вывести на экран измеренную температуру с ТРМ 202. Есть два варианта. Int16 со знаком в одном регистре или float32 в двух регистрах. В NModbus числа представлены ushort16. В мануале NModbus есть примеры преобразования ushort - float и наоборот. Пробовал использовать, но ничего правильного так и не получил на экране. Есть ли более понятный способ преобразования ushort - float ?
Простите, это что за библиотека Modbus на ПК такая, которая не умеет работать с float и так далее?
Студенты что ли писали? Я могу понять, когда числа с плавающей точкой являются отсебятиной производителя прибора (встречал такое), но чтобы IEEE не понимало, это как бы..... может в мусорку такую библиотеку ?
И опять же, расчет CRC тоже должен быть, способов расчетов CRC Modbus в сети для C# предостаточно. Хотя собственно их два, табличный и расчетный с полиномом.
До crc пока руки не дошли. А вот с выводом на экран измеренных значений все наладилось. Signed int просто через двойное приведение типов правильно выводится. А float через несколько битовых операций пришел в норму. И в C# еще есть класс BitConverter, внем есть метод как раз для таких преобразований. Так, что все пишется-читается без проблем. Пробовал читать температуру и регистр статуса одновременно с 9 штук трм. Все нормально, правда быстрее чем за100 мс один прибор опросить не получается, программа начинает выбрасывать исключения. Хотя это не очень принципиально.
Так паузы между запросами должны быть, приборы то не всегда готовы к ответу на запрос. Может по этому и исключения.
У вас CRC должна сама библиотека формировать, по крайней мере когда вы отправляете запрос, вы же указываете только номер регистра и номер команды чтения, а раз прибор отвечает, значит все нормально. Это вам при ответе надо убедиться, что ответ пришел полным и не искаженным. Опять же, возможно библиотека и это проверяет и выставляет флаг.
Вариаций может быть масса, типа
bool read = Читаем то-то, out error; и если read = true то ответ корректный, если false то смотрим что там за ошибка.
Это пример, не знаю, как там в бибке этой все устроено. А может надо самостоятельно CRC проверять получив ответ...
Подниму тему. Я пытаюсь считать по modbus TCP c пр200. C#? ,библиотека Nmodbus4. Считываю через конвертор ER-108. Но это не суть. Я готовой программой все считываю. То есть сеть рабочая. В конверторе есть отладкаи вот там мне выдается
1. Рабочий вариант, готовой программой
1:05:47 RS485 PORT1 CONNECTION ACCEPTED 192.168.88.2 PORT 59132
1:05:47 RS485 PORT1 DATA RECEIVED, LEN=8
0x10 0x03 0x02 0x00 0x00 0x03
2. Нерабочий - моя недоделка
0:57:00 RS485 PORT1 CONNECTION ACCEPTED 192.168.88.2 PORT 52620
0:57:00 RS485 PORT1 DATA RECEIVED, LEN=12
0x00 0x01 0x00 0x00 0x00 0x06 0x10 0x04 0x02 0x00 0x00 0x01
Получается какие то непонятные данные приходят на запрос вначале. А с этих 0x10 вроде похожая посылка. Адрес 16, функциями и 03 и 04 все читается готовой прогой.... Не подскажите куда копнуть... Я пока попробую другие библиотеки попробовать. Потому как, вот qModMaster - тоже отказывается читать, хотя соединяется... А прога, которая все читает AVReporter Modbus Communication Tester.
Вот, кстати, догадался и проверил посылку посылку от qModMaster
Такая же, как и у меня длинная
0:01:21 RS485 PORT1 DATA RECEIVED, LEN=12
0x00 0x14 0x00 0x00 0x00 0x06 0x10 0x04 0x02 0x00 0x00 0x01
?????
Cуть как раз в этом. Ваш прибор - это конвертер интерфейсов, он передает пакет, полученный по TCP, в COM-порт без каких-либо преобразований.Считываю через конвертор ER-108. Но это не суть.
"Готовая программа" отправляет по TCP кадр протокола Modbus RTU (обычно это называют Modbus RTU over TCP) - т.е. ПР200 в итоге получает фрейм Modbus RTU и корректно его обрабатывает.
Вы же с помощью Nmodbus4 отправляете по TCP кадр протокола Modbus TCP (с MBAP Header и без CRC) - и когда ПР200 получает фрейм Modbus TCP, то, естественно, считает его невалидным.
Вам надо разобраться, как с помощью вашей библиотеки отправлять по TCP фреймы протокола Modbus RTU.
СODESYS V3.5: Repository Archive V3.5 SP4 (необходим для старых СПК) / Раздел CDS V3.5 на сайте
Форум: Вопросы и ответы / Визуализация / Настройка обмена с другими устройствами
Web-панель ВП110 / Modbus-индикатор СМИ2-М
Telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru | oscat.ru | Как обратиться в техподдержку?
Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | XY problem | Как правильно задавать вопросы | AnyDesk