常见问题:FinsTCP连接成功但读取标签返回“响应超时”或“非法地址(0x0220)”错误。
根本原因多为PLC侧配置未启用FINS服务或网络参数不匹配:① CJ/NJ系列需在CX-Programmer中启用“FINS Ethernet”并设置正确节点号(默认1);② PLC IP与C#客户端不在同一子网,或防火墙/杀软拦截6000端口;③ C#中FINS帧的DA1/DA2(目标节点/网络号)、SA1/SA2(源节点)填写错误(如误将PLC节点号填入SA1);④ 读取地址格式不符——欧姆龙标签名需经CX-Designer映射为FINS地址(如%MW100→W100,D1000→D1000),直接传入字符串标签名将失败。建议用OMRON官方FINS库(如FinsSocket)替代自定义TCP封装,并开启FINS日志验证收发帧十六进制内容,快速定位协议层偏差。
1条回答 默认 最新
桃子胖 2026-02-26 15:51关注```html一、现象层:连接成功但读取失败——表象与典型错误码
开发者常遇到“TCP三次握手成功,
Socket.Connect()返回true”,但调用ReadMemory()后立即抛出"Response timeout"或解析响应帧得到错误码0x0220(FINS规范定义为Illegal Address)。该错误在Wireshark中表现为:客户端发出FINS命令帧后,PLC未返回任何应用层响应(非RST/ICMP,而是静默丢包),或返回含02 20的错误响应帧。此阶段仅能确认链路层通畅,无法判断协议栈是否就绪。二、配置层:PLC侧FINS服务启用与网络拓扑校验
- CJ/NJ系列PLC必须显式启用FINS Ethernet服务:在CX-Programmer V9.7+中,进入【PLC】→【设置】→【CPU单元设置】→【FINS Ethernet】选项卡,勾选“启用FINS Ethernet通信”,并严格设置
节点号(Node Number)(默认为1,不可为0或255);若使用NJ系列,还需在Sysmac Studio中检查【Controller Configuration】→【Network Config】→【FINS/UDP Settings】是否启用。 - IP子网与端口连通性验证:
检查项 正确示例 常见错误 PLC与PC IP是否同子网 PLC: 192.168.1.10/24,PC: 192.168.1.20/24 PLC: 192.168.1.10/24,PC: 192.168.2.20/24(跨网段需路由/FINS网关) TCP端口6000可达性 telnet 192.168.1.10 6000响应ConnectedWindows防火墙/360安全卫士拦截6000端口;PLC内置防火墙(如NJ的Security Settings)未放行
三、协议层:FINS帧结构关键字段深度解析
FINS TCP通信本质是将FINS消息封装于TCP载荷(无固定长度头),其核心控制字段如下:
┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ │ IC(1B) │ RC(1B) │ DA1(1B)│ DA2(1B)│ SA1(1B)│ SA2(1B)│ SID(1B)│ CMD(2B) │ ← FINS Header (8 bytes) └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘DA1= 目标PLC节点号(非IP!),CJ/NJ默认为0x01;DA2= 目标网络号,以太网固定为0x00SA1= 客户端节点号(非本机IP),通常设为0x01(与PLC不同即可);SA2= 源网络号,以太网为0x00- 常见误写:
SA1 = PLC节点号→ 导致PLC拒绝响应(源地址非法);DA1 = 0x00→ 返回0x0220
四、地址映射层:欧姆龙标签名到FINS物理地址的转换规则
欧姆龙PLC不支持直接读取CX-One工程中的符号名(如
"Motor_Speed")。所有读写操作必须基于FINS地址空间,转换关系如下:%MW100→W100(字地址,16位)%ML100→L100(长字地址,32位)%D1000→D1000(DM区,16位)%CIO100.00→CIO100(CIO区,bit访问需指定bit偏移)
注:未在CX-Designer中通过【Symbolic Addressing】→【FINS Mapping】生成映射表的自定义标签,无法被FINS协议识别。
五、工具链层:推荐技术栈与诊断流程图
摒弃手写TCP+拼接FINS帧的易错方案,强烈采用OMRON官方
FinsSocket.dll(.NET Framework 4.7.2+)或开源库OmronFinsNet(NuGet:OmronFinsNet)。启用日志后可输出十六进制帧对比:graph TD A[启动FINS日志] --> B[捕获客户端发送帧] A --> C[捕获PLC返回帧] B --> D{DA1=0x01? SA1≠0x01?} C --> E{响应码=0000? 否则查FINS ErrCode表} D -->|否| F[修正节点号配置] E -->|0220| G[检查地址格式/W100而非%MW100] F --> H[重试读取] G --> H六、高阶实践:Wireshark精准过滤与FINS解码技巧
在Wireshark中设置显示过滤器:
tcp.port == 6000 && tcp.len > 8,右键FINS载荷→【Decode As】→选择OMRON FINS(需安装FINS dissector插件)。关键观察点:- 请求帧第2字节(RC)应为
0x00(FINS命令);第3-4字节(DA1/DA2)是否匹配PLC节点/网络号 - 响应帧第7字节(SID)必须与请求帧一致;第8-9字节(CMD)若为
02 20,则立即定位地址错误 - 地址参数区(CMD后第1字节起):例如读W100的指令,此处应为
00 64 00 01(起始地址W100=0x0064,长度1=0x0001)
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报- CJ/NJ系列PLC必须显式启用FINS Ethernet服务:在CX-Programmer V9.7+中,进入【PLC】→【设置】→【CPU单元设置】→【FINS Ethernet】选项卡,勾选“启用FINS Ethernet通信”,并严格设置