分类: 〖自动化〗2007-07-19 10:04 34038人阅读 评论(38) 收藏 举报

其实很早就想写写关于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)的更多相关文章

  1. Modbus测试工具ModbusPoll与Modbus Slave使用方法

    感谢https://blog.csdn.net/byxdaz/article/details/77979114原创,由于CSDN经常调整,故再编辑收藏,并修改了部分BUG. 一.介绍 Modbus P ...

  2. Modbus仿真器 Modbus Poll 和Modbus Slave详细图文教程

    Modbus Poll 是Witte Software公司开发的的Modbus主机仿真器,用于测试和调试Modbus从设备.软件支持ModbusRTU.ASCII.TCP/IP协议.支持多设备监控,可 ...

  3. modbus4j中使用modbus tcp/ip和modbus rtu over tcp/ip模式

    通过借鉴高人博客,总结如下: 1. TcpMaster类,用于生成ModbusMaster主类 package sun.sunboat; public class TcpMaster { privat ...

  4. Modbus测试工具 :Modbus Poll,Modbus Slave

    源:http://blog.sina.com.cn/s/blog_49352090010138e7.html Modbus测试工具 :Modbus Poll,Modbus Slave

  5. FreeModbus 精简版本(Only RTU) for M128 (Modbus Slave)

    1.硬件连接: M128 PD3 INT3/TXD1  ---> PC 232COM Pin 2 PD2 INT2/RXD1  ---> PC 232COM Pin 3 GND       ...

  6. FreeModbus for stm32(Keil工程)——精简Modbus slave协议【worlsing笔记】

    FreeModbus For stm32:点击下载源码 1.测试环境Keil MDK 4.7a  stm32f103c8, PB12为输出线圈,    可以通过Modbus Poll来控制线圈的输出状 ...

  7. 【STM32 .Net MF开发板学习-05】PC通过Modbus协议远程操控开发板

    从2002年就开始接触Modbus协议,以后陆续在PLC.DOS.Windows..Net Micro Framework等系统中使用了该协议,在我以前写的一篇博文中详细记载了这一段经历,有兴趣的朋友 ...

  8. 【阿里云IoT+YF3300】9.快速开发modbus设备驱动

    Modbus是一种串行通信协议,是莫迪康公司为PLC(编程逻辑控制器)通信而设计的协议.Modbus目前已经成为工业领域通信协议的业界标准,大部分的仪器仪表都支持该通信协议.很早以前就开发过基于Mod ...

  9. ServerSuperIO Designer IDE 发布,打造物联网通讯大脑,随心而联。附:C#驱动源代码。

    1.概况 注:ServerSuperIO Designer IDE 同行业网友随便使用,不涉及到软件使用限制的问题. 从2015年到现在的将近两年的时间,一直在开发.完善ServerSuperIO(S ...

随机推荐

  1. 使用NPIO操作Excel

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using NPOI.SS. ...

  2. IBM MQ

    一,安装 1,先安装必备MQ\MQ60\Prereqs\IES\Setup.exe 2,再安装MQ\MQParms.exe 二,发送方 刚装好后,默认有一个管理器名,可以删除,自己重新建,以防有不可知 ...

  3. Sql查询除ID以外相同的数据

    id    NAME    AGE1    n1         12    n1         13    n2         24    n2         25    n22       ...

  4. poj 1659 Frogs' Neighborhood (DFS)

    http://poj.org/problem?id=1659 Frogs' Neighborhood Time Limit: 5000MS   Memory Limit: 10000K Total S ...

  5. GitHub 有哪些优秀的项目

    GitHub 有哪些优秀的项目 http://www.zhihu.com/question/20584141

  6. 1029: [JSOI2007]建筑抢修 - BZOJ

    Description 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不尽快修 ...

  7. 1025: [SCOI2009]游戏 - BZOJ

    Description windy学会了一种游戏.对于1到N这N个数字,都有唯一且不同的1到N的数字与之对应.最开始windy把数字按顺序1,2,3,……,N写一排在纸上.然后再在这一排下面写上它们对 ...

  8. org.hibernate.LazyInitializationException

    1.org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.c ...

  9. LocalStorage 本地存储

    首先自然是检测浏览器是否支持本地存储.在HTML5中,本地存储是一个window的属性,包括localStorage和sessionStorage,从名字应该可以很清楚的辨认二者的区别,前者是一直存在 ...

  10. LA 4731

    dp[i][j]意思是前i个分成j组最小的花费 #include<cstdio> #include<algorithm> #include<cstring> #in ...