文章目录

PLC与RFID读写器的通信编程实例

发布于 2026-03-25 23:52:34 · 浏览 12 次 · 评论 0 条

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 数据的完整逻辑流向:

graph TD Start(开始上电) --> Init["初始化 MB_CLIENT 指令\nMODE = 0"] Init --> Trigger{读取触发信号?} Trigger -- 否 --> Trigger Trigger -- 是 --> Req["发送请求:\nREQ = TRUE"] Req --> Wait["等待 DONE 或 ERROR"] Wait --> Check{DONE = 1 ?} Check -- 否 --> ErrorCheck{ERROR = 1 ?} ErrorCheck -- 是 --> Err["错误处理:\n记录错误代码"] Err --> Trigger ErrorCheck -- 否 --> Wait Check -- 是 --> Parse["解析数据:\n将 DATA_PTR 数据移出"] Parse --> Reset["复位触发信号:\nREQ = FALSE"] Reset --> Trigger

四、 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_ErrorFALSE,则通信成功。

检查 常见问题:

  1. Comm_Error 为 TRUE,Error_Code80C8:表示通信超时。请 检查 接线 A/B 是否接反,或波特率设置是否不一致。
  2. 读到数据为全 0:表示读到了空数据。请 确认 标签是否在感应区内,或读写器寄存器地址是否配置错误。
  3. 数据乱码:通常是数据解析错误。请 核对 读写器返回的数据格式是 HEX 还是 ASCII,并相应调整 PLC 解析程序。

评论 (0)

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

扫一扫,手机查看

扫描上方二维码,在手机上查看本文