C#使用TCPIP与ModBus进行通讯.pdf

C#使用TCPIP与ModBus进行通讯.pdf

ID:58607803

大小:1.13 MB

页数:10页

时间:2020-10-18

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

《C#使用TCPIP与ModBus进行通讯.pdf》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

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(MODBUSApplicationProtocolheader)2.1数

2、据包格式数据交换过程中,数据包的格式由三部分组成:协议头+功能码+数据(请求或接受的数据)。;..,.这里主要用到下列两个功能码(十进制):3:读取寄存器中的值(ReadMultipleRegister)16:往寄存器中写值(WriteMultipleRegister)2.2MBAPheader协议头具体包括下列4个字段:(1)TransactionIdentifier:事务ID标识,Client每发送一个Request数据包的时候,需要带上该标识;当Server响应该请求的时候,会把该标识复制到Response中;这样客户端就可以进行容错判断,防止数据包发串了。(2

3、)ProtocalIdentifier:协议标识,ModBus协议中,该值为0;(3)Length:整个数据包中,从当个前这个字节之后开始计算,后续数据量的大小(按byte计算)。(4)UnitIdentifier:-_-3.大小端转换ModBus使用Big-Endian表示地址和数据项。因此在发送或者接受数据的过程中,需要对数据进行转换。;..,.3.1判断大小端对于整数1,在两种机器上有两种不同的标示方式,如上图所示;因此,我们可以用&操作符来取其地址,再转换成指向byte的指针(byte*),最后再取该指针的值;若得到的byte值为1,则为Little-Endi

4、an,否则为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)来进行转换。下面的代码对该转换进行了封装,加入了Little-Endian转Big-Endian的处理(以int为例):1:publicclassValueHelper//Big-Endian可以直接

5、转换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:internalclassLittleEndianValueHelper:ValueHelper//Little-Endian,转换时需要做翻转处理。14:{15:publicoverrideByte[]Get

6、Bytes(intvalue)16:{17:returnthis.Reverse(BitConverter.GetBytes(value));18:}19:publicvirtualintGetInt(byte[]data)20:{21:returnBitConverter.ToInt32(this.Reverse(data),0);22:}23:privateByte[]Reverse(Byte[]data)24:{25:Array.Reverse(data);26:returndata;27:}28:}4.事务标识和缓冲处理4.1TransactionIdenti

7、fier上面2.2节中提到,Client每发送一个Request数据包的时候,需要带上一个标识;当Server响应该请求的时候,会把该标识复制到Response中,返回给Client。这样Client就可以用来判断数据包有没有发串。在程序中,可以可以用一个变量及记录该标识:1:privatebytedataIndex=0;2:3:protectedbyteCurrentDataIndex4:{5:get{returnthis.dataIndex;}6:}7:8:protectedbyteNextDataIndex()9:{10:return++thi

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

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

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