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

PLC技术漫谈之6.2MODBUS通信协议5 点击:1773 | 回复:23



王晟磊

    
  • 精华:12帖
  • 求助:0帖
  • 帖子:70帖 | 687回
  • 年度积分:0
  • 历史总积分:1173
  • 注册:2004年2月11日
发表于:2005-11-17 15:18:00
楼主
1-2通讯功能 在功能码1到6, 15和16的讯息文会指出在MODBUS上的那一个地址会被寻址到,例如功能码1 ,5及15会参考到COIL (0XXXX),功能3, 6及16参考到保留缓存器(HOLDING REGISTER) (4XXXX)。所有的参考地址都是以相对于零来做参考点,例如COIL 00127是以0126来被参考到的(0126 decimal)=007E(hex),在MODBUS的格式里所有的数字都是以十六进制的方式来表示的。 在本章中所举的例子会显示协议(PROTOCOL)与使用RTU或ASCII的模式是互相独立的,使用此软件程序的程序者可以利用以下的方法来订定他们特殊应用时所须的协议。 以下所示的例子是”读输出缓存器” 40108!~40110 (M-BUS SLAVE接口单元的地址是06),他们的信息文以RTU或ASC II MODE来表示的话,将会如下图所显示: 询问: 信息文 RTU ASC II 表头 无 引号 地址 0000 0110 0 6 功能 0000 0011 0 3 开始之缓存器:高次序 0000 0000 0 0 低次序 0110 1011 6 B 缓存器之数目:高次序 0000 0000 0 0 低次序 0000 0011 0 3 错误侦测 0111 0101 8 9 尾部 1010 0000 无 回车 跳行 共8字节 共17字节 响应: 信 息 文 RTU ASC II 表头 无 引号 ( : ) 地址 0000 0110 0 6 功能 0000 0011 0 3 开始之缓存器: 0000 0110 0 6 高次序 0000 0010 0 2 低次序 0110 1011 2 B 资 料:高次序 0000 0000 0 0 低次序 0110 0011 6 3 高次序 0000 0000 0 0 低次序 0110 0011 6 3 高次序 0000 0000 0 0 低次序 0110 0011 6 3 错误侦测 回转余数法 纵式余数法 尾部 无 回车 跳行 共13字节 共27字节 1-2-1读取输出状态(功能码01)-READ OUTPUT 0XXXX STATUS 1.询问 此功能允许使用者从被寻址到的SLAVE所控制的断续性输出得到逻辑线圈(LOGIC COIL)开开/关的状态 广播模式并不支持此项功能码。每个询问的要求将可寻址到最大1024个线圈,不过,特定的SLAVE装置可能会被限制在此最大量以下。 特别注意的一点就是线圈的起始号码与实际的对应,因为线圈(COIL)是从零开始,所以第1号COIL是0,第2号COIL是1,依此类推 图1-2-1是此功能的例子,读取的是17号SLAVE上的COIL 00020到00056的状态:



覃敏

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 18回
  • 年度积分:0
  • 历史总积分:36
  • 注册:2005年12月14日
发表于:2006-04-14 18:01:00
1楼
hehe,,,能说祥细没???

覃敏

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 18回
  • 年度积分:0
  • 历史总积分:36
  • 注册:2005年12月14日
发表于:2006-04-14 18:16:00
2楼
回转余数法??? 纵式余数法???

怎么解释呢??

gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2006-04-16 11:06:00
3楼
LRC和CRC16

覃敏

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 18回
  • 年度积分:0
  • 历史总积分:36
  • 注册:2005年12月14日
发表于:2006-04-18 13:23:00
4楼
LRC和CRC16??

老柴夫

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 195回
  • 年度积分:0
  • 历史总积分:196
  • 注册:2006年3月02日
发表于:2006-04-19 20:31:00
5楼
LRC算法
CRC16算法
……好象是验证用的。
呵呵……我忘光了。

变频器

  • 精华:1帖
  • 求助:0帖
  • 帖子:14帖 | 147回
  • 年度积分:0
  • 历史总积分:296
  • 注册:2003年4月14日
发表于:2006-04-23 22:31:00
6楼
看了好多的文章,看了好多的地方,可是对通讯,有点摸不着头脑,最近好象稍微有点入门了,可是又好象更迷茫了,不知道怎么回事。

变频器

  • 精华:1帖
  • 求助:0帖
  • 帖子:14帖 | 147回
  • 年度积分:0
  • 历史总积分:296
  • 注册:2003年4月14日
发表于:2006-04-23 22:35:00
7楼
就比如说这个MODBUS通讯吧,听王老师说在欧洲没有人喜欢,可是我好象现在碰到的东西好多就是用的这个东西做的,我就不会用它们,比如好多的变频器的通讯都是MODBUS的,有什么RTU和ASCII两种方式,可是我就是搞不明白它们的最本质区别是什么?
如何在PLC里面做它们的校验呢?

变频器

  • 精华:1帖
  • 求助:0帖
  • 帖子:14帖 | 147回
  • 年度积分:0
  • 历史总积分:296
  • 注册:2003年4月14日
发表于:2006-04-23 22:37:00
8楼
有的变频器的说明书上给出了那个LRC和CRC的C语言的例子,可是我不懂的C这个语言,我就想知道在用梯形图上如何做这两个校验呢?

王晟磊

  • 精华:12帖
  • 求助:0帖
  • 帖子:70帖 | 687回
  • 年度积分:0
  • 历史总积分:1173
  • 注册:2004年2月11日
发表于:2006-04-24 13:09:00
9楼
变频器:
您好!
modbus是相当通用的通信协议,最大的优点就是简单,你如果想用要梯形图做CRC个人觉得是不太可能的。因为有相当多的异或操作。所以建议选用PLC上带MODBUS主协议的产品。
如果实在没有就选PLC上带自由通信协议的产品,然后通过用modscan软件和485转换器捕捉两个你需要帧,并将对应的通信数据放在自由通信协议功能块内发送给你的从设备,这样也可以满足要求,只是不太灵活。

变频器

  • 精华:1帖
  • 求助:0帖
  • 帖子:14帖 | 147回
  • 年度积分:0
  • 历史总积分:296
  • 注册:2003年4月14日
发表于:2006-04-24 20:49:00
10楼
能解释一下“MODBUS主协议”这个词吗?我是真的不太了解,通讯是一问一答吧?可是有时候我能知道一问如何去实现,可是一答我就不知道如何去接收,然后如何去利用,如用一答来核实我的一问当中的命令执行的如何?不知道我表达清楚了吗?

王晟磊

  • 精华:12帖
  • 求助:0帖
  • 帖子:70帖 | 687回
  • 年度积分:0
  • 历史总积分:1173
  • 注册:2004年2月11日
发表于:2006-04-27 12:05:00
11楼
主协议,其实就是您说的一问一答中的主动方——问的这一方,而从设备是答的这一方。
任一次通信都是由主设备发起,从设备是被动的接收主设备的请求,并执行主设备的命令。
所有的操作都是根据协议中定的FC功能码来区分的。

老柴夫

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 195回
  • 年度积分:0
  • 历史总积分:196
  • 注册:2006年3月02日
发表于:2006-04-27 18:52:00
12楼
从楼主给的例子中可以看到,
问的一方,在问的报文中就以经定好了要回答的报文的内容和长度。
只要通过校验是正确的回答的报文,去掉按协议格式固定的部分,就是你要的信息了。
如何去利用……这是在应用软件上就要设好的。

王晟磊

  • 精华:12帖
  • 求助:0帖
  • 帖子:70帖 | 687回
  • 年度积分:0
  • 历史总积分:1173
  • 注册:2004年2月11日
发表于:2006-05-05 15:59:00
13楼
老柴夫说得对

gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2006-05-11 23:44:00
14楼
有一个modbus中文的协议标准草稿版
找到就可以了,里边有相当于代码原理图的实现方式

变频器

  • 精华:1帖
  • 求助:0帖
  • 帖子:14帖 | 147回
  • 年度积分:0
  • 历史总积分:296
  • 注册:2003年4月14日
发表于:2006-05-12 10:27:00
15楼
真的很谢谢你们,我明白了,有不明白的以后还要和你们请教

wincc123

  • 精华:4帖
  • 求助:0帖
  • 帖子:41帖 | 765回
  • 年度积分:1
  • 历史总积分:1067
  • 注册:2003年10月13日
发表于:2006-05-12 10:44:00
16楼
下面引用由王晟磊在 2006-4-24 13:09:00 发表的内容:
  变频器:<br>您好!<br>modbus是相当通用的通信协议,最大的优点就是简单,你如果想用要梯形图做CRC个人觉…
--------------------------------------------------------------------------------------------
老王,其实我挺佩服你的,对于行业整体上有比较高的认识,可是你说用PLC实现CRC不太可能,你的说法是完全错误的,CRC/LRC在PLC上实现是有点难度,但你要知道,PLC照样有指针,我实现了CRC/LRC/BCC,我还实现冒泡排序/FIFO之类的东西,只是难易上和你选择的PLC的功能有一定关系,
不是吹我能,还有那么多的用户在使用MODBUS,不行的话,人家怎么做

wincc123

  • 精华:4帖
  • 求助:0帖
  • 帖子:41帖 | 765回
  • 年度积分:1
  • 历史总积分:1067
  • 注册:2003年10月13日
发表于:2006-05-12 10:58:00
17楼
LRC,在PLC上实现的时候,将ASCII码帧中的头和尾去掉,将串中的每个字节变成16进制相加,在将结果取反加1(补码)就是LRC了
例子:
:010107D00001LRC\CR\LF
LRC=01+01+07+D0+00+01=DA,将DA求补=26
那么以上完整的帧就是
:010107D0000126\CR\LF

CRC就比较复杂一点了,描述的过程比较长
1:预置一个16位寄存器为0FFFFH(全1),称之为CRC寄存器。
2:把数据帧中的第一个字节的8位与CRC寄存器中的低字节进行异或运算,结果存回CRC寄存器。
3:将CRC寄存器向右移一位,最高位填以0,最低位移出并检测。
4:如果最低位为0:重复第三步(下一次移位);如果最低位为1:将CRC寄存器与一个预设的固定值(0A001H)进行异或运算。
5:重复第三步和第四步直到8次移位。这样处理完了一个完整的八位。
6:重复第2步到第5步来处理下一个八位,直到所有的字节处理结束。
7:最终CRC寄存器的值就是CRC的值。
剩下的就是高前低后还是高后低前

变频器

  • 精华:1帖
  • 求助:0帖
  • 帖子:14帖 | 147回
  • 年度积分:0
  • 历史总积分:296
  • 注册:2003年4月14日
发表于:2006-05-12 17:37:00
18楼
等一下,我找个时间好好研究一下,然后再请教。

julylf

  • 精华:1帖
  • 求助:0帖
  • 帖子:19帖 | 99回
  • 年度积分:0
  • 历史总积分:281
  • 注册:2005年3月09日
发表于:2006-05-31 10:53:00
19楼
用PLC来写CRC校验是可以的,我就用梯形图写了一个,有谁要看?

王晟磊

  • 精华:12帖
  • 求助:0帖
  • 帖子:70帖 | 687回
  • 年度积分:0
  • 历史总积分:1173
  • 注册:2004年2月11日
发表于:2006-06-03 14:08:00
20楼
呵呵呵zzj1382先生真是高!
我说得太绝对了,当然一定要写是没问题的,只是感觉用梯形图来写这种算法太麻烦,如果PLC本身是带CRC算法或者功能块的会更好一些.
我也是有朋友要这个功能,本来想叫他用梯形图写,但觉得太麻烦就放弃了,最后在底层用C给他做了一个CRC的功能块解决的.
 

热门招聘
相关主题

官方公众号

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