PLC与RFID读写器的通信编程实例
本文将以西门子 S7-1200 PLC 与某型号高频 RFID 读写器为例,通过 Modbus RTU 协议实现标签数据的读取与写入。所有步骤均基于硬件接线、参数配置及逻辑代码编写展开。
一、 硬件连接与物理层检查
确认 PLC 通信口(CM1241 RS485 模块或 CPU 自带 PROFINET 口转串口)与 RFID 读写器的接线正确。
连接 RS485 线缆。RFID 读写器通常采用 A/B 端子接线。
执行 以下接线操作:
| 设备端 | RFID 读写器端 | 颜色建议 | 说明 |
|---|---|---|---|
| PLC A+ (或 T/R+) | 485+ (A) | 绿色 | 数据正极 |
| PLC B- (或 T/R-) | 485- (B) | 白色 | 数据负极 |
| GND | GND | 黑色 | 屏蔽地线,必接 |
紧固 所有螺丝,防止接触不良导致通信中断。
二、 RFID 读写器参数配置
在编写 PLC 程序前,需通过读写器配套的配置软件将其通信参数设置为与 PLC 一致。
打开 RFID 配置软件,连接 读写器。
修改 串口参数如下:
- 波特率:19200 (根据需求可选,建议 19200 以保证速度)
- 数据位:8
- 停止位:1
- 校验位:Even (偶校验) 或 None (无校验,需与 PLC 保持一致)
设置 通信协议为 Modbus RTU 模式。
记录 读写器的 从站地址 (Slave ID),默认通常为 1。
记录 存储标签数据的 Modbus 寄存器地址。例如:标签 UID 存储在保持寄存器 Address 0,长度为 4 个字(8 字节)。
保存 配置并 重启 读写器使设置生效。
三、 PLC 通信逻辑规划
通信过程分为“触发发送”、“等待响应”、“处理数据”三个阶段。为确保通信稳定,采用状态机逻辑编写。
下图展示了 PLC 读取 RFID 数据的完整逻辑流向:
四、 PLC 程序编写 (SCL 语言)
在 TIA Portal (博途) 软件中,新建 DB 块存储数据,并编写程序。
1. 定义全局变量 (DB 块)
创建 一个名为 RFID_Data 的全局 DB 块,定义以下变量:
| 变量名称 | 数据类型 | 初始值 | 描述 |
|---|---|---|---|
Read_Trigger |
Bool | False | 读取触发信号 (上升沿有效) |
UID_Hex |
Array[0..7] of Byte | 0 | 存储读取到的标签 UID (16进制) |
UID_String |
String[20] | "" | 转换后的 UID 字符串,方便 HMI 显示 |
Comm_Error |
Bool | False | 通信错误标志位 |
Error_Code |
Word | 0 | 错误代码 |
2. 编写主程序 (OB1)
拖入 MB_CLIENT 指令到主程序中。该指令用于 Modbus TCP 或 RTU 通信,此处配置为 RTU 模式。
配置 MB_CLIENT 引脚参数(背景数据块建议新建):
REQ: 使用脉冲信号触发。DISCONNECT: 默认为FALSE,保持连接。MB_MODE: 设置为0(Modbus RTU)。MB_DATA_ADDR: 填入0(对应读写器配置的寄存器首地址)。MB_DATA_LEN: 填入4(读取 4 个字)。DATA_PTR: 关联 到RFID_Data.UID_Hex。
编写 SCL 代码如下:
// 上升沿检测触发信号
IF "RFID_Data".Read_Trigger AND NOT #Trigger_Memory THEN
#Trigger_Memory := TRUE;
// 触发 Modbus 读取
#Modbus_Inst.REQ := TRUE;
ELSE
#Trigger_Memory := "RFID_Data".Read_Trigger;
#Modbus_Inst.REQ := FALSE;
END_IF;
// 通信错误监测
IF #Modbus_Inst.ERROR THEN
"RFID_Data".Comm_Error := TRUE;
"RFID_Data".Error_Code := #Modbus_Inst.STATUS;
ELSE
"RFID_Data".Comm_Error := FALSE;
"RFID_Data".Error_Code := 16#0000;
END_IF;
// 读取成功且无错误,进行数据解析
IF #Modbus_Inst.DONE AND NOT #Modbus_Inst.ERROR THEN
// 此处可将字节数组转换为字符串 (示例逻辑)
// 将 Hex 数据转换为 ASCII 字符串以便显示
#Temp_String := '';
FOR #i := 0 TO 7 DO
#Byte_Val := "RFID_Data".UID_Hex[#i];
// 调用库指令或自行写逻辑将 Byte 转为 2 位 Hex 字符
// 假设存在 'Byte_to_Hex_String' 功能块
#Hex_Char := "Byte_to_Hex_String"(#Byte_Val);
#Temp_String := CONCAT(#Temp_String, #Hex_Char);
END_FOR;
"RFID_Data".UID_String := #Temp_String;
END_IF;
五、 数据处理与调试
RFID 读卡器返回的数据通常遵循大端模式,即高字节在前。
注意 字节序交换问题。例如,寄存器地址 0 返回的字数据为 AABB,在 UID_Hex 数组中可能存储为 AA, BB。如果 PLC 内部处理需要小端模式,需 调用 SWAP 指令或 编写 交换逻辑。
下载 程序到 PLC。
打开 软件的“在线监控”功能。
放置 RFID 标签到读写器感应区。
观察 RFID_Data.UID_String 变量值。如果读到类似 E200 1234 5678 的字符串,且 Comm_Error 为 FALSE,则通信成功。
检查 常见问题:
Comm_Error为 TRUE,Error_Code为80C8:表示通信超时。请 检查 接线 A/B 是否接反,或波特率设置是否不一致。- 读到数据为全 0:表示读到了空数据。请 确认 标签是否在感应区内,或读写器寄存器地址是否配置错误。
- 数据乱码:通常是数据解析错误。请 核对 读写器返回的数据格式是 HEX 还是 ASCII,并相应调整 PLC 解析程序。

暂无评论,快来抢沙发吧!