跳到主要内容

欧姆龙 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