欢迎来到天天文库
浏览记录
ID:41402214
大小:452.76 KB
页数:10页
时间:2019-08-24
《C#使用TCPIP与ModBus进行通讯》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、C#使用TCP/IP与ModBus进行通讯1.ModBus的Client/Server模型2.数据包格式及MBAPheader(MODBUSApplicationProtocolheader)3.大小端转换4.事务标识和缓冲清理5.示例代码1.ModBus的Client/Server模型 Client与Server之间有两种通讯方式:一种是TCP/IP,另一种是通过串口(SerialPort),本文重点介绍第一种通讯方式。第二种方式留了接口,暂时还没有实现。 2.数据包格式及MBAPheader(MODBUSApplicationPr
2、otocolheader) 2.1数据包格式 数据交换过程中,数据包的格式由三部分组成:协议头+功能码+数据(请求或接受的数据)。 这里主要用到下列两个功能码(十进制): 3:读取寄存器中的值(ReadMultipleRegister) 16:往寄存器中写值(WriteMultipleRegister) 2.2MBAPheader 协议头具体包括下列4个字段:(1)TransactionIdentifier:事务ID标识,Client每发送一个Request数据包的时候,需要带上该标识;当Server响应该
3、请求的时候,会把该标识复制到Response中;这样客户端就可以进行容错判断,防止数据包发串了。(2)ProtocalIdentifier:协议标识,ModBus协议中,该值为0;(3)Length:整个数据包中,从当个前这个字节之后开始计算,后续数据量的大小(按byte计算)。(4)UnitIdentifier:-_- 3.大小端转换 ModBus使用Big-Endian表示地址和数据项。因此在发送或者接受数据的过程中,需要对数据进行转换。3.1判断大小端 对于整数1,在两种机器上有两种不同的标示方式,如上图所示;因此,我们可以用
4、&操作符来取其地址,再转换成指向byte的指针(byte*),最后再取该指针的值;若得到的byte值为1,则为Little-Endian,否则为Big-Endian。1:unsafe2:{3:inttester=1;4:boollittleEndian=(*(byte*)(&tester))==(byte)1;5:}3.2整数/浮点数转换成Byte数组 .Net提供了现成的API,可以BitConverter.GetBytes(value)和BitConverter.ToXXOO(Byte[]data)来进行转换。下面的代码对该转换进行
5、了封装,加入了Little-Endian转Big-Endian的处理(以int为例):1:publicclassValueHelper//Big-Endian可以直接转换2:{3:publicvirtualByte[]GetBytes(intvalue)4:{5:returnBitConverter.GetBytes(value);6:}7:publicvirtualintGetInt(byte[]data)8:{9:returnBitConverter.ToInt32(data,0);10:}11:}12: 13:internalclas
6、sLittleEndianValueHelper:ValueHelper//Little-Endian,转换时需要做翻转处理。14:{15:publicoverrideByte[]GetBytes(intvalue)16:{17:returnthis.Reverse(BitConverter.GetBytes(value));18:}19:publicvirtualintGetInt(byte[]data)20:{21:returnBitConverter.ToInt32(this.Reverse(data),0);22:}23:priva
7、teByte[]Reverse(Byte[]data)24:{25:Array.Reverse(data);26:returndata;27:}28:}4.事务标识和缓冲处理 4.1TransactionIdentifier 上面2.2节中提到,Client每发送一个Request数据包的时候,需要带上一个标识;当Server响应该请求的时候,会把该标识复制到Response中,返回给Client。这样Client就可以用来判断数据包有没有发串。在程序中,可以可以用一个变量及记录该标识:1:privatebytedataIndex=
8、0;2: 3:protectedbyteCurrentDataIndex4:{5:get{returnthis.dataIndex;}6:}7: 8:protectedbyteN
此文档下载收益归作者所有