C#使用TCPIP与ModBus进行通讯

C#使用TCPIP与ModBus进行通讯

ID:41402214

大小:452.76 KB

页数:10页

时间:2019-08-24

C#使用TCPIP与ModBus进行通讯_第1页
C#使用TCPIP与ModBus进行通讯_第2页
C#使用TCPIP与ModBus进行通讯_第3页
C#使用TCPIP与ModBus进行通讯_第4页
C#使用TCPIP与ModBus进行通讯_第5页
资源描述:

《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

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。