跳到主要内容

欧姆龙 FINS 协议通讯

Darra PLC 通过 FINSProtocolAdapter 支持欧姆龙 FINS (Factory Interface Network Service) 协议, 可与 CP/CJ/NX 系列 PLC 通讯。

支持系列

系列型号传输层说明
CP 系列CP1E/CP1H/CP1LTCP/UDP内置以太网或模块
CJ 系列CJ1M/CJ2M/CJ2HTCP/UDP以太网模块 CJ1W-ETN21
CS 系列CS1G/CS1H/CS1DTCP/UDP以太网模块
NX 系列NX1P2/NX102/NX502TCP/UDP内置以太网
NJ 系列NJ101/NJ301/NJ501TCP/UDP内置以太网

传输层选择

传输层端口特点
UDP9600低延迟, 无连接, 适合局域网
TCP9600可靠传输, 支持跨子网, 推荐
推荐

生产环境建议使用 FINS/TCP 模式, 稳定性更好。

存储区访问

存储区标识地址范围数据类型
CIO 通道 IOCIOCIO0 ~ CIO6143WORD/BIT
WR 工作区WRWR0 ~ WR511WORD/BIT
HR 保持区HRHR0 ~ HR511WORD/BIT
DM 数据区DMDM0 ~ DM32767WORD
AR 辅助区ARAR0 ~ AR959WORD/BIT (只读)
EM 扩展数据EMEM0 ~ EM32767WORD
TIM 定时器TIMTIM0 ~ TIM4095PV/完成标志
CNT 计数器CNTCNT0 ~ CNT4095PV/完成标志

连接配置

{
"protocol": "OmronFINS",
"host": "192.168.1.30",
"port": 9600,
"transport": "TCP",
"sourceNode": 0,
"destinationNode": 0,
"sourceUnit": 0,
"destinationUnit": 0,
"timeout": 3000
}
节点地址

FINS 协议使用节点地址 (SA1/DA1) 路由。若 PLC 与 Darra 在同一子网, 节点地址通常为 IP 地址的最后一个字节。例如 PLC IP 为 192.168.1.30, 则 DA1=30。

PLC 变量映射

欧姆龙 FINS 地址        Darra PLC 变量
DM0 ←→ MW3000 (INT)
DM100 ←→ MD3200 (DINT)
CIO0.00 ←→ IX20.0 (BOOL, 只读)
CIO100.00 ←→ QX20.0 (BOOL)
WR0 ←→ MW3500 (INT)

代码示例

// 创建 FINS 连接
var adapter = PLCDriverFactory.Create(ProtocolId.OmronFINS);
await adapter.ConnectAsync(new ConnectionConfig
{
Host = "192.168.1.30",
Port = 9600,
Transport = FINSTransport.TCP,
SourceNode = 1,
DestinationNode = 30
});

// 读取 DM0~DM9 (10 个 WORD)
var data = await adapter.ReadAsync("DM0", 10);
short value = BitConverter.ToInt16(data, 0);

// 写入 CIO100.00 (置位)
await adapter.WriteAsync("CIO100.00", new byte[] { 0x01 });

错误处理

FINS 协议返回标准错误码:

主码子码含义
0x000x00正常完成
0x010x01本地节点不在网络中
0x020x01目的节点不在网络中
0x040x01数据长度超限
0x110x01存储区访问错误
0x150x01地址范围超限

FINS 帧结构

FINS/UDP 帧

| ICF | RSV | GCT | DNA | DA1 | DA2 | SNA | SA1 | SA2 | SID | MRC | SRC | TEXT |
  • ICF (Info Control Field): 0x80 = 请求, 0xC0 = 响应
  • GCT (Gateway Count): 跨网关跳数, 通常 0x02
  • DNA (Destination Network Address): 目的网络号, 同网段填 0
  • DA1 (Destination Node Address): 目的节点地址
  • DA2 (Destination Unit Address): 目的单元地址, CPU = 0x00
  • SNA/SA1/SA2: 源地址三元组
  • SID (Service ID): 客户端分配, 用于匹配响应
  • MRC/SRC: 主命令码 / 子命令码
  • TEXT: 命令数据

FINS/TCP 帧

TCP 模式在 FINS 头之前加一个 20 字节的 FINS/TCP 头, 含帧长度和帧类型 (握手/数据/错误)。握手阶段客户端和服务器交换节点地址。

握手流程 (TCP)

客户端 → 服务器: FINS/TCP Node Address Data Send
(客户端自己期望的节点号, 一般 0 = 让服务器分配)
客户端 ← 服务器: FINS/TCP Node Address Data Send Reply
(服务器分配的客户端节点号 + 自己的节点号)
(后续所有 FINS 命令都包含双方节点号)

Darra 侧在 ConnectAsync 时自动完成握手, 并缓存节点号供后续请求使用。

FINS 命令码

MRCSRC功能
0x010x01存储区读取
0x010x02存储区写入
0x010x03存储区填充
0x010x04多地址读取
0x010x05多地址写入
0x010x06存储区传送 (块间复制)
0x040x01CPU 运行
0x040x02CPU 停止
0x050x01CPU 单元读取
0x060x01CPU 状态读取
0x070x01时钟读取
0x070x02时钟写入
0x210x02错误清除
0x220x02错误日志读取

存储区代码

FINS 用单字节代码识别存储区:

存储区字读取码位读取码
CIO0xB00x30
WR0xB10x31
HR0xB20x32
AR0xB30x33
DM0x820x02
EM (bank 0)0xA00x20
EM (bank 1)0xA10x21
EM (当前 bank)0x980x18

适配器根据地址文本 (DM100, CIO50.3) 自动选择代码。

节点地址规划

FINS 使用节点地址做路由, 同一网络内节点号唯一:

PLC1 (NodeId=1)  PLC2 (NodeId=2)  Darra PLC (NodeId=100)
│ │ │
└──────────────┴──────────────────┘
同一 FINS 网络 (网络号=1)

配置建议:

  • PLC IP 最后一字节 == 节点号 (容易记忆)
  • 或独立分配, 写到电子表格备案
  • 同网内避免冲突

批量读写

多地址读取 (MRC=0x01 SRC=0x04)

一次请求多个不连续地址, 但每个地址只能读 1 个字:

var items = new[] { "DM0", "DM100", "CIO5", "WR20" };
var values = await adapter.ReadMultipleAsync(items);

适合读少量状态变量。

连续读取

ReadAsync("DM0", 100) 一次读 100 个字, 比循环读 100 次快几十倍。

CPU 状态与控制

// 读 CPU 状态
var status = await adapter.ReadCpuStatusAsync();
// status.Mode: Program / Monitor / Run
// status.ErrorCode

// 远程控制
await adapter.StartCpuAsync(); // 进入 Run 模式
await adapter.StopCpuAsync(); // 进入 Program 模式

CPU 上的拨码开关优先级高于远程命令。设成 Program 拨码时, 远程启动无效。

时钟同步

var plcTime = await adapter.ReadClockAsync();
await adapter.WriteClockAsync(DateTime.Now);

CP 系列的时钟精度约 ±5 秒/天, 远程同步频率建议 1 次/小时。

EM 存储区分页

EM (扩展数据存储) 分为多个 bank, 每 bank 32K 字:

bank大小访问方式
bank 032K WEM0:0 (推荐显式带 bank 号)
bank 132K WEM1:0
...
bank F32K WEMF:0
currentEM:0 (按当前激活 bank)

多 bank 配置下必须指定 bank, 否则可能读错区。

错误处理

完整错误码表见 Omron W227/W421 手册附录。常见:

主码:子码含义处理
00:00正常-
01:01本地节点不存在节点号在 FINS 网络里没配
02:01目的节点不存在核对目的节点号
03:02多地址读越界减少请求项数
11:01存储区越界检查地址范围
11:03起始地址越界同上
21:01写保护CPU 在 Run 模式禁止写某些区
22:02CPU 故障清错 (MRC=0x21 SRC=0x02)
23:03FINS 包非法包长/头格式错

排错

症状处理
连接建立但命令超时节点号配错, 握手成功不代表节点号对
间歇性 02:01跨网关时 GCT 字段不够
DM 能读 CIO 不能读检查 CP/NJ CPU 的存储区访问权限
EM 访问返回 11:01EM 不存在 (CP1E 等小型无 EM)
UDP 模式丢包改用 TCP
中文字符串乱码欧姆龙默认 Shift-JIS, 非 UTF-8