预览加载中,请您耐心等待几秒...
1/7
2/7
3/7
4/7
5/7
6/7
7/7

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

关于Modbus是什么东东就无须多言了,因为这个协议实在是应用太广泛了,究其原因恐怕在 于:1协议内容完全透明公开;2实现起来所需的硬件和软件都比较简单;所以在工作中经常 碰到什么电度表、流量计需要和plc进行modbus通讯,或者两个厂家的产品之间需要交换数 据也会想到用modbus。 这次想认真深入研究下,于是百度了半天,最后发现还是英文原版的modbus协议文本最好, 毕竟是最正宗的啊。当然我是先看中文的,不明白了再翻英文的。另外还有一个就是安装了 step7的modbus驱动(包括master和slave)后会有一个master和slave的pdf文件,其 中讲述master的pdf文件还是不错的。举个例子我开始想当然的认为主站发给从站的电文中, 地址就是如实写的,比如00001在电文中就是0001,我用commix软件做master,发送报文 过去,然后监控串口,我自以为返回的报文是“正确”的。然后换了一个专用的modbus模拟 器发命令下去,却不对了,监控报文发现对方返回的内容偏移了一个bit,奇怪啊,后来查 阅文档才发现,西门子网上课堂关于串口通讯的教程其中有个常见问题“如何计算modbus 地址”,里面说可以参考modbusmaster1.3节。 ――――――――――――――――――――――――――――――――― 在西门子的Modbus_master第1.3节有如下描述: Inthetransmissionmessagesontheserialtransmissionline,theaddressesusedin theMODBUSusersystemarereferencedto0.IntheMODBUSusersystemitself,these addressesarecountedbeginningwith1. Example:Thefirstholdingregisterintheusersystemisrepresentedasregister40001. Inthetransmissionmessage,thevalue0000Hexistransmittedastheregisteraddress whenFC03,06,or16isused.The127thcoilisrepresentedascoil00127intheuser systemandisassignedthecoiladdress007EHexinthetransmissionmessage. 即Modbus规定的地址是从1开始的,例如输出位(COILSTATUS)的地址范围是从00001- 09999,但是主站发给从站的报文中却是从00000开始的,即若要读取第127个输出位,则报 文中该地址应为126即007E。 现在很多人都有这个共识:用plc和现场的设备做modbus通讯的话,先用pc机测试下。于 是pc上的串口调试软件就成为必备的利器了。我在百度上找了不少相关软件,有通用的串口 调试软件如commix,也有专用的modbus调试仿真软件: lCOMMIXV1.4 只有一个可执行文件,可以自动生成modbus的crc校验码,但是毕竟不是专门的modbus调 试仿真软件,用commix必须十分熟悉modbus报文格式; lMODBUSV3.16 开始我觉得这软件挺复杂的,不知道咋用。用着用着就上手了,觉得相当的好啊。加拿大的 一个叫做Calta计算机公司的东东,功能很全,用起来也很方便,我觉得最好用的一个modbus 专用仿真软件。支持master和slave模式(还支持monitor模式即只监控串口),支持1-6, 15,16功能码(但是对于15,16只能一次写一个变量下去),支持串口的报文监视; lMODSCAN 只能做master,且不支持15,16功能码,界面还不错; lModbus调试精灵V1.024 找了好几个网站下载都是一个可执行文件,偏偏报告缺少什么dll文件,看上去是因为软件 是用mfc写的,没办法只好去网上下了几个mfc的dll文件才运行起来。界面过于简陋,只 能做master但是居然支持写多寄存器也考虑得不错了。 关于MODBUSRTU的crc校验,在百度上居然发现某些网页给出的算法有误,真是晕,还好找 到了两段程序,一个是lad写的(就是亿万论坛上有网友发的340做slave的例程)另外一 个是scl写的,模拟了下发现结果是相同的,再对照算法看完程序心中有数了。 附crc-16的算法(应该是正确的,呵呵): ①装入一个16位寄存器,所有数位均为1。 ②该16位寄存器与开始8位字节进行异或运算。运算结果放入这个16位寄存器。 ③把这个16寄存器向右