1. 协议概述
欧姆龙(Omron)是来自日本的知名电子和自控设备制造商,其中、小型PLC在国内市场有较高的占有率,有CJ、CM等系列。PLC可以支持Fins、Host link等协议进行通信。
支持以太网的欧姆龙PLC CPU、以太网通信模块根据型号的不同,一般都会持 FINS(Factory Interface Network Service)协议,一些模块也会支持EtherNet/IP协议。Omron fins协议缺省TCP/UDP端口号为9600。Fins协议封装在TCP/UDP之上,需要注意的是基于TCP的Fins数据包和基于UDP的包在头部上差异较大。协议的具体构造可以参考欧姆龙官方文档。
FINS协议实现了OMRON PLC与上位机以太网通信。Fins基于TCP/UDP的报文的概览如下:
Fins over TCP
+-----------------------------------------------------------+
| Fins/TCP Header | Fins over UDP(optional) |
+-----------------------------------------------------------+
/ \
/ Fins over UDP \
+---------------------------------------+
| Fins/UDP Header | Command Data |
+---------------------------------------+
由上图可知,Fins/TCP实际上是将Fins/UDP报文作为其负载,在其前面加了一个Fins/TCP报头。需要注意的是,Fins/TCP报文中负载即Fins/UDP部分不一定会出现,它可以只有一个简单的Fins/TCP报头。
先介绍Fins/UDP报文的组成,然后再介绍Fins/TCP结构。
2. 协议详解
2.1 Fins over UDP
基于UDP的Fins协议的结构相对简单,整体结构由报头和数据两部分组成,如下所示:
Fins over UDP
+--------------------------+
| Fins/UDP Header |
+--------------------------+
| Command Data(opitonal) |
+--------------------------+
其中报头部分为必要组成部分,为固定长度12个字节,数据部分非必现。
2.1.1 Fins/UDP Header
报头部分由11个定长字段组合而成,前面10个字段分别简称为:ICF、RSV、GCT、DNA、DA1、DA2、SNA、SA1、SA2、SID,如下所示:
0 1 2 6 7
+---------+-----------+----------+---------------------+
| Gateway | Data Type | Reserved | Response setting |
+------------------------------------------------------+
| Reserved |
+------------------------------------------------------+
| Gateway Counts |
+------------------------------------------------------+
| Destination Network Address |
+------------------------------------------------------+
| Destination Node Number |
+------------------------------------------------------+
| Destination Unit Addres |
+------------------------------------------------------+
| Source Network Address |
+------------------------------------------------------+
| Source Node Number |
+------------------------------------------------------+
| Source Unit Addres |
+------------------------------------------------------+
| Service Id |
+------------------------------------------------------+
| Command |
+ +
| Code(2B) |
+------------------------------------------------------+
上述11个字段中,除最后一个Command Code字段为2个字节外,其余所有字段均只占1个字节。
2.1.2 Information control filed
ICF,信息控制字段,1个字节,由4个子字段组成,分述如下:
1... .... = Gateway bit,是否使用网关,0x01表示使用;
.1.. .... = Data Type bit,数据类型比特位,0x01表示响应,0x00表示命令;
..0. .... = Reserved bit,保留比特位,默认置0;
...0 .... = Reserved bit,保留比特位,默认置0;
.... 0... = Reserved bit,保留比特位,默认置0;
.... .0.. = Reserved bit,保留比特位,默认置0;
.... ..0. = Reserved bit,保留比特位,默认置0;
.... ...1 = Response setting bit,响应标志,0x01表示非必需回应,0x00表示必须进行回应。
2.1.3 Reserved
保留字段,1个字节,置为0x00。
2.1.4 Gateway count
网关计数,1个字节,置为0x02。
2.1.5 Destination network address
目标网络地址,1个字节,取值如下:
- 00:表示本地网络;
- 0x01~0x7F:表示远程网络。
2.1.6 Destination node number
目标节点编号,1个字节,取值如下:
- 0x01~0x3E: SYSMAC LINK网络中的节点号;
- 0x01~0x7E: YSMAC NET网络中的节点号;
- 0xFF: 广播传输。
Omron的官方手册中,该字段只能取上述值,实际抓包有其它值出现,被wireshark标记为unknown。
2.1.7 Destination unit address
目标单元地址,1个字节,取值如下:
- 0x00:PC(CPU);
- 0xFE: SYSMAC NET Link Unit or SYSMAC LINK Unit connected to network;
- 0x10~0x1F:CPU总线单元 ,其值等于10 + 单元号(前端面板中配置的单元号)。
Omron的官方手册中,该字段只能取上述值,实际抓包有其它值出现,被wireshark标记为unknown。
2.1.8 Source network address
源网络地址,1个字节,取值如下:
- 0x00:表示本地网络;
- 0x01~0x7F:表示远程网络。
2.1.9 Source node number
源节点编号,1个字节,取值如下:
- 0x01~0x3E: SYSMAC LINK网络中的节点号;
- 0x01~0x7E: YSMAC NET网络中的节点号;
- 0xFF: 广播传输
Omron的官方手册中,该字段只能取上述值,网上的实际抓包发现会有其它值出现,被wireshark标记为unknown。
2.1.10 Source unit address
源单元地址,1个字节,取值如下:
- 0x00:PC(CPU);
- 0xFE: SYSMAC NET Link Unit or SYSMAC LINK Unit connected to network;
- 0x10~0x1F:CPU总线单元 ,其值等于10 + 单元号(前端面板中配置的单元号)。
Omron的官方手册中,该字段只能取上述值,实际抓包有其它值出现,被wireshark标记为unknown。
2.1.11 Service ID
服务ID,1个字节,取值0x00~0xFF,产生会话的进程的唯一标识。
2.1.12 Command Code字段
2个字节,其取值由第一个字节表示的大分类和第二个字节表示的子分类复合而成,取值及其含义如下表:
Command Code | English Explanation | 中文解释 |
0x0101 | MEMORY AREA READ | 内存区域读取 |
0x0102 | MEMORY AREA WRITE | 内存区域写入 |
0x0103 | MEMORY AREA FILL | 内存区域填充 |
0x0104 | MULTIPLE MEMORY AREA READ | 多内存区域读取 |
0x0105 | MEMORY AREA TRANSFER | 内存区域传输 |
0x0201 | PARAMETER AREA READ | 参数区域读取 |
0x0202 | PARAMETER AREA WRITE | 参数区域写入 |
0x0203 | PARAMETER AREA CLEAR | 参数区域清除 |
0x0220 | DATA LINK TABLE READ | 数据链表读取 |
0x0221 | DATA LINK TABLE WRITE | 数据链表写入 |
0x0304 | PROGRAM AREA PROTECT | 程序区保护 |
0x0305 | PROGRAM AREA PROTECT CLEAR | 程序区保护清除 |
0x0306 | PROGRAM AREA READ | 程序区读取 |
0x0307 | PROGRAM AREA WRITE | 程序区写入 |
0x0308 | PROGRAM AREA CLEAR | 程序区清除 |
0x0401 | RUN | 运行 |
0x0402 | STOP | 停止 |
0x0403 | RESET | 重置 |
0x0501 | CONTROLLER DATA READ | 控制器数据读取 |
0x0502 | CONNECTION DATA READ | 连接数据读取 |
0x0601 | CONTROLLER STATUS READ | 控制器状态读取 |
0x0602 | NETWORK STATUS READ | 网络状态读取 |
0x0603 | DATA LINK STATUS READ | 数据链接状态读取 |
0x0620 | CYCLE TIME READ | 循环次数读取 |
0x0701 | CLOCK READ | 时钟读取 |
0x0702 | CLOCK WRITE | 时钟写入 |
0x0801 | LOOP-BACK TEST/INTERNODE ECHO TEST | 环路测试/内部节点测试 |
0x0802 | BROADCAST TEST RESULTS READ | 广播测试结果读取 |
0x0803 | BROADCAST TEST DATA SEND | 广播测试数据发送 |
0x0920 | MESSAGE READ | 消息读取 |
0x0921 | MESSAGE CLEAR | 消息清除 |
0x0C01 | ACCESS RIGHT ACQUIRE | 访问权限获取 |
0x0C02 | ACCESS RIGHT FORCED ACQUIRE | 访问权限强制获取 |
0x0C03 | ACCESS RIGHT RELEASE | 访问权限释放 |
0x2101 | ERROR CLEAR | 错误清除 |
0x2102 | ERROR LOG READ | 错误日志读取 |
0x2103 | ERROR LOG CLEAR | 错误日志清除 |
0x2201 | FILE NAME READ | 文件名读取 |
0x2202 | SINGLE FILE READ | 单文件读取 |
0x2203 | SINGLE FILE WRITE | 单文件写入 |
0x2204 | MEMORY CARD FORMAT | 记忆卡格式化 |
0x2205 | FILE DELETE | 文件删除 |
0x2206 | VOLUME LABEL CREATE/DELETE | 卷标创建/删除 |
0x2207 | FILE COPY | 文件复制 |
0x2208 | FILE NAME CHANGE | 文件名更改 |
0x2209 | FILE DATA CHECK | 文件数据核查 |
0x220A | MEMORY AREA FILE TRANSFER | 内存区域文件传输 |
0x220B | PARAMETER AREA FILE TRANSFER | 参数区域文件传输 |
0x220C | PROGRAM AREA FILE TRANSFER | 程序区域文件传输 |
0x220D | FILE MEMORY INDEX READ | 文件内存索引读取 |
0x2210 | FILE MEMORY READ | 文件内存读取 |
0x2211 | FILE MEMORY WRITE | 文件内存写入 |
0x2301 | FORCED SET/RESET | 强制设置/重置 |
0x2302 | FORCED SET/RESET CANCEL | 取消强制设置/重置 |
0x230A | MULTIPLE FORCED STATUS READ | 多强制状态读取 |
0x2601 | NAME SET | 名称设置 |
0x2602 | NAME DELETE | 名称删除 |
0x2603 | NAME READ | 名称读取 |
合计:14个大类,57个子类,共57个Command Code。
2.2 Fins Over TCP
基于TCP的FINS报文结构也不复杂,无非就是一个FINS/TCP头部(必选),加上FINS/UDP报文(可选),如下所示:
Fins over TCP
+----------------------------------------+
| Fins/TCP Header |
+----------------------------------------+
| Fins/UDP Header(not neccessary) |
+----------------------------------------+
| Command Data(not neccessary) |
+----------------------------------------+
2.2.1 Fins/TCP Header
Fins/TCP的报头与Fins/UDP不同的是,它由4个固定字段和2个可选字段组成,如下所示:
Fins/TCP Header
0 31
+---------+-----------+----------+---------------------+
| Magic Bytes |
+------------------------------------------------------+
| Length |
+------------------------------------------------------+
| Command |
+------------------------------------------------------+
| Error Code |
+------------------------------------------------------+
| Client Node Address(optional) |
+------------------------------------------------------+
| Server Node Address(optional) |
+------------------------------------------------------+
2.2.2 Magic
其ASCII码(0x46494E53)是单词‘FINS’,值是固定的。
2.2.3 Length
Length 的值表示其后所有字段(包括可能出现的Fins/UDP包)的总长度
Length 的值等于TCP负载的总长度减去8个字节。
2.2.4 Command
Command 表示消息中随附的命令的类型。
这个字段的取值直接决定了后续可选的字段Client Node Address、Server Node Address是否出现,具体情况如下所示:
1)0x00000000:Node Address Data Send(client to server),此时仅有Client Node Address字段;
(2)0x00000001: Node Address Data send(Server to client)(0x00000001),此时Client/Server Node Address字段均出现;
(3)其它:不会出现上述两个字段。
2.2.5 Error Code
Error Code 表示错误代码,提示发送的数据包是否有错误。根据 wireshark源代码所提供的信息,错误代码目前共定义了10种类型,如下所示:
错误码 | 对应含义 |
0x00000000 | Normal |
0x00000001 | The header is not ‘FINS’ (ASCII code) |
0x00000002 | The data length is too long |
0x00000003 | The command is not supported |
0x00000020 | All connections are in use |
0x00000021 | The specified node is already connected |
0x00000022 | Attempt to access a protected node from an unspecified IP address |
0x00000023 | The client FINS node address is out of range |
0x00000024 | The same FINS node address is being used by the client and server |
0x00000025 | All the node addresses available for allocation have been used |
2.2.6 Client Node Address
1. 设备识别:
- Client Node Address 用于唯一标识网络中的每个客户端设备。它确保数据能够正确地发送到特定的客户端。
2. 通信管理:
- 在进行数据传输时,FINS 协议通过 Client Node Address 确定目标设备,从而实现不同设备之间的有效通信。
3. 多节点支持:
- FINS 协议允许多个客户端在同一网络中同时存在。每个客户端通过其唯一的 Node Address 进行区分,这使得系统可以支持复杂的多节点通信。
4. 地址范围:
- Client Node Address 通常是一个范围在 0 到 254 之间的整数(某些情况下可能更具体,具体取决于网络设置)。地址 0 通常用于广播。
示例
- 在一个工厂自动化系统中,PLC 可能使用 Client Node Address 1,而传感器可能使用 Client Node Address 2。通过这些地址,PLC 可以向特定的传感器发送数据请求或指令。
Fins/TCP协议的客户端/服务器在传输有效的命令数据之前,由客户端先向服务器发送一个包含Client Node Address字段的报文申请节点地址。由于客户端申请的时候还没有节点地址,因此该字段被置为0x00000000。
2.2.7 Server Node Address
1. 设备识别:
- Server Node Address 用于唯一标识网络中的每个服务器设备(例如 PLC、I/O 设备、HMI 等)。它确保请求能够正确地发送到特定的服务器。
2. 通信管理:
- 在 FINS 协议中,客户端(如 PC 或控制器)通过 Server Node Address 确定目标服务器,以便发送数据请求或指令。
3. 多节点支持:
- FINS 协议支持在同一网络中存在多个服务器。每个服务器都有其唯一的 Server Node Address,这使得系统能够同时处理多个客户端请求。
4. 地址范围:
- Server Node Address 通常是一个范围在 0 到 254 之间的整数(某些情况下可能更具体,具体取决于网络设置)。地址 0 通常用于广播,允许客户端向网络中的所有服务器发送请求。
示例:在一个工厂自动化系统中,PLC 可能使用 Server Node Address 1,而另一个控制器可能使用 Server Node Address 2。客户端通过这些地址与特定的服务器进行通信,发送指令或获取数据。
服务器收到客户端请求后,给客户端分配相应的节点地址并通告给客户端,同时在报文中包含服务器自己的节点地址信息
2.3 Command Data
Fins/UDP、Fins/TCP协议的实际负载部分。