Стартовая страница › Форумы › Взаимодействие с устройствами › Ошибки при чтении по ModBus
- В этой теме 26 ответов, 5 участников, последнее обновление 1 год, 2 месяца назад сделано JurasskPark.
-
АвторСообщения
-
19.01.2023 в 13:02 #27069AllmyУчастник
Добрый день! Пытаюсь читать контроллер по протоколу ModBus TCP. Ряд параметров считывается нормально, но аналоговые входы считать не получается. Выдает ошибку
Request element group «Аналоговые входы»
Send (12): 34 BB 00 00 00 06 01 04 00 00 00 04
Receive (7/7): 34 BB 00 00 00 13 01
2023-01-19 12:50:39 Error calling the Session method of the [1] Laurent-5 device:
Scada.ScadaException: Error reading data: Offset and length were out of bounds for the array or count is greater than the number of elements from index to the end of the source collection. (Parameter ‘count’)
—> System.ArgumentOutOfRangeException: Offset and length were out of bounds for the array or count is greater than the number of elements from index to the end of the source collection. (Parameter ‘count’)
at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 count)
at Scada.Comm.Drivers.DrvCnlBasic.Logic.TcpConnection.Read(Byte[] buffer, Int32 offset, Int32 count, Int32 timeout, ProtocolFormat format, String& logText)
— End of inner exception stack trace —
at Scada.Comm.Drivers.DrvCnlBasic.Logic.TcpConnection.Read(Byte[] buffer, Int32 offset, Int32 count, Int32 timeout, ProtocolFormat format, String& logText)
at Scada.Comm.Drivers.DrvModbus.Protocol.ModbusPoll.TcpRequest(DataUnit dataUnit)
at Scada.Comm.Drivers.DrvModbus.Logic.DevModbusLogic.Session()
at Scada.Comm.Engine.DeviceWrapper.Session()Настройки все вроде бы верные, по инструкции к контроллеру
Скрины настроек и журнала по ссылке
https://drive.google.com/drive/folders/1xeZajFdhDJaTSuarxYotV42uKxOhF0Yh?usp=sharing19.01.2023 в 16:48 #27076JurasskParkУчастникЯ вижу только одну проблему.
Буфер не дали до конца дочитать.
Эту железку ещё кто-то опрашивает кроме вас? Есть приборы котрые только 1 сессию разрешают…19.01.2023 в 17:36 #27077AllmyУчастникНет, никто не читает.
Я тоже вижу, что в журнале нет хвоста из трех групп, которые отображаются как
Receive (3/3): хх хх ххНа других типах все есть
- Этот ответ был изменен 1 год, 3 месяца назад от Allmy.
19.01.2023 в 17:51 #27079AllmyУчастникДолжно прийти в ответ не
Receive (3/3): хх хх хх
а
хх хх хх хх хх хх (последние четыре пары это показания в формате 32-bit Float)19.01.2023 в 18:39 #27084MikhailМодераторДобрый день!
Какая версия драйвера Модбас?
Попробуйте, пожалуйста, деактивировать все остальные группы, кроме проблемной. Ошибка повторится?19.01.2023 в 18:41 #27085MikhailМодераторЕщё просьба выложить файл шаблона опроса.
19.01.2023 в 18:57 #27089AllmyУчастникВерсия 6.0.0.0
Файл шаблона:
<?xml version=»1.0″ encoding=»utf-8″?>
<DeviceTemplate>
<Options>
<ZeroAddr>true</ZeroAddr>
<DecAddr>true</DecAddr>
<DefByteOrder2 />
<DefByteOrder4 />
<DefByteOrder8 />
</Options>
<ElemGroups>
<ElemGroup active=»false» dataBlock=»Coils» address=»0″ name=»Реле»>
<Elem readOnly=»false» tagCode=»RELE1″ name=»RELE1″ />
<Elem readOnly=»false» tagCode=»RELE2″ name=»RELE2″ />
<Elem readOnly=»false» tagCode=»RELE3″ name=»RELE3″ />
<Elem readOnly=»false» tagCode=»RELE4″ name=»RELE4″ />
</ElemGroup>
<ElemGroup active=»false» dataBlock=»Coils» address=»50″ name=»Выходные силовые линии»>
<Elem readOnly=»false» tagCode=»OUT1″ name=»OUT1″ />
<Elem readOnly=»false» tagCode=»OUT2″ name=»OUT2″ />
<Elem readOnly=»false» tagCode=»OUT3″ name=»OUT3″ />
<Elem readOnly=»false» tagCode=»OUT4″ name=»OUT4″ />
<Elem readOnly=»false» tagCode=»OUT5″ name=»OUT5″ />
</ElemGroup>
<ElemGroup active=»false» dataBlock=»Coils» address=»100″ name=»Общие линии (InOut)»>
<Elem readOnly=»true» tagCode=»IO1″ name=»IO1″ />
</ElemGroup>
<ElemGroup active=»true» dataBlock=»InputRegisters» address=»0″ name=»Аналоговые входы»>
<Elem type=»float» isBitMask=»false» tagCode=»ADC2″ name=»ADC2″ />
</ElemGroup>
</ElemGroups>
<Cmds />
</DeviceTemplate>19.01.2023 в 19:13 #27090AllmyУчастникЧерез веб интерфейс самого модуля данные показываются.
Видео записи экрана по ссылке
https://drive.google.com/file/d/1HytuPF0othc3n2gYxNQdUAvhalaJ1cJK/view?usp=sharing20.01.2023 в 10:02 #27092JurasskParkУчастникЧерез веб интерфейс самого модуля данные показываются.
Ну это ничего не значит. У меня на работе у подрядчиков всё работает на оборудовании, а на верхний уровень данные забыли «положить» или положили не в тот регистр, или совсем не реализовали. 🙂
20.01.2023 в 10:05 #27093JurasskParkУчастникХм… Еще идея… что сам контроллер не успевает подготавливать данные на ответ, а конверте RS232/RS485 in Ethernet уже отправляет данные.
Через что вы опрашиваете? Может там есть период ожидания пакетов перед отправкой?
Я ставлю 400 мс. Больше как бы смысла ждать нет. 🙂20.01.2023 в 10:27 #27094AllmyУчастникДело в том, что SimplyModBusTCP Client 8.1.2 (на мой взгляд это лучший тестовый клиент) читает входы контроллера без проблем.
Скрин по ссылке
https://drive.google.com/file/d/1wFzDKS7ML4jv9Wz2v5CLra0cgwC7HGIp/view?usp=sharing
На скрине я читаю все 5 аналоговых входов и в столбце results реальное напряжение, которое показывается и на внешних измерителях
20.01.2023 в 11:21 #27099AllmyУчастникИ еще непонятно, почему в драйвере для Float (4 байта) адрес устанавливается в виде двух регистров, например, 0-1 (если начальный 0) или 1-2 (если начальный 1)?
В других клиентах устанавливается конкретно указанный адрес — если 0, то 0 и т.д.
20.01.2023 в 11:32 #27100AllmyУчастникИ да, если я начинаю читать с 4 регистра (у меня 5 входов, начиная с 0), то выдается другая ошибка — ILLEGAL DATA ADDRESS
20.01.2023 в 11:35 #27101manjey73Участникfloat занимает два регистра по умолчанию. Разные программы по разному указывают, кто-то пишет что 0-1 или 1-2 а некоторые пишут только стартовый.
По второму вопросу, вы читаете 4 регистра за пределами памяти, отсюда и ошибка…
20.01.2023 в 11:46 #27102AllmyУчастникПолучается, драйвер не понимает, что при float ему надо считать два регистра, начиная с указанного?
-
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.