首页 上一页 1 2 下一页 尾页

为什么MODBUS报文里面看不到起始位、停止位及校验位? 点击:19165 | 回复:33



星矢

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:10帖 | 54回
  • 年度积分:0
  • 历史总积分:256
  • 注册:2004年6月24日
发表于:2011-04-14 09:03:14
楼主

主站和从站之间传递的通讯信息为11位字格式:(1位起始位,8位数据位,1位停止位,奇/偶校验);

而只能看到通讯数据(信息帧)格式:

数据格式: 地址码 功能码 数据区 错误校检
数据长度: 1字节 1字节 N字节 16位CRC码(冗余循环码)

 




steelen

  • 精华:1帖
  • 求助:2帖
  • 帖子:164帖 | 1497回
  • 年度积分:4
  • 历史总积分:5171
  • 注册:2002年3月15日
发表于:2011-04-14 09:47:20
1楼
MODBUS协议缺省是1起始位,8数据位,偶校验,一个停止位。

ye_w

  • 精华:21帖
  • 求助:1帖
  • 帖子:69帖 | 5217回
  • 年度积分:0
  • 历史总积分:46739
  • 注册:2002年4月17日
发表于:2011-04-14 15:30:02
2楼
这部分内容跟应用无关,看不到很正常。你看到的都是应用报文部分

星矢

  • 精华:0帖
  • 求助:0帖
  • 帖子:10帖 | 54回
  • 年度积分:0
  • 历史总积分:256
  • 注册:2004年6月24日
发表于:2011-04-14 18:53:39
3楼

引用ye_w 的回复内容:这部分内容跟应用无关,看不到很正常。你看到的都是应用报文部分


是啊,有什么工具能读出来吗?不被公开的原因是什么?

youhm

  • 精华:0帖
  • 求助:0帖
  • 帖子:8帖 | 709回
  • 年度积分:0
  • 历史总积分:2593
  • 注册:2005年2月16日
发表于:2011-04-14 19:33:24
4楼

这些东西是由硬件处理的,如果你想看到分析这些东西,你可以用示波器查看,这根本没什么意义

你还是找些串口通讯的基础资料看看吧

星矢

  • 精华:0帖
  • 求助:0帖
  • 帖子:10帖 | 54回
  • 年度积分:0
  • 历史总积分:256
  • 注册:2004年6月24日
发表于:2011-04-15 10:48:43
5楼
原来如此,知道是怎么回事就行了,主要是纳闷看不到这个事情,你说是由硬件处理,大概就清楚是怎么回事了。

星矢

  • 精华:0帖
  • 求助:0帖
  • 帖子:10帖 | 54回
  • 年度积分:0
  • 历史总积分:256
  • 注册:2004年6月24日
发表于:2011-04-23 17:00:28
6楼

拿MODBUS举例 ,我们发送比如:

       02              03            00  01                   00  01            D5  F9    (RTU方式-奇校验)

         ↓                ↓                 ↓                            ↓                      ↓  

   子站地址     功能码      起始寄存器地址           长度              CRC校验

这个功能是从子站02读0001存储区取0001个数据到主站,从站会返回一系列的数据依据一定格式到端口。
从站接收到的数据流是否应该是: (低位优先)
1...11      0      00000010     0      (hx:02)

1...11      0      00000011     1      (hx:03)

1...11      0      00000001     0      (hx:01)

1...11      0      00000000     1      (hx:00)

1...11      0      00000001     0      (hx:01)    

1...11      0      00000000     1      (hx:00) 

1...11      0      11010101     0      (hx:D5)

1...11      0      11111001     1      (hx:F9)

   ↓           ↓               ↓          ↓ 

 停止     起始         数据       校验

不知对否???

yjig

  • 精华:2帖
  • 求助:5帖
  • 帖子:97帖 | 5237回
  • 年度积分:0
  • 历史总积分:12514
  • 注册:2004年6月04日
发表于:2011-04-23 17:46:41
7楼
为什么发送数据“ 00   01  ”,而接受时被前后颠倒?

Piston

  • 精华:0帖
  • 求助:1帖
  • 帖子:23帖 | 13107回
  • 年度积分:18
  • 历史总积分:40065
  • 注册:2009年5月22日
发表于:2011-04-23 22:43:20
8楼
低位与高位是倒过来的,这是规定没啥特殊理由

yjig

  • 精华:2帖
  • 求助:5帖
  • 帖子:97帖 | 5237回
  • 年度积分:0
  • 历史总积分:12514
  • 注册:2004年6月04日
发表于:2011-04-23 22:55:20
9楼

 

1...11 0 00000010 0 (hx:02)       

1...11 0 00000011 1 (hx:03)

1...11 0 00000001 0 (hx:01)           发送的数据明明是00,收到的怎变成01?

1...11 0 00000000 1 (hx:00)           发送的数据明明是01,收到的怎变成00?

1...11 0 00000001 0 (hx:01)           同上。

1...11 0 00000000 1 (hx:00)           同上。

1...11 0 11010101 0 (hx:D5)

1...11 0 11111001 1 (hx:F9)

yjig

  • 精华:2帖
  • 求助:5帖
  • 帖子:97帖 | 5237回
  • 年度积分:0
  • 历史总积分:12514
  • 注册:2004年6月04日
发表于:2011-04-23 23:16:01
10楼

以下图片来自于台达PLC说明书,根据台达说明书,没看出发送的数据(D1093、D1094)被颠倒的痕迹?

yjig

  • 精华:2帖
  • 求助:5帖
  • 帖子:97帖 | 5237回
  • 年度积分:0
  • 历史总积分:12514
  • 注册:2004年6月04日
发表于:2011-04-23 23:31:30
11楼

以上图片中的含义是:在H01从机中,数据地址为H2102,读取H0002个字的数据。

按楼主的解释,需要把21  02进行前后颠倒,变成02  21后再发送,同样H00  02个字的数据,也需要进行前后颠倒,变成H02  00后再发送。

但以上的解释与说明书相矛盾?

 

 

以下内容是楼主在6层的解释,从楼主发送的内容来看,0001储存区及0001个数据都被颠倒了。

这个功能是从子站02读0001存储区取0001个数据到主站,从站会返回一系列的数据依据一定格式到端口。

1...11      0      00000010     0      (hx:02)

1...11      0      00000011     1      (hx:03)

1...11      0      00000001     0      (hx:01)

1...11      0      00000000     1      (hx:00)

1...11      0      00000001     0      (hx:01)    

1...11      0      00000000     1      (hx:00) 

1...11      0      11010101     0      (hx:D5)

1...11      0      11111001     1      (hx:F9)

星矢

  • 精华:0帖
  • 求助:0帖
  • 帖子:10帖 | 54回
  • 年度积分:0
  • 历史总积分:256
  • 注册:2004年6月24日
发表于:2011-04-24 01:34:38
12楼
希望跟大家一起探讨:《GB/T 19582 基于Modbus协议的工业自动化网络规范》

星矢

  • 精华:0帖
  • 求助:0帖
  • 帖子:10帖 | 54回
  • 年度积分:0
  • 历史总积分:256
  • 注册:2004年6月24日
发表于:2011-04-24 01:38:31
13楼

在此有2个疑问:

1、如“RTU报文帧”所示,这个“必须以连续的字符流发送整个报文帧”究竟是指什么呢?是一次性发送完整个数据报文(地址码+功能码+数据区+错误校检),还是以每11位一个报文连续将整个数据(地址码/功能码/数据区/错误校检)发送完,帧内报文以【起始位   停止位】间隔,如间隔>1.5个字符,则该帧不正常,如间隔>3.5个字符之后还没有传输字符,则视为帧结束?

2、低位优先原则(包括数据位、CRC校验)如何实现?讨论实际“物理层”的位序列情况,而不是经“数据链路层”调整后的序列!(你所列举的例子的确是这样,但我觉得这是经处理后的顺序--高前低后,因为按照规范接收方事先就知道应该将后接收的放在高位)

  我的理解,02  03  00  01  00  01  D5  F9  是否就按上面这样的数据流发出去?接收方接收到后,如果数据没有错误,去除起始位和校验位,将数据位存入缓冲区,这个仅仅是物理层做的,但MODBUS被接收后,数据链路层又将数据帧的各项进行计算,如果CRC一致,同时地址又同自己地址相同(为了减少接收处理时间,在接收到地址字段时,就可以分析地址字段,而不需要等到整个帧结束),则剥掉地址和校验部分,取有效的数据部分进行分析,再将请求的数据发送到端口。

  不管是什么类型的通讯方式,只要是串行通讯(包括RS232485,基于485PROFIBUS总线,以太网等等在接收数据的时候都是差不多的(都是差不多),空闲的时候一直为1(也或者一直为0),先检测起始位,如果来了一个0,或者来了一个1,就认为是起始位的开始,然后下面的数位就认为是字节部分,等到字节部分结束,就自动检查字节中1的个数,跟接收过来的校验位做比较,如果和接收过来的校验位一致,就代表这个字节是正确的,如果不一样,就代表是错误的,(对于错误的处理,如何解决?如果说对于错误的数据都扔掉,那是不是会导致数据传输不到位?因为发送方根本不知道数据有没有准确无误的到达,如果联络发送方重新发送?)

星矢

  • 精华:0帖
  • 求助:0帖
  • 帖子:10帖 | 54回
  • 年度积分:0
  • 历史总积分:256
  • 注册:2004年6月24日
发表于:2011-04-24 02:15:09
14楼

补充一下“字节序”,方便理解为什么要规定“低位优先发送”。我猜是为了适应接收数据后在存储器中储存(对于我们常用的CPU架构,如Intel,AMD的CPU使用的都是小字节序,而例如Mac OS以前所使用的Power PC使用的便是大字节序(不过现在Mac OS也使用Intel的CPU了))。

http://www.cnblogs.com/JeffreyZhao/archive/2010/02/10/byte-order-and-related-library.html

 

 

yjig

  • 精华:2帖
  • 求助:5帖
  • 帖子:97帖 | 5237回
  • 年度积分:0
  • 历史总积分:12514
  • 注册:2004年6月04日
发表于:2011-04-24 11:02:55
15楼

对于14楼的两个疑问中的第一问,按我的理解应该是:

“以每11位一个报文连续将整个数据(地址码/功能码/数据区/错误校检)发送完,帧内报文以【起始位 停止位】间隔,如间隔>1.5个字符”

参见附件:

yjig

  • 精华:2帖
  • 求助:5帖
  • 帖子:97帖 | 5237回
  • 年度积分:0
  • 历史总积分:12514
  • 注册:2004年6月04日
发表于:2011-04-24 11:19:31
16楼

按上图的解释,发送数据是从左到右的次序进行的,并且首先发送b0位,然后发送b1位,依此类推,b2位、b3位…b7位(8位数据)。

如果需要发送 (hx:02) ,按我的理解,应该是:1...11 0 01000000 0 (b0在左,先发送)),

而不应该:1...11 0 00000010 0

是否正确?望高手指正!



yjig

  • 精华:2帖
  • 求助:5帖
  • 帖子:97帖 | 5237回
  • 年度积分:0
  • 历史总积分:12514
  • 注册:2004年6月04日
发表于:2011-04-24 14:28:38
17楼

突然间,有了新的假设,是否可这样理解:

楼主需要发送的数据为 00  01   ,其高字节就是00  ,低字节是01,根据MODBUS协议规定, 首先发送高字节,然后发送低字节。因此发送第一字节为:00,紧接着发送第二字节:01,因此楼主的传输次序不对。

 

至于MODBUS规定:高字节被储存到低地址,而低字节被储存到高地址是另一回事。因为不同的厂家有不同的规定,三菱规定:高字节被存到高地址,而西门子规定恰恰相反,高字节被存到低地址。

但无论如何,在传输时,你必须遵循MODBUS协议规定,也就是说,首先传输高字节,然后低字节,否则相互之间通讯,将无章可言。

对于各厂家自己的规定(高、低地址),本人认为:那是各厂家自己的事,此时你收到数据后,各品牌可按自己的标准,将高、低字节存到自己规定的位置上去。

综上所述,简而言之,就是两句话:传输就是传输,储存就是储存,完全是两回事,互不相干。

是否正确?望高手指正!

星矢

  • 精华:0帖
  • 求助:0帖
  • 帖子:10帖 | 54回
  • 年度积分:0
  • 历史总积分:256
  • 注册:2004年6月24日
发表于:2011-04-24 15:46:12
18楼

我彻底被搞晕了,经你一说明白了,赞同你的说法,传输时首先发送高字节(8位),然后发送低字节(8位),至于高/低字节的位传输次序,应该是先低位(LSB),后高位(MSB),而储存时按照各个厂家的不同规定而定,与传输无关。

那么传输32位的数据类型时,又是怎么样的呢?如0x 11223344,是否应该是11→22→33→44的顺序,而具体到传输0x 11(其二进制为00010001)时,传输的次序颠倒过来就是10001000,其余类似。

星矢

  • 精华:0帖
  • 求助:0帖
  • 帖子:10帖 | 54回
  • 年度积分:0
  • 历史总积分:256
  • 注册:2004年6月24日
发表于:2011-04-24 15:53:04
19楼
而CRC校验由于事先将低位字节放在前面,高位字节放在后面,因此在传输时,按照先传输高位字节的规定,而实际传输的却是CRC校验的低位字节。为什么啊?为什么?

尐お槑孨/叶宏

  • 精华:3帖
  • 求助:0帖
  • 帖子:114帖 | 3593回
  • 年度积分:0
  • 历史总积分:7688
  • 注册:2008年3月16日
发表于:2011-04-24 16:11:42
20楼

你看到的是对话层的数据,而物理层的帧你是看不到的。

 

 


热门招聘
相关主题

官方公众号

智造工程师
    首页 上一页 1 2 下一页 尾页