- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
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: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可以直接转换
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[] GetBytes(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
原创力文档


文档评论(0)