Подключение газового счетчика Принц

Здравствуйте!

Подскажите, кто-нибудь подключал подобные счетчики с помощью такого RS-485/RS-232 адаптера?

У меня Wirenboard 6.6. По первой линии подключено периферийное оборудование Wirenboard, по второй - счетчик электроэнергии CE102M-R5

Правильно ли понимаю, что в моем случае адаптер нужно подключить к первой линии RS-485? Нужно ли писать свой адаптер, как я это делал для Энергомеры, пока он не стал поддерживаться официально (GitHub - tamtakoe/energomera-ce102m-wirenboard: Wirenboard (MQTT) adapter for Energomera CE102M power meter)?

Добрый день. Интерфейс у самого счетчика какой? RS232 или RS485?

Оптический. Адаптер его считывает и выдает сигнал как по RS485, так и по RS232. Я подключил по RS485

У меня, к сожалению нет опыта работы с таким адаптером, но тут несколько основных моментов:

  • если устройства нельзя привести к одним и тем же параметрам шины (скорость, четность, стопбиты) - то они подключаются на разные шины.
  • если используется не поддерживающий работу с разными протоколами драйвер (например штатный wb-mqtt-serial - поддерживает) - то тоже на разные шины.

Ну и - пока непонятно како именно протокол у счетчика.

Протокол Modbus-RTU. Подключил ко второй линии 9600, c одним стоп-битом. Всё заработало. Создал кастомное устройство и вывел в него основные параметры, описанные в документации:

Основная проблема в том, что параметры часто получаются с ошибками. Скорее всего это из-за того, что у меня такая топология шины (хотя все проложено экранированной витой парой):

Топологию поменять не могу, но можно ли как-то увеличить ожидание ответа или уменьшить частоту запросов или еще что-нибудь, чтобы избежать ошибок?

P.S. У меня лежит бесхозный счетчик Принц G1.6 у которого прошла половина срока поверки. Могу прислать его вам для тестов или передать кому-нибудь в Питере. Нужен?

На скорости 9600 такая топология вполне приемлема, дело не в ней. Хотя не понимаю, почему WB и эл. счетчик не подключить шлейфом.
Я бы отключил wb-mqtt-serial и поигрался с modbus_client. Посмотрел бы, при какой частоте опроса регистры с ошибками читаются корректно. И привел шаблон в соответствие. А вот если ошибки будут регулярными и в режиме ручного опроса - тогда надо смотреть, что с шиной не так.
P.s. Встречал устройства, у которых ответить ошибкой на запрос из-за того, что микроконтроллер просто в данный момент занят своими делами, было нормой.

2 лайка

Можно, у нас есть такая статья: Подключение стороннего Modbus-устройства к контроллеру Wiren Board — Wiren Board и там есть про параметр guard_interval_us. Думаю, это то, что вам нужно. Для «плохих устройств» мы ставим "guard_interval_us": 5000.

2 лайка

Отввод в 20 см влиять на 9600 не должен.
Точно ли соединены Gnd устройств?
Ну и - в логе на что ругается, таймаут или именно ошибки приема?
“Таймаут” - в принципе иногда свидетельствует что ошибка произошла на этапе передачи команды устройству, то есть оно получило некорректный запрос (CRC не сошелся, например) и не отвечает.

1 лайк

Сколько ни игрался с modbus_client ошибки никогда не возникают. И там нет определенных регистров, где случаются ошибки при опросе через wb-mqtt-serial, они каждый раз по-разному случаются для этого счетчика.

Шлейфом не подключил, потому что счетчик опечатан и коснись что, пришлось бы срывать пломбу, чтобы поменять топологию

Да, GND соединены, но у счетчика отдельное питание 24В. Попробую завести на него Vcc контроллера, посмотрю что будет

нет смысла, достаточно соединения Gnd.

А что за ошибки-то? Иногда сторонние устройства просто не выдерживают нашего совершенного драйвера, который максимально утилизирует шину. Поэтому целесообразно добавить guard interval побольше, как коллега выше советует.

Дошли руки до логов. Какие-то такие. Ничего не понятно, в общем…

17-07-2023 14:26:30.725 [wb-mqtt-serial] DEBUG: [serial port driver] channel ‘AstronomicTime-m’ of device ‘wb-modbus-1-0’ ← 41, error:
17-07-2023 14:26:30.697 [wb-mqtt-serial] DEBUG: [serial port driver] channel ‘AstronomicTime-s’ of device ‘wb-modbus-1-0’ ← 31, error:
17-07-2023 14:26:29.608 [wb-mqtt-serial] DEBUG: [serial port driver] channel ‘TimeInvalid’ of device ‘wb-modbus-1-0’ ← 0, error:
17-07-2023 14:26:29.584 [wb-mqtt-serial] DEBUG: [serial port driver] channel ‘Time’ of device ‘wb-modbus-1-0’ ← 1477181825, error:
17-07-2023 14:26:28.489 [wb-mqtt-serial] DEBUG: [serial port driver] channel ‘VolumeN’ of device ‘wb-modbus-1-0’ ← 0, error: 
17-07-2023 14:26:27.399 [wb-mqtt-serial] DEBUG: [serial port driver] channel ‘DayStart-m’ of device ‘wb-modbus-1-0’ ← 0, error:
17-07-2023 14:26:26.308 [wb-mqtt-serial] DEBUG: [serial port driver] channel ‘Compressibility’ of device ‘wb-modbus-1-0’ ← 1, error: 
17-07-2023 14:26:25.228 [wb-mqtt-serial] DEBUG: [serial port driver] channel ‘SerialNumber’ of device ‘wb-modbus-1-0’ ← 2034367, error:
17-07-2023 14:26:23.451 [wb-rules] INFO: wb-modbus-1-0/VolumeN: failed to convert value ‘’, passing raw, error: This control is incomplete
17-07-2023 14:26:23.417 [wb-rules] INFO: wb-modbus-1-0/VolumeN: failed to convert value ‘’, passing raw, error: This control is incomplete
17-07-2023 14:26:23.374 [wb-rules] INFO: wb-modbus-1-0/VolumeN: failed to convert value ‘’, passing raw, error: This control is incomplete
17-07-2023 14:26:15.967 [wb-rules] WARNING: wb-modbus-1-0/BattaryVoltage: failed to convert value ‘’, passing raw, error: This control is incomplete
17-07-2023 14:26:15.956 [wb-rules] INFO: wb-modbus-1-0/BattaryVoltage: failed to convert value ‘23.8555147’, passing raw, error: This control is incomplete
17-07-2023 14:26:15.944 [wb-rules] WARNING: wb-modbus-1-0/RawVolumeN: failed to convert value ‘0’, passing raw, error: This control was deleted
17-07-2023 14:26:15.934 [wb-rules] WARNING: wb-modbus-1-0/GlobalTime-M: failed to convert value ‘’, passing raw, error: This control is incomplete
17-07-2023 14:26:15.919 [wb-rules] INFO: wb-modbus-1-0/GlobalTime-M: failed to convert value ‘7’, passing raw, error: This control is incomplete
17-07-2023 14:26:15.840 [wb-rules] WARNING: wb-modbus-1-0/Type: failed to convert value ‘’, passing raw, error: This control is incomplete

Мне тоже. На что смотреть, что в этом логе отличается от ожидаемого?

Из-за чего красные значения появляются? Может это в других логах пишется?

Guard interval (us) 5000 и Response timeout (ms) 1000 улучшили ситуацию. Красные значения стали появляться гораздо реже, но не исчезли совсем (Пробовал Guard interval (us) до 100 000 поднимать - мало помогло)

лог - именно сервиса wb-mqtt-serial.
Как и написано в документации занчение meat “r” - ошибки чтения.
Просмотрте лог, если включить debug режим - то и отправленные-принятые байты.
Мервис ожидает корректного ответа от устройства в окно времени, определяемое timeout/ Если получен некорректный или не получен совсем - ошибка.

Ну да, смотрю wb-mqtt-serial.service логи через веб-интерфейс. Странно, что в интерфейсе ошибка обозначается красным, а в логах ничего со статусом Error, Critical и т.п. нет

Еще, кстати, добавьте, пожалуйста, в список групп g-gas-meter для газовых счетчиков. Или я и так могу указывать эту группу в шаблоне?

Получаю данные о целой и дробной части в разных адресах. Можно как-нибудь сложить эти значения в одном поле в шаблоне?

Не советую использовать веб-интерфейс для хоть сколько-то серьезного анализа логов. Неудобно.
Старый добрый journalctl намного эффективнее.

Да, конечно можете.

GitHub - wirenboard/wb-mqtt-serial: Wiren Board MQTT serial protocol driver ключевое слово format

Можно подробнее про format. Пробовал играться с ним, но не похоже, что это то, что нужно. Хотя в моем случае может быть проще, т.к. данные о целой и дробной части идут в смежных регистрах.
Целая часть (регистр 0): 0xA1B1C1D1, дробная (регистр 2): 0xA2B2C2D2.

Причем байты поменяны местами, т.е. значения будут 0xC1D1A1B1 и 0xC2D2A2B2 (для чего успользую little_endian)

Мне же нужно вместо двух полей получить одно поле с числом с плавающей точкой на основе 0xA1B1C1D1A2B2C2D2 Пробовал int64 использовать, но получается шляпа.

Есть и другие ситуации, когда даты раскиданы по регистрам (год, месяц, день и т.д.), а нужно объединить их в одну строку (напр.: 18.07.2013)