半生听风吟 2026-02-26 15:50 采纳率: 98.6%
浏览 2
已采纳

C#通过FinsTCP读写欧姆龙PLC标签时连接失败或数据异常如何排查?

常见问题: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/24PLC: 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默认为0x01DA2 = 目标网络号,以太网固定为0x00
    • SA1 = 客户端节点号(非本机IP),通常设为0x01(与PLC不同即可);SA2 = 源网络号,以太网为0x00
    • 常见误写:SA1 = PLC节点号 → 导致PLC拒绝响应(源地址非法);DA1 = 0x00 → 返回0x0220

    四、地址映射层:欧姆龙标签名到FINS物理地址的转换规则

    欧姆龙PLC不支持直接读取CX-One工程中的符号名(如"Motor_Speed")。所有读写操作必须基于FINS地址空间,转换关系如下:

    1. %MW100W100(字地址,16位)
    2. %ML100L100(长字地址,32位)
    3. %D1000D1000(DM区,16位)
    4. %CIO100.00CIO100(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)
    ```
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 2月27日
  • 创建了问题 2月26日