个人技术分享

一、场景

近期公司要对欧姆龙CP系列设备的数据采集,于是就研究了下欧姆龙的Fins Tcp协议。

二、Fins Tcp

组成 字节 说明
固定头 4 46494E53 FINS对应的ASCII码的十六进制
长度 4 后面剩余指令的长度
命令 4

握手固定为:00000000

读写固定为:00000002

错误码 4

00000000:正常

00000001:头不是‘FINS’(ASCII code)

00000002:数据太长

00000003:不支持的命令

00000020:超过连接上限

00000021:指定的节点已经处于连接中

00000022:尝试去连接一个受保护的网络节点,该节点还未配置到PLC中

00000023:客户端FINS节点地址超范围

00000024:当前客户端的节点地址已被使用

00000025:所有的节点地址已被使用

ICF 1

信息控制域,发送固定为80(1000 0000),响应固定位C0(1100 0000)。

bit0:0表示需要回复,1表示不需要回复;

bit6: 0表示发送,1表示响应

RSV 1 固定值00,系统预留
GCT 1 固定值02,(Permissible Number of Gateways)
DNA 1 固定值00,目标网络号,即PLC网络地址。01-7F: 目标网络地址(1到127)

DA1

1 目标节点地址,即PLC IP最后一位的hex
DA2 1 目标单元地址,固定值00
SNA 1 PC网络地址,固定值00
SA1 1 PC节点地址,即PC IP地址最后一位的hex,为0时PLC自己获取
SA2 1 PC单元地址,固定为00
SID 1

固定值00,用于表示数据发送的过程,00-FF,用于检测响应请求是否正确。

当发送节点与响应节点SID值相同,则代表响应的数据是请求的数据;

不同时,代表响应的数据非请求数据

MRC 1 主请求码
SRC 1 次请求码,主/次组合:0101读操作 0102写操作 2301强制操作
Parameter N 具体看情况区分

Parameter读写命令格式分类

组成 字节 说明
Area 1 D位:02,D字:82; W位:31,W字:B1; C位:30,C字:B0
Address 3 起始地址(2bit)+位地址(1bit)
Length 2 读取或写入的数据长度
Value 2 写操作时的数据

Parameter中PLC回复报文
组成 字节 说明
错误码 2 错误码(先判断错误码,再去解析后面的数值)
数据 Length * 2 读取到的数值,每个数值占2字节
  • 握手报文

Socket连接上后,需要第一时间发送握手报文,否则PLC会断开与PC的连接。

PC Send: 

46 49 4E 53 00 00 00 0C 00 00 00 00 00 00 00 00 00 00 00 01

PC Recevice:

46 49 4E 53 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 01
  • 读取点位报文