modbus的新起点 点击:13492 | 回复:183



we9322025

    
  • 精华:2帖
  • 求助:0帖
  • 帖子:11帖 | 41回
  • 年度积分:8
  • 历史总积分:955
  • 注册:2012年10月23日
发表于:2018-07-13 16:07:34
楼主

入工控已经五年了。工控的入门似乎很简单,但是一深入下去就效率极低。

五年了,应该做件大事。

为此希望花半年的零散时间,结合我个人调试经验,写一篇关于modbus的鸿篇巨作,也欢迎同行提出意见。

在这里先给大家分享下目前拟定的目录:

第一章 Modbus 基础

1.1 前言:

1.2 Modbus的协议架构:

1.3 Modbus 协议的概要

1.4 Modbus实战分析

1.4.1 Modbus ASCII实战分析

1.4.2 Modbus RTU的实战分析

1.4.3 Modbus TCP抓包分析

1.4.4 RTU/ASCII Over TCP抓包分析

1.5 Modbus 总结及其对比分析

第二章 Modbus 应用

2.1台达PLC与modbus应用

2.1.1 台达PLC modbus RTU/ASCII从站功能

2.1.2 台达PLC Link功能

2.1.3 台达PLC modbusRTU/ASCII主站功能

2.1.4 台达PLC modbus TCP server功能

2.1.5 台达PLC modbus TCP资料交换功能

2.1.6 台达PLC modbus TCP客户端功能

2.2 西门子PLC的modbus应用

2.2.1 西门子S7-200 modbus RTU

2.2.2 西门子smart S7-200 mdobus RTU

2.2.3 西门子s7-1200的modbus TCP

2.2.3 西门子S7-1200的modbus RTU

2.3 AB的modbus的应用

2.3.1 AB micro_850的 ModbusTCP

2.3.2 AB micro_850的 ModbusRTU

2.3.3 AB PLC_AB1769_L32E的 ModbusRTU

2.4 三菱

2.4.1 FX3SA的modbus RTU

2.5 欧姆龙

2.5.1 CP1L的modbus RTU

2.6 松下

2.6.1 松下AFPX的modbus RTU主站

2.6.2 松下AFPX的modbus TCP客户端

2.7 Modbus与C#的应用

2.7.1 C# 编写modbus RTU主站

2.7.2 C# 编写modbus TCP Client

2.7.3 C# 编写modbus RTU Over TCP功能

2.7.4 C# 编写远程modbusDTU服务器


目前才写到台达章节,整理资料需要花不少时间。每周会更新一到两章节。如果有朋友需要,但是我论坛还没更新的时候,可以联系我微信:we9322025。


在此,先奉献第一章的基础篇给大家。

modbus新起点1--基础篇:http://bbs.gongkong.com/d/201807/764982_1.shtml 

modbus新起点连载2--modbus台达篇:http://bbs.gongkong.com/d/201807/765040_1.shtml

modbus的新起点连载3——台达PLC的modbus主站:http://bbs.gongkong.com/d/201807/765110_1.shtml

modbus新起点连载4--台达PLC以太网的数据交换:http://bbs.gongkong.com/D/201807/765957_1.shtml 

modbus新起点连载5--台达PLC的modbusTCP客户端程序:http://bbs.gongkong.com/D/201807/765961_1.shtml 

modbus新起点连载6——西门子200的modbusRTU: http://bbs.gongkong.com/D/201807/766167_1.shtml 

modbus新起点连载7——西门子1200的modbus TCP http://bbs.gongkong.com/d/201808/767744_1.shtml 

modbus新起点连载8——西门子1200的modbus RTU 和AB PLC的modbus相关资料和链接:http://bbs.gongkong.com/d/201808/767745_1.shtml 

modbus新起点连载9——三菱PLC FX3SA的modbus RTU:http://bbs.gongkong.com/D/201808/768365_1.shtml 


正在下载,请等待……
下载附件需0积分!

1分不嫌少!


楼主最近还看过



合作方来给大家

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 100回
  • 年度积分:0
  • 历史总积分:259
  • 注册:2017年7月20日
发表于:2018-07-18 17:05:45
21楼

看完楼主的文章之后特地回来给你点个赞,支持

回复本条

    

we9322025

  • 精华:2帖
  • 求助:0帖
  • 帖子:11帖 | 41回
  • 年度积分:15
  • 历史总积分:974
  • 注册:2012年10月23日
发表于:2018-07-18 18:58:21
22楼

1.4.3 Modbus TCP抓包分析

Modbus TCP介绍是在TCP/IP上的MODBUS报文传输服务。Modbus TCP/IP的通信系统包括不同类型的设备:

Ø  连接至 TCP/IP 网络的 MODBUS TCP/IP 客户机和服务器设备。(本章介绍的modbus TCP

Ø  互连设备,例如:在 TCP/IP 网络和串行链路子网之间互连的网桥、路由器或网关,联接,该子网允许将 MODBUS 串行链路客户机和服务器终端设备连接起来。(modbus RTU/ASCII的转换网关)。

image.png

Modbus协议定义了一个与基础通信层无关的简单协议单元(PDU)。特定总线网络上的MODBUS协议能够在应用数据单元(ADU)上引入一些附加域。

image.png

如果用modbus RTU的报文来套用则是,

image.png

如果是modbus TCP的报文的套用则是:

image.png

其中modbus TCPPDUmodbus RTUPDU的内容全部相同。为此后续的介绍中只是介绍了modbus TCP的机制,功能码也只是选取其中一个功能码进行讲解。

Modbus TCP的报文头的组成如下:

事务元标识符

协议标识符号

长度

单元标识符

长度

2字节

2字节

2字节

1字节

描述

用来识别该报文是否已经处理过
  比如计数器。

由于TCP可以可以多路复用,所以需要用一个字段来表示协议编号。
  0:modbus

后面报文的长度。
  PDU的字节数+1

由于需要转换转换给串口,串口中有一个站号。在modbusTCP中没有意义。

由于 modbus TCP是基于 TCP/IP协议之上的应用层协议,所以其连接过程,依然需要遵循TCP的连接过程(握手和挥手环境)。机制如下:

三次握手和四次挥手,握手环节是建立连接的过程,挥手环节是断开连接的过程。中间数据传输的过程就是modbus 报文交互的过程。

 

image.png

下面我们来通过modbus TCP报文的抓包来进行分析。找到抓包文件modbus TCP.pcapngwireshark打开。报文中可以看到交互的过程:

建立连接的三个环节

image.png

中间是modbus交互的环节

image.png

尾部是断开连接的过程:

image.png

建立连接和断开连接,所有的TCP/IP的报文都有这一过程。后面重点解析一段modbus的交互报文。

image.png

从上面第54个编号的请求如上图,下边红色框中内容,是modbus的详细报文。主要分为五部分:二层报文头、三层报文头、传输控制协议头、modbus TCP头、modbus内容。前三个,是TCP/IP的共性,后面两个是modbus所独有的。

展开modbus TCP头和modbus的内容如下:

image.png

Modbus TCP的头一共由四部分组成:

Ø  Transcation Identifier(传输ID,每请求一次加1,从0开始递增)

Ø  Protocol Identifier(协议标识符,0modbus协议)

Ø  Length(长度,后面还有6个字节的长度)

Ø  Unit Identifier(单元标识符,就是从站站号,在modbusTCP中没有意义,在modbus TCP转串口的协议中才会用到(modbus网桥))

Modus通讯内容,这边使用的是0号功能码,这一部分详细内容可以参考modbusRTUdata区域(功能码+长度+数据)。0号功能码就是对应区域就是

Ø  Function Coderead Coils

Ø  Reference Number:来时地址

Ø  Bit count:线圈的个数

接下来我们来看下一下对应的modbus 的响应报文。

image.png

其中响应的 modbus TCP头的报文中,

Ø  Transaction Identifier:与请求的报文相同

Ø  Protocol Identifier:固定为0,表示modbus协议

Ø  Length:的长度由后面报文长度决定

响应中的modbus内容如下:

Ø  Function Coderead coils

Ø  Byte count:数据内容的字节数

Ø  Data0002100000  0000  0000  0010  0001 0000coil491

对应其他功能码的只有modbus内容区域和modbus RTU一样,在这里就不在赘述。


回复本条

    

we9322025

  • 精华:2帖
  • 求助:0帖
  • 帖子:11帖 | 41回
  • 年度积分:15
  • 历史总积分:974
  • 注册:2012年10月23日
发表于:2018-07-18 18:59:06
23楼

1.4.4 RTU/ASCII Over TCP抓包分析

RTU/ASCII OVER TCP的报文是TCP/IP的头+ASCII/RTU报文组成。同样需要遵循TCP的建立连接和断开连接的过程。与modbus TCP的不同主要在于中间报文。在这里我们打开ASCIIovertcp.pcapng的抓包报文进行查看。建立连接和断开连接我们就不看了。我们直接进入modbus报文交互环节。

image.png

其中data区域,如果大家对前面ASCII章节所讲的内容有映像的话不能认出是modbus ASCII报文:

3a:30:31:30:31:30:30:30:41:30:30:31:34:45:30:0d:0a

具体含义大家可以查一下前面的章节。


回复本条

    

we9322025

  • 精华:2帖
  • 求助:0帖
  • 帖子:11帖 | 41回
  • 年度积分:15
  • 历史总积分:974
  • 注册:2012年10月23日
发表于:2018-07-18 19:00:27
24楼

1.5 Modbus 总结及其对比分析

Modbus的是一个工控上经常碰到的协议。它由简单的PDU报文分别扩展衍生出其很多分之。

1.5 Modbus 总结及其对比分析

Modbus的是一个工控上经常碰到的协议。它由简单的PDU报文分别扩展衍生出其很多分之。

image.png

由最初的简单协议报文,串口上面衍生出串口报文,在网口上面规划了modbus TCP。串口扩展报文用十六进制(HEX)表示衍生出了RTU,用ASCII表示报文衍生出modbus ASCII。串口报文通过串口服务器后衍生出了over TCP的版本。

网口和串口传输数据的时候,最大差别是速度,在网线直连传输的时候都在10msmodbusTCP就可以完成一次交互,而串口在9600的波特率下传输一次基本在120ms左右;由于网口的可复用性强,可以支持并发。就是一个客户端允许同时向多个服务器拿数据,串口同一时刻永远只能用一有一个请求或者响应在传输;modbus TCP可以支持多主站,串口只能单一主站(注:虽然后来modbus 新增Plus版本有了通过令牌解决多主站问题,但是效率依然是瓶颈);网口可以通过交换机或者路由扩展下去,串口只能通过手拉手方式的接法进行扩展,还受到到距离、站数、导线粗细等问题,导致串口组网比较困难。那么问题回来了串口有这么多问题,为啥没被抛弃呢?便宜就是硬道理,现在网口的一个PLC和串口的一个PLC差价在400多,如果在更早他们的差价更大。

Modbus ASCII新的协议栈设计考虑到的问题比较完善,比较容易区分每个报文的开始和结束,报文的完整性接受比较有保帐。Modbus RTU报文及其精简,传输效率高。相比ASCII码方式RTU的传输到底快多少呢?一个十六进制表示成一个字符,就是说ASCII码传输相同的内容,其长度是RTU的近两倍。由于串口传输都在本地,丢包和错误率偏低,使得ASCII码设计较为鸡肋,RTU获得很多厂商的青睐。

Over TCP起始本质上是一种透传。不止试用modbus协议,也适用于其他协议。只是因为modbus的应用广泛性,衍生出了RTU/ASCII over TCP。但是Over TCP并不能直接接入modbus的总线中。他需要一步将外面封装的TCP头给裁掉。所以Over TCP在现场总线总很少涉及到。但是在远程的系统中,涉及的就比较广。比较典型的就是DTUDTUOver TCP的基础上加了一些特殊的标识符,使得远程的管理更为容易。



由最初的简单协议报文,串口上面衍生出串口报文,在网口上面规划了modbus TCP。串口扩展报文用十六进制(HEX)表示衍生出了RTU,用ASCII表示报文衍生出modbus ASCII。串口报文通过串口服务器后衍生出了over TCP的版本。

网口和串口传输数据的时候,最大差别是速度,在网线直连传输的时候都在10msmodbusTCP就可以完成一次交互,而串口在9600的波特率下传输一次基本在120ms左右;由于网口的可复用性强,可以支持并发。就是一个客户端允许同时向多个服务器拿数据,串口同一时刻永远只能用一有一个请求或者响应在传输;modbus TCP可以支持多主站,串口只能单一主站(注:虽然后来modbus 新增Plus版本有了通过令牌解决多主站问题,但是效率依然是瓶颈);网口可以通过交换机或者路由扩展下去,串口只能通过手拉手方式的接法进行扩展,还受到到距离、站数、导线粗细等问题,导致串口组网比较困难。那么问题回来了串口有这么多问题,为啥没被抛弃呢?便宜就是硬道理,现在网口的一个PLC和串口的一个PLC差价在400多,如果在更早他们的差价更大。

Modbus ASCII新的协议栈设计考虑到的问题比较完善,比较容易区分每个报文的开始和结束,报文的完整性接受比较有保帐。Modbus RTU报文及其精简,传输效率高。相比ASCII码方式RTU的传输到底快多少呢?一个十六进制表示成一个字符,就是说ASCII码传输相同的内容,其长度是RTU的近两倍。由于串口传输都在本地,丢包和错误率偏低,使得ASCII码设计较为鸡肋,RTU获得很多厂商的青睐。

Over TCP起始本质上是一种透传。不止试用modbus协议,也适用于其他协议。只是因为modbus的应用广泛性,衍生出了RTU/ASCII over TCP。但是Over TCP并不能直接接入modbus的总线中。他需要一步将外面封装的TCP头给裁掉。所以Over TCP在现场总线总很少涉及到。但是在远程的系统中,涉及的就比较广。比较典型的就是DTUDTUOver TCP的基础上加了一些特殊的标识符,使得远程的管理更为容易。


回复本条

    

we9322025

  • 精华:2帖
  • 求助:0帖
  • 帖子:11帖 | 41回
  • 年度积分:15
  • 历史总积分:974
  • 注册:2012年10月23日
发表于:2018-07-18 19:01:25
25楼

2.1台达PLCmodbus应用

台达小型PLC由于其较高的性价比,在中国市场中排名第四。由于手中的资源有限,所以台达PLCmodbus 应用,将围绕DVP-12SE的机型展开。

经过查阅手册收整理12SEmodbus地址表如下:

寄存器

范围

类型

属性

Modbus通訊位址

Modbus通訊位址

(Hex)

(Dec)

S

000~1023

Bit

R / W

0000~03FF

000001~001024

X

000~377 (Octal)

Bit

R

0400~04FF

101025~101280

Y

000~377 (Octal)

Bit

R / W

0500~05FF

001281~001536

T

000~255

Bit

R / W

0600~06FF

001537~001792

Word

R / W

0600~06FF

401537~401792

M

000~1535

Bit

R / W

0800~0DFF

002049~003584

M

1536~4095

Bit

R / W

B000~B9FF

045057~047616

C

0~199

16-bit

Bit

R / W

0E00~0EC7

003585~003784

Word

R / W

0E00~0EC7

403585~403784

200~255

32-bit

Bit

R / W

0EC8~0EFF

003785~003840

Dword

R / W

0EC8~0EFF

403785~403840

D

000~4095

Word

R / W

1000~1FFF

404097~408192

D

4096~11999

Word

R / W

9000~AEDF

436865~444750

为了方便我们的后面的调试,我们编写一个PLC程序让PLC的数据动起来,这样监控的时候就比较方便了。

image.png


回复本条

    

we9322025

  • 精华:2帖
  • 求助:0帖
  • 帖子:11帖 | 41回
  • 年度积分:15
  • 历史总积分:974
  • 注册:2012年10月23日
发表于:2018-07-18 19:02:56
26楼

2.1.1 台达PLC modbus RTU/ASCII从站功能

台达PLC已经内置了modbus协议,只需要做串口参数的修改即可。其中12SE中的的串口相关的寄存器如下:

image.png

其中D1120的参数如下:

image.png

目前我们编写一个modbus RTU模式下串口(Com2)参数9600,81n

D1120H81

M1143ON

编写modbus的从站参数如下:

image.png

通过usbRS485的线,对PLC进行调试结果如下:
由于在变化的寄存器是D112。而D0~D4095范围的寄存器开始的modbus地址是H1000(换成16进制后是4096),所以D112modbus地址是4096+112=4208

image.png


回复本条

    

we9322025

  • 精华:2帖
  • 求助:0帖
  • 帖子:11帖 | 41回
  • 年度积分:15
  • 历史总积分:974
  • 注册:2012年10月23日
发表于:2018-07-18 19:07:37
27楼

2.1.2 台达PLC Link功能

PLClink功能主要用于实现PLC串口之间的数据交互。台达的PLC使用了17(十六进制)modbus读写指令,其主要实现同时读取一片寄存器之间的区域,并写入另外一寄存器区域。有点像0316功能码的组合版。

具体使用过程:

编写PLC程序,有与PLC默认是1号站,9600,71EAscii码模式。并设置link启动,自动模式。

image.png

ISPsoft软件界面左上角【NWCOMFIG

image.png

进入下面

image.png

拖动Dvp-Series->SE到右边编辑区

image.png

双击PLC1PLC2分别配置串口信息

image.png

拖动上面的串口C2C1进行组网

image.png

将配置好的信息分别下载到PLC中。

选中网络#1  RS485 连线 双击

image.png

点击向右指示箭头

image.png

双击第一条,即可进行数据交换的配置。

配置的画面如下:

image.png

然后点击【确认】

image.png

如有需要还可配置多条

image.png

配置完成之后点击下载并监控

image.png

选择1号站的数据即可看到数据

image.png

其他的特殊使用参看台达的PLC link手册。


回复本条

    

we9322025

  • 精华:2帖
  • 求助:0帖
  • 帖子:11帖 | 41回
  • 年度积分:15
  • 历史总积分:974
  • 注册:2012年10月23日
发表于:2018-07-18 19:14:21
28楼

2.1.3 台达PLC modbusRTU/ASCII主站功能

台达的modbus 主站可以通过通讯向导来完成。在这里给大家简单介绍一个如何快速获取变频器的运行频率。

场景每隔500ms读取一次变频器的运行频率,存到D101中。

第一步 设定变频器的通讯格式为RTU模式,9600,81e。分别设定参数P89=01P92=04

image.png

image.png

第二步 查找变频器运行频率的modbus地址。查找后为2103H

image.png

第四步 使用PLC的通信向导

1)打开WPLsoft,创建一个空程序

2)在工具栏,找到通讯程序按钮,点击,弹出通讯程序向导

image.png

(3)       选择CCOM2,然后点击“下一步”。配置通讯参数。

条件表达式,设置成LD M1002//程序初始化的时候进行通讯初始化

勾选通讯保存

勾选RTU模式

通讯参数,9600,8,1,E

通讯站号:1

image.png

(4)       配置好通讯参数后点击“下一步”。选择通讯应用指令。

image.png

(5)       在点击下一步,进行通讯参数配置。当M0导通的时候读取变频器的运行频率(H2103)。配置参数如下:

image.png

image.png

(6)       点击“完成”后,自动生成了通讯程序。

image.png

image.png

第五步 修改PLC的通讯程序。由于变频器的频率需要一直读取,所以需要完成对M0的导通控制,才能进行通讯。我的常规习惯是,在通讯完成后的500ms,再次进行频率读取。对M0的信号进行控制。我个人的习惯是,通讯分为请求开始,轮询间隔,通讯复位,超时判断四个阶段。

修改之后如下:

第六步 报文解析。修改完程序之后就算是可以进行通讯了。通过监控可以看到回复的报文:

image.png

参看前面基础篇中的03报文格式

image.png

整理在excel中(从报文中可以看出,一个寄存器表示一个byte):

D0

H0001

站号

D1

H0003

功能码

D2

H0002

字节数

D3

H0011

寄存器值高位

D4

H005C

寄存器的低位

D5

H00B4

CRC高位

D6

H002D

CRC低位

所以变频器的的频率为D3D4的组合H115C

新增解析程序

image.png

D101就是所需的变频器的值。其中有偏移两位小数点就是44.44


回复本条

    

student

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 7147回
  • 年度积分:27
  • 历史总积分:30554
  • 注册:2016年7月25日
发表于:2018-07-18 21:16:52
29楼

谢谢分享,确实够很有帮助

回复本条

    

郭远林

  • [版主]
  • 精华:3帖
  • 求助:10帖
  • 帖子:114帖 | 2277回
  • 年度积分:70
  • 历史总积分:45752
  • 注册:2011年10月21日
发表于:2018-07-18 21:23:27
30楼

大师我得向你学习!

回复本条

    

郭远林

  • [版主]
  • 精华:3帖
  • 求助:10帖
  • 帖子:114帖 | 2277回
  • 年度积分:70
  • 历史总积分:45752
  • 注册:2011年10月21日
发表于:2018-07-18 21:25:41
31楼

我加你微信了,, 

回复本条

    

狼人杀

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 42回
  • 年度积分:15
  • 历史总积分:588
  • 注册:2018年5月26日
发表于:2018-07-19 08:54:04
32楼

谢谢楼主的干货。学习了。。

回复本条

    

向南1

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 30回
  • 年度积分:0
  • 历史总积分:106
  • 注册:2018年7月19日
发表于:2018-07-19 10:25:02
33楼

大师我得向你学习  

回复本条

    

Smile-lyc

  • [管理员]
  • 精华:138帖
  • 求助:53帖
  • 帖子:3604帖 | 22810回
  • 年度积分:1639
  • 历史总积分:157730
  • 注册:2006年8月04日
发表于:2018-07-20 21:45:17
34楼

很久没有如此干货了,亲们快接货

回复本条

    

空的用户名

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 11回
  • 年度积分:0
  • 历史总积分:146
  • 注册:2018年7月23日
发表于:2018-07-23 15:09:07
35楼

谢谢分享,帮助非常大,正在看这方面的资料

回复本条

    

ww2222w2008

  • 精华:0帖
  • 求助:1帖
  • 帖子:3帖 | 240回
  • 年度积分:0
  • 历史总积分:142
  • 注册:2013年11月14日
发表于:2018-07-23 17:56:07
36楼

谢谢分享,这确实够称得上鸿作了

回复本条

    

丨丶灬迷失er丨

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 98回
  • 年度积分:0
  • 历史总积分:115
  • 注册:2018年7月21日
发表于:2018-07-24 08:53:36
37楼

楼主好人..谢谢楼主分享

回复本条

    

zhangpeng521008

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 200回
  • 年度积分:62
  • 历史总积分:903
  • 注册:2012年8月23日
发表于:2018-07-24 09:45:40
38楼

好久不见这样的帖子了,支持你!加油!


回复本条

    

gk2017

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 102回
  • 年度积分:0
  • 历史总积分:64
  • 注册:2018年5月21日
发表于:2018-07-24 10:35:16
39楼

好文,必须要学习一下

回复本条

    

过客一号

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 2417回
  • 年度积分:0
  • 历史总积分:496
  • 注册:2017年6月09日
发表于:2018-07-24 13:05:09
40楼

好资料,感谢分享!

回复本条

    

热门招聘
相关主题

官方公众号

智造工程师