工业物联网关-modbus数据采集程序(1-程序设计)

写代码之前

最近代码写慢了,磨了好久都没开始动手写代码。考虑的东西越多越多,甚至自己都认为过虑了。就像这个程序,写代码之前估计花了大半天或者一天在思考怎么写,不知道是好事还是年纪大了。所以专门写篇文章,把自己思考的内容写出来,作个回顾。

一, 需求

需求一定要了解清楚才动手,不然后面改出花来。这个程序看起来不算复杂,要实现的功能就是通过串口或者TCP实现Modbus协议,采集数据并存储到redis去,也会处理写操作和透传。(现在回顾起来,当时慢的一个原因是产品定义是自己,需求其实没想清楚,想需求时又考虑了技术实现,应该要优化。)

1.1 架构中的层次及接口

系统业务软件整体架构在《工业物联网关-整体框架》文章有介绍,业务软件架构如下图:
进程模块划分
当前要实现的是上图中"底层采集程序(C语言)"这个软件,从图可以看出,上层接口是redis软件,包括了缓存和消息队列接口。下层是串口和网口,对接的是终端设备,软件要实现modbus-rtumodbus-tcp通信。

1.2 配置

需要通过串口和网口与哪些设备通信,采集的数据区有哪些,数据要解析为什么变量,这些都需要用户配置。我们网关提供了web界面给用户,支持手动和excel(CSV)导入的方式生成配置文件,程序读取这些配置后才能正常工作。
参考了物模型的概念(后面有更多的内容),有产品,设备配置文件,里面包括了数据区和变量的配置。串口和网口配置文件,主要包括通信参数和外挂了哪些设备。
一些思考:web 那边有提过下发配置给网关,可能跟现在差不多,是json格式的。这个兼容性的问题就值思考了,web那边是随时可以改的。网关的话,发货后再改就麻烦,就算是远程升级也是麻烦。目前的想法是找个标准,大家支持,web端可以生成配置文件,网关来导入,例如都支持thingsboard的标准。如果web要改,那恐怕是要支持另一个标准了,同时网关也得跟着改。

1.3 log & debug

开发阶段可以用gdb和printf来调试,后期debug主要靠log了,另外需要在web界面上dump通信的报文,以调试设备通信及协议等问题。log 支持开关和打印等级功能,支持输出到文件功能,要注意log文件不能太大。(调试和LOG相关花了不少时间,包括打印开关和等级控制,输出到文件后怎么清掉,web端怎么读log。其实最开始应该就用printf和gdb好了,log什么的后面再改,反正不影响程序逻辑。)

二, 数据结构

2.1 数据格式转换

在物联网之前,web跟硬件设备交集不多,又因为各自生存土壤的区别,数据存储及格式会有差异。对资源非常吝啬的硬件设备喜欢用寄存器存储数据,1个字节1个bit都斤斤计较,以节省存储空间和减少CPU(MCU)的运算。而web端相对财大气粗,不同含义的数据用变量解耦出来,分开处理和存储。更喜欢考虑分布式存储,负载均衡等技术。一个典型的例子是设备有个寄存器,有8bit,低4个bit代表某个数值,范围就是0-15,高4个bit分别代表某个硬件开关,例如为0就亮灯,为1就灭灯之类。到了web端通常用1个整型变量和1个boolean数组(或4个boolean变量)来存储。
网关的其中一个任务就是把设备的数据格式转化为web端的数据格式。参考过往modbus协议的生态和物模型的概念,常规的转换流程是: 寄存器 - 数据区 - 变量,双向的。网关是不知道数据的含义的,所以是提供配置方式,让用户来配置。
变量可以用一系列的属性来描述,下图是阿里云配置变量属性的界面:
属性配置界面
配置完成后生成一个json格式的数据结构:

{
   
   
    "code": "energy_ALL",
    "name": "合相有功电能",
    "unit": "Kwh",
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值