我的Modbus Slave/Client开发历程(Rtu/AscII/Tcp)
其实很早就想写写关于Modbus的开发历程,但牵扯项目较多,不同语言版本较多,头绪繁杂,一时不知从何写起。最近的医疗项目的通信部分,重新调整为Modbus协议,并且内容几乎涵盖了Modbus的方方面面(Rtu/Tcp,Slave/Client相关开发),所以更坚定了写Modbus信心,今天忙里偷闲,以时间为序,以项目为纲,把Modbus相关开发经历一一道来。
一、焦炉四大车通信系统(2002~2005)
硬件平台:西门子PLC200
操作系统:Win2000/XP
1、 主PLC与PC机的通信
最早主PLC与PC机通信,采用自定义的协议,主PLC中做了一个类似木马的程序来响应PC机下发的读写V变量区的指令。这样就完成了PLC的读写操作。
后来西门子PLC的开发软件进行了升级,提供了Modbus Rtu Slave库,这样只要上位机实现Modbus Rtu Client就可以直接读写PLC变量区了,之后用VB开发了Modbus相应的组件,这样很长一段内,该系统PC与主PLC就采用了Modbus的通信。
前两年开发组态软件,所以西门子PPI协议顺礼成章也就知道了,当然PC与西门子采用PPI协议是最棒的,因为PLC中不需要写一行代码,也无需占用程序和变量空间。所以之后Modbus被放弃了,转而采用了PPI通信协议。
2、 主PLC与从PLC的通信(无线电台通信)
刚开始主PLC与从PLC采用自定义协议,最早在首钢做实验的时候,只有四个从站,并且个数是唯一确定的,所以自定义协议用的很好,效率也很高;但是项目推广后,在其它现场有7个从站的,也有8个,9个的,不确定,并且从站要分组,此外通信传递内容也更多了,不光位置信息、推焦电流、推焦、平煤信号、连锁信号都要传递,最后选择了Modbus协议。
但是使用Modbus有几个问题,第一西门子提供的Modbus Slave不支持广播命令,第二只提供了Modbus Slave程序,从PLC没有什么问题,但是主PLC却没有Modbus Client程序。
对第一个问题,没有办法,不支持就算了,只要一个个来写。(注:后来的某一天,西门子MicroWIN开发环境突然出bug了,竟然看到了部分的西门子Modbus Slave源码,我在此基础上实现了可支持广播的Modbus Slave代码)。
对第二个问题,只好老老实实的用西门子 PLC 语句表命令开发Modbus Client,只要实现3号和16号命令就可以了,还好,Modbus Client本身协议不难,难在PLC的运行机制和PC程序不同,PLC是大循环扫描的,等待数据返回时,不能直接等待,否则运行看门狗会超时,总之克服重重困难,终于开发出稳定可靠的Modbus Client程序,直到现在,现场的PLC通信仍采用该方式。
附记:有人会问,为什么没有采用PPI协议,PLC本身就支持主和从协议啊?但太让人遗憾的是,PPI协议通信节奏太快,目前还没有无线电台(普通工业用)可以正常实现PPI协议通信。
该焦炉四大机车相关介绍,可以参见我以前写的文章:
http://www.gongkong.com/tech/example/detail_1.asp?id=4055
相关专利
http://www.cpsfu.com/C10B/2003/1456635.shtml
我开发的Modbus控件介绍
http://blog.csdn.net/yefanqiu/archive/2005/11/20/533315.aspx
我开发的PPI控件介绍
http://blog.csdn.net/yefanqiu/archive/2005/11/18/532256.aspx
二、AB PLC扩展模块ProSoft MVI56通信模块(2005年11月)
在做济钢四车项目的时候,由于PLC采用的是AB RsLogix5000系列的PLC,上面的端口不支持自由口编程,无法读取我们定位标尺的数据,所以购买了与其合作的ProSoft公司专门生产第三方模块。ProSoft生产的模块有很多种,由于没有经验,很不幸,我们选择的是MVI56的模块,而这个模块却是全部自由编程,不含有任何默认协议。
该模块典型的就是一个嵌入式系统,相当一个带三个串口的386的电脑,操作系统为小型的DOS系统(TINY DOS),用C++为其开发程序。
在开发完我们的红外定位标尺的读取程序后,顺便也开发一个Modbus Rtu Client的程序,这样AB的PLC可以直接和Modbus 的设备进行通信了。
相关文章,请参见我以前写的文章:
http://blog.csdn.net/yefanqiu/archive/2005/11/20/533440.aspx
三、隧道广告影像系统(2004~2006)
隧道广告影像系统的通信系统,采用12个通信子站(NetBoxII),刚开始并没有任何Modbus协议,直到有一天,客户提出要控制节目播放的次序、次数和播放时间,最后决定在地铁隧道里,添加一个西门子PLC200系统,由于设备早已安装完成,不可能为PLC布一个五六百米的通信线路,只好利用原通信线路,而最上层的通信为TCP,NetBoxII下一层才是485总线,所以NetBoxII当仁不让的成了通信桥的设备。
但是,问题来了,上位机PC如何通过TCP与基于485的PLC进行通信?
最后,决定西门子PLC中安装Modbus Rtu Slave程序,实现一个标准Modbus设备,NetBoxII实现 Modbus Tcp到Modbus Rtu的协议转换。也就是说,在NetBoxII中实现Modbus Tcp Slave和Modbus Rtu Client代码。
这样用BC3.0,DOS平台下实现了Modbus Tcp/Rtu协议转换功能,实现了上位机PC与PLC的通信的要求。
隧道广告的相关介绍,可以参见我以前写的文章:
http://blog.csdn.net/yefanqiu/archive/2006/08/16/1074382.aspx
四、嵌入式组态系统(2006年1月~至今)
开发组态系统,自然而然的要实现各种通信协议的驱动,所以Modbus 协议的开发不在话下。
分别用EVC和VC实现了Modbus Rtu/AscII/Tcp的Client通信协议驱动。
嵌入式组态系统的相关介绍,可以参见我以前写的文章:
http://blog.csdn.net/yefanqiu/archive/2006/11/29/1419479.aspx
http://blog.csdn.net/yefanqiu/archive/2006/11/19/1396827.aspx
http://blog.csdn.net/yefanqiu/archive/2006/10/24/1348840.aspx
五、LED影像系统(2006年12月~至今)
目前关于通信这块代码还没有做,不过已决定用C#开发Modbus Rtu Client程序和单片机开发的硬件设备进行通信(单片机中实现Modbus Rtu Slave,这部分有专门的硬件工程师实现),通过Modbus的通信实现LED大屏各种参数的配置。
LED系统相关介绍
http://blog.csdn.net/yefanqiu/archive/2007/05/28/1627782.aspx
六、医疗系统(2007年6月~至今)
目前这部分正在做,除红外通信板的Modbus Rtu Slave用汇编实现外,其它的都用C#语言实现。
七、Modbus Rtu 通信协议(3,16号命令)
1、 读取保持寄存器(单个和多个,以字为最小单位)
发送命令帧:
|
设备地址 |
功能码 |
地址H |
地址L |
数据量H |
数据量L |
CRC H |
CRC L |
|
Addr0 |
3 H |
HoldStart |
DataNum |
CRC高位 |
CRC低位 |
||
帧 长 度:8个字节
设备地址:1~247
功 能 码:3H
数据地址:0~65535 具体范围与相关设备有关
数 量:1~65535 具体范围与相关设备有关
校 验 码:CRC16校验
返回命令帧:
|
设备地址 |
功能码 |
数据量 |
数据1 |
数据N |
CRC H |
CRC L |
|
Addr1 |
3 H |
返回数据的字节数N |
Data (1~N) |
CRC高位 |
CRC低位 |
|
帧 长 度:5+N 个字节
设备地址:1~247
功 能 码:3H
数 据 量:实际的读取数据数量
数 据:返回数据的意义
a=HoldStart
n= DataNum-1
|
VW a (VB a) |
VWa(VB a+1) |
… |
VW a+n(VB a+n) |
VWa+n(VB a+n+1) |
|
Data(1) |
Data(2) |
… |
Data(N-1) |
Data(N) |
校 验 码:CRC16校验
命令有误:
1) 没有任何返回
2) 返回异议帧
|
设备地址 |
功能码 |
错误信息 |
CRC H |
CRC L |
|
Addr1 |
83 H |
一个字节的错误信息 |
CRC高位 |
CRC低位 |
2、 设置保持寄存器(多个,以字为最小单位)
发送命令帧:
|
设备地址 |
功能码 |
地址H |
地址L |
数据量H |
数据量L |
数据字节数 |
具体 数据 |
CRC H |
CRC L |
|
Addr0 |
10 H |
HoldStart |
DataNum |
bytN |
1~bytN |
CRC高位 |
CRC低位 |
||
帧 长 度:9+bytN 个字节
设备地址:1~247
功 能 码:10H
数据地址:0~65535 具体范围与相关设备有关
数 量:1~122 具体范围与相关设备有关
字 节 数:设置的字节个数 bytN= DataNum×2
数 据:具体的字节数据
校 验 码:CRC16校验
返回命令帧:
|
设备地址 |
功能码 |
地址H |
地址L |
数据量H |
数据量L |
CRC H |
CRC L |
|
Addr1 |
10 H |
HoldStart |
DataNum |
CRC高位 |
CRC低位 |
||
帧 长 度:8 个字节
设备地址:1~247
功 能 码:10H
数据地址:0~65535 具体范围与相关设备有关
数 量:1~122 具体范围与相关设备有关
校 验 码:CRC16校验
命令有误:
1) 没有任何返回
2) 返回异议帧
|
地址 |
功能码 |
错误信息 |
CRC H |
CRC L |
|
Addr1 |
90 H |
一个字节的错误信息 |
CRC高位 |
CRC低位 |
八、一点总结
编写通信相关的程序,其实协议和开发语言并不重要,重要的是对通信双方的通信设备的特点,性能要有充分了解,这样才能开发出可靠,高效的通信程序。
我的Modbus Slave/Client开发历程(Rtu/AscII/Tcp)的更多相关文章
- Modbus测试工具ModbusPoll与Modbus Slave使用方法
感谢https://blog.csdn.net/byxdaz/article/details/77979114原创,由于CSDN经常调整,故再编辑收藏,并修改了部分BUG. 一.介绍 Modbus P ...
- Modbus仿真器 Modbus Poll 和Modbus Slave详细图文教程
Modbus Poll 是Witte Software公司开发的的Modbus主机仿真器,用于测试和调试Modbus从设备.软件支持ModbusRTU.ASCII.TCP/IP协议.支持多设备监控,可 ...
- modbus4j中使用modbus tcp/ip和modbus rtu over tcp/ip模式
通过借鉴高人博客,总结如下: 1. TcpMaster类,用于生成ModbusMaster主类 package sun.sunboat; public class TcpMaster { privat ...
- Modbus测试工具 :Modbus Poll,Modbus Slave
源:http://blog.sina.com.cn/s/blog_49352090010138e7.html Modbus测试工具 :Modbus Poll,Modbus Slave
- FreeModbus 精简版本(Only RTU) for M128 (Modbus Slave)
1.硬件连接: M128 PD3 INT3/TXD1 ---> PC 232COM Pin 2 PD2 INT2/RXD1 ---> PC 232COM Pin 3 GND ...
- FreeModbus for stm32(Keil工程)——精简Modbus slave协议【worlsing笔记】
FreeModbus For stm32:点击下载源码 1.测试环境Keil MDK 4.7a stm32f103c8, PB12为输出线圈, 可以通过Modbus Poll来控制线圈的输出状 ...
- 【STM32 .Net MF开发板学习-05】PC通过Modbus协议远程操控开发板
从2002年就开始接触Modbus协议,以后陆续在PLC.DOS.Windows..Net Micro Framework等系统中使用了该协议,在我以前写的一篇博文中详细记载了这一段经历,有兴趣的朋友 ...
- 【阿里云IoT+YF3300】9.快速开发modbus设备驱动
Modbus是一种串行通信协议,是莫迪康公司为PLC(编程逻辑控制器)通信而设计的协议.Modbus目前已经成为工业领域通信协议的业界标准,大部分的仪器仪表都支持该通信协议.很早以前就开发过基于Mod ...
- ServerSuperIO Designer IDE 发布,打造物联网通讯大脑,随心而联。附:C#驱动源代码。
1.概况 注:ServerSuperIO Designer IDE 同行业网友随便使用,不涉及到软件使用限制的问题. 从2015年到现在的将近两年的时间,一直在开发.完善ServerSuperIO(S ...
随机推荐
- PL/SQL数据导入导出浅谈(1)
近来需要通过PL/SQL向Oracle中导数据,特此总结一下 试例表:test 字段:id;name;org; 1.直接复制粘贴(当数据量不是特别大的时候) 1)使用select * from tes ...
- 权限管理数据库设计_Rev1
贴出来自身接触项目以来所接触过的一些企业管理信息系统权限部门的一个通用数据库设计初稿: 设计的文字解释以及各部分的作用等确定可行会再进行描述: 图: 如果有不同意见请轻拍!
- ExtJs4.2 知识点
知识点1:修改密码类 参考:点击这里 Ext.apply(Ext.form.VTypes, { password: function (val, field) { if (field.initialP ...
- Elasticsearch搜索类型(query type)详解
关于我,邯郸人. 对这类话题感兴趣?欢迎发送邮件至donlianli@126.com 请支持原创http://www.cnblogs.com/donlianli/p/3857500.html e ...
- 3D游戏常用技巧Normal Mapping (法线贴图)原理解析——高级篇
1.概述 上一篇博客,3D游戏常用技巧Normal Mapping (法线贴图)原理解析——基础篇,讲了法线贴图的基本概念和使用方法.而法线贴图和一般的纹理贴图一样,都需要进行压缩,也需要生成mipm ...
- linux 添加用户
1.下面就开始来说怎么添加新用户 我们以添加一个用户名为jorcen的新用户为例来说明,执行下面的命令: # useradd jorcen 2.那么就新用户就添加完成,但是没有任何信息,新用户添加完成 ...
- uva 165
回溯 参考了一下别人的解法 1 必须存在 再枚举下一个数字的时候 从当前可取到的最小数字加一枚举到当前可取到的最大数字加一 /********************************* ...
- ural 1221
本来就是个很水的题 就是枚举起点长度然后直接判断就行了 但是比赛的时候写了个大bug 还找不出来 自己太水了 #include <cstdio> #include <c ...
- uva 10069
简单的dp 但是一个大数加法 套用了末位大牛的类模板 #include <cstdio> #include <cstring> #include <algorithm& ...
- Google Play市场考察报告-2
接上文,本次继续考察App. (6)CNBETA win8平板客户端 cnBeta是国内少有的科技类资讯网站,在程序员群体中具有很大影响力.面向程序员的软件应用在APP中一向属于少数,然而程序员群体已 ...