工控机上位机软件的开发历程(二)[通俗易懂]

工控机上位机软件的开发历程(二)[通俗易懂]仪器归一化设计这是具体内容的第一篇,我们先来讲述仪器的归一化设计。仪器是各种功能都有的,我只举我们在环境监测这方面所用到的仪器。我们要测试水是不是有污染物质,污染到什么程度,我们要测试水体的高锰酸盐指数、氨氮、总磷、总氮等值。我们的站房有一个后备电源,我们要知道市电是否断电了,是否在用备用电源。我们的站房是有空调的,我希望知道站房的温度和湿度,于是就有了一个温湿度计。我们可能还会有流量计、…

大家好,又见面了,我是你们的朋友全栈君。

仪器归一化设计

这是具体内容的第一篇,我们先来讲述仪器的归一化设计。

仪器是各种功能都有的,我只举我们在环境监测这方面所用到的仪器。我们要测试水是不是有污染物质,污染到什么程度,我们要测试水体的高锰酸盐指数、氨氮、总磷、总氮等值。我们的站房有一个后备电源,我们要知道市电是否断电了,是否在用备用电源。我们的站房是有空调的,我希望知道站房的温度和湿度,于是就有了一个温湿度计。我们可能还会有流量计、DTU、数采仪等仪器。这些仪器跟工控机的连接也不尽相同,有的使用串行线,有的使用网线。用网线的仪器,有的作为客户端,有的作为服务端,有的使用UDP。总之,这些仪器的通讯协议是五花八门的,通信链路也是有区别的。

但我们需要对仪器做出归一化设计。

其实无论仪器有什么功能,工控机对仪器的操作无非就两个:读和写。读的话,可能是读到测量的值、仪器的状态等;写的话,就是启动仪器测量、修改仪器的参数等。而读和写的操作,都是通过发送和接收完成的。虽然通信协议各不相同,但我们总是可以把发送和接收的内容转化为最基础的字节流。要发送怎样的字节流,接收到的字节流如何解释,就要根据仪器的特性去定义了。

根据这样的特点,我们为所有仪器定义了一个基类,它包含了发送字节流和接收字节流两个方法。而所有仪器类,都继承自这个基类。

工控机上位机软件的开发历程(二)[通俗易懂]

每个仪器特定的类,只需要完成拼装发送的字节流,和解析接收的字节流即可,它不需要理会如何发送和接收。而实际上的发送和接收,我们知道链路是有多种的,如上面提到的串行线和网线。使用哪种方式去传输,我们需要根据仪器的属性去判断。如下图所示的方法,在基类里实现。

工控机上位机软件的开发历程(二)[通俗易懂]

解决了上面仪器类的结构设计以后,我们需要考虑仪器的属性如何表示和存储。我们把所有仪器都称为设备,设备包含以下内容:

(1)名称。

(2)传输方式,以及传输的参数。例如用串口,那应该有串口号、波特率等。如果用网线,应该有IP、端口等。

(3)使用的通信协议。选定之后,上位机能够找到相应的通信协议类,对字节流进行操作。顺便一说,我们把通信协议类用反射的方法去做,每个协议是一个dll,选择不同的协议即会执行不同的代码。

(4)因子列表。

没错,说到这里,我们就发现,设备里有一个因子的概念。因子是什么?这个比较难解释。从最原始的因子来看,因子就是仪器的测量值。例如我们有一台温湿度计,它的测量值会有两个,分别是温度和湿度。我们就把温度和湿度作为两个因子。我们对因子的概念进行扩展,把状态也作为因子。例如仪器的工作状态、故障状态,都可以看作是一个个的因子。甚至,我们把控制仪器的命令,也看成是因子。例如是启动测量、更换运行模式,每一个动作都看成是一个因子。这样下来之后,仪器的所有功能,都变成了因子的列表。因子有很多属性,但不是所有因子都一样的。名称是我们想到的唯一一个共性属性。我们在实际的开发过程中,定义了几种因子:

(1)实际因子:就是测量值。它应该有单位、超标限制、因子地址(Modbus协议)等属性。

(2)计算因子:跟实际因子类似,只是它不是直接读取仪器值得到的,而是根据实际因子计算出来的。这样的话,计算因子就要有一个表达式的属性,例如是:温度*9/5+32

(3)状态因子:仪器的状态。它的值不一定是数,可能是一个字符串。

(4)反控因子:对仪器的控制命令。可以用一个数字去表示控制的类型,只需要在协议类里面解释清楚即可。

通过上面的方法,我们把所有仪器都归一成统一的类了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/145069.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • bootstrap-fileinput使用手册

    bootstrap-fileinput使用手册一、准备1、插件下载地址:https://github.com/kartik-v/bootstrap-fileinput/下载后的压缩包解压文件夹内容如下:  js:插件核心js代码,引用fileinput.min.js/fileinput.js即可,默认插件语言为英文,如需要中文需要引用js/locales/zh.js(其他语言引用相应的js文件) …

  • 你知道如何从零开始学c++游戏编程吗「建议收藏」

    你知道如何从零开始学c++游戏编程吗「建议收藏」在软件开发中,游戏开发这个方向看起来目标很明确,但其实是个领域很广的方向,入门的时候如果得不到指点一二,很容易误入歧途,相反,如果走这条路之前能得到前人的一些指路,是可以事半功倍的。平台与编程语言选择首先,游戏开发的平台就有很多类型:个人主机平台:Windows、Linux、MacOC;移动平台:iOS、Android、WindowsPhone、BlackBerryOS、Symbian;专业主…

  • Java:JVM垃圾回收机制[通俗易懂]

    Java:JVM垃圾回收机制[通俗易懂]JVM垃圾回收机制提到Java垃圾回收机制就不得不提到一个方法:system.gc()用于调用垃圾收集器,在调用时垃圾收集器将运行以回收未使用的内存空间,它将尝试释放被丢弃对象所占用的空间。作为程序员有必要了解gc方法,这也是在面试中经常会被问及的问题:我们从三个方面来理解gc:1.JVM如何确定哪些空间能被回收?2.JVM会在什么时候进行垃圾清除的动作?3.JVM如何清除垃圾的?1.JVM如…

  • Java 集合概览

    Java 集合概览JavaCollectionAPI提供了一些列的类和接口来帮助我们存储和管理对象集合。其实Java中的集合工作起来像是一个数组,不过集合的大小是可以动态改变的,而且集合也提供了更多高级功能。有了JavaCollectionAPI,我们就不需要自己编写集合类了,大部分Java集合类都位于java.util包里面,还有一些和并发相关的集合类位于java.util.concurrent包中。下面就介绍

  • stringutil.isnotempty_中低腰和低腰的区别

    stringutil.isnotempty_中低腰和低腰的区别学习中遇到了这个地方,搜了一下,这位仁兄总结的挺详细,就粘了过来原文链接(https://www.cnblogs.com/dixinyunpan/p/6088612.html)isNotEmpty(str)等价于str!=null&&str.length>0isNotBlank(str)等价于str!=null&&str…

  • Ubuntu卸载python3.6「建议收藏」

    Ubuntu卸载python3.6「建议收藏」注意:这里说一下,系统自带的python3.6可别乱删,这个是我自己下载的python3.6若你们有想卸载系统自带的python3.6,可千万别去卸载!一般会开机都开不起!安装多余的python3.6没有用,才使用下列命令卸载python3.6及其一些依赖软件包命令:sudoaptautoremovepython3.6…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号