Чтения массива регистров modbus


#1

Добрый день, имеется modbus устройство которое я пытаюсь опрашивать с помощью wb6, создал json tamplate читать одиночные и составные регистры получается нормально, а вот как быть с массивом регистров (например нужно считать массив из 100 регистров) в документации ответа не нашел.
Собственно созрело 2 вопроса:

  1. Есть ли json конструкция для такого случая?
  2. Есть ли возможность не показывать пользователю эти данные на вкладке Devices, а только через History

#2

culit, добрый день!
К сожалению, нет простого способа сделать то, что вы хотите.

Я бы сделал так: подключил бы устройство к отдельному порту, на котором нет других устройств, опрашиваемых wb-mqtt-serial. По cron-правилу вызывал бы скрипт для чтения и обработки массива регистров (через утилиту modbus_client). Хранил бы где-то значения массива, а в движке правил что-то бы с ним делал.

Не очень хорошее решение, но должно работать.


#3

Возникает еще вопрос)
Есть возможность через web-rules работать с бд sqlite3, если я буду результат опроса хранить именно так?. Может существует что то подобное встроенное?


#4

Встроенной поддержки sqlite3 нет.
Вообще, мне кажется, что ваша задача проще решается вне движка правил и Modbus-драйвера контроллера, каким-нибудь скриптом на питоне или на node.js? или на чем удобно . А взаимодействие с правилами и интерфейсом контроллера организовать через mqtt.


#5

Спасибо за ответ)


#6

Да не за что, к сожалению, просто не получается.


#7

Вы писали про способ:

Я реализовал опрос, и отправку mqtt, можете направить меня пожалуйста на wiki где есть описания создания правил, для подписки на mqtt сообщения


#8

Основная статья вот эта: https://wirenboard.com/wiki/index.php/Движок_правил_wb-rules

Идея такая: вы создаете виртуальное устройство (defineVirtualDevice), устройству добавляете контролы (смотрите примеры в статье). Для каждого контрола создается MQTT-топик в виде

/devices/Имя_виртуального_устройства/controls/Навзвание_контрола

в который можно публиковать значения, а также писать правила, которые будут вызываться при изменении этих значений.


#9

Спасибо)


#10

Успехов вам!


#11

Добрый день, никак не могу принять сообщение по mqqt по данному примеру:

from paho.mqtt import client


def on_connect(client, userdata, rc):  
    print("Connected with result code: %s" % rc)
    client.subscribe("/devices/request_watt/controls/enabled")

def on_message(client, userdata, msg):  
    print("%s: %s" % (msg.topic, msg.payload))

def main():  
    subscriber = client.Client()
    subscriber.on_connect = on_connect
    subscriber.on_message = on_message

    subscriber.connect("localhost",18883)
    subscriber.loop_forever()

if __name__ == "__main__":  
    main()

В результате на стороне python тишина) Нужно ваше экспертное мнение


#12

Добрый день! На первый взгляд кажется, что вы подключаетесь не совсем к тому порту, нужен 1883, не 18883.


#13

В общем все завелось с вот этим кодом:

from config import Configuration
import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
     print("Connected With Result Code {}".format(rc))
     client.subscribe(Configuration.topic_switcher)

def on_disconnect(client, userdata, rc):
	print("Disconnected From Broker")

def on_message(client, userdata, message):
	print(message.payload.decode())
	print(message.topic)

def run():
    broker_address = "localhost"
    broker_portno = 1883
    client = mqtt.Client()
    #Assigning the object attribute to the Callback Function
    client.on_connect = on_connect
    client.on_disconnect = on_disconnect
    client.on_message = on_message
    client.connect(broker_address, broker_portno)
    client.loop_forever()

if __name__ == '__main__':
    run()

Работа с web ui оказалась проще чем я думал)


#14

Замечательно! Успехов вам!


#15

У меня осталась последняя проблема которую решить никак не удается) Я создал службу которая опрашивает устройство и умеет отправлять\принимать данные по mqqt, я создал виртуальное устройство которое может управлять службой, есть ли возможность закинуть данные сразу в history не показывая их пользователю в виде полей?)


#16

Вопрос решен, тему можно закрывать)
Если кому-нибудь понадобится, то выход очень простой, если нужно считать массив данных как в моем случае ваттметрграмму, то можно создать виртуальное устройство с одним полем value, и скриптом на любом языке работать с modbus, а считаный массив поэлементно отправлять по mqtt в созданное поле виртуального устройства, через равные промежутки времени, тем самым оно попадет в history, а виртуальное устройство останется компактным