Проблема с интеграцией вентиляционной установки

Добрый день, при интеграции ПВ по RS-485 возникла проблема с параметром управления и статуса. Параметр “stopRun” всегда в ошибке, я пробовал использовать тип holding и формат u16, но там параметр не даёт управлять, всегда приходит 0. Параметр “status” занимает 4 байта и поэтому я использовал формат u32, он также всегда шлёт 1, а если использовать формат u16 то всегда приходит 0, независимо от того включена вентиляция или нет. В чём может быть проблема?

При подключении мы использовали модуль расширения для портов WBE2-I-RS485-ISO, то есть, вентиляция подключена отдельно. На самой панели не дало выбрать стоп-биты 2(там либо 0,либо 1), мы выбрали 1, также в настройках порта на WirenBoard7 выбрали 1. Хотя обычно для подключения через RS-485 использовали стоп-биты 2, может ли быть проблема в этом? Остальные параметры портов сходятся с обычным подключением RS-485.

Также прикрепил pdf документацию к вентиляции:

instrukcziya_inteh-ver2.02.pdf (2,3 МБ)

Прикрепил скрин моего конфига:

Добрый день!

Предлагаю абстрагироваться от контроллера и проверить карту регистров устройства.

Попробуйте считать значения требуемых регистров – например, подключитесь к устройству с помощью утилиты modbus_client и считайте данные из любого известного вам регистра (серийный номер подойдет).

Сверьте с ожидаемым значением.

Кроме того, обратите внимание на несколько моментов по документации Intech:

stopRun (41651) — по документации это holding-регистр (командное слово), а не coil.

Тип uint и float использует нестандартный порядок байт 1-0-3-2. При чтении многорегистровых значений это нужно учитывать, иначе значение соберётся некорректно.

Обратите внимание на паритет. По документации Intech (настройки RS-485) панель работает со скоростью 115200, паритетом Even (Чётность) и 1 стоп-битом.

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

Полезная ссылка:

Добрый день, я пробовал считывать данные через modbus_client, параметр stopRun передаёт 0, как и должно быть. Но если попробовать менять значение, то параметр уходит в ошибку. Мне кажется это из-за неправильного формата, я пытался с “reg_type: holding” и “format: u16”, но не работало управление, просто передавало 0. Поэтому я подумал, нужно использовать “reg_type:coil”, но это не дало ничего, параметр в ошибке. Можете подсказать какой формат использовать вместо “short”?
Паритет мы поставили “Запрещено”, а на контроллере “N”, проверял через modbus_client, данные передаются, также скорость на панели и порту выбрана 9600.

Предварительно (всегда) имеет смысл проверить используя modbus_client.

А для чего? То есть - зачем пытаться менять функцию?

Вот тут описаны все возможные.
Подсказать - конечно могу, покажитте как (какой командой Modbus) вы читаете и записываете.

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

Вам удалось разобраться?

Добрый день, на данный момент нужно понять какой reg_type у параметра StopRun использовать вместо short, я не смог разобраться. Пока что протестировать с ПВ возможности не было

На данный момент в чем-то нужна помощь с нашей стороны?

Да, можете пожалуйста помочь с выбором format из доступных?


В документации указан short, значит по идее это u8?

По таблице типов Intech short – это 2 байта со знаком, то есть s16. u8 – 1 байт без знака, это соответствует их типу ubyte, которого в карте регистров нет. Так что short у Intech s16, а не u8.

Добрый день!

Вам помог мой ответ?

Добрый день, вчера тестировали, но не получается управлять установкой. Обратились к производителю, нам ответили что “Судя по коду вы пытаетесь выставить 1 в регистр 41651.Для запуска установки нужно сделать импульс 1 на бит 0 регистр 41651” и предложили реализовать это через wb-rules при помощи скрипта, но по ТЗ заказчика мы не можем использовать wb-rules. Есть ли какой-то способ делать импульс 1 на бит 0 не используя скрипты?

Не до конца понимаю, что нужно сделать – выставить 0-й бит регистра в 1, а затем обратно в 0?

Без применения wb-rules только с использованием стороннего ПО.

Вот скрипт, который скинули:

defineRule(“send_pulse_to_bit”, {

whenChanged: “virtual_device/trigger”, // Имя вашей виртуальной кнопки/триггера

then: function (newValue, devName, cellName) {

if (newValue) { // 1. Устанавливаем бит 0 регистра 41651 в единицу (true)

                // Замените "my_modbus_device" на фактическое имя (ID) вашего устройства              dev\["my_modbus_device"\]\["register_41651_bit_0"\] = true;

// 2. Через 500 мс сбрасываем этот бит обратно в ноль (false)

setTimeout(function() {

dev[“my_modbus_device”][“register_41651_bit_0”] = false;

}, 1000); // Длительность импульса в миллисекундах } } });

Как я понял нужно выставить импульс 1 в бит 0 регистра 41651, а не выставлять значение 1 в регистр

Дело не в формате: бит 0 регистра 41651 – это значение 1 в этом регистре, остальные биты нулевые. Регистр командный, поэтому опишите его в шаблоне кнопкой – драйвер запишет регистр целиком, а каждое нажатие даст одну запись со значением 1:

{
    "name": "cmd_start",
    "reg_type": "holding",
    "write_address": "41651",
    "type": "pushbutton",
    "format": "u16",
    "on_value": 1
}

Адрес указывайте тот же, по которому регистр читается у вас через modbus_client. Пример такого канала – в разделе «Писать можно, читать нельзя»: https://wiki.wirenboard.com/wiki/Connecting_Third_Party_Devices_to_Wiren_Board

Если нужно адресоваться именно к одному биту, в драйвере есть запись адреса в виде “address”: “41651:0:1” – регистр:смещение от младшего бита:количество бит. Для вашего регистра это не нужно: он читается нулём, поэтому оба варианта дают на шине одинаковый запрос.

Дальше остаётся вопрос про сброс бита: если установка сбрасывает его сама, одного нажатия достаточно. Если бит нужно принудительно вернуть в 0, шаблоном это не решается – драйвер записывает только то значение, которое ему дали, и последовательность 1 в 0 сам не формирует. Тогда эти две записи должен делать тот, кто управляет установкой – либо wb-rules на контроллере, либо верхний уровень через MQTT или Modbus TCP.

Попробуйте на установке и напишите, что получится.