西门子S7系列PLC的PUT/GET指令是用于S7通信协议中实现PLC与PLC、PLC与上位机(如HMI、SCADA或PC)之间数据交换的核心功能块。这些指令主要用于S7-1200和S7-1500系列PLC,基于S7CommPlus协议,通过以太网(PROFINET)实现高效的数据读写操作。
PUT/GET指令概述
1. 功能定义
• GET指令:从远程PLC的指定存储区读取数据,客户端(调用GET的PLC)发起请求,服务器端(被读取的PLC)返回数据。
• PUT指令:向远程PLC的指定存储区写入数据,客户端发起请求,服务器端接收并存储数据。
• 通信模式:PUT/GET指令基于主从模型(Client-Server),调用指令的PLC为客户端,目标PLC为服务器端。服务器端无需额外编程,只需准备数据块。
2. 适用范围
• 支持的PLC型号:S7-1200(固件V2.0及以上)、S7-1500、部分S7-300/400(需支持S7Comm协议)。
• 通信介质:以太网(PROFINET),端口通常为102。
• 典型应用:
• PLC之间的数据共享(如生产线的状态同步)。
• HMI/SCADA读取PLC数据(如实时监控变量)。
• 上位机与PLC的数据交互(如通过PC写入控制参数)。
3. 特点
• 单边组态:只需在客户端(调用PUT/GET的PLC)组态,服务器端无需额外编程。
• 灵活寻址:支持多种存储区(如DB、M、I、Q等)和数据类型(BIT、BYTE、WORD、REAL等)。
• 高效性:支持批量读写多个变量,减少通信开销。
• 安全性:S7-1200/1500使用S7CommPlus协议,支持TLS加密。
PUT/GET指令的结构与参数
PUT/GET指令是TIA Portal(博图软件)中的标准功能块(FB),位于指令库的“通信 > S7通信”目录下。以下是指令的详细参数说明。
1. GET指令(FB14)
• 功能:从远程PLC读取数据。
• 输入参数:
• REQ(BOOL):触发信号,上升沿触发读取请求。
• ID(WORD):S7连接的标识号(在硬件组态中定义)。
• NDR(BOOL,输出):新数据就绪标志,置1表示读取成功。
• BUSY(BOOL,输出):指令执行中标志,置1表示正在通信。
• ERROR(BOOL,输出):错误标志,置1表示发生错误。
• STATUS(WORD,输出):状态码,指示执行结果(如0x0000表示成功)。
• ADDR_1…ADDR_n(ANY):远程PLC的存储区地址(如P#DB1.DBX0.0 BYTE 10)。
• RD_1…RD_n(ANY):本地存储区,用于存储读取的数据。
• 调用方式:每次调用支持读取1到4个变量(取决于CPU型号)。
2. PUT指令(FB15)
• 功能:向远程PLC写入数据。
• 输入参数:
• REQ(BOOL):触发信号,上升沿触发写入请求。
• ID(WORD):S7连接的标识号。
• DONE(BOOL,输出):写入完成标志,置1表示写入成功。
• BUSY(BOOL,输出):指令执行中标志。
• ERROR(BOOL,输出):错误标志。
• STATUS(WORD,输出):状态码。
• ADDR_1…ADDR_n(ANY):远程PLC的存储区地址。
• SD_1…SD_n(ANY):本地存储区,提供待写入的数据。
• 调用方式:支持写入1到4个变量。
3. 寻址格式
• 存储区:支持I(输入)、Q(输出)、M(标志)、DB(数据块)、T(定时器)、C(计数器)。
• 地址格式:如P#DB1.DBX0.0 BYTE 10(读取/写入DB1的0.0偏移量开始的10字节数据)。
• 数据类型:支持BIT、BYTE、WORD、DWORD、INT、DINT、REAL等。
PUT/GET指令的组态与编程
1. 硬件组态
1. 配置网络:
• 在TIA Portal中添加两台PLC(如S7-1200和S7-1500)。
• 设置IP地址(如客户端:192.168.0.10,服务器:192.168.0.12)。
• 确保两台PLC在同一子网内,端口102开放。
2. 建立S7连接:
• 在“连接”视图中添加S7连接。
• 指定客户端PLC(调用PUT/GET的PLC)和服务器PLC(被读写的PLC)。
• 设置连接ID(WORD类型,如W#16#0001)。
• 配置TSAP(Transport Service Access Point),格式为“机架号.槽号”(如03.01)。
3. 服务器端设置:
• 在服务器PLC中启用“允许通过PUT/GET远程访问”选项(在CPU属性 > 保护与安全中)。
• 准备数据块(如DB1),确保客户端有访问权限。
2. 编程步骤
1. 创建数据块:
• 客户端:创建本地数据块(如DB10)存储读取/写入的数据。
• 服务器端:创建目标数据块(如DB1)存放被读写的数据。
2. 调用PUT/GET指令:
• 在客户端的主程序(OB1)中插入GET或PUT指令。
• 设置REQ信号(通过触发条件,如按钮或定时器)。
• 配置ID(连接ID,如W#16#0001)。
• 指定ADDR_1(远程地址,如P#DB1.DBX0.0 BYTE 10)和RD_1/SD_1(本地地址,如P#DB10.DBX0.0 BYTE 10)。
3. 处理状态:
• 监控NDR/DONE信号,确认操作成功。
• 检查ERROR和STATUS,处理错误(如0x7001表示连接未建立)。
4. 下载程序:
• 将程序下载到客户端和服务器PLC,启动通信。
3. 示例代码
GET指令读取远程DB1的10字节数据:
// 触发GET指令
A "Trigger" // 外部触发信号
= "GET_REQ"
// 调用GET指令
CALL "GET" (REQ := "GET_REQ",
ID := W#16#0001,
ADDR_1 := P#DB1.DBX0.0 BYTE 10,
RD_1 := P#DB10.DBX0.0 BYTE 10,
NDR => "GET_NDR",
BUSY => "GET_BUSY",
ERROR => "GET_ERROR",
STATUS => "GET_STATUS")
// 处理结果
A "GET_NDR"
JC Success
A "GET_ERROR"
JC Error
Success: // 数据读取成功
NOP
Error: // 处理错误
NOP
PUT指令写入本地DB10的10字节数据到远程DB1:
// 触发PUT指令
A "Trigger"
= "PUT_REQ"
// 调用PUT指令
CALL "PUT" (REQ := "PUT_REQ",
ID := W#16#0001,
ADDR_1 := P#DB1.DBX0.0 BYTE 10,
SD_1 := P#DB10.DBX0.0 BYTE 10,
DONE => "PUT_DONE",
BUSY => "PUT_BUSY",
ERROR => "PUT_ERROR",
STATUS => "PUT_STATUS")
// 处理结果
A "PUT_DONE"
JC Success
A "PUT_ERROR"
JC Error
注意事项
1. 通信限制
• 最大数据量:单次PUT/GET操作的最大数据量受CPU型号限制(如S7-1200最大为160字节,S7-1500更高)。
• 连接资源:每个PLC的S7连接数有限(如S7-1200支持8个连接),需合理分配。
• 优化访问:尽量合并多个变量到同一数据块,减少通信请求。
2. 错误处理
常见错误码及解决方法:
• 0x7001:连接未建立。检查IP地址、TSAP配置或网络连接。
• 0x8104:目标地址无效。确认服务器端数据块存在且未被锁定。
• 0x8500:数据类型不匹配。检查ADDR和RD/SD的格式一致性。
• 0x8301:访问权限不足。确保服务器端启用PUT/GET访问权限。
3. 性能优化
• 批量操作:在一次请求中读写多个变量,减少通信开销。
• 非优化块:服务器端数据块需设置为“非优化访问”,以兼容PUT/GET指令。
• 触发控制:避免频繁触发REQ信号,设置合理的通信间隔(如100ms)。