入工控已经五年了。工控的入门似乎很简单,但是一深入下去就效率极低。
五年了,应该做件大事。
为此希望花半年的零散时间,结合我个人调试经验,写一篇关于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
楼主最近还看过
Modbus TCP介绍是在TCP/IP上的MODBUS报文传输服务。Modbus TCP/IP的通信系统包括不同类型的设备:
Ø 连接至 TCP/IP 网络的 MODBUS TCP/IP 客户机和服务器设备。(本章介绍的modbus TCP)
Ø 互连设备,例如:在 TCP/IP 网络和串行链路子网之间互连的网桥、路由器或网关,联接,该子网允许将 MODBUS 串行链路客户机和服务器终端设备连接起来。(modbus RTU/ASCII的转换网关)。
Modbus协议定义了一个与基础通信层无关的简单协议单元(PDU)。特定总线网络上的MODBUS协议能够在应用数据单元(ADU)上引入一些附加域。
如果用modbus RTU的报文来套用则是,
如果是modbus TCP的报文的套用则是:
其中modbus TCP的PDU和modbus RTU的PDU的内容全部相同。为此后续的介绍中只是介绍了modbus TCP的机制,功能码也只是选取其中一个功能码进行讲解。
Modbus TCP的报文头的组成如下:
域 | 事务元标识符 | 协议标识符号 | 长度 | 单元标识符 |
长度 | 2字节 | 2字节 | 2字节 | 1字节 |
描述 | 用来识别该报文是否已经处理过 | 由于TCP可以可以多路复用,所以需要用一个字段来表示协议编号。 | 后面报文的长度。 | 由于需要转换转换给串口,串口中有一个站号。在modbusTCP中没有意义。 |
由于 modbus TCP是基于 TCP/IP协议之上的应用层协议,所以其连接过程,依然需要遵循TCP的连接过程(握手和挥手环境)。机制如下:
三次握手和四次挥手,握手环节是建立连接的过程,挥手环节是断开连接的过程。中间数据传输的过程就是modbus 报文交互的过程。
下面我们来通过modbus TCP报文的抓包来进行分析。找到抓包文件modbus TCP.pcapng用wireshark打开。报文中可以看到交互的过程:
建立连接的三个环节
中间是modbus交互的环节
尾部是断开连接的过程:
建立连接和断开连接,所有的TCP/IP的报文都有这一过程。后面重点解析一段modbus的交互报文。
从上面第54个编号的请求如上图,下边红色框中内容,是modbus的详细报文。主要分为五部分:二层报文头、三层报文头、传输控制协议头、modbus TCP头、modbus内容。前三个,是TCP/IP的共性,后面两个是modbus所独有的。
展开modbus TCP头和modbus的内容如下:
Modbus TCP的头一共由四部分组成:
Ø Transcation Identifier(传输ID,每请求一次加1,从0开始递增)
Ø Protocol Identifier(协议标识符,0是modbus协议)
Ø Length(长度,后面还有6个字节的长度)
Ø Unit Identifier(单元标识符,就是从站站号,在modbusTCP中没有意义,在modbus TCP转串口的协议中才会用到(modbus网桥))
Modus通讯内容,这边使用的是0号功能码,这一部分详细内容可以参考modbusRTU的data区域(功能码+长度+数据)。0号功能码就是对应区域就是
Ø Function Code:read Coils
Ø Reference Number:来时地址
Ø Bit count:线圈的个数
接下来我们来看下一下对应的modbus 的响应报文。
其中响应的 modbus TCP头的报文中,
Ø Transaction Identifier:与请求的报文相同
Ø Protocol Identifier:固定为0,表示modbus协议
Ø Length:的长度由后面报文长度决定
响应中的modbus内容如下:
Ø Function Code:read coils
Ø Byte count:数据内容的字节数
Ø Data:000210(0000 0000 0000 0010 0001 0000)coil(4和9为1)
对应其他功能码的只有modbus内容区域和modbus RTU一样,在这里就不在赘述。
回复本条
RTU/ASCII OVER TCP的报文是TCP/IP的头+ASCII/RTU报文组成。同样需要遵循TCP的建立连接和断开连接的过程。与modbus TCP的不同主要在于中间报文。在这里我们打开ASCIIovertcp.pcapng的抓包报文进行查看。建立连接和断开连接我们就不看了。我们直接进入modbus报文交互环节。
其中data区域,如果大家对前面ASCII章节所讲的内容有映像的话不能认出是modbus ASCII报文:
3a:30:31:30:31:30:30:30:41:30:30:31:34:45:30:0d:0a
具体含义大家可以查一下前面的章节。
回复本条
Modbus的是一个工控上经常碰到的协议。它由简单的PDU报文分别扩展衍生出其很多分之。
Modbus的是一个工控上经常碰到的协议。它由简单的PDU报文分别扩展衍生出其很多分之。
由最初的简单协议报文,串口上面衍生出串口报文,在网口上面规划了modbus TCP。串口扩展报文用十六进制(HEX)表示衍生出了RTU,用ASCII表示报文衍生出modbus ASCII。串口报文通过串口服务器后衍生出了over TCP的版本。
网口和串口传输数据的时候,最大差别是速度,在网线直连传输的时候都在10ms内modbusTCP就可以完成一次交互,而串口在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在现场总线总很少涉及到。但是在远程的系统中,涉及的就比较广。比较典型的就是DTU。DTU在Over TCP的基础上加了一些特殊的标识符,使得远程的管理更为容易。
由最初的简单协议报文,串口上面衍生出串口报文,在网口上面规划了modbus TCP。串口扩展报文用十六进制(HEX)表示衍生出了RTU,用ASCII表示报文衍生出modbus ASCII。串口报文通过串口服务器后衍生出了over TCP的版本。
网口和串口传输数据的时候,最大差别是速度,在网线直连传输的时候都在10ms内modbusTCP就可以完成一次交互,而串口在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在现场总线总很少涉及到。但是在远程的系统中,涉及的就比较广。比较典型的就是DTU。DTU在Over TCP的基础上加了一些特殊的标识符,使得远程的管理更为容易。
回复本条
台达小型PLC由于其较高的性价比,在中国市场中排名第四。由于手中的资源有限,所以台达PLC的modbus 应用,将围绕DVP-12SE的机型展开。
经过查阅手册收整理12SE的modbus地址表如下:
寄存器 | 范围 | 类型 | 属性 | 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的数据动起来,这样监控的时候就比较方便了。
回复本条
台达PLC已经内置了modbus协议,只需要做串口参数的修改即可。其中12SE中的的串口相关的寄存器如下:
其中D1120的参数如下:
目前我们编写一个modbus RTU模式下串口(Com2)参数9600,8,1,n。
D1120:H81
M1143为ON
编写modbus的从站参数如下:
通过usb转RS485的线,对PLC进行调试结果如下:
由于在变化的寄存器是D112。而D0~D4095范围的寄存器开始的modbus地址是H1000(换成16进制后是4096),所以D112的modbus地址是4096+112=4208,
回复本条
PLC的link功能主要用于实现PLC串口之间的数据交互。台达的PLC使用了17(十六进制)modbus读写指令,其主要实现同时读取一片寄存器之间的区域,并写入另外一寄存器区域。有点像03和16功能码的组合版。
具体使用过程:
编写PLC程序,有与PLC默认是1号站,9600,7,1,E,Ascii码模式。并设置link启动,自动模式。
ISPsoft软件界面左上角【NWCOMFIG】
进入下面
拖动Dvp-Series->SE到右边编辑区
双击PLC1和PLC2分别配置串口信息
拖动上面的串口C2,C1进行组网
将配置好的信息分别下载到PLC中。
选中网络#:1 RS485 连线 双击
点击向右指示箭头
双击第一条,即可进行数据交换的配置。
配置的画面如下:
然后点击【确认】
如有需要还可配置多条
配置完成之后点击下载并监控
选择1号站的数据即可看到数据
其他的特殊使用参看台达的PLC link手册。
回复本条
台达的modbus 主站可以通过通讯向导来完成。在这里给大家简单介绍一个如何快速获取变频器的运行频率。
场景每隔500ms读取一次变频器的运行频率,存到D101中。
第一步 设定变频器的通讯格式为RTU模式,9600,8,1,e。分别设定参数P89=01,P92=04。
第二步 查找变频器运行频率的modbus地址。查找后为2103H
第四步 使用PLC的通信向导
(1)打开WPLsoft,创建一个空程序
(2)在工具栏,找到通讯程序按钮,点击,弹出通讯程序向导
(3) 选择CCOM2,然后点击“下一步”。配置通讯参数。
条件表达式,设置成LD M1002//程序初始化的时候进行通讯初始化
勾选通讯保存
勾选RTU模式
通讯参数,9600,8,1,E
通讯站号:1
(4) 配置好通讯参数后点击“下一步”。选择通讯应用指令。
(5) 在点击下一步,进行通讯参数配置。当M0导通的时候读取变频器的运行频率(H2103)。配置参数如下:
(6) 点击“完成”后,自动生成了通讯程序。
第五步 修改PLC的通讯程序。由于变频器的频率需要一直读取,所以需要完成对M0的导通控制,才能进行通讯。我的常规习惯是,在通讯完成后的500ms,再次进行频率读取。对M0的信号进行控制。我个人的习惯是,通讯分为请求开始,轮询间隔,通讯复位,超时判断四个阶段。
修改之后如下:
第六步 报文解析。修改完程序之后就算是可以进行通讯了。通过监控可以看到回复的报文:
参看前面基础篇中的03报文格式
整理在excel中(从报文中可以看出,一个寄存器表示一个byte):
D0 | H0001 | 站号 |
D1 | H0003 | 功能码 |
D2 | H0002 | 字节数 |
D3 | H0011 | 寄存器值高位 |
D4 | H005C | 寄存器的低位 |
D5 | H00B4 | CRC高位 |
D6 | H002D | CRC低位 |
所以变频器的的频率为D3和D4的组合H115C
新增解析程序
即D101就是所需的变频器的值。其中有偏移两位小数点就是44.44
回复本条