[西门子] 文档和源码分享!一文让你精通Modbus

[复制链接]
查看121 | 回复0 | 2024-10-22 08:38:27 | 显示全部楼层 |阅读模式
>

屯蒙闲谈聚焦方向:

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 Masterv2.0)中指令,CM01信号板使用ModbusRTU Master2v2.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

波特率:

支持的通讯波特率为1200240048009600192003840057600115200

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-曾工分享”    即可获得源码链接!

该回复为自动回复,如果没有得到链接,仔细检查是不是回复的关键字有问题!



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则