1.3 通信特点
特性 | 说明 |
通信类型 | PROFINET IO RT(实时) |
数据交换 | 过程数据 + 参数数据 |
传输距离 | 标准 100 米(可扩展) |
通信周期 | 4ms ~ 512ms 可调 |
识别距离 | 根据 RFID 系列(HF:0-400mm, UHF:0-12m) |
多标签识别 | 支持防碰撞,同时识别多个标签 |
---
二、硬件与软件要求
2.1 软件要求
软件 | 最低版本 | 推荐版本 | 说明 |
TIA Portal(博途) | V15.1 | V17/V18/V19 | S7-1200 组态 |
RFID 固件 | 根据型号 | 最新版本 | 支持 PROFINET 功能 |
GSDML 文件 | V2.3 | TIA Portal 内置 | PROFINET 设备描述 |
RF-Viewer | V2.0+ | 最新版本 | RFID 调试软件(可选) |
2.2 硬件要求
设备 | 型号/订货号 | 说明 |
| S7-1200 | CPU 1214C/1215C/1217C V4.0 及以上 | IO 控制器 |
| RF600 | 6GF34xx 系列 | UHF RFID 阅读器 |
| RF200 | 6GT28xx 系列 | HF RFID 阅读器 |
| RF300 | 6GT23xx 系列 | HF RFID 阅读器 |
| RF400 | 6GF33xx 系列 | UHF RFID 阅读器 |
| 天线 | 根据应用选择 | 圆形/矩形/近场等 |
| 电子标签 | 根据应用选择 | 无源/有源标签 |
| 网线 | CAT5e 及以上 | 标准工业以太网线 |
2.3 常见 RFID 阅读器型号
系列 | 型号 | 订货号 | 接口 |
| RF620R | 标准型 | 6GF3420-0AA00 | PROFINET/PROFIBUS |
| RF640R | 高性能型 | 6GF3440-0AA00 | PROFINET/PROFIBUS |
| RF680R | 长距离型 | 6GF3480-0AA00 | PROFINET/PROFIBUS |
| RF240R | 紧凑型 | 6GT2840-0AB00 | PROFINET |
| RF280R | 标准型 | 6GT2880-0AB00 | PROFINET |
| RF310R | 紧凑型 | 6GT2310-0AB00 | PROFINET |
| RF340R | 标准型 | 6GT2340-0AB00 | PROFINET |
| RF350R | 高性能型 | 6GT2350-0AB00 | PROFINET |
---
三、配置步骤(TIA Portal 侧)
第一步:创建 TIA Portal 项目
打开TIA Portal软件
点击「创建新项目」,输入项目名称
选择「添加新设备」
第二步:添加 S7-1200 CPU(IO 控制器)
添加 PLC:
选择「控制器」→「SIMATIC S7-1200」→「CPU」
选择具体型号(如 CPU 1215C DC/DC/DC)
选择固件版本(V4.0 及以上)
配置 PROFINET 接口:
进入「设备视图」→ 点击 CPU 上的 PROFINET 接口
在「属性」→「以太网地址」中设置:
IP 地址:如 192.168.0.1
子网掩码:255.255.255.0
勾选「自动生成 PROFINET 设备名称」
第三步:添加 RFID 阅读器(IO 设备)
添加 RFID 设备:
进入「网络视图」
在右侧「硬件目录」→「识别系统」→「SIMATIC RF」→ 选择对应系列
选择对应型号(如 RF620R/RF340R 等)
拖拽到网络视图中配置 PROFINET 接口:
双击网络视图中的 RFID 阅读器
在「属性」→「以太网地址」中设置:
IP 地址:如 192.168.0.2(与 PLC 同一网段)
子网掩码:255.255.255.0
取消勾选「自动生成 PROFINET 设备名称」
手动设置设备名称(如:"rfid_reader1")
分配 IO 控制器:
在网络视图中选中 RFID 阅读器
点击「未分配」
选择 S7-1200 作为 Controller
第四步:配置数据交换区(过程映像)
这是最关键的配置,决定数据交换格式:
进入设备视图:
双击 RFID 阅读器图标
进入「设备视图」
配置子模块:
数据类型 | 长度 | 说明 |
| 输入数据 | 64~256 字节 | 标签数据、状态字、诊断信息 |
| 输出数据 | 32~64 字节 | 读/写命令、控制字、参数设置 |
选择合适的子模块(过程数据区)
典型配置包括:
配置 I/O 地址:
输入地址(PLC 读取):如 %IW0-%IW127
输出地址(PLC 写入):如 %QW0-%QW31
第五步:建立网络连接
进入「网络视图」
选中 S7-1200 的 PROFINET 接口(绿色方块)
拖拽连线到 RFID 阅读器的 PROFINET 接口连接成功后显示绿色实线
第六步:分配设备名称(关键步骤)
连接 PLC:
使用网线连接 PC 与 S7-1200
确保 PC 与 PLC 在同一网段
在线访问:
点击「在线」→「访问 PG/PC」
选择连接的网卡
点击「更新」搜索网络设备
分配名称:
找到未分配名称的 RFID 阅读器(显示 MAC 地址)
输入配置的设备名称(如:"rfid_reader1")
点击「分配名称」
验证:
点击「显示」确认名称已分配
设备名称必须与 TIA Portal 组态完全一致
第七步:RFID 阅读器参数配置
使用RF-Viewer软件或 Web 界面配置 RFID 参数:
参数 | 设置值 | 说明 |
| 工作模式 | PROFINET IO | 选择 PROFINET 通信 |
| Device Name | rfid_reader1 | 与 TIA 组态一致 |
| IP Address | 192.168.0.2 | 与 TIA 组态一致 |
| 天线功率 | 根据应用 | UHF:10-30dBm, HF:根据标签 |
| 读取模式 | 连续/触发 | 根据应用选择 |
| 过滤条件 | 根据标签类型 | EPC/UID/TID 等 |
| 数据更新周期 | 10ms~100ms | 根据应用选择 |
第八步:编译并下载
编译项目:
点击「编译」→「编译全部」
检查是否有错误
下载组态:
连接 S7-1200 PLC
下载组态到 PLC
将 PLC 切换到RUN 模式
RFID 阅读器上电:
阅读器会自动从 PLC 获取组态
无需单独下载
---
四、数据交换格式详解
4.1 输入数据(RFID→PLC)
偏移 | 数据类型 | 长度 | 说明 |
0 | 状态字 | 2 字节 | 设备状态、就绪标志 |
2 | 标签数量 | 2 字节 | 检测到的标签数量 |
4 | 标签 1 EPC/UID | 16 字节 | 第一个标签 ID |
20 | 标签 1 数据 | 32 字节 | 第一个标签用户数据 |
52 | 标签 2 EPC/UID | 16 字节 | 第二个标签 ID(可选) |
68 | 诊断信息 | 4 字节 | 错误代码、警告 |
4.2 输出数据(PLC→RFID)
偏移 | 数据类型 | 长度 | 说明 |
0 | 控制字 | 2 字节 | 启动/停止/复位命令 |
2 | 命令字 | 2 字节 | 读/写/锁定命令 |
4 | 天线选择 | 2 字节 | 选择工作天线 |
6 | 过滤条件 | 4 字节 | 标签过滤设置 |
10 | 写入数据 | 32 字节 | 写入标签的数据 |
4.3 状态字详解
位 | 名称 | 功能 | 0 | 1 |
0 | 就绪 | 设备就绪 | 未就绪 | 就绪 |
1 | 通信正常 | PROFINET 通信 | 故障 | 正常 |
2 | 读取就绪 | 可读取标签 | 忙 | 就绪 |
3 | 故障 | 故障状态 | 无故障 | 故障 |
4 | 标签检测到 | 有标签 | 无标签 | 有标签 |
5 | 数据有效 | 数据有效性 | 无效 | 有效 |
6 | 写入完成 | 写入操作 | 进行中 | 完成 |
7 | 报警 | 报警状态 | 无报警 | 报警 |
4.4 控制字详解
位 | 名称 | 功能 | 0 | 1 |
0 | 启动 | 启动设备 | 停止 | 启动 |
1 | 停止 | 停止读取 | 运行 | 停止 |
2 | 复位 | 故障复位 | - | 复位 |
3 | 读取命令 | 触发读取 | - | 读取 |
4 | 写入命令 | 触发写入 | - | 写入 |
5 | 清除数据 | 清除缓存 | - | 清除 |
6 | 天线 1 使能 | 天线 1 | 禁用 | 使能 |
7 | 天线 2 使能 | 天线 2 | 禁用 | 使能 |
---
五、编程示例
5.1 标准 PROFINET IO 编程(SCL)
// 定义数据块DATA_BLOCK "RFID_Data"STRUCT // 输出数据(写入 RFID) Control_Word : WORD; // 控制字 %QW0 Command_Word : WORD; // 命令字 %QW2 Antenna_Select : WORD; // 天线选择 %QW4 Filter_Condition : DWORD; // 过滤条件 %QD6 Write_Data : Array[0..15] OF BYTE; // 写入数据 %QB10 // 输入数据(从 RFID 读取) Status_Word : WORD; // 状态字 %IW0 Tag_Count : WORD; // 标签数量 %IW2 Tag1_EPC : Array[0..15] OF BYTE; // 标签 1 EPC %IB4 Tag1_Data : Array[0..31] OF BYTE; // 标签 1 数据 %IB20 Tag2_EPC : Array[0..15] OF BYTE; // 标签 2 EPC %IB52 Diagnostic : DWORD; // 诊断信息 %ID68END_STRUCTEND_DATA_BLOCK// 主程序 OB1// 读取 RFID 状态"RFID_Data".Status_Word := %IW0;"RFID_Data".Tag_Count := %IW2;// 判断设备就绪IF ("RFID_Data".Status_Word AND 160001) <> 0 THEN "RFID_Ready" := TRUE;ELSE "RFID_Ready" := FALSE;END_IF;// 判断通信正常IF ("RFID_Data".Status_Word AND 160002) <> 0 THEN "Communication_OK" := TRUE;ELSE "Communication_Fault" := TRUE;END_IF;// 判断标签检测到IF ("RFID_Data".Status_Word AND 160010) <> 0 THEN "Tag_Detected" := TRUE; "Tag_Valid" := TRUE;ELSE "Tag_Detected" := FALSE; "Tag_Valid" := FALSE;END_IF;// 判断数据有效IF ("RFID_Data".Status_Word AND 160020) <> 0 THEN "Data_Valid" := TRUE; // 读取标签 EPC FOR i := 0 TO 15 DO "Tag1_EPC_String"[i] := "RFID_Data".Tag1_EPC[i]; END_FOR;ELSE "Data_Valid" := FALSE;END_IF;// 判断故障IF ("RFID_Data".Status_Word AND 160008) <> 0 THEN "RFID_Fault" := TRUE; "Fault_Code" := "RFID_Data".Diagnostic;ELSE "RFID_Fault" := FALSE;END_IF;// 启动 RFID 阅读器IF "Start_Button" AND "RFID_Ready" THEN "RFID_Data".Control_Word := 160001; // 启动命令 %QW0 := "RFID_Data".Control_Word;END_IF;// 停止 RFID 阅读器IF "Stop_Button" THEN "RFID_Data".Control_Word := 160002; // 停止命令 %QW0 := "RFID_Data".Control_Word;END_IF;// 触发读取(上升沿)"Read_Rising_Edge" := "Read_Button" AND NOT "Read_Prev";IF "Read_Rising_Edge" AND "RFID_Ready" THEN "RFID_Data".Control_Word := 160008; // 读取命令 %QW0 := "RFID_Data".Control_Word;END_IF;"Read_Prev" := "Read_Button";// 故障复位IF "Reset_Button" AND "RFID_Fault" THEN "RFID_Data".Control_Word := 160004; // 复位命令 %QW0 := "RFID_Data".Control_Word;END_IF;5.2 标签数据处理
// EPC/UID 数据转换(字节转字符串)FOR i := 0 TO 15 DO // 高 4 位转十六进制字符 high_nibble := "RFID_Data".Tag1_EPC[i] / 16; CASE high_nibble OF 0..9: "Tag1_EPC_Hex"[i*2] := CHAR(high_nibble + 48); 10..15: "Tag1_EPC_Hex"[i*2] := CHAR(high_nibble + 55); END_CASE; // 低 4 位转十六进制字符 low_nibble := "RFID_Data".Tag1_EPC[i] MOD 16; CASE low_nibble OF 0..9: "Tag1_EPC_Hex"[i*2+1] := CHAR(low_nibble + 48); 10..15: "Tag1_EPC_Hex"[i*2+1] := CHAR(low_nibble + 55); END_CASE;END_FOR;// 标签计数IF "Tag_Detected" AND NOT "Tag_Detected_Prev" THEN "Tag_Count_Total" := "Tag_Count_Total" + 1;END_IF;"Tag_Detected_Prev" := "Tag_Detected";// 标签去重(简单实现)IF "Tag_Detected" THEN "Current_Tag_EPC" := "Tag1_EPC_Hex"; IF "Current_Tag_EPC" <> "Last_Tag_EPC" THEN "Unique_Tag_Count" := "Unique_Tag_Count" + 1; "Last_Tag_EPC" := "Current_Tag_EPC"; END_IF;END_IF;5.3 写入标签数据
// 写入标签数据(上升沿触发)"Write_Rising_Edge" := "Write_Button" AND NOT "Write_Prev";IF "Write_Rising_Edge" AND "RFID_Ready" AND "Tag_Detected" THEN // 准备写入数据 "RFID_Data".Write_Data[0] := 1648; // 'H' "RFID_Data".Write_Data[1] := 1645; // 'E' "RFID_Data".Write_Data[2] := 164C; // 'L' "RFID_Data".Write_Data[3] := 164C; // 'L' "RFID_Data".Write_Data[4] := 164F; // 'O' // 设置写入命令 "RFID_Data".Command_Word := 160010; // 写入命令 "RFID_Data".Control_Word := 160010; // 触发写入 %QW2 := "RFID_Data".Command_Word; %QW0 := "RFID_Data".Control_Word;END_IF;"Write_Prev" := "Write_Button";// 等待写入完成IF ("RFID_Data".Status_Word AND 160040) <> 0 THEN "Write_Complete" := TRUE;ELSE "Write_Complete" := FALSE;END_IF;5.4 完整控制程序示例
// 主程序 OB1// 初始化IF "First_Scan" THEN "RFID_Data".Control_Word := 160001; // 启动命令 %QW0 := "RFID_Data".Control_Word; "First_Scan" := FALSE;END_IF;// 读取状态"RFID_Data".Status_Word := %IW0;"RFID_Data".Tag_Count := %IW2;// 设备就绪判断IF ("RFID_Data".Status_Word AND 160001) <> 0 THEN "RFID_Ready" := TRUE;ELSE "RFID_Ready" := FALSE;END_IF;// 通信状态判断IF ("RFID_Data".Status_Word AND 160002) <> 0 THEN "Communication_OK" := TRUE;ELSE "Communication_Fault" := TRUE; // 输出故障信号 %QX0.0 := TRUE;END_IF;// 标签检测处理IF ("RFID_Data".Status_Word AND 160010) <> 0 AND ("RFID_Data".Status_Word AND 160020) <> 0 THEN "Tag_Detected" := TRUE; "Tag_Valid" := TRUE; "Read_Count" := "Read_Count" + 1; // 转换 EPC 为字符串 "Convert_EPC_To_String"(); // 标签去重计数 IF "Current_Tag_EPC" <> "Last_Tag_EPC" THEN "Unique_Tag_Count" := "Unique_Tag_Count" + 1; "Last_Tag_EPC" := "Current_Tag_EPC"; // 记录标签信息 "Tag_Log"[log_index].EPC := "Current_Tag_EPC"; "Tag_Log"[log_index].Time := LOCAL_TIME; log_index := log_index + 1; END_IF;ELSE "Tag_Detected" := FALSE; "Tag_Valid" := FALSE;END_IF;// 故障处理IF ("RFID_Data".Status_Word AND 160008) <> 0 THEN "RFID_Fault" := TRUE; "Fault_Code_Display" := "RFID_Data".Diagnostic; // 输出故障信号 %QX0.1 := TRUE; // 自动复位尝试 IF "Auto_Reset_Enable" THEN "Reset_Timer"(IN := TRUE, PT := T5S); IF "Reset_Timer".Q THEN "RFID_Data".Control_Word := 160004; // 复位 %QW0 := "RFID_Data".Control_Word; "Reset_Timer"(IN := FALSE); END_IF; END_IF;ELSE "RFID_Fault" := FALSE; %QX0.1 := FALSE;END_IF;// 手动控制IF "Start_Button" AND "RFID_Ready" THEN "RFID_Data".Control_Word := 160001; // 启动 %QW0 := "RFID_Data".Control_Word;END_IF;IF "Stop_Button" THEN "RFID_Data".Control_Word := 160002; // 停止 %QW0 := "RFID_Data".Control_Word;END_IF;IF "Read_Button" AND "RFID_Ready" THEN "RFID_Data".Control_Word := 160008; // 读取 %QW0 := "RFID_Data".Control_Word;END_IF;---
六、通信状态监控与诊断
6.1 RFID 阅读器 LED 状态指示
LED | 颜色/状态 | 含义 |
| RUN | 绿色常亮 | 运行正常 |
| RUN | 黄色闪烁 | 启动中/待机 |
| RUN | 红色 | 故障 |
| LINK | 绿色 | 网络连接正常 |
| LINK | 熄灭 | 网络连接断开 |
| RF | 绿色闪烁 | 正在读取标签 |
| RF | 红色 | RF 故障 |
6.2 TIA Portal 在线监控
状态指示 | 颜色 | 含义 |
通信正常 | 绿色 | PROFINET 连接建立成功 |
通信故障 | 红色 | 连接中断或配置错误 |
正在连接 | 黄色 | 设备正在建立连接 |
6.3 诊断缓冲区
在 TIA Portal 中查看 CPU 的「诊断缓冲区」
可获取详细的通信错误信息
常见错误:设备名称不匹配、IP 冲突、网线故障等
6.4 RFID 常见故障代码
错误码 | 含义 | 解决方案 |
0x0000 | 无错误 | 正常 |
0x0001 | 通信超时 | 检查 PROFINET 网络连接 |
0x0002 | 配置错误 | 检查 PROFINET 配置 |
0x0003 | 设备名称不匹配 | 重新分配设备名称 |
0x0100 | 无标签检测到 | 检查标签位置和天线功率 |
0x0101 | 标签读取失败 | 检查标签类型和频率 |
0x0102 | 标签写入失败 | 检查标签是否可写 |
0x0200 | 天线故障 | 检查天线连接 |
0x0201 | RF 模块故障 | 重启阅读器或联系厂家 |
0x0202 | 温度过高 | 检查散热和环境温度 |
---
七、常见问题与解决方案
问题现象 | 可能原因 | 解决方案 |
RFID 无法识别 | GSD 文件未导入 | 在 TIA Portal 中导入 GSDML 文件 |
设备名称分配失败 | 未在线操作 | 点击「在线」→「访问 PG/PC」分配名称 |
通信超时 | IP 地址不在同一网段 | 检查并统一 IP 网段 |
标签读不到 | 天线功率过低 | 调整天线功率和标签距离 |
连接显示红色 | PLC 未运行 | 将 PLC 切换到 RUN 模式 |
设备名称不匹配 | 名称不一致 | 确保 TIA 组态与阅读器配置一致 |
数据不更新 | 读取模式配置错误 | 检查连续/触发读取模式 |
频繁通信中断 | 网线质量差 | 更换高质量网线 |
多标签识别失败 | 防碰撞设置错误 | 调整防碰撞参数 |
写入失败 | 标签锁定或只读 | 检查标签类型和权限 |
读取距离短 | 天线不匹配 | 更换合适的天线 |
金属干扰 | 金属环境影响 | 使用抗金属标签或调整位置 |
---
八、配置要点总结
配置项 | 关键要点 |
软件版本 | TIA Portal V15.1 及以上 |
GSD 文件 | RFID 设备 GSDML 通常 TIA 内置 |
IP 地址 | 同一网段,不能冲突 |
设备名称 | 必须在线分配且与组态一致 |
数据交换区 | 正确配置输入/输出地址 |
天线功率 | 根据应用和标签调整 |
读取模式 | 连续/触发根据应用选择 |
过滤条件 | 设置合适的标签过滤 |
网络连接 | 使用标准网线,确保连接可靠 |
诊断功能 | 启用诊断便于故障排查 |
环境因素 | 注意金属/液体对 RF 的影响 |
---
九、推荐参考资料
资料名称 | 来源 | 链接 |
SIMATIC RF600 产品手册 | 西门子工业支持中心 | 下载 |
SIMATIC RF200/300 产品手册 | 西门子工业支持中心 | 下载 |
RFID PROFINET 配置指南 | 西门子工业支持中心 | 下载 |
RF-Viewer 调试软件 | 西门子工业支持中心 | 下载 |
TIA Portal PROFINET 配置指南 | 西门子工业支持中心 | 查看 |
---
十、总结
S7-1200 与西门子 RFID 系统的 PROFINET IO 通信是工业自动化中物品识别追踪的经典方案,具有以下优势:
优势 | 说明 |
高速实时 | PROFINET RT 通信,周期可达 4ms |
非接触识别 | 无需视线,可穿透非金属材料 |
配置简单 | TIA Portal 统一组态,导入 GSD 即可 |
诊断完善 | 支持阅读器级诊断和故障定位 |
扩展灵活 | 支持多阅读器、多站点连接 |
成本优化 | 减少布线,降低安装成本 |
功能丰富 | 支持读/写/锁定/多标签识别 |
兼容性好 | 与 S7-1200 完美配合 |
配置流程简图
重要提示
RFID 阅读器需支持 PROFINET,确认型号带 PN 接口设备名称必须严格一致,区分大小写天线功率要根据标签和距离调整,避免过强或过弱注意金属和液体对 RF 信号的影响,合理安装位置多标签识别时启用防碰撞功能写入标签前确认标签可写且未锁定 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!