一、场景
近期公司要对欧姆龙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 | 具体看情况区分 |
组成 | 字节 | 说明 |
Area | 1 | D位:02,D字:82; W位:31,W字:B1; C位:30,C字:B0 |
Address | 3 | 起始地址(2bit)+位地址(1bit) |
Length | 2 | 读取或写入的数据长度 |
Value | 2 | 写操作时的数据 |
组成 | 字节 | 说明 |
错误码 | 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
-
读取点位报文