《C#使用TCPIP与ModBus进行通讯》.docVIP

  • 280
  • 0
  • 约1.22万字
  • 约 10页
  • 2020-01-22 发布于天津
  • 举报
C#使用TCP/IP与ModBus进行通讯 1. ModBus的 Client/Server模型 2. 数据包格式及MBAP header (MODBUS Application Protocol header) 3. 大小端转换 4. 事务标识和缓冲清理 5. 示例代码 1. ModBus的 Client/Server模型 ? ??? Client与Server之间有两种通讯方式:一种是TCP/IP,另一种是通过串口(Serial Port),本文重点介绍第一种通讯方式。第二种方式留了接口,暂时还没有实现。 ? 2. 数据包格式及MBAP header (MODBUS Application Protocol header) ??? 2.1 数据包格式 ??? 数据交换过程中,数据包的格式由三部分组成:协议头 + 功能码 + 数据(请求或接受的数据)。 ??? 这里主要用到下列两个功能码(十进制): ??? 3: 读取寄存器中的值(Read Multiple Register) ??? 16: 往寄存器中写值(Write Multiple Register) ? ?? 2.2 MBAP header ??? ??? 协议头具体包括下列4个字段: (1) Transaction Identifier:事务ID标识,Client每发送一个Request数据包的时候,需要带上该标识;当Server响应该请求的时候,会把该标识复制到Response中;这样客户端就可以进行容错判断,防止数据包发串了。 (2) Protocal Identifier:协议标识,ModBus协议中,该值为0; (3) Length:整个数据包中,从当个前这个字节之后开始计算,后续数据量的大小(按byte计算)。 (4) Unit Identifier:-_- ? 3. 大小端转换 ??? ModBus使用Big-Endian表示地址和数据项。因此在发送或者接受数据的过程中,需要对数据进行转换。 3.1 判断大小端 ??? 对于整数1,在两种机器上有两种不同的标示方式,如上图所示;因此,我们可以用操作符来取其地址,再转换成指向byte的指针(byte*),最后再取该指针的值;若得到的byte值为1,则为Little-Endian,否则为Big-Endian。 1: unsafe 2: { 3: int tester = 1; 4: bool littleEndian = (*(byte*)(tester)) == (byte)1; 5: } 3.2 整数/浮点数转换成Byte数组 ??? .Net提供了现成的API,可以BitConverter.GetBytes(value)和BitConverter.ToXXOO(Byte[] data)来进行转换。下面的代码对该转换进行了封装,加入了Little-Endian转Big-Endian的处理(以int为例): 1: public class ValueHelper //Big-Endian可以直接转换 2: { 3: public virtual Byte[] GetBytes(int value) 4: { 5: return BitConverter.GetBytes(value); 6: } 7: public virtual int GetInt(byte[] data) 8: { 9: return BitConverter.ToInt32(data, 0); 10: } 11: } 12:? 13: internal class LittleEndianValueHelper : ValueHelper //Little-Endian,转换时需要做翻转处理。 14: { 15: public override Byte[] GetBytes(int value) 16: { 17: return this.Reverse(BitConverter.GetBytes(value)); 18: } 19: public virtual int GetInt(byte[] data) 20: { 21: return BitConverter.ToInt32(this.Reve

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档