Modbus协议常被用在工业现场,用于各类设备的数据采集以及远程控制,Node-RED社区有很多开发者为Modbus协议提供了各种类型的Modbus节点,有用于边缘采集的“node-red-node-arc-modbus” ,也有通用Modbus协议栈“node-red-contrib-modbus”,接下来就通过使用Modbus协议栈演示Modbus IO设备接入Node-RED网关。
与以往添加节点的方式一样,先选择菜单,进入“节点管理”,输入节点名称“node-red-contrib-modbus”,带搜索完成后选择对应的节点,点击安装,带安装完成后会出现一系列的Modbus操作节点。
本片文章主要对静态操作节点“Modbus-Read”、“Modbus-Write”、“Modbus-Response”,以及动态操作节点“Modbus-Flex-Connector”、“Modbus-Flex-Getter”、“Modbus-Flex-Write”进行说明,利用上述节点即可实现远程IO数据的采集和控制。
“Modbus-Read”,网关作为主机,配置静态连接参数以及静态Modbus参数,通过网络、串口,以及配置的协议(Modbus RTU与Modbus TCP)去读取指定Modbus从机的指定寄存器数据。
“Modbus-Write”,网关作为主机,配置静态连接参数以及静态Modbus参数,通过网络、串口,以及配置的协议(Modbus RTU与Modbus TCP)与传入的参数配置指定Modbus从机的指定寄存器数据。
“Modbus-Read”与“Modbus-Write”在使用前都需要提前配置网关如何连接设备,左图说明通过串口查询的配置,右图说明通过网络查询的配置;
“Modbus-Read”节点需要配置设备的地址(Unit-id),我这里配置为104,也可以不输入,若不输入则采用连接时配置的默认设备地址,还需要配置采用的功能码,我这通过读取AO的整型值为例(查询IO设备的寄存器表可以得到AO存放在40100-40103),所以FC(功能码)配置为3(读取保持寄存器),如果读取AI该配置FC为4(读取输入寄存器,查询IO设备的寄存器表可以得到AO存放在30100-30103),在配置节点的地址为100,寄存器数量为4,自动轮询为10s(可根据自己需要调整时基为毫秒、秒、分、时),选择上一步配置的连接参数。
“Modbus-Write”和“Read”都具有地址、寄存器地址、数量、连接服务器,相同的参数配置方法相同不在单独说明,写入节点还需要传入数据,如右图,传入4个寄存器参数。
“Modbus-Response”用于输出前端Modbus节点的返回数据在Node-RED控制台显示的节点,一般不使用。
“Modbus-Flex-Connector”用于与Modbus设备动态建立连接的节点,使用该节点需要传入连接所需的参数,以及配置存储连接信息的空间(配置一个新的服务器节点,IP和端口可以任意配置,其余参数根据实际需求调整,这里采用TCP连接并通过Modbus TCP协议通信,超时时间为1000),其余参数可通过前端节点传入。
添加“inject”节点,添加“payload”对象,输入JSON数据{"connectorType":"TCP","tcpHost":"192.168.88.35","tcpPort":502},点击部署,可通过手动触发连接;
连接成功后调试日志接口输出一下数据;
“Modbus-Flex-Getter”用于动态查询IO设备参数,需要传入设备地址、功能码、首地址寄存器、寄存器数量,目前该控件支持01、02、03、04功能码,动态连接一样,在节点前端添加一个“inject”传入Modbus请求参数;
“Modbus-Flex-Write”用于动态写入IO设备数据,需要传入设备地址、功能码、首地址寄存器、寄存器数量、操作数据,目前该控件支持单个操作的05与06也支持连续操作的15、16功能码,与其他动态连接的节点一样,在节点前端添加一个“inject”传入Modbus请求参数和数据;
下面为节点配置,可通过Node-RED导入功能复制本文案例;
动态连接参数输入:
[{"id":"e45d6bd45793ccad","type":"modbus-flex-connector","z":"5d4fa2aa0a8f4fcf","name":"","maxReconnectsPerMinute":4,"emptyQueue":false,"showStatusActivities":false,"showErrors":false,"server":"904086e697ba6c29","x":370,"y":620,"wires":[["b4159f0075e37cfc"]]},{"id":"902892a0233fc0e2","type":"inject","z":"5d4fa2aa0a8f4fcf","name":"连接参数输入","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"{"connectorType":"TCP","tcpHost":"192.168.88.35","tcpPort":502}","payloadType":"json","x":110,"y":620,"wires":[["e45d6bd45793ccad"]]},{"id":"904086e697ba6c29","type":"modbus-client","name":"测试设备","clienttype":"tcp","bufferCommands":true,"stateLogEnabled":false,"queueLogEnabled":false,"failureLogEnabled":true,"tcpHost":"192.168.88.105","tcpPort":"502","tcpType":"DEFAULT","serialPort":"/dev/ttyUSB","serialType":"RTU BUFFERD","serialBaudrate":"9600","serialDatabits":"8","serialStopbits":"1","serialParity" :"none","serialConnectionDelay":"100","serialAsciiResponseStartDelimiter":"0x3A","unit_id":"1","commandDelay":"1","clientTimeout":"1000","reconnectOnTimeout":true,"reconnectTimeout":"2000","parallelUnitIdsAllowed":true,"showWarnings":true,"showLogs":true}]
动态查询参数:
[{"id":"bb9ead56ab51483e","type":"modbus-flex-getter","z":"5d4fa2aa0a8f4fcf","name":"" , "showStatusActivities":false,"showErrors":false,"showWarnings":true,"logIOActivities":false,"server":"904086e697ba6c29","useIOFile":false,"ioFile":"","useIOForPayload":false,"emptyMsgOnFail":false,"keepMsgProperties":false,"delayOnStart":false,"startDelayTime":"","x":350,"y":720,"wires":[[],["a051c717d9537768"]]},{"id":"181a3bf2d08b472d","type":"inject","z":"5d4fa2aa0a8f4fcf" ,"name" : "动态查询AO状态","props":[{"p":"payload.fc","v":"3","vt":"num"},{"p":"payload.unitid","v":"105","vt":"str"},{"p":"payload.address" , "v":"100","vt":"str"} , {"p":"payload.quantity","v":"4","vt":"str"}],"repeat":"","crontab":"","once": false ,"onceDelay" : 0.1,"topic":"","x":120,"y":720,"wires":[["bb9ead56ab51483e"]]},{"id":"904086e697ba6c29" , "type":"modbus-client" , "name" : "测试设备" ,"clienttype":"tcp","bufferCommands" : true," stateLogEnabled":false , "queueLogEnabled" : false,"failureLogEnabled":true,"tcpHost":"192.168.88.105" , "tcpPort":"502","tcpType":"DEFAULT","serialPort":"/dev/ttyUSB","serialType":"RTU-BUFFERD" , "serialBaudrate" : "9600","serialDatabits" : "8","serialStopbits" : "1" , "serialParity":"none" ,"serialConnectionDelay":"100","serialAsciiResponseStartDelimiter" : "0x3A" , "unit_id":"1","commandDelay" :"1","clientTimeout":"1000","reconnectOnTimeout":true,"reconnectTimeout":"2000","parallelUnitIdsAllowed":true,"showWarnings":true,"showLogs":true}]
动态修改寄存器:
[{"id":"2d5ea26349786e57","type":"modbus-flex-write" , "z" : "5d4fa2aa0a8f4fcf" , "name" : "","showStatusActivities":false,"showErrors":false,"showWarnings":true,"server":"904086e697ba6c29","emptyMsgOnFail":false,"keepMsgProperties":false,"delayOnStart":false,"startDelayTime":"","x":350,"y":780,"wires":[[],["a051c717d9537768"]]},{"id":"00d9fdbe7e55a434","type":"inject","z":"5d4fa2aa0a8f4fcf","name":"动态写入AO","props":[{"p":"payload.value","v":"[20000,20000,20000,20000]","vt":"json"},{"p":"payload.fc" ,"v":"16","vt":"num"},{"p":"payload.unitid","v":"105","vt":"str"},{"p":"payload.address" , "v":"100","vt":"str"},{"p":"payload.quantity","v":"4","vt":"str"}],"repeat" :"","crontab" :"","once":false,"onceDelay" :0.1,"topic" :"","x":110,"y":780,"wires":[["2d5ea26349786e57"]]},{"id":"904086e697ba6c29","type":"modbus-client" ,"name" :"测试设备" , "clienttype" : "tcp","bufferCommands" : true,"stateLogEnabled" : false," queueLogEnabled": false,"failureLogEnabled" : true,"tcpHost" : "192.168.88.105" , "tcpPort" :"502","tcpType":"DEFAULT","serialPort":"/dev/ttyUSB","serialType":"RTU-BUFFERD" , "serialBaudrate" :"9600","serialDatabits":"8","serialStopbits":"1","serialParity":"none","serialConnectionDelay":"100","serialAsciiResponseStartDelimiter":"0x3A","unit_id":"1","commandDelay":"1","clientTimeout":"1000","reconnectOnTimeout":true,"reconnectTimeout":"2000","parallelUnitIdsAllowed":true,"showWarnings":true,"showLogs":true}]
今天的分享就到这里啦,EBYTE每一天都致力于更好的助力物联化、智能化、自动化的发展,提升资源利用率,更多串口服务器、数传电台、lora模块等无线数传模块产品更多资料,感兴趣的小伙伴可以登录我们的亿佰特官网和企业公众号(微信号:cdebyte)进行了解,也可以直接拨打400电话咨询技术专员!
相关阅读: