1 MBAP报文头(MBAP: Modbus Application Protocol,Modbus应用协议)
分四个域,共7个字节,见表1。
表1
域 | 长度 | 描述 | 客户端 | 服务器端 |
传输标志 | 2字节 | 标志某个Modbus | 由客户端生成 | 应答时复制该值 |
协议标志 | 2字节 | 0=Modbus协议 | 由客户端生成 | 应答时复制该值 |
长度 | 2字节 | 后续字节计数 | 由客户端生成 | 应答时由服务器 |
单元标志 | 1字节 | 定义连接于目的 | 由客户端生成 | 应答时复制该值 |
2 Modbus功能代码
共有三种类型分别为:
· 公共功能代码 已定义好的功能码,保证其唯一性,由Modbus.org认可。
· 用户自定义功能代码 有两组,分别为65~72和100~110,不需要认可,但不保证代码使用的唯一性,如想变为公共代码,需要RFC认可。
· 保留的功能代码 由某些公司使用在某些传统设备的代码,不可作为公共用途。
常用公共功能代码见表2。
常用公共功能代码 | 功能码 | ||||
十进码 | 子码 | 十六进制 | |||
位 操 作 | 开关量输入 | 读输入点 | 02 | 02 | |
内部位或开关量输出 | 读线圈 | 01 | 01 | ||
写单个线圈 | 05 | 05 | |||
写多个线圈 | 15 | 0F | |||
16 位 操 作 | 模拟量输入 | 读输入寄存器 | 04 | 04 | |
内部寄存器或输出寄存器(模拟量输出) | 读多个寄存器 | 03 | 03 | ||
写单个寄存器 | 06 | 06 | |||
写多个寄存器 | 16 | 10 | |||
读/写多个寄存器 | 23 | 17 | |||
屏蔽写寄存器 | 22 | 16 | |||
文件记录 | 读文件记录 | 20 | 6 | 14 | |
封装接口 | 写文件记录 | 21 | 6 | 15 | |
读设备标识 | 43 | 14 | 2B |
表2 常用公共功能代码
功能代码划按应用深浅分,可分为三个类别:
(1) 类别0,对于客户机/服务器最小的可用子集。
· 读多个保持寄存器(fc.3);
· 写多个保持寄存器(fc.16)。
(2) 类别1,可实现基本互易操作的常用代码。
· 读线圈(fc.1);
· 读开关量输入(fc.2);
· 读输入寄存器(fc.4);
· 写线圈(fc.5);
· 写单一寄存器(fc.6)。
(3) 类别2,用于人机界面、监控系统的例行操作和数据传送功能。
· 强制多个线圈(fc.15);
· 读通用寄存器(fc.20);
· 写通用寄存器(fc.21);
· 屏蔽写寄存器(fc.22);
· 读写寄存器(fc.23)。
3 Modbus应用举例:读寄存器
请求 功能码 1字节 0x03
起始地址 2字节 0x0000到0xFFFF
寄存器数 2字节 1到125(0x7D)
应答 功能码 1字节 0x03
字节数 1字节 2 x N
寄存器的值 N x 2字节
(N为寄存器的数量)
出错 出错码 1字节 0x83
例外码 1字节 01或02或03或04
4 Modbus TCP 请求报文举例,见表3。
表3
描述 |
| 大小(字节) | 示例 | 备注 |
MBAP | 传输标志Hi | 1 | 0x15 | 传输标志用于和应答配合使用 |
传输标志Lo | 1 | 0x01 | 每对传输使用唯一的标志 | |
协议标志 | 2 | 0x0000 | 该域可用作寻址Modbus/ | |
长度 | 2 | 0x0006 | ||
单元标志 | 2 | 0xFF | ||
Modbus | 功能代码 | 1 | 0x03 | 读寄存器 |
起始地址 | 2 | 0x0005 |
| |
寄存器数 | 2 | 0x0001 |
5 Modbus TCP客户端的实现
用Connect( )命令建立对目标设备TCP502端口的连接。
数据通讯的过程如下:
(1) 准备Modbus报文,包括7个字节的MBAP在内的请求;
(2) 使用Send( )命令发送;
(3) 在同一连接等待应答;
(4) 用recv( )读报文,完成一次数据交换过程。
当通讯任务结束时,关闭TCP连接,使服务器可以为其它设备服务。
6 Modbus TCP的样板程序
用户可以通过网络www.transparentfactory.com下载。
(1) 基于WIN32系统下,C的应用程序。
(2) 基于UNIX系统下,C的应用程序。
(3) JAVA的应用程序。
7 Modbus TCP协议
协议文本的英文版可从www.modbus.org下载。
8 Modbus的应用
Modbus 是一种通讯协议,于 1979年由Modicon公司发明,并将其公开,推向市场,是基于主站从站/ 客户机服务器方式连接智能设备,实现设备间的数据交换。
Modbus 的通讯几乎可以通过任何物理介质实现,如:电线、光纤、红外、射频、扩频、微波、卫星等。Modbus 还可以通过不同的网络进行互连,如:以太网、ADSL、ISDN、PSTN、ATM、FR等。所以它具有很强的扩展能力,可以说:连接的距离已不是问题,它可以通过互联网,连接到世界的任何地方。
Modbus 具有很高的速度性能:响应时间小于10毫秒,目前可以满足工业控制中90% 应用的需求,它的下一个实现目标是:响应时间小于1毫秒。
由于Modbus 是制造业、基础设施环境下,真正的开放协议,故得到了工业界的广泛支持,是事实上的工业标准。还由于它的协议简单、容易实施和高性价比,所以全球有超过400个厂家支持,使用的设备节点超过700万个。
9 典型应用介绍
人机界面+可编程控制器+变频调速器应用(HMI+PLC+VSD)
这是一种设备制造商(OEM)和传统设备改造时,经常使用的方案,典型配置如图1所示。
图1 设备制造商或设备改造项目典型应用
图中人机界面可以是图形的,也可以是文字的,一般文字型HMI比图形的HMI要价格低廉。图中的变频器只画了一台,实际上使用RS485的多站总线,最多可以连接31台。可编程控制器可按工艺要求,可对变频器的速度进行调节。
完成上述方案的关键是用知道变频器内部的命令字和各参数的寄存器号,下面就施耐德公司的ATV58变频器来说明PLC是如何操作变频器的。
命令字CMD(变频器地址W400)
位15:1,简单控制方式;
位1:=0串行连接无效
=1串行连接有效;
位7:=0
=1 故障复位;
位8:=0 激活半行连接控制
=1 取消串行连接控制;
位11:=0 正转
=1 反转;
位12:=0 运行
=1 停止(减速停车);
位13:=0
=1 直流注入停车;
位14:=0
=1 快速停车。
可以通过可编程控制器的Modbus写命令,把代码发送到W400寄存器中,实现对变频器的控制。
举例:
正转运行 CMD="H"'002'
频率给定 W401 LFR
转速给定 W603 LFRD
反转运行 CMD="H"'802'
频率给定 W401LFR
转速给定 W603 LFRD
减速停车 CMD="H"'002'
直流注入停车CMD=H'A002'
快速停车 CMD="H"'C002'
自由停车 CMD="H"'000'
因为设备制造商对价格比较敏感,所以也有把上述标准的配置进行简化的版本,如图2所示。
图2 设备制造商或设备改造项目典型应用简化版
(a)省略人机界面HMI(b)省略PLC
控制和操作的原理基本上是相同的。