姚仪牌温度控制仪表-边缘网关-MQTT接入ThingsKit
1、准备工作
本次测试所需硬件为姚仪牌温度传感器CU50、姚仪牌温度控制仪表XMTD-908以及各类线材:
姚仪牌温度控制仪表,型号:XMTD-908
购买地址:
纵横边缘网关(本次测试使用),型号:EG8000
购买咨询地址:
准备好设备后按照相关说明书接线,温度控制仪表需要接入一组220VAC电源供电以及AB数据线连接边缘网关RS485口,本次测试组网方式为以太网。
2、确定设备数据点
2-1、确定设备功能
本文档只讨论针对该设备主要数据点的获取并展示在平台上进行显示。
XMTD-908温度控制仪表内置一套逻辑进行设备继电器的操作(可控制水泵工作达到降温效果),具体为:
1、测量温度值PV是否大于温度预设值SV来决定水泵继电器的输出,制冷状态下PV大于SV则水泵继电器输出通路状态,PV小于SV则输出断路状态(默认回差0.5)。
2、测量温度值PV大于温度报警值ALM1时触发ALM1的报警继电器输出通路状态,低于则输出断路状态(默认回差0.5)。
我们需要采集的数据点就包括:测量温度值PV、温度预设值SV、温度报警值ALM1、水泵继电器输出状态relayStatus(开/关)、报警继电器状态ALM1Status(开/关)。
2-2、确定数据点通讯方式
XMTD-908温度控制仪表支持Modbus通讯,直接使用设备上的RS485口与边缘网关直连即可。
由于该设备只支持单寄存器读操作(功能码03)和写操作(功能码06),此处列出所有数据点寄存器地址:
数据点名称 | Modbus地址/PLC组态地址 |
测量温度值PV | 1001H/44098 |
温度预设值SV | 0000H/40001 |
温度报警值ALM1 | 0001H/40002 |
水泵继电器输出状态relayStatus | 1101H/44354 |
报警继电器状态ALM1Status | 1200H/44609 |
💡 提示
边缘网关的Modbus请求节点填写起始地址使用的是PLC组态地址,但我们一般接触的设备提供的寄存器地址都是Modbus地址。这里解释一下他们的对应关系:
线圈(DO)地址(功能码01):00000~09999
触点(DI)地址(功能码02):10000~19999
输入寄存器(AI)地址(功能码04):30000~39999
输出寄存器(AO)地址(功能码03):40000~49999
从Modbus地址转换为PLC组态地址首先需要确定该Modbus地址的寄存器类型,由寄存器类型决定PLC组态地址首位,然后将Modbus地址由十六进制转换为十进制确定PLC组态地址后四位(注意Modbus第一位是0000H,而PLC组态地址是1开始)。
例如:输入寄存器0005H转换为PLC组态地址则是30006。
💡 注意
表格中测量温度值PV的Moudbus地址是1001H,为什么PLC组态地址就是44098呢?转换过程是这样的:PV是输出寄存器(功能码03)则首位为4,1001H转换为十进制则是4097,又由于Modbus地址从0开始PLC组态地址从1开始,所以4097需要加1等于4098,组合起来就得到了1001H的PLC组态地址44098。
3、配置边缘网关
3-1、登录边缘网关
首次如何登录边缘网关请参照这边文档:
此处为语雀内容卡片,点击链接查看:https://yunteng.yuque.com/avshoi/xiv0kd/sizhghbprcl3gez3
3-2、进入可视化编程界面
💡 提示
进入该界面准备进行可视化编程。
3-3、读取数据点
💡 注意
边缘网关的修改需要点击右上角“部署”才能生效。
💡 提示
按照动图中操作可以读出到测量温度值PV,由于该设备数据结构原因PV实际值需要除以10即当前的PV为23.9度。
💡 提示
本文档调用的串口节点为高级串口节点,但实际操作中串口和高级串口节点都可以在这个场景下使用。
💡 注意
使用Modbus解析节点是应当在Modbus请求节点提前设置寄存器解析内容,寄存器解析类型需要根据数据点格式决定(Modbus寄存器使用默认类型即可)。
💡 补充
该设备默认地址01H,通讯参数波特率9600,数据位8,校验位none,停止位1。
3-4、封装读取结果
通过3-3的操作,我们已经拿到了温度控制仪表的测量温度值PV,接下来需要将其处理为平台可以处理的报文格式。
//从寄存器解析出来的当前温度应该除以10才是真实值
var askTemp = msg.payload / 10;
//封装网关子设备的其中一个物模型传递给平台
var jsonOject = {
"测试湿帘控制": [
{
"realtime": askTemp
}
]
}
msg.payload = jsonOject;
return msg;
💡 提示
本函数是针对平台MQTT网关设备进行接入的json格式。
💡 补充
本设备其他数据点都可以按照此流程进行数据采集上传至平台,只需要修改节点参数即可。
例如,读取并封装温度给定值SV:
//从寄存器解析出来的温度给定值应该除以10才是真实值
var askTemp = msg.payload / 10;
//封装网关子设备的其中一个物模型传递给平台
var jsonOject = {
"测试湿帘控制":[
{
"givenValue": askTemp
}
]
}
msg.payload = jsonOject;
return msg;
💡 提示
其余的三个数据点是用一样的流程进行读取封装,但需要注意数据点的类型有所不同而修改方法。例如水泵继电器输出状态relayStatus和报警继电器状态ALM1Status就是开关量直接读取赋值即可不用除以10。
//从寄存器解析出来的报警1触发值应该除以10才是真实值
var askTemp = msg.payload/10;
//封装网关子设备的其中一个物模型传递给平台
var jsonOject = {
"测试湿帘控制":[
{
"ALM1Value": askTemp
}
]
}
msg.payload = jsonOject;
return msg;
//报警1状态是布尔值
var askTemp = msg.payload;
//封装网关子设备的其中一个物模型传递给平台
var jsonOject = {
"测试湿帘控制":[
{
"ALM1Status": askTemp
}
]
}
msg.payload = jsonOject;
return msg;
//继电器状态是布尔值
var askTemp = msg.payload;
//封装网关子设备的其中一个物模型传递给平台
var jsonOject = {
"测试湿帘控制":[
{
"relayStatus": askTemp
}
]
}
msg.payload = jsonOject;
return msg;
3-5、数据指向平台
读取到5个数据点后的流程如下图:
添加一个MQTT发布节点并指向平台:
💡 提示
本文档采用MQTT网关的方式接入设备,所以这里使用的topic是v1/gateway/telemetry,填写MQTT broker配置时的客户端ID、账号、密码都可以自定义,需要和平台MQTT Basic一致。
💡 注意
测试中使用服务器地址以及端口需要根据实际情况填写。
体验账号
服务器地址:101.133.234.90
端口号:1883
💡 提示
配置完毕后我们可以看到MQTT发布节点的状况为“连接中”,证明现在还无法连接上平台。我们需要在下一个章节配置平台。
4、Thingskit配置
4-1、创建产品
在边缘网关内将数据封装完毕后,在平台端建立与边缘网关的MQTT连接。
💡 提示
不选择接入协议直接创建产品,产品的接入协议类型为DEFAULT并支持MQTT、HTTP、COAP三种协议。
4-2、创建物模型
❓ 什么是物模型?
物模型是产品数字化的描述,定义了产品的功能,物模型将不同品牌不同品类的产品功能抽象归纳,形成“标准物模型”,便于各方用统一的语言描述、控制、理解产品功能。简单来说,物模型就是设备的具体属性如湿度、温度、继电器状态等在平台上的体现形式。
💡 提示
动图中只创建了一个物模型,实际上我们要创建五个物模型,由于篇幅原因就没有暂时添加过程,添加所有物模型的界面如下图展示,文档提供了本次测试用物模型导入内容供大家对比。
{
"properties": [
{
"functionName": "报警1",
"identifier": "ALM1Status",
"accessMode": "r",
"specs": {
"dataType": {
"type": "BOOL",
"specs": {
"boolOpen": "开",
"boolClose": "关"
}
}
},
"extensionDesc": null
},
{
"functionName": "当前温度",
"identifier": "realtime",
"accessMode": "r",
"specs": {
"dataType": {
"type": "DOUBLE",
"specs": {
"unit": {
"value": "°C",
"label": "摄氏度 / °C",
"key": "°C"
},
"unitName": "摄氏度 / °C"
}
}
},
"extensionDesc": null
},
{
"functionName": "湿帘状态",
"identifier": "relayStatus",
"accessMode": "r",
"specs": {
"dataType": {
"type": "BOOL",
"specs": {
"boolOpen": "开",
"boolClose": "关"
}
}
},
"extensionDesc": null
},
{
"functionName": "温度给定值",
"identifier": "givenValue",
"accessMode": "r",
"specs": {
"dataType": {
"type": "DOUBLE",
"specs": {
"unit": {
"value": "°C",
"label": "摄氏度 / °C",
"key": "°C"
},
"unitName": "摄氏度 / °C"
}
}
},
"extensionDesc": null
},
{
"functionName": "警报1触发值",
"identifier": "ALM1Value",
"accessMode": "r",
"specs": {
"dataType": {
"type": "DOUBLE",
"specs": {
"unit": {
"value": "°C",
"label": "摄氏度 / °C",
"key": "°C"
},
"unitName": "摄氏度 / °C"
}
}
},
"extensionDesc": null
}
],
"services": [],
"events": []
}
4-3、创建设备
4-3-1、创建网关设备
💡 提示
如果选择设备所属组织没有选项可点击“新建组织”。
💡 提示
创建设备后,需要修改设备凭证才能让设备上线,设备凭证必须与边缘网关MQTT发布节点一致。
💡 注意
平台设备创建后建议在边缘网关重新部署。
4-3-2、修改网关子设备
当创建网关设备并让边缘网关与平台建立连接后,平台会自动创建一个网关子设备:
修改过程:
4-4、数据验证
💡 提示
可以看到温度控制仪表上的数据与平台物模型展示数据一致。