星纵UC5X1系列对接Modbus TCP功能
目录
一、概述
星纵物联LoRaWAN网关可以作为Modbus服务器,通过TCP或Modbus TCP协议有线方式对接水肥系统。本文介绍针对电磁阀控制器和电动阀控制器的Modbus TCP对接。
二、对接步骤
1、阀控器在网关NS上正常上线
进入Network Server–>设备,查看阀控器有激活且最新更新时间。
1、创建载荷编解码器
(1)针对UC511电磁阀控制器,手动修改编码器、对象映射函数。解码函数默认不用修改。
①编码函数修改为:
function Encode(fPort, obj) {
var bytes = [];
bytes.push(0xff);
bytes.push(0x1d);
if (obj.switch1 == 1 ) {
bytes.push(0x20);
bytes.push(0x00);
return bytes;
}
else if(obj.switch1 == 0 ){
bytes.push(0x00);
bytes.push(0x00);
return bytes;
}
else if(obj.switch2 == 1 ){
bytes.push(0x21);
bytes.push(0x00);
return bytes;
}
else if(obj.switch2 == 0 ){
bytes.push(0x01);
bytes.push(0x00);
return bytes;
}
}
②对象映射函数修改为:
{
“version”: “1.0.0”,
“bytes”: “01755C03010004C805000000”,
“object”: [
{
“id”: “valve_1”,
“name”: “valve_1”,
“value”: “”,
“unit”: “”,
“access_mode”: “RW”,
“data_type”: “BOOL”,
“value_type”: “UINT8”,
“bacnet_type”: “analog_value_object”,
“bacnet_unit_type_id”: 95,
“bacnet_unit_type”: “UNITS_NO_UNITS”
},
{
“id”: “valve_2”,
“name”: “valve_2”,
“value”: “”,
“unit”: “”,
“access_mode”: “RW”,
“data_type”: “BOOL”,
“value_type”: “UINT8”,
“bacnet_type”: “analog_value_object”,
“bacnet_unit_type_id”: 95,
“bacnet_unit_type”: “UNITS_NO_UNITS”
},
{
“id”: “battery”,
“name”: “Battery”,
“value”: “92”,
“unit”: “%”,
“access_mode”: “R”,
“data_type”: “NUMBER”,
“value_type”: “UINT8”,
“bacnet_type”: “analog_input_object”,
“bacnet_unit_type_id”: 98,
“bacnet_unit_type”: “UNITS_PERCENT”
},
{
“id”: “switch1”,
“name”: “switch1”,
“value”: “”,
“unit”: “”,
“access_mode”: “RW”,
“data_type”: “BOOL”,
“value_type”: “UINT8”,
“bacnet_type”: “analog_value_object”,
“bacnet_unit_type_id”: 95,
“bacnet_unit_type”: “UNITS_NO_UNITS”
},
{
“id”: “switch2”,
“name”: “switch2”,
“value”: “”,
“unit”: “”,
“access_mode”: “RW”,
“data_type”: “BOOL”,
“value_type”: “UINT8”,
“bacnet_type”: “analog_value_object”,
“bacnet_unit_type_id”: 95,
“bacnet_unit_type”: “UNITS_NO_UNITS”
}
]
}
(2)针对UC521电动阀控制器,手动添加解码函数、编码函数、对象映射函数。
①解码函数:
复制github上的解码函数即可codec/vendors/milesight-iot/uc52x/uc52x-decoder.js at release · Milesight-IoT/codec · GitHub
②编码函数:
function Encode(fPort, obj) {
var bytes = [];
bytes.push(0xf9);
bytes.push(0x19);
if (obj.switch1 == 1 ) {
bytes.push(0x00);
bytes.push(0x00);
bytes.push(0x64);
return bytes;
}
else if(obj.switch1 == 0 ){
bytes.push(0x00);
bytes.push(0x00);
bytes.push(0x00);
return bytes;
}
else if(obj.switch2 == 1 ){
bytes.push(0x01);
bytes.push(0x00);
bytes.push(0x64);
return bytes;
}
else if(obj.switch2 == 0 ){
bytes.push(0x01);
bytes.push(0x00);
bytes.push(0x00);
return bytes;
}
}
③对象映射函数:
{
“version”: “1.0.0”,
“bytes”: “01755C03010004C805000000”,
“object”: [
{
“id”: “valve_1_opening”,
“name”: “Valve 1 Opening”,
“value”: “”,
“unit”: “”,
“access_mode”: “R”,
“data_type”: “NUMBER”,
“value_type”: “UINT8”,
“bacnet_type”: “analog_input_object”,
“bacnet_unit_type_id”: 98,
“bacnet_unit_type”: “UNITS_PERCENT”
},
{
“id”: “valve_2_opening”,
“name”: “Valve 2 Opening”,
“value”: “”,
“unit”: “”,
“access_mode”: “R”,
“data_type”: “NUMBER”,
“value_type”: “UINT8”,
“bacnet_type”: “analog_input_object”,
“bacnet_unit_type_id”: 98,
“bacnet_unit_type”: “UNITS_PERCENT”
},
{
“id”: “battery”,
“name”: “Battery”,
“value”: “92”,
“unit”: “%”,
“access_mode”: “R”,
“data_type”: “NUMBER”,
“value_type”: “UINT8”,
“bacnet_type”: “analog_input_object”,
“bacnet_unit_type_id”: 98,
“bacnet_unit_type”: “UNITS_PERCENT”
},
{
“id”: “switch1”,
“name”: “switch1”,
“value”: “”,
“unit”: “”,
“access_mode”: “RW”,
“data_type”: “NUMBER”,
“value_type”: “UINT8”,
“bacnet_type”: “analog_value_object”,
“bacnet_unit_type_id”: 95,
“bacnet_unit_type”: “UNITS_NO_UNITS”
},
{
“id”: “switch2”,
“name”: “switch2”,
“value”: “”,
“unit”: “”,
“access_mode”: “RW”,
“data_type”: “NUMBER”,
“value_type”: “UINT8”,
“bacnet_type”: “analog_value_object”,
“bacnet_unit_type_id”: 95,
“bacnet_unit_type”: “UNITS_NO_UNITS”
}
]
}
三、阀控器数据正常上报
在Network Server–>数据流查看阀控器上报的数据是否是正常解析,如下格式代表是正常解析。
(1)电磁阀控制器:
(2)电动阀控制器:
四、创建Modbus TCP服务器
在协议集成–>Modbus Server–>Server,点击添加;
参数解释:
名称:自定义;
网络接口:选择eth0;
端口:自定义,与Modbus poll工具上的端口一致即可;
连接方式:选择Modbus TCP;
Server ID:自定义,与Modbus poll工具上的端口一致即可;
描述:自定义;
五、创建Modbus对象
(1) 在协议集成–>Modbus Server–>Modbus对象,点击添加。
(2)勾选对需要添加的对象。
(3) 添加成功后可以看到对应地址。
(4)对应的数据可以采集到,当数据上传时数据会有更新。
电磁阀控制器:
电动阀控制器:
六、Modbus poll采集上行数据
(1) modbus poll工具使用modbus TCP模式,信息与网关上配置一致。
(2)点击”Setup-Read/Write Definition”进行配置采集参数。
设置对应的参数后点击OK。
● Slave ID:创建服务时配置的从站地址;
● function:配置采集寄存器的功能码,需要与网关上配置寄存器类型一致;
● Address:采集地址(数值根据设置显示的寄存器地址进行配置);
● Quantity:采集寄存器数量。
(3)对于UC511,在Display中选择对应的数据格式类型,电池电量需要选择Long DC BA。
(4)检查最终采集到的数据显示内容情况正确。
备注:针对电动阀控制器和电磁阀控制器的上行数据的操作方式相同。
七、Modbus poll下发控制
(1) 打开Modbus Poll工具,进入Setup–>Read/Write Definition–>Function,改成01 Read Coils(0x),如下图:
从网关上来看,寄存器地址0代表控制开关电磁阀接口1,寄存器地址1代表控制开关电磁阀接口2。
(1)操作关闭电动阀1,如下步骤:
(2)操作关闭电动阀2,如下步骤:
备注:Value是on时代表下发打开,Value是off时代表下发关闭。
(3)在网关上即可看到通过Modbus TCP工具下发的数据。
备注:针对电动阀控制器和电磁阀控制器的下发控制的操作方式相同。