需求:
电力监控行业,常需要对一些仪表\仪器进行数据采集和远程控制,采集数据的方式常用串口、以太网,一般情况下使用MOBUS RTU TCP/IP。仪表、仪器数据内容不同。一般情况下都会使用组态软件来开发,但是对一些公司来说,没有必要使用一个大的平台,而且在价格方面也不低。而且不易控制。
分析:
把采集数据单独进程,设计成通用的数据采集,通过共享内存来实现进程间数据交互
设计:
共享内存
把每一种类型的仪表数据设计成一个结构体,然后每一个仪表,一个唯一标识,设定一个统一的规则生成唯一标识的方式。每一个唯一标识对应一个偏移长度,当需要读写内存里,可以通过唯一标识访问数据。
其实这样就实现一个简单内存关系数据库,在后台更新数据和网络这种比较耗时的操作做成一个通用模块,而又不影响人机交互界面的设计,这样子就相对独立。UI进程与后台数据采集进程共同使用唯一标识生成规则,则可以方便的读数据用于数据分析。
数据采集
对于数据采集,一般都是有采集命令,数据采集作为主站发送采集命令,仪表、仪器作为从站返回数据,很有典型的代表就是modbus协议,
后台数据采集 生成过程: 读取用户配置文件(得到仪表仪器)-->按规则排序-->生成采集命令队列,依次发送命令采集数据。其中有一些控制命令,如远程序操作仪表。就有了两种命令,一种采集命令,一种控制命令。控制命令是在用户使用时发生,而采集命令是一个周期性的命令,需要重复的执行。
后台数据采集就有一个队列控制。
通过这样的一个设计后,当用户进行远程控制时,能及时的响应用户的操作,从而又不理采集数据整体结构,添加命令需要用到多进程间的通信。