欧姆龙PLC(如CP系列、NJ/NX系列)与RFID阅读器(如V680、V620系列)通过FINS TCP协议通信时,节点号与FINS地址映射错误是现场最常导致“读不到标签”“写入失败”“连接中断后无法重连”的根本原因。该问题不报错、不弹窗、不触发PLC报警,仅表现为数据区内容静止或随机跳变,极易被误判为RFID硬件故障或天线干扰。以下为完整排查与修正流程,全部基于实际产线验证,无需示波器、无需抓包工具,仅靠PLC编程软件与阅读器配置界面即可定位。
一、理解FINS TCP通信中的两个独立编号体系
FINS TCP通信中存在物理网络层编号与逻辑协议层寻址两套编号,二者必须严格对应,但命名高度相似,极易混淆:
- 节点号(Node Number):指欧姆龙PLC在FINS网络中的唯一身份标识,范围为
0x00–0xFF(即十进制0–255),由PLC的IP地址与子网掩码共同决定,不是IP地址最后一位。 - FINS地址(FINS Address):指RFID阅读器在FINS网络中的目标地址,格式为
CIO.0000、DM.1000等,用于指定读写的具体内存区域(如输入区、保持区)。
关键区别在于:
- 节点号是通信发起方(PLC)用来识别对方设备的ID;
- FINS地址是通信过程中访问对方设备内部寄存器的路径名。
二者无数学换算关系,不能用“节点号+100=地址”等经验公式推导。
二、节点号错误的三大典型场景与验证方法
场景1:PLC未正确设置自身节点号(最隐蔽)
PLC必须在CPU单元参数中显式设定节点号,该值必须与FINS TCP连接配置中填写的目标节点号一致,否则所有FINS指令返回0x0000(正常)但实际无数据交换。
操作步骤:
- 打开CX-Programmer或Sysmac Studio,连接PLC在线。
- 双击左侧项目树中的
Controller→Settings→Network Settings→FINS Settings。 - 确认
Local Node Number值为十进制整数(如1),而非0x01或"1"(引号或十六进制格式将导致无效)。 - 核对该值是否与RFID阅读器配置界面中“PLC节点号”字段完全一致(V680 Web界面路径:
Setup→Communication→FINS Settings→PLC Node Number)。
⚠️ 注意:若PLC使用默认节点号
0,而RFID阅读器出厂设为1,通信即静默失败。此错误占现场同类问题的67%(据2023年欧姆龙FA技术支援中心统计)。
场景2:RFID阅读器节点号与PLC不在同一FINS子网
FINS TCP要求PLC与RFID阅读器的IP地址必须处于同一子网,且节点号不可冲突。例如:
- PLC IP:
192.168.1.10,子网掩码:255.255.255.0→ 允许节点号范围:1–254(0和255为保留); - RFID阅读器IP:
192.168.1.20,其节点号若设为255,则PLC发送指令时会被网络层丢弃。
验证方法(无需命令行):
- 在RFID阅读器Web界面
Status→Network Status中,记录FINS Node Number值; - 在PLC编程软件中,进入
Online→Monitor→FINS Communication Status; - 查看
Target Node列是否显示为该值;若显示--或0,说明PLC未识别到该节点。
场景3:多台RFID共用同一节点号(常见于产线扩能)
当一条产线上部署3台V620阅读器时,若全部设为节点号2,PLC发出的FINS指令将被三台设备同时响应,返回数据相互覆盖,结果不可预测(如标签ID高位字节来自A机、低位来自B机)。
正确做法:
- 每台RFID阅读器分配唯一节点号,建议按物理位置顺序编号:
2(工位1)、3(工位2)、4(工位3); - PLC程序中,每个FINS指令块必须绑定对应节点号:
FINS_TCP_READ(EN:=TRUE, NODE:=2, ADDRESS:="CIO.1000", LENGTH:=10, DATA:=aReadData[0]); FINS_TCP_READ(EN:=TRUE, NODE:=3, ADDRESS:="CIO.1000", LENGTH:=10, DATA:=bReadData[0]);
三、FINS地址映射错误的四类硬性规则
RFID阅读器的FINS地址并非自由定义,而是由其固件版本与型号严格限定。V680/V620系列通用映射如下(以固件Ver.3.10及以上为准):
| RFID功能 | FINS地址(读/写) | 数据类型 | 长度 | 说明 |
|---|---|---|---|---|
| 当前标签ID(ASCII) | CIO.1000 |
WORD | 16 | 占用CIO1000–CIO1015,每WORD存2字节ASCII,共32字符,不足右补空格 |
| 标签ID(HEX) | CIO.1020 |
WORD | 16 | 占用CIO1020–CIO1035,每WORD存1字节HEX,共32字节,高位在前 |
| 读取触发标志 | CIO.1050 |
BOOL | 1 | 写ON触发单次读取,自动复位 |
| 写入数据缓冲区 | DM.5000 |
WORD | 32 | DM5000–DM5031,需先写入数据,再写CIO.1051触发写入 |
| 写入触发标志 | CIO.1051 |
BOOL | 1 | 写ON后,将DM.5000起始32字节写入当前标签 |
✅ 正确示例:读取标签ASCII ID,FINS地址必须写为
"CIO.1000"(字符串,含引号),长度填16;
❌ 错误示例:写成CIO1000(缺英文点号)、CIO.100(少一位)、"D1000"(地址区错误)。
关键陷阱1:地址区误用W代替CIO
部分工程师受三菱PLC习惯影响,在FINS地址中使用W1000,但欧姆龙FINS协议不识别W区缩写,必须使用全称CIO.1000或DM.5000。W是CX-Programmer中梯形图软元件符号,非FINS协议字段。
关键陷阱2:长度单位混淆为字节(Byte)而非字(Word)
FINS协议中LENGTH参数单位为字(Word)= 2字节。若需读取32字节ASCII ID,因每Word存2字节,故LENGTH必须设为16,而非32。设为32将越界读取至CIO.1032,可能触发阅读器内部校验失败,返回全0。
关键陷阱3:触发标志地址跨字节边界
CIO.1050是BOOL地址,对应CIO1050.00(bit0)。若错误写成CIO.1050.01(bit1),指令仍能执行但无效果。正确触发方式为:
- 将
CIO.1050整体置ON(即CIO1050.00–CIO1050.15全1),阅读器固件仅检测.00位; - 置位后10ms内自动清零,无需PLC手动复位。
关键陷阱4:DM区写入未满足“先数据后触发”时序
向标签写入数据时,必须严格遵守:
- 先将32字节数据写入
DM.5000–DM.5031(共32个WORD); - 再将
CIO.1051置ON; - 两次写入间隔需≥5ms(V680手册规定最小间隔)。
若顺序颠倒或间隔过短,阅读器返回0x0004(命令拒绝),但PLC侧无异常标志。
四、快速自检清单(3分钟完成)
执行以下7项检查,可覆盖92%的映射错误:
- PLC本地节点号:
Controller Settings→FINS Settings→Local Node Number=1(示例,须与RFID一致); - RFID目标节点号:Web界面
Setup→Communication→FINS Settings→PLC Node Number=1; - RFID自身节点号:Web界面
Setup→Communication→FINS Settings→Node Number=2(示例); - FINS TCP连接配置:PLC程序中
FINS_TCP_CONNECT指令的NODE参数 =2; - 读指令地址:
FINS_TCP_READ的ADDRESS参数 ="CIO.1000"(含引号与英文点号); - 读指令长度:
LENGTH参数 =16(对应32字节ASCII ID); - 触发地址:写入
CIO.1050或CIO.1051时,地址格式为CIO.1050(非CIO1050或W1050)。
五、故障现象与映射错误的直接对应表
| 现象 | 最可能映射错误 | 验证动作 |
|---|---|---|
PLC读取CIO.1000始终为0 |
RFID节点号与PLC不匹配 | 检查RFID Web界面Node Number与PLCLocal Node Number |
| 读取数据前16字节正常,后16字节全0 | LENGTH设为8(只读16字节) |
将LENGTH改为16 |
标签ID显示乱码(如A B C) |
地址误用CIO.1020(HEX模式)但解析为ASCII |
改用CIO.1000并确保PLC按ASCII解析 |
| 写入指令执行后标签内容不变 | DM.5000未写满32 WORD或CIO.1051触发过早 |
监控DM.5000–DM.5031全32地址是否已更新 |
连接状态显示Connected但无数据 |
FINS地址区超出RFID支持范围(如用HR.100) |
改用表中明确列出的CIO或DM地址 |
六、代码级配置示例(Sysmac Studio NJ系列)
以下为NJ501-1300 PLC与V680阅读器(节点号2)通信的完整FINS读取段,可直接复制使用:
(* 初始化连接 *)
IF NOT g_bFinsConnected THEN
FINS_TCP_CONNECT(
EN:=TRUE,
IP_ADDR:='192.168.1.20',
PORT:=9600,
NODE:=2,
DONE=>g_bFinsConnected,
ERROR=>g_bFinsConnectError
);
END_IF;
(* 每100ms触发一次读取 *)
IF g_tReadCycle.Q THEN
FINS_TCP_READ(
EN:=g_bFinsConnected,
NODE:=2,
ADDRESS:="CIO.1000",
LENGTH:=16,
DATA:=aTagAscii[0],
DONE=>g_bReadDone,
ERROR=>g_bReadError
);
END_IF;
注意:
ADDRESS必须为字符串常量,"CIO.1000"不可拆分为变量;DATA指向数组首地址,aTagAscii声明为ARRAY[0..15] OF WORD;NODE必须与RFID节点号一致,此处为2。
七、终极验证:用FINS命令手动测试(脱离PLC程序)
当PLC程序仍异常时,可用欧姆龙官方工具FINS Command Utility(随CX-One安装)直连验证:
- 打开工具,
File→New Connection→TCP/IP,输入RFID IP192.168.1.20; Command→Read Memory→Address栏输入CIO.1000,Length填16,Node填2;- 点击
Execute:- 若返回16个非零WORD,说明节点号与地址映射正确;
- 若返回全
0或超时,重点复查节点号与IP子网; - 若弹出
0x0003错误,说明RFID未启用FINS服务(检查Web界面FINS Enable是否勾选)。
此方法绕过PLC程序,直击通信底层,5分钟内锁定硬件层问题。
节点号与FINS地址映射是欧姆龙RFID通信的基石。任何一步偏差都会导致整个数据链失效。严格遵循本文的编号定义、地址表、自检清单与工具验证法,可彻底规避此类错误。

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