C#实现数据采集系统-数据反写(3)ModbusTcp写入数据模块开发 线圈基本都是单个写入,这里就使用05功能码寄存器写入可能多个同时写入,如int32,float等,需要四个字节,则需要2个寄存器,并且数据的两个寄存器是连续的,,其他的如Int64,double,则需要4个寄存器,我们可以一起写入调高效率。跟读报文一样,定义一个写入报文的头,前10个报文,再接收到写入数据是再在后面接上对应的数据字段然后再初始化的时候修改从站地址。
C#实现数据采集系统-数据反写(2)消息内容处理和写入通信类队列 在ModbusTcp通信类中,添加一个写入队列和写入方法,写入点位先添加在队列中,然后再读数据间隙中,实现写入。处理消息,将消息转换成对应点位和值,然后调用modbustcp的写入方法。然后在启动的时候,订阅各个设备ID的写入主题,添加控制方法。用于存储每个设备的通信类,使用键值对。存储设备ID和通信类,用于快速查找。实现消息订阅方法-设备控制。
C#实现数据采集系统-数据反写(1)MQTT订阅接收消息 订阅方法实现:订阅主题,添加到_topicActions,如果已经连接,则直接订阅,没有连接,则等待连上的时候自动订阅,增加锁来确保订阅成功。然后需要一个键值对用于存储这个关系。在连接方法中,添加订阅。
C#实现数据采集系统-周期配置、功能配置 之前采集、推送周期都是写死的现在就是新增一个需求,需要能够配置采集时间,比如我想1s采集一次,5s采集一次或者1分钟采集一次,然后定时推送也是,如此,我想设置推送的时间;还有定时推送和变化推送功能我可以配置是否开启关闭,有时候我只需要一种推送功能即可这样我们就可以在配置中增加这几个个参数。
visual studio使用技巧:快速生成Json、XML对应类 在项目中经常用到json或者xml作为配置文件,进行序列化和反序列化就需要有对应的类,重新写一遍类就比较麻烦,这里就讲一下通过visual studio快速生成json或者xml对应类型的方法。
C#实现数据采集系统-系统优化服务封装 现在我们调用modbustcp和mqtt都直接在Program,所有加载和功能都混合在一起,比较难以维护类似asp.net core项目的Program.cs代码如下,构建服务配置和启动要实现的效果,Main方法中就是一个服务启动,只需要几行代码。
C#实现数据采集系统-配置文件化 配置信息ip端口,还有点位信息,什么的都是直接在代码里直接写死,添加点位,修改配置,比较麻烦,每次修改都需要重新生成打包。所以将这些配置都改成配置文件,这样只需要修改配置文件,程序无须修改,即可更新。配置代码:如果我们有100个采集,一个个去添加就很累,或者ip地址改了,都要重新改了打包发布再部署所以将这些属性和信息都改成配置文件。
C#实现数据采集系统-modbustcp数据通知 在ModbusTcp模块中已经能够获取到正确的plc值,接下来做的就是如何让外部调用的程序获取到相关的数据,主要就是两种方法:通过对象属性进行共享;通过事件进行推送。
C#实现数据采集系统-Tcp粘包处理 Tcp通信中会出现粘包的情况,Tcp数据不是完全一收一发,而是会将接收到数据存在一个接收缓冲区,等到调用接收的把数据从缓冲区取出来大部分时候,我们收发消息频率不高,看上去就是发一条,收一条,完整数据;理论上,接收一次,是会出现各种情况,粘包的几种情况示例:比如 modbustcp响应报文,我们查询三次,正常是收到三条下面这样报文123。
C#实现数据采集系统-字节序处理和代码优化 C# 小端模式modbustcp中,寄存器都是两个字节,寄存器内部两个字节都是大端存储,如果需要存储int32,float,double等数据,则需要2个或者更多寄存器,目前大部分plc在处理时,寄存器之间都是采用小端存储,寄存器里是大端,形成了小大端模式,就是CD AB,GHEFCDAB大端 ABCD小端DCBA小大端模式CD ABC#中,都是小端模式存储,所以处理就是CDAB→DCBA,GHEFCDAB→HGFEDCBA。
C#实现数据采集系统-查询报文处理和响应报文分析处理 线圈:一个字节可以表示8个地址,1-8个线圈只需要1个字节,9-16个两个字节,以此类推。循环所有点位信息,然后修改发送报文的功能码,起始地址,读寄存器数量发送报文。从格式看,前9位格式和长度是一样的,从第十位数据位开始长度不一样。数据总长可以根据查询报文中,查询数量来计算出。FF-1111 1111 一个字节表示八位。可以看到读寄存器跟线圈报文长度是不一样的。寄存器:需要2个字节来表示一个寄存器。计算公式:查询数量/8的整数+1;计算公式:查询数量x2。