当前位置: 首页 > news >正文

DGIOT-Modbus-RTU控制指令05、06的配置与下发

file

[小 迪 导 读]:伴随工业物联网在实际应用中普及,Modbus-RTU作为行业内的标准化通讯协议。在为物联网起到采集作用的同时,设备的控制也是一个密不可分的环节。


场景解析:在使用Modbus对设备进行采集后,可以通过自动控制和手动控制来实现动环或者设备的运行状态调节。因此,自动控制可以通过配置规则引擎来实现;而手动控制需要用户自行根据设备的指令标识完成配置。


末尾提供源码供测试使用


Modbus-RTU控制指令05、06的配置与下发

05-写单个线圈指令格式:
01 05 00 00 FF 00 8C 3A(开)
01 05 00 00 00 00 CD CA(关)

06-写单个寄存器指令格式:
01 06 00 02 00 B1 E8 7E
向设备编号为0X01的寄存器上,在第0X02的寄存器地址写入177实现控制。


实现流程

1.创建Modbus通道,将图片中1、2、3、4位置处的数据补充完整。

编号注释
1任取
2任取
3服务器开放的端口号,不要冲突
4设备登录报文校验,*代表任意字符

file

2.创建产品。首先需要创建产品,为为后期大批量的同种产品接入提供模板,同时通过对物模型的配置为后续的指令下发提供数据标识。根据图片,我们在产品管理内创建产品,这里的采集通道将步骤1内创建的Modbus采集通道挂载进来。

file

3.搭建物模型。在拿到设备的手册后,厂商有提供指令模板或者由用户通过串口调试工具自行测得设备的控制指令集。操作类似modbus的采集物模型指令,区别在于将采集频率改为不采集(自动上报)。而后的寄存器功能码对照设备指令集选择。报文序号默认填1。根据图片参考。

file

file

4.上线设备。完成物模型的搭建后,重启刚才用到的3个通道,将我们的设备上线到平台,此时可以获得设备的ID号以填补后续的api标识。

file

5.低代码配置。进入刚才创建的产品,对照下图完成Profile控制指令的创建。这是专用于控制模块搭建的模板。

file

(1)首先生成一个表单,然后添加你需要的模板个数。这里选用的模块是“开关”。
(2)配置字段名。这里的各个字段名对应物模型中的标识符。

file

(3)勾选修改即提交。请求方式为PUT,接口地址为iotapi/classes/Device/XXXXXXXXXXX [这里的XXX为步骤4中的设备id号]
自定义适配器为必选项。
(4)触发值。这里设置触发05、06指令后下发的数据。对于05功能码而言,1代表实际报文中的FF即开;0代表实际报文中的00即关。对于06功能码而言,此处的值为实际的需求值。
file

file

6.成果展示。再次上线设备后,我们在设备管理内找到设备,点击后面的“控制”按钮进入到配置好的界面。然后通过点击触发开关实现数据的控制指令的数据下发。
file


物模型代码

{"properties": [{"accessMode": "rw","dataForm": {"address": "0X10","afn": "","byteType": "","bytelen": "","collection": "%{s}","control": "%{d}","countcollection": "%{s}","countround": "all","countstrategy": 20,"da": "","data": "null","dt": "","iscount": "0","offset": 0,"operatetype": "readCoils","order": 2,"originaltype": "short16_AB","protocol": "MODBUSRTU","rate": 1,"round": "all","slaveid": "0X10","strategy": "主动上报"},"dataSource": {"": [],"_dlinkindex": 1,"address": "0X02","operatetype": "writeHreg","originaltype": "bit","registersnumber": "1","slaveid": "0X01"},"dataType": {"das": [],"specs": {"0": "关","15": "开"},"type": "enum"},"devicetype": "控制2","identifier": "control2","isaccumulate": false,"isshow": false,"isstorage": false,"moduleType": "properties","name": "control2","required": true,"updateAt": "1693218087737","index": 0},{"accessMode": "rw","dataForm": {"address": "0X10","afn": "","byteType": "","bytelen": "","collection": "%{s}","control": "%{d}","countcollection": "%{s}","countround": "all","countstrategy": 20,"da": "","data": "null","dt": "","iscount": "0","offset": 0,"operatetype": "readCoils","order": 1,"originaltype": "short16_AB","protocol": "MODBUSRTU","rate": 1,"round": "all","slaveid": "0X10","strategy": "主动上报"},"dataSource": {"": [],"_dlinkindex": 1,"address": "0X01","operatetype": "writeCoil","originaltype": "bit","registersnumber": "1","slaveid": "0X01"},"dataType": {"das": [],"specs": {"0": "关","1": "开"},"type": "enum"},"devicetype": "控制1","identifier": "control1","isaccumulate": false,"isshow": false,"isstorage": false,"moduleType": "properties","name": "control1","required": true,"updateAt": "1693207951719","index": 1},{"accessMode": "rw","dataForm": {"address": "0X10","collection": "%{s}","control": "%{d}","countcollection": "%{s}","countround": "all","countstrategy": 20,"data": "null","iscount": "0","offset": 0,"operatetype": "readCoils","order": 0,"originaltype": "short16_AB","protocol": "MODBUSRTU","rate": 1,"round": "all","slaveid": "0X10","strategy": "主动上报"},"dataSource": {"": [],"_dlinkindex": 1,"address": "0X00","operatetype": "writeCoil","originaltype": "bit","registersnumber": "1","slaveid": "0X01"},"dataType": {"das": [],"specs": {"0": "关","1": "开"},"type": "enum"},"devicetype": "控制0","identifier": "control0","isaccumulate": false,"isshow": false,"isstorage": false,"moduleType": "properties","name": "control0","required": true,"updateAt": "1693202658593","index": 2}]
}

低代码json

return {...api,data:{profile:{control0:api.data.control0  }}
}

【此处为开关控件-验证-发送适配器的接口代码。其中control0为该组件绑定的物模型的标识符】


[小 迪 点 评]

  • 手动配置控制指令,一次配置支持后续大量同类设备接入
  • 丰富的可拓展性,通过配置不同的api接口和页面实现一个网页全控制效果

想了解更多 dgiot 的具体细节,欢迎大家在GitHub上查看相关源代码。

http://www.lryc.cn/news/162463.html

相关文章:

  • 机器学习实战-系列教程8:SVM分类实战3非线性SVM(鸢尾花数据集/软间隔/线性SVM/非线性SVM/scikit-learn框架)项目实战、代码解读
  • 计算机网络-谢希任第八版学习笔记总结
  • 手写Spring:第5章-注入属性和依赖对象
  • 初识集合框架 -Java
  • 目标检测笔记(十五): 使用YOLOX完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
  • 深眸科技自研轻辙视觉引擎,以AI机器视觉赋能杆号牌识别与分拣
  • Shell命令管理进程
  • python创建exe文件
  • 【数据结构】AVL树的插入与验证
  • 9.3.3网络原理(网络层IP)
  • 代码随想录算法训练营第四十八天| LeetCode121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III
  • C++新经典10--vector以及其使用
  • std : : vector
  • AJAX学习笔记8 跨域问题及解决方案
  • webhook--详解(gitee 推送)
  • 高速路自动驾驶功能HWP功能定义
  • Leetcode113. 路径总和 II
  • 分布式锁之redis实现
  • Idea中如何在一个项目中引入其他子模块?
  • UDP协议概述
  • Python-tracemalloc-跟踪内存分配
  • 02 CSS技巧
  • Yarn资源调度器
  • android上架备案公钥和md5获取工具
  • SpringBoot系列(12):SpringBoot集成log4j2日志配置
  • HTML事件列表
  • 并发-Executor框架笔记
  • 【C进阶】分析 C/C++程序的内存开辟与柔性数组(内有干货)
  • 深入理解 JVM 之——字节码指令与执行引擎
  • C++:vector