Ошибки при чтении по ModBus

Просмотр 15 сообщений - с 1 по 15 (из 27 всего)
  • Автор
    Сообщения
  • #27069
    Allmy
    Участник

    Добрый день! Пытаюсь читать контроллер по протоколу 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=sharing

    • Эта тема была изменена 1 год, 3 месяца назад от Allmy.
    • Эта тема была изменена 1 год, 3 месяца назад от Allmy.
    #27076
    JurasskPark
    Участник

    Я вижу только одну проблему.
    Буфер не дали до конца дочитать.
    Эту железку ещё кто-то опрашивает кроме вас? Есть приборы котрые только 1 сессию разрешают…

    #27077
    Allmy
    Участник

    Нет, никто не читает.
    Я тоже вижу, что в журнале нет хвоста из трех групп, которые отображаются как
    Receive (3/3): хх хх хх

    На других типах все есть

    • Этот ответ был изменен 1 год, 3 месяца назад от Allmy.
    #27079
    Allmy
    Участник

    Должно прийти в ответ не
    Receive (3/3): хх хх хх
    а
    хх хх хх хх хх хх (последние четыре пары это показания в формате 32-bit Float)

    #27084
    Mikhail
    Модератор

    Добрый день!
    Какая версия драйвера Модбас?
    Попробуйте, пожалуйста, деактивировать все остальные группы, кроме проблемной. Ошибка повторится?

    #27085
    Mikhail
    Модератор

    Ещё просьба выложить файл шаблона опроса.

    #27089
    Allmy
    Участник

    Версия 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>

    #27090
    Allmy
    Участник

    Через веб интерфейс самого модуля данные показываются.

    Видео записи экрана по ссылке
    https://drive.google.com/file/d/1HytuPF0othc3n2gYxNQdUAvhalaJ1cJK/view?usp=sharing

    #27092
    JurasskPark
    Участник

    Через веб интерфейс самого модуля данные показываются.

    Ну это ничего не значит. У меня на работе у подрядчиков всё работает на оборудовании, а на верхний уровень данные забыли «положить» или положили не в тот регистр, или совсем не реализовали. 🙂

    #27093
    JurasskPark
    Участник

    Хм… Еще идея… что сам контроллер не успевает подготавливать данные на ответ, а конверте RS232/RS485 in Ethernet уже отправляет данные.
    Через что вы опрашиваете? Может там есть период ожидания пакетов перед отправкой?
    Я ставлю 400 мс. Больше как бы смысла ждать нет. 🙂

    #27094
    Allmy
    Участник

    Дело в том, что SimplyModBusTCP Client 8.1.2 (на мой взгляд это лучший тестовый клиент) читает входы контроллера без проблем.

    Скрин по ссылке

    https://drive.google.com/file/d/1wFzDKS7ML4jv9Wz2v5CLra0cgwC7HGIp/view?usp=sharing

    На скрине я читаю все 5 аналоговых входов и в столбце results реальное напряжение, которое показывается и на внешних измерителях

    • Этот ответ был изменен 1 год, 2 месяца назад от Allmy.
    • Этот ответ был изменен 1 год, 2 месяца назад от Allmy.
    • Этот ответ был изменен 1 год, 2 месяца назад от Allmy.
    • Этот ответ был изменен 1 год, 2 месяца назад от Allmy.
    #27099
    Allmy
    Участник

    И еще непонятно, почему в драйвере для Float (4 байта) адрес устанавливается в виде двух регистров, например, 0-1 (если начальный 0) или 1-2 (если начальный 1)?

    В других клиентах устанавливается конкретно указанный адрес — если 0, то 0 и т.д.

    #27100
    Allmy
    Участник

    И да, если я начинаю читать с 4 регистра (у меня 5 входов, начиная с 0), то выдается другая ошибка — ILLEGAL DATA ADDRESS

    #27101
    manjey73
    Участник

    float занимает два регистра по умолчанию. Разные программы по разному указывают, кто-то пишет что 0-1 или 1-2 а некоторые пишут только стартовый.

    По второму вопросу, вы читаете 4 регистра за пределами памяти, отсюда и ошибка…

    #27102
    Allmy
    Участник

    Получается, драйвер не понимает, что при float ему надо считать два регистра, начиная с указанного?

Просмотр 15 сообщений - с 1 по 15 (из 27 всего)
  • Вы должны авторизироваться для ответа в этой теме.