西门子S7-200 Modbus最强解析图解
使用下面的例程你可以在S7-200CPU之间设置一个简单的Modbus通讯。
这个例子是关于Modbus功能码6的(写从站保持寄存器), 也可以作为其他所支持的功能码:1, 2, 3, 4, 5, 15 和16 的基本参数设置步骤 。
要求:
要使用Modbus协议必须先在STEP 7 Micro/Win上安装指令库 。
Modbus主站协议只支持STEP 7 Micro/Win V4.0 SP5及其以上版本.。
- 硬件设置
- 参数匹配
- 指令库的存储地址
- 保持寄存器值得传输
- 硬件设置
例程中的Modbus通讯是在两个S7-200 CPU的0号通讯口间进行的(最好每个CPU都有两个通讯口)。在主站侧也可以选择相应库文件 "MBUS_CTRL_P1" 和 "MBUS_MSG_P1"通过1号通讯口通信。通讯口1与Micro/WIN建立PG或PC连接,两个CPU的通讯口0通过PPI电缆进行连接(电缆的 针脚 连接为2,3,7,8)。 - 参数匹配
对于MODBUS通讯, 主站侧需要程序库 "MBUS_CTRL" 和 "MBUS_MSG", - 从站侧需要程序库 "MBUS_INIT" and "MBUS_SLAVE"。
在 Micro/WIN 中您需要为主站和从站新建一个项目,程序与参数设置见图.02。
必须要保证主站与从站的“Baud”和"Parity"的参数设置要一致,并且程序块"MBUS_MSG"中的"Slave"地址要与程序块"MBUS_INIT"中的"Addr"所设置的一致 (见图. 02)。
Micro/WIN“系统块”中设置的0通讯口的波特率与MODBUS协议无关("Mode" = "1")。下面的表格列出了程序块各个参数选项及其意义
主站
MBUS_CTRL
参数 意义 选项 EN 使能 Mode 协议选择 0=PPI, 1=MODBUS Baud 传输速率 kbps 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 Parity 校验选择 0=无校验, 1=奇校验, 2=偶校验 Timeout 从站的最长响应时间 ms Done “完成”标志位 Error 错误代码 1) 表 01
1) 参看STEP 7 Micro/WIN 帮助: "MODBUS主站执行MBUS_MSG时的错误代码MBUS_MSG" 。
MBUS_MSG
参数 意义 选项 EN 使能 First 读写请求位 Slave 从站地址 RW "读" 或 "写" 0=读, 1=写 Addr 读写从站的数据地址 0 .. 128 = 数字量输出 Q0.0 .. Q15.7
1001 .. 10128 = 数字量输入 I0.0 .. I15.7
30001 .. 30092 = 模拟量输入 AIW0 .. AIW62
40001 .. 49999 = 保持寄存器 2Count 位或字的个数 (0xxxx, 1xxxx) / words (3xxxx, 4xxxx) DataPtr V存储区起始地址指针 Done "完成" 标志位 Error 错误代码 1) 表 02
1)参看STEP 7 Micro/WIN 帮助: "MODBUS主站执行MBUS_MSG时的错误代码MBUS_MSG" 。
从站
MBUS_INIT
参数 意义 选项 EN 使能 Mode 协议选择 0=PPI, 1=MODBUS Addr 从站地址 Baud 传输速率 kbps 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 Parity 校验 0=无校验, 1=奇校验, 2=偶校验 Delay 超时时间 ms MaxIQ 可使用的数字输入输出点数 2) MaxAI 可使用的模拟量输入点数 2) MaxHold 保持寄存器字的最大数量 2) HoldStart 保持寄存器的起始地址(40001) Done 完成标志位 Error 错误代码 3) 表 03
2) 最大的地址取决于所用CPU的类型及其最大值。
3)参看STEP 7 Micro/WIN 帮助: “MODBUS从站协议的错误代码”。MBUS_SLAVE
参数 意义 选项 EN 使能 Done 完成标志位 Error 错误代码 3) 表 04
3)参看STEP 7 Micro/WIN 帮助: “MODBUS从站协议的错误代码” 。
- 库的存储地址
项目完成后必须要在Micro/WIN中定义库的存储地址,当定义完存储区后, 要保证在任何情况下不能再被其它程序所使用 (主站侧: "DataPtr" + "Count" 从站侧: "HoldStart" + "MaxHold")。 - 保持寄存器值的传输
将程序下载到相应的CPU后,可以在状态表中给主站侧的V存储区赋值,然后监视从站的变化。
当主站的I0.0使能后,VW2中的内容就被发送到从站并写入从站的VW2 。 - 保持寄存器值的传输见图. 04。
指针"DataPtr" 代表了V区被读的起始地址。
参数 "Count" 表明了地址"Addr" = "4xxxx" (保持寄存器)以字为单位被读的个数。
主站中被读取的V存储区被写入地址为"Addr" = "40002" ("RW" = "1")的保持寄存器中。
保持寄存器是以字为单位工作的,它与从站的V区地址对应。
指针 "HoldStart" 明确了与保持寄存器起始地址40001相对应的V存储区的初始地址。
可以这样计算从站的V区目标指针:2 * (Addr - 40001) + HoldStart = 2 * (40002 - 40001) + &VB0 = &VB2
另外,要保证"MaxHold" 定义的数据区能够包含主站侧所要写入的数据区 :
MaxHold >= Addr - 40001 + Count = 40002 - 40001 + 1 = 2
- Modbus RTU 主站指令库
西门子在 Micro/WIN V4.0 SP5 中正式推出 Modbus RTU 主站协议库(西门子标准库指令)。图 1. 西门子标准指令库(Micro/WIN V4.0 SP5)
注意:1. Modbus RTU 主站指令库的功能是通过在用户程序中调用预先编好的程序功能块实现的,该库对 Port0 和Port 1 有效。该指令库将设置通信口工作在自由口模式下。
2. Modbus RTU 主站指令库使用了一些用户中断功能,编其他程序时不能在用户程序中禁止中断。
3. Modbus RTU 主站库对CPU的版本有要求。CPU 的版本必须为 2.00 或者 2.01(即订货号为6ES721*-***23-0BA*),1.22版本之前(包括1.22版本)的 S7-200 CPU 不支持。
使用 Modbus RTU 主站指令库,可以读写 Modbus RTU 从站的数字量、模拟量 I/O 以及保持寄存器。
要使用 Modbus RTU 主站指令库,须遵循下列步骤:Modbus RTU 主站功能编程
1. 调用 Modbus RTU 主站初始化和控制子程序
使用 SM0.0 调用 MBUS_CTRL 完成主站的初始化,并启动其功能控制:用 SM0.0 调用 Modbus RTU 主站初始化与控制子程序
各参数意义如下:a. EN 使能: 必须保证每一扫描周期都被使能(使用 SM0.0)
b. Mode 模式: 为 1 时,使能 Modbus 协议功能;为 0 时恢复为系统 PPI 协议
c. Baud 波特率: 支持的通讯波特率为1200,2400,4800,9600,19200,38400,57600,115200。
d. Parity 校验: 校验方式选择
0=无校验
1=奇较验
2=偶较验
e. Timeout 超时: 主站等待从站响应的时间,以毫秒为单位,典型的设置值为 1000 毫秒(1 秒),允许设置的范围为1 - 32767。
注意: 这个值必须设置足够大以保证从站有时间响应。f. Done 完成位: 初始化完成,此位会自动置1。可以用该位启动 MBUS_MSG 读写操作(见例程)
g. Error 初始化错误代码(只有在 Done 位为1时有效):
0= 无错误
1= 校验选择非法
2= 波特率选择非法
3= 模式选择非法2. 调用 Modbus RTU 主站读写子程序MBUS_MSG,发送一个Modbus 请求;
调用Modbus RTU 主站读写子程序
各参数意义如下:a. EN 使能: 同一时刻只能有一个读写功能(即 MBUS_MSG)使能
注意:建议每一个读写功能(即 MBUS_MSG)都用上一个 MBUS_MSG 指令的Done 完成位来激活,以保证所有读写指令循环进行(见例程)。
b. First 读写请求位: 每一个新的读写请求必须使用脉冲触发
c. Slave 从站地址: 可选择的范围 1 -247
d. RW 从站地址: 0 = 读, 1 = 写
注意:1. 开关量输出和保持寄存器支持读和写功能
2. 开关量输入和模拟量输入只支持读功能
e. Addr 读写从站的 选择读写的数据类型
数据地址: 00001 至 0xxxx - 开关量输出
10001 至 1xxxx - 开关量输入
30001 至 3xxxx - 模拟量输入
40001 至 4xxxx - 保持寄存器
f. Count 数据个数 通讯的数据个数(位或字的个数)
注意: Modbus主站可读/写的最大数据量为120个字(是指每一个 MBUS_MSG指令)
g. DataPtr 数据指针: 1. 如果是读指令,读回的数据放到这个数据区中
2. 如果是写指令,要写出的数据放到这个数据区中
h. Done 完成位 读写功能完成位
i. Error 错误代码: 只有在 Done 位为1时,错误代码才有效
0 = 无错误
1 = 响应校验错误
2 = 未用
3 = 接收超时(从站无响应)
4 = 请求参数错误(slave address, Modbus address, count,RW)
5 = Modbus/自由口未使能
6 = Modbus正在忙于其它请求
7 = 响应错误(响应不是请求的操作)
8 = 响应CRC校验和错误
-
101 = 从站不支持请求的功能
102 = 从站不支持数据地址
103 = 从站不支持此种数据类型
104 = 从站设备故障
105 = 从站接受了信息,但是响应被延迟
106 = 从站忙,拒绝了该信息
107 = 从站拒绝了信息
108 = 从站存储器奇偶错误常见的错误:
• 如果多个 MBUS_MSG 指令同时使能会造成 6 号错误
• 从站 delay 参数设的时间过长会造成主站 3 号错误
• 从站掉电或不运行,网络故障都会造成主站 3 号错误
3. 在 CPU 的 V 数据区中为库指令分配存储区(Library Memory)
Modbus Master 指令库需要一个284个字节的全局 V 存储区。关于 Modbus RTU 主站协议库的补充说明
此为西门子正式推出的标准库指令说明资料。
在 Modbus RTU Master 协议和 PPI 协议之间切换:
Modbus RTU Master 协议指令库使通信口工作在自由口模式下,此时不能与 Micro/WIN 软件通信。要在切换回PPI 协议,可以:
• 将 MBUS_CTRL 指令的 Mode 输入端设置为逻辑“0”
• 将 CPU 的允许模式选择开关置为 STOP 位置
Modbus RTU Master 协议库的执行时间:
Modbus RTU Master 协议库的 MBUS_CTRL 指令不需要很长的执行时间。MBUS_需要 1.11 ms用于初始化,在后续的每个扫描周期中只占用 0.41 ms。
调用 MBUS_MSG 子程序会加长处理时间。大部分时间都用于 CRC 校验的计算。每读、写一个字的数据就需要 1.85 ms扫描时间。数据最多的情况下(读、写 120 字的数据),扫描时间大概会扩增加 222ms。读操作的时间主要消耗在接收数据上;写操作的时间主要消耗在发送数据上。
Modbus 地址
通常 Modbus 地址由 5 位数字组成,包括起始的数据类型代号,以及后面的偏移地址。Modbus Master协议库把标准的 Modbus 地址映射为所谓 Modbus 功能号,读写从站的数据。Modbus Master协议库支持如下地址:
• 00001 - 09999:数字量输出( 线圈)
• 10001 - 19999:数字量输入(触点)
• 30001 - 39999:输入数据寄存器(通常为模拟量输入)
• 40001 - 49999:数据保持寄存器
Modbus Master 协议库支持的功能
为了支持上述 Modbus 地址的读写,Modbus Master 协议库需要从站支持下列功能:
表 1. 需要从站支持的功能
Modbus 地址 读/写 Modbus 从站须支持的功能
00001 - 09999
数字量输出 读 功能 1
写 功能 5:写单输出点
功能 15:写多输出点
10001 - 19999
数字量输入 读 功能 2
写 -
30001 - 39999
输入寄存器 读 功能 4
写 -
40001 - 49999
保持寄存器 读 功能 3
写 功能 6:写单寄存器单元
功能 16:写多寄存器单元Modbus 地址和 S7-200 存储区地址的映射
S7-200 通过 Modbus Master 和 Slave 协议库通信时,Modbus 地址和 S7-200 内存储区地址的映射关系都类似。
Modbus 保持寄存器地址映射举例:Modbus 保持寄存器地址
40001 12 34
40002 56 78
40003 9A BCS7-200 存储区字寻址
VW200 12 34
VW202 56 78
VW204 9A BCS7-200 存储区字节寻址
VB200 12
VB201 34
VB202 56
VB203 78
VB204 9A
VB205 BCModbus 数字量地址映射举例:
位地址(0xxxx 和 1xxxx)数据总是以字节为单位打包读写。第一个字节中的最低有效位对应 Modbus地址的起始地址。如下图所示:数字量地址映射举例
常问问题
Modbus RTU 主站库对 CPU 的版本是否有要求,为什么编译例子程序时,会遇到 4个错误?
Modbus RTU 主站库对 CPU 的版本确实有要求,CPU 的版本必须为 2.00 或者2.01(即订货号为6ES721*-***23-0BA*),1.22 版本之前(包括 1.22 版本)的 S7-200 CPU不支持。
Modbus 指令库启动后,如何通过同一个通信端口进行 CPU监控?
Modbus 指令库使用的是 CPU 的自由口通信功能,工作在自由口模式下的通讯口不能使用 Micro/WIN 的 PPI编程通信监控。如果通信口都已经被占用,可以考虑:
• 加一个通信模块(如 EM 277、CP 243-1、EM 241 等)扩展出一个编程通信口
• 中止自由口模式,可以将 CPU 上的模式开关从 RUN 拨到 STOP;或者保持处于 RUN 状态,用程序停止指令库的Modbus 模式(参见指令库应用)
如何理解 Modbus 地址与功能码的区别?
Modbus 地址与 Modbus 的功能码是两个层次的概念。
根据 Modbus 通信协议,Modbus 数据的地址使用 0xxxx、1xxxx、3xxxx 和 4xxxx的形式,分别表示数字量输出、数字量输入、模拟量输入等数据地址。在使用 S7-200 的指令库时,Modbus 数据地址与 S7-200的 I/O 和数据存储区地址间有特定的对应关系。
有些设备表明它支持 Modbus RTU 通信协议,但也详细提供了读写数据的详细通信帧格式,其中包括如何指定 Modbus站的地址,需要读写数据类型、长度等等。数据帧有特定字节指出此指令读写的数据类型和地址,此字节的数据内容即所谓“功能码”,如功能 1指定读取单个/多个数字量输出点的值。
支持 Modbus 协议的设备或软件,使用时用户直接设置或看到的应当是 Modbus 数据地址。Modbus地址所访问的数据,是通过各种“功能”读写而来。功能码是 Modbus 地址的底层。如果 Modbus 通信的一方提供的所谓Modbus 协议只有功能码,则需要注意了解此功能号与 Modbus 地址间的对应关系。
如何访问大于 9999 的保持寄存器地址?
通常 Modbus 协议的保持寄存器地址范围在 40001 - 49999 之间。对于多数应用来说已经够了。但有些 Modbus从站把地址映射到保持寄存器区的地址超过 9999 的部分。
Modbus Master 协议库支持超过 9999 的保持寄存器地址。地址范围为 400001 - 465536。只需在调用MBUS_MSG 子程序时给 Addr 参数赋相应的值即可,如 416768。
Modubs Master 扩展地址模式仅支持保持寄存器区,不支持其他地址类型。
- 库的存储地址