>屯蒙闲谈聚焦方向:
1.PLC标准化和PLC代码自动生成(OPENNESS)
2.设备机器安全(理论+方案) 3.西门子运动控制和行业解决方案 4.OIIOT盒子
声明: 该资源由曾工提供,致谢曾工!
Modbus简介Modbus协议是一种已广泛应用于当今工业控制领域的通用通讯协议。通过此协议,控制器相互之间、或控制器经由网络(如以太网)可以和其它设备之间进行通信。Modbus协议使用的是主从通讯技术,即由主设备主动查询和操作从设备。一般将主控设备方所使用的协议称为ModbusMaster,从设备方使用的协议称为Modbus Slave。 Modbus数据模型指令介绍Modbus RTU 主站指令库 西门子在STEP 7-Micro/WIN SMART 中正式推出 Modbus RTU 主站协议库(西门子标准库指令)。 图 1. 西门子标准指令库(STEP 7-Micro/WIN SMART)注意:
1. Modbus RTU 主站指令库的功能是通过在用户程序中调用预先编好的程序功能块实现的,该库对 CPU 集成的RS 485 通讯口 和 CM01 信号板有效。该指令库将设置通信口工作在自由口模式下。 2. Modbus RTU 主站指令库使用了一些用户中断功能,编其他程序时不能在用户程序中禁止中断。 3. Modbus RTU 主站指令库可以同时应用于CPU 集成的RS 485 通讯口 和 CM01 信号板,此时集成的RS485口使用Modbus RTU Master(v2.0)中指令,CM01信号板使用ModbusRTU Master2(v2.0)中指令,如果只有一个主站则不做区分。 使用Modbus RTU 主站指令库,可以读写 Modbus RTU 从站的数字量、模拟量 I/O 以及保持寄存器。 Modbus RTU 主站功能编程 1. 调用Modbus RTU 主站初始化和控制子程序 使用SM0.0 调用 MBUS_CTRL 完成主站的初始化,并启动其功能控制:
图 2. 用 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. | Port | 端口号: | 0 = CPU 集成的 RS 485 通讯口 ; 1 = 可选 CM 01 信号板 。 | f. | Timeout | 超时: | 主站等待从站响应的时间,以毫秒为单位,典型的设置值为 1000 毫秒(1 秒),允许设置的范围为 1 - 32767。 |
| 注意: 这个值必须设置足够大以保证从站有时间响应。 | g. | Done | 完成位: | 初始化完成,此位会自动置1。可以用该位启动 MBUS_MSG 读写操作(见例程) | h. | Error |
| 初始化错误代码(只有在 Done 位为1时有效): |
| 0= 无错误 | 1= 校验选择非法 | 2= 波特率选择非法 | 3= 超时无效 | 4= 模式选择非法 | 9= 端口无效 | 10= 信号板端口 1 缺失或未组态 |
2. 调用Modbus RTU 主站读写子程序MBUS_MSG,发送一个Modbus 请求;
图 3. 调用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 指令库需要一个286个字节的全局V 存储区。 调用STEP7 - Mciro/WIN SMART Instruction Library(指令库)需要分配库指令数据区(LibraryMemory)。库指令数据区是相应库的子程序和中断程序所要用到的变量存储空间。 如果在编程时不分配库指令数据区,编译时会产生许多相同的错误。 操作步骤: 1)在指令树的Project(项目)中,以鼠标右键单击ProgramBlock(程序块),在弹出的快捷菜单中选择Library Memory。如图4所示:
图4. “库存储器”按钮 2)在弹出的选项卡中设置库指令数据区,如图5所示:
图5. 缺省情况下是从VB0开始,但要保证该存储器使用地址范围与其他程序使用的地址不能有重叠。按“建议地址”按钮也可以自动分配。
可以使用 “建议地址” 设置数据区,但要注意编程软件设置的数据区地址,只考虑到了其他一般寻址,而未考虑到诸如Modbus数据保持寄存器区等的设置。应当确保不与其他任何已使用的数据区重叠、冲突。不应重复按“建议地址” 按钮,否则也会造成混乱。 关于Modbus RTU 主站协议库的补充说明 Modbus 地址 通常Modbus 地址由 5 位数字组成,包括起始的数据类型代号,以及后面的偏移地址。ModbusMaster 协议库把标准的 Modbus 地址映射为所谓 Modbus 功能号,读写从站的数据。ModbusMaster 协议库支持如下地址: · 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 SMART 存储区地址的映射 S7-200 SMART 通过Modbus Master 和 Slave 协议库通信时,Modbus地址和 S7-200 SMART CPU内存储区地址的 映射关系都类似。 Modbus 保持寄存器地址映射举例: Modbus 保持寄存器地址 40001 | 12 34 | 40002 | 56 78 | 40003 | 9A BC |
|
| S7-200 SMART 存储区字寻址 VW200 | 12 34 | VW202 | 56 78 | VW204 | 9A BC |
|
| S7-200 SMART 存储区字节寻址 VB200 | 12 | VB201 | 34 | VB202 | 56 | VB203 | 78 | VB204 | 9A | VB205 | BC |
|
Modbus 数字量地址映射举例: 位地址(0xxxx和 1xxxx)数据总是以字节为单位打包读写。第一个字节中的最低有效位对应 Modbus 地址的起始地址。如下图所示:
图6 . 数字量地址映射举例 轮询结构使用完成位与循环左移完成 主程序中调用Modbus子程序
附上Modbus读程序源码截图
下面展示插队写入 读示例 增加读取站 Slave填写从站号 RW填写0读取 Addr填入读取地址 DataPtr填写存放读回的数据指针 写示例 增加写入站 Slave填写从站号 RW填写1写入 Addr填入写入地址 DataPtr填写写入数据指针
写入时置位Write即可自动处理插队写入 例如
根据该思路简单修改即可通杀Modbus通讯轮询插队写入,写入完成自动回到读轮询
谢谢曾工的分享,希望曾工的分享能够帮助到有需求的人。
后台回复 “一文让你精通Modbus-曾工分享” 即可获得源码链接! 该回复为自动回复,如果没有得到链接,仔细检查是不是回复的关键字有问题!
|