Есть следующая задача.
Нужно подключить панель оператора по modbus tcp.
При этом панель оператора master а wiren board slave
Нужно записывать и читать данные с holding register.
после чего mqtt топики привязанные к адресам holding register будут обрабатываться пайтон скриптом.
Проблема в том что я не понимаю как добавить
Шлюз MQTT - Modbus RTU/TCP slave в Регистры Holding (чтение/запись)
свой топик.
Добрый день.
Не уверен что верно понял задачу, но попробую показать.
Нажимаю “+”:
Вписываю мой, созданный в соответствии с конвенцией топик:
Указав ID(Modbus address) 1 и адрес регистра 100.
Все. Теперь регистр можно читать и записывать.
Я это делал только вся проблема в том что если я пытаюсь читать данный адрес командой 3 получаю ошибку . Если читаю командой 4 то все в порядке. но в таком случае я не могу записать в этот адрес ничего
Какого типа регистр?
вот такие настройки OPC сервера в Wiren Board тоже holding
holding читается только 03 командой.
Пожалуйста покажите конфиг wb-mqtt-mbgate.conf
Также - запрос к этому регистру, в виде байт. Сделайте его с компьютера для диагностики.
Например
Connecting to 10.0.0.71:502
[00][01][00][00][00][06][37][03][07][D0][00][01]
Waiting for a confirmation...
<00><01><00><00><00><05><37><03><02><00><00>
SUCCESS: read 1 of elements:
Data: 0x0000
Картинка как настроено в незнакомом ПО - недостаточно…
Я вижу:
{
"topic": "test/tesr1",
"address": 160,
"unitId": 1,
"meta_type": "range",
"enabled": true,
"format": "signed",
"size": 1,
"max": 0,
"scale": 0,
"byteswap": false,
"wordswap": false
}
настроенный 160 holding регистр c id1
а читаете 208 c id 7
Логично, такого нет.
Просто правильно указал количество байт и проблема ушла.
Теперь вопрос в том что в Каналах MQTT я не могу найти такой топик.test/tesr1
Так, я этот топик в MQTT создавал, используя вот такой скрипт:
function makeNewVirtualPool(vdName, nameControl, typeControls, orderControl){
//log.info("GetDevice", getDevice("vdName"))
if (getDevice(vdName) === undefined) {
log.info("Define new")
defineVirtualDevice(vdName, {
title: vdName,
cells: {
},
})
}
//Тут проверим есть ли уже контрол и если нет - создадим.
if (!getDevice(vdName).isControlExists(nameControl)) {
log.info("Контрола нет, создаем.")
getDevice(vdName).addControl(nameControl, {
type: typeControls,
min: 10,
max: 50,
value: 1,
readonly: false,
order: orderControl
});
}
}
makeNewVirtualPool("pemp1", "tesr1", "range", 1);
Я верно понимаю что топик - есть, но проблема возникает с его добавлением в конфиг wb-mqtt-mbgate?
Нпишите - что делаете, какого результата ожидаете.
Топик есть. Через MQTT я могу как записывать в него данные так и читать.
Но мне нужно передать в этот топик параметр из панели оператора по modbus tcp.
Панель оператор является мастером
Вот тут “Регистры Holding (чтение/запись)” я прописал вот такое название pemp1/tesr1
При попытке записать любое значение оно тут же становится равно “0”
Tx, data:[00 09 00 00 00 09 01 10 05 DC 00 01 02 00 4B ]
Rx data:[00 09 00 00 00 06 01 10 05 DC 00 01 ]
Есть какое то решение этой проблемы? Или надо свой скрипт для этого писать?
Покажите пожалуйста
mosquitto_sub -v -t /devices/pemp1/#
То есть запустите в консоли и запишите згачение по Modbus TCP
root@wirenboard-AQCMCVPH:~# mosquitto_sub -v -t /devices/pemp1/#
/devices/pemp1/meta/name pemp1
/devices/pemp1/meta/driver wb-rules
/devices/pemp1/controls/tesr1 inf
/devices/pemp1/controls/tesr1/meta {“order”:1,“readonly”:false,“type”:“value”}
/devices/pemp1/controls/tesr1/meta/order 1
/devices/pemp1/controls/tesr1/meta/readonly 0
/devices/pemp1/controls/tesr1/meta/type value
/devices/pemp1/controls/tesr2 inf
/devices/pemp1/controls/tesr2/meta {“order”:1,“readonly”:false,“type”:“value”}
/devices/pemp1/controls/tesr2/meta/order 1
/devices/pemp1/controls/tesr2/meta/readonly 0
/devices/pemp1/controls/tesr2/meta/type value
/devices/pemp1/controls/tesr1/on inf
Так, отлично.
То есть при записи по Modbus TCP - в топик ничего не писалось?
Дайте еще конфиг wb-mqtt-mbgate, попробую воспроизвести.
wb-mqtt-mbgate.conf (170,2 КБ)
Вижу два вхождения, причем первое скорнфигурировано неверно:
{
"topic": "pemp1/controls/tesr1",
"address": 1000,
"unitId": 1,
"meta_type": "",
"enabled": true,
"format": "signed",
"size": 2,
"max": 0,
"scale": 0,
"byteswap": false,
"wordswap": false
},
{
"topic": "pemp1/tesr1",
"address": 1500,
"unitId": 1,
"meta_type": "",
"enabled": true,
"format": "signed",
"size": 2,
"max": 0,
"scale": 0,
"byteswap": false,
"wordswap": false
}
Со всторым (адрес 1500) - работает.