叶帆工作室

嵌入式开发爱好者(十年开发经验,精通C/C++/VC/VB/C#...)

叶帆
叶帆的公告
本博客原创文章,作者保留一切权利,需经作者同意后方可转载,转载时 请注明[叶帆工作室]及文章链接。yefan@vip.sina.com
【简介】叶帆[微软MVP]
【文章】叶帆文章列表
【软件】叶帆共享软件列表
最近评论
findg:今天我看见这个网站:http://www.diybl.com/course/6_system/linux/Linuxjs/2007921/72422.html转载了该篇文章,但没有注明文章来源。
dasheng:应该怎样建立监测串口接收数据事件的线程呢。还请指教。
andy:可以给我发一份Dotnet Framework的ppt么?
My E-Mail:caozhongshuai_andy@163.com
真的非常感谢!
@:我防火墙是关了的为撒也还有这情况呢?
superpope1216:叶老师
现在我要用C# 2005开发一个windows mobile 蓝牙打印的功能,请问又什么方法吗?
因为我对蓝牙通信的原理是通过串口什么的不太清楚
还又是否需要调用API函数?C#有没有该蓝牙类?
文章分类
收藏
    相册
    叶帆照片
    【叶帆软件】
    [01]VB源码之友(V2.1.548)
    [02]API浏览器.net(V5.0)
    [03]叶帆成语词典(V2.0.8)
    [04]叶帆密码库(V1.2.8)
    【叶帆资源】
    DAO 2.0引擎
    叶帆快速通道
    Windows Embedded 专题
    中文MSDN
    叶帆圈子--工业自动化
    叶帆工作室(博客园)
    叶帆工控--工业自动化
    叶帆群组--工业应用开发
    微软中文技术论坛
    瑞康社区论坛
    叶帆友情链接
    张欣
    枕善居
    莫依
    葛涵涛
    郑建
    陈辉
    马宁
    马骐
    魏涛序
    黎波
    存档
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 我的Modbus Slave/Client开发历程(Rtu/AscII/Tcp)收藏

    新一篇: ActiveSync用红外接口PC与掌上电脑同步 | 旧一篇: ini文件纯C++读写代码

     

    其实很早就想写写关于Modbus的开发历程,但牵扯项目较多,不同语言版本较多,头绪繁杂,一时不知从何写起。最近的医疗项目的通信部分,重新调整为Modbus协议,并且内容几乎涵盖了Modbus的方方面面(Rtu/TcpSlave/Client相关开发),所以更坚定了写Modbus信心,今天忙里偷闲,以时间为序,以项目为纲,把Modbus相关开发经历一一道来。

     

    一、焦炉四大车通信系统(2002~2005

    硬件平台:西门子PLC200

    操作系统:Win2000/XP

    1、  PLCPC机的通信

    最早主PLCPC机通信,采用自定义的协议,主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通信模块200511月)

    在做济钢四车项目的时候,由于PLC采用的是AB RsLogix5000系列的PLC,上面的端口不支持自由口编程,无法读取我们定位标尺的数据,所以购买了与其合作的ProSoft公司专门生产第三方模块。ProSoft生产的模块有很多种,由于没有经验,很不幸,我们选择的是MVI56的模块,而这个模块却是全部自由编程,不含有任何默认协议。

    该模块典型的就是一个嵌入式系统,相当一个带三个串口的386的电脑,操作系统为小型的DOS系统(TINY DOS),用C++为其开发程序。

    在开发完我们的红外定位标尺的读取程序后,顺便也开发一个Modbus Rtu Client的程序,这样ABPLC可以直接和Modbus 的设备进行通信了。

    相关文章,请参见我以前写的文章:

    http://blog.csdn.net/yefanqiu/archive/2005/11/20/533440.aspx

     

    三、隧道广告影像系统(2004~2006

    隧道广告影像系统的通信系统,采用12个通信子站(NetBoxII),刚开始并没有任何Modbus协议,直到有一天,客户提出要控制节目播放的次序、次数和播放时间,最后决定在地铁隧道里,添加一个西门子PLC200系统,由于设备早已安装完成,不可能为PLC布一个五六百米的通信线路,只好利用原通信线路,而最上层的通信为TCPNetBoxII下一层才是485总线,所以NetBoxII当仁不让的成了通信桥的设备。

    但是,问题来了,上位机PC如何通过TCP与基于485PLC进行通信?

    最后,决定西门子PLC中安装Modbus Rtu Slave程序,实现一个标准Modbus设备,NetBoxII实现 Modbus TcpModbus Rtu的协议转换。也就是说,在NetBoxII中实现Modbus Tcp SlaveModbus Rtu Client代码。

    这样用BC3.0DOS平台下实现了Modbus Tcp/Rtu协议转换功能,实现了上位机PCPLC的通信的要求。

     

    隧道广告的相关介绍,可以参见我以前写的文章:

    http://blog.csdn.net/yefanqiu/archive/2006/08/16/1074382.aspx

     

     

    四、嵌入式组态系统(20061~至今)

    开发组态系统,自然而然的要实现各种通信协议的驱动,所以Modbus 协议的开发不在话下。

    分别用EVCVC实现了Modbus Rtu/AscII/TcpClient通信协议驱动。

     

    嵌入式组态系统的相关介绍,可以参见我以前写的文章:

    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影像系统(200612~至今)

     

      

    目前关于通信这块代码还没有做,不过已决定用C#开发Modbus Rtu Client程序和单片机开发的硬件设备进行通信(单片机中实现Modbus Rtu Slave,这部分有专门的硬件工程师实现),通过Modbus的通信实现LED大屏各种参数的配置。

     

    LED系统相关介绍

    http://blog.csdn.net/yefanqiu/archive/2007/05/28/1627782.aspx

     

    六、医疗系统(20076~至今)

    目前这部分正在做,除红外通信板的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个字节

    设备地址:1247

    功 能 码:3H

    数据地址:065535   具体范围与相关设备有关         

        量:165535   具体范围与相关设备有关

    校 验 码:CRC16校验

     

    返回命令帧:

    设备地址

    功能码

    数据量

    数据1

    数据N

    CRC H

    CRC L

    Addr1

    3 H

    返回数据的字节数N

    Data (1N)

    CRC高位

    CRC低位

    帧 长 度:5N 个字节

    设备地址:1247

    功 能 码:3H

    数 据 量:实际的读取数据数量         

        据:返回数据的意义

    aHoldStart

    n= DataNum1

    VW a VB a

    VWaVB a+1

    VW a+nVB a+n

    VWa+nVB a+n+1

    Data1

    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