Ошибки при чтении Bolid С2000-ПП

Не стоит путать RS485 Ориона и RS485 модбаса. К выходу Modbus на С2000ПП подключен только Wirenboard, кроме С2000-ПП на этом порту вайрена никого нет. Провод длиной полтора метра, профибас. С2000-ПП, С2000М и С2000-КДЛ подключены последовательно по шине RS485 системы Орион, модбаса там и в помине нет, как и вайрена.

Я имел в виду порт модуля С2000М. Попробуйте отключить все остальные устройства, кроме преобразователя C2000-ПП от порта RS485 модуля С2000М для теста. Бывает так, что другие устройства мешают связи контроллера Wirenboard и целевого устройства. Читаются ли регистры модуля С2000М при таком подключении?

Ещё раз: у С2000-ПП есть контакты для подключения RS485 ориона, а с другой стороны контакты для Modbus. В эти самые контакты для модбаса ничего кроме вайрена не подключено.

Без схемы очень трудно разобраться. По фотографиям сложно определить, что и куда подключено, хотя фотографии тоже очень полезны.

Я ждал от вас схемы, например, такой:


У вас так все подключено?

1 лайк

К сожалению, не было возможности быстро нарисовать такую красивую схему.

Да, всё верно, за исключением того, что С2000М и С2000-КДЛ питаются от 24В, С2000-ПП от 12В.

Кстати, да, я подключил землю вайрена на 0В С2000-ПП, но, судя по схеме, эти 0В для TTL, а не для модбаса. Но могу ошибаться.

Теперь попробуйте отключить от C2000M пульт С2000-КДЛ (о чем я говорил ранее). Подключите по схеме (привел ниже) и попробуйте прочитать регистры.

Также, как я понял, у вас на преобразователе С2000-ПП установлены все три джампера XP1, 2 и 4. Думаю, что XP1 должен быть снят, чтобы преобразователь работал в режиме “Орион-Slave” (тогда преобразователь будет выступать шлюзом между сетями). Также можно попробовать снять джамперы XP1 и 2 (для теста).

Дальше надо пробовать изменять таймауты и интервалы в настройках драйвера wb-mqtt-serial. Вот было несколько тем:

Попробовал. Как и ожидалось, ничего не поменялось, и вряд ли могло. Как вообще шина RS485 Ориона может влиять на Modbus?) Мне в голову не приходит ни одной идеи. Могу ошибаться.

Он и снят, иначе бы ничего не работало. Напомню, софтиной болида через USB свисток по Modbus всё восхитительно читается с ПК. Следовательно, настройки и джамперы на стороне болида правильные.

Я уже перепробовал разные вариации pool_interval, device_timeout_ms, frame_timeout_ms, guard_interval. Возможно, недостаточно много вариантов перебрал, но тут уже жду Вашего совета, какие стоит поставить и поэкспериментировать. То, что точно пробовал, указано в шапке темы.

Он и снят, иначе бы ничего не работало.

На фото я вижу, что все три джампера установлены. Я ошибаюсь?

Попробуйте в настройках порта в веб-интерфейсе добавить через кнопку Properties параметр guard_interval_us и установить его значение в 3000, а если не поможет, то увеличить до 50000.

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

Действительно, 50000 помогло. Когда я экспериментировал, такое большое число не ставил.

Теперь всё читается шустро и без ошибок (пока что)

Но возник новый вопрос. Осталось управлять состоянием зоны (постановка/снятие с охраны). Для этого используются регистры 40000+:

Вот мой конфиг канала:

Конфиг канала
{
  "name": "ch1 set",
  "type": "range",
  "reg_type": "holding",
  "address": 40001,
  "format": "s16",
  "scale": 1,
  "offset": 0,
  "readonly": false,
  "poll_interval": 1000,
  "max": 109
}

Почему-то там лежит 6344, что я делаю не так?

image

Если регистр читается нормально, результат совпадает с результатом чтения утилитой modbus_client, то тут, наверное, надо изучать документацию на приборы.

Почему вы считаете, что что-то не так?
Как я понял из документации надо действовать следующим образом. Берем число 6344, переводим его в двоичный формат: 00011000 11001000 (старший и младший байты соответственно). В десятичной системе счисления байты будут иметь значения: 24 и 200
Затем по таблице 1.1.5.12.1 (стр. 25 документации на С2000-ПП) определяем состояния:

  • вход взят на охрану (24)
  • напряжение системной батареи пришло в норму (200).

Для работы с битами в шаблонах тоже есть средства:
https://wirenboard.com/wiki/Wb-mqtt-serial_templates#.D0.9A.D0.B0.D0.BD.D0.B0.D0.BB.D1.8B_.D1.83.D1.81.D1.82.D1.80.D0.BE.D0.B9.D1.81.D1.82.D0.B2.D0.B0_.28channels.29

address — адрес регистра. Можно читать отдельные биты регистра, для этого запишите адрес в формате: "address":"reg:shift:width", где reg — адрес регистра, shift — смещение от начала, а width — количество считываемых битов. Например, "address":"109:1:2" — прочитать второй и третий биты регистра, расположенного по адресу 109.

Решил тоже поиграться с с2000-ПП.
Мой опыт.
Мне не удалось прочитать 4096, 4112 и 4128. Возможно нужны еще какие-то настройки в самом с2000-ПП. Шаблон конфига использовал выше.
Состояние/Управление регистры 40000+ читаются, изменяются успешно.
“address”: “40000:8:8” и “address”: “40000:0:8”.
Дальше захотелось поиграться с функцией для работы с буфером событий.
root@wirenboard-A4O3NNVO:~# modbus_client --debug -mrtu -pnone -s1 /dev/ttyRS485-1 -a3 -t0x03 -r46264
Opening /dev/ttyRS485-1 at 9600 bauds (N, 8, 1)
[03][03][B4][B8][00][01][22][3D]
Waiting for a confirmation…
<03><03><02><04><05><03><47>
SUCCESS: read 1 of elements:
Data: 0x0405
root@wirenboard-A4O3NNVO:~#

Штатная болидовская выдает программа выдает:
Адрес ПП: 3
Событие #1029: (Код: 24) Взятие входа на охрану
Данные: [Раздел: 1] [Зона: 1] [Дата/Время: 22.09.21 - 20:48:29] [ID Раздела: 1]
Полный ответ: [3.3.28.4.5.21.24.3.2.0.1.2.2.0.1.24.2.0.1.11.6.20.48.29.22.9.21.0.0.0.0.227.6]

Мне нужно прочитать 7 байт.

Как правильно написать в шаблоне “address”: “46264:Х:Х” ?

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

Выдержка из документации:

  • address — адрес регистра. Можно читать отдельные биты регистра, для этого запишите адрес в формате: "address":"reg:shift:width", где reg — адрес регистра, shift — смещение от начала, а width — количество считываемых битов. Например, "address":"109:1:2" — прочитать второй и третий биты регистра, расположенного по адресу 109.

Документацию по созданию пользовательских шаблонов можно найти здесь:
https://wirenboard.com/wiki/Wb-mqtt-serial_templates

root@wirenboard-A4O3NNVO:~# modbus_client --debug -mrtu -pnone -s1 /dev/ttyRS485-1 -a3 -t0x03 -r46264 -c 14
Opening /dev/ttyRS485-1 at 9600 bauds (N, 8, 1)
[03][03][B4][B8][00][0E][62][39]
Waiting for a confirmation…
<03><03><1C><00><01><15><18><03><02><00><01><02><02><00><01><18><02><00><01><0B><06><12><2C><00><17><09><15><00><00><00><00><87>
SUCCESS: read 14 of elements:
Data: 0x0001 0x1518 0x0302 0x0001 0x0202 0x0001 0x1802 0x0001 0x0b06 0x122c 0x0017 0x0915 0x0000 0x0000
root@wirenboard-A4O3NNVO:~#
Читаю
register value change: <modbus:3:holding: 46264:7:2> ← 0
Получаю 0 а должен 24 (18) :(.

Из регистра 46264

Естественно старшие биты тут “0”

Почему?

Ткните пожалуйста, как правильно написать в шаблоне “address”: “46264:Х:Х” чтобы получить в ответе 24 (18) ? 7 код события

В документации нашел следующее:

Сравниваем ответ по Modbus с документацией:

То есть, как я понимаю, вам нужно прочитать младший байт регистра 46265. Для этого в шаблоне нужно указать так:
“address”:“46265:0:8”

root@wirenboard-A4O3NNVO:~# modbus_client --debug -mrtu -pnone -s1 /dev/ttyRS485-1 -a3 -t0x03 -r46264 -c2
Opening /dev/ttyRS485-1 at 9600 bauds (N, 8, 1)
[03][03][B4][B8][00][02][62][3C]
Waiting for a confirmation…
<03><03><04><00><01><15><18><86>
SUCCESS: read 2 of elements:
Data: 0x0001 0x1518
root@wirenboard-A4O3NNVO:~#
из 0x1518 надо получить 18

Пробовал 46265:0:8
[modbus] Register <modbus:3:holding: 46265:0:8> is not supported

Это, видимо, особенность Болида. Думаю, что в этом случае сам код события средствами шаблонов не получить. Попробуйте считать два 16-битных регистра как один 32-битный регистр. Для этого в шаблоне его канал пропишите так:

                "name": "Reg_name",
                "reg_type": "holding",
                "address": "46264",
                "type": "value",
                "format": "u32"

А потом средствами правил (wb-rules) уже выделять младший байт из полученного 32-разрядного числа, например, с помощью побитовых операций, как показано здесь: