我的Modbus Slave/Client开发历程(Rtu/AscII/Tcp)

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

 

其实很早就想写写关于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、 设置保持寄存器(多个,以字为最小单位)

发送命令帧:

 

                                   
           

设备地址

           
           

功能快捷键

撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G

合理的创建标题,有助于目录的生成

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片: Alt

带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block var foo = 'bar'; 

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目 Value
电脑 $1600
手机 $12
导管 $1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列 第二列 第三列
第一列文本居中 第二列文本居右 第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPE ASCII HTML
Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
Quotes "Isn't this fun?" “Isn’t this fun?”
Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。1

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n 1 ) ! n N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N 是通过欧拉积分

Γ ( z ) = 0 t z 1 e t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

gantt
        dateFormat  YYYY-MM-DD
        title Adding GANTT diagram functionality to mermaid
        section 现有任务
        已完成               :done,    des1, 2014-01-06,2014-01-08
        进行中               :active,  des2, 2014-01-09, 3d
        计划一               :         des3, after des2, 5d
        计划二               :         des4, after des3, 5d
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. 注脚的解释 ↩︎

猜你喜欢

转载自blog.csdn.net/gfuugfd/article/details/83896011