From cd4af1a5c7c94b4e6f0bfd6b4a69e9e7352c6134 Mon Sep 17 00:00:00 2001 From: gitee-bot Date: Fri, 27 Jun 2025 01:20:20 +0000 Subject: [PATCH] Update README.md --- README.md | 456 +++++++----------------------------------------------- 1 file changed, 56 insertions(+), 400 deletions(-) diff --git a/README.md b/README.md index 7f3a837..ce52f5f 100644 --- a/README.md +++ b/README.md @@ -1,421 +1,77 @@ -# [欧姆龙Fins读写指令大全](https://www.cnblogs.com/resplendent/p/15219216.html) +# 欧姆龙Fins读写指令大全 +这是一个基于Spring Boot的欧姆龙Fins TCP协议通信服务,提供PLC数据读写接口。 +## 功能特性 -以下指令均为16进制数,PC IP地址:192.168.250.24,PLC IP地址:192.168.250.23 +- 支持PLC位(Bit)和字(Word)类型数据读写 +- 提供RESTful API接口进行数据交互 +- 支持十六进制数据处理 +- 包含完整的Fins协议解析工具 -##### 注:1个十六进制数占0.5字节 +## 系统架构 -# 一、Fins Tcp +基于Netty实现TCP客户端通信,采用策略模式处理不同数据区域类型,使用CompletableFuture处理异步请求响应。 -1.握手指令 +## 安装部署 -1.1. 发送 +1. 确保已安装JDK 1.8+ 和 Maven +2. 执行 `mvn clean install` +3. 配置application.yml中的OMRON连接参数: + ```yaml + omron: + fins-tcp-ip: 127.0.0.1 + fins-tcp-port: 9600 + plc-ip-node: 1 + pc-id-node: 1 + read-write-timeout: 5000 + ``` -46494E53 0000000C 00000000 00000000 00000018 +## 使用说明 -46494E53:ASCII编码:FINS; +### API接口 -0000000C:指后面跟的字节长度; +#### 测试接口 +`GET /send/test` +参数:msg (测试消息) -00000000:固定命令; +#### 数据读取 +`GET /send/send` +参数: +- db (数据块地址) +- offset (偏移量) +- bool (是否为布尔值) -00000000:错误代码; +#### 数据写入 +`GET /send/write` +参数: +- db (数据块地址) +- offset (偏移量) +- dbValue (写入值) +- bool (是否为布尔值) -00000018:PC节点IP,当设置为0时,会自动获取节点IP。 +### 数据转换 +注:DB地址需要乘以256后转换为十六进制 -1.2. 反馈 +## 错误处理 -46494E53 00000010 00000001 00000000 00000018 00000017 +包含完整的错误代码处理机制,通过FinsErrorCodeEnum定义常见错误代码,使用GlobalException进行异常处理。 -46494E53:ASCII编码:FINS; +## 协议解析 -00000010:指后面跟的字节长度; +提供完整的Fins协议解析工具: +- FinsMsgAnalysisUtil:Fins消息解析工具 +- FinsRequestAnalysisUtil:Fins请求解析工具 +- FinsUtil:核心Fins通信工具类 -00000001:固定命令; - -00000000:错误代码; - -00000018:本机电脑节点IP; - -00000017:PLC节点IP。 - - - -2. 读取指令 - -读D100开始的2个地址,注:一次最多读1000个地址。 - -2.1. 发送 - -46494E53 0000001A 00000002 00000000 80 00 02 001700 001800 FF 0101 82 006400 0002 - -46494E53:ASCII编码:FINS; - -0000001A:指后面跟的字节长度; - -00000002:固定命令; - -00000000:错误代码; - -80:ICF; - -00:RSV; - -02:GCT; - -00:PLC网络地址; - -17:PLC节点地址; - -00:PLC单元地址; - -00:PC网络地址; - -18:PC节点地址; - -00:PC单元地址; - -FF:SID; - -0101:读指令; - -82:读地址区(D位:02,D字:82,W位:31,C位:30,W字:B1,C字:B0); - -006400:起始地址; - -0002:读个数。 - - - -2.2. 反馈 - -46494E53 0000001A 00000002 00000000 C0 00 02 001800 001700 FF 0101 0000 AABB CCDD - -46494E53:ASCII编码:FINS; - -0000001A:指后面跟的字节长度; - -00000002:固定命令; - -00000000:错误代码; - -C0:ICF; - -00:RSV; - -02:GCT; - -00:PC网络地址; - -18:PC节点地址; - -00:PC单元地址; - -00:PLC网络地址; - -17:PLC节点地址; - -00:PLC单元地址; - -FF:SID; - -0101:读指令; - -0000:读取成功标识; - -AABB CCDD:读到的数据。 - - - -3.写入指令 - -往W10,W11写入AABB,CCDD - -3.1. 发送 - -46494E53 0000001E 00000002 00000000 80 00 02 001700 001800 FF 0102 B1 000A00 0002 AABBCCDD - -46494E53:ASCII编码:FINS; - -0000001E:指后面跟的字节长度; - -00000002:固定命令; - -00000000:错误代码; - -80:ICF; - -00:RSV; - -02:GCT; - -00:PLC网络地址; - -17:PLC节点地址; - -00:PLC单元地址; - -00:PC网络地址; - -18:PC节点地址; - -00:PC单元地址; - -FF:SID; - -0102:写指令; - -B1:读地址区(D位:02,D字:82,W位:31,C位:30,W字:B1,C字:B0); - -000A00:起始地址; - -0002:写个数; - -AABBCCDD:写入数据。 - - - -3.2. 反馈 - -46494E53 00000016 00000002 00000000 C0 00 02 001800 001700 FF 0102 0000 - -46494E53:ASCII编码:FINS; - -00000016:指后面跟的字节长度; - -00000002:固定命令; - -00000000:错误代码; - -C0:ICF; - -00:RSV; - -02:GCT; - -00:PC网络地址; - -18:PC节点地址; - -00:PC单元地址; - -00:PLC网络地址; - -17:PLC节点地址; - -00:PLC单元地址; - -FF:SID; - -0102:写指令; - -0000:写入成功标识。 - - - -# 二、Fins Udp - -Fins Udp与Fins Tcp很像,只是Fins Udp不需要发握手指令,指令从80(ICF)开始。 - -1.读取指令 - -读D100开始的2个通道 - -1.1. 发送 - -80 00 02 001700 001800 FF 0101 82 006400 0002 - -80:ICF; - -00:RSV; - -02:GCT; - -00:PLC网络地址; - -17:PLC节点地址; - -00:PLC单元地址; - -00:PC网络地址; - -18:PC节点地址; - -00:PC单元地址; - -FF:SID; - -0101:读指令; - -82:读地址区(D位:02,D字:82,W位:31,C位:30,W字:B1,C字:B0); - -006400:起始地址; - -0002:读个数。 - - - -1.2. 反馈 - -C0 00 02 001800 001700 FF 0101 0000 AABB CCDD - -C0:ICF; - -00:RSV; - -02:GCT; - -00:PC网络地址; - -18:PC节点地址; - -00:PC单元地址; - -00:PLC网络地址; - -17:PLC节点地址; - -00:PLC单元地址; - -FF:SID; - -0101:读指令; - -0000:读取成功标识; - -AABB CCDD:读到的数据。 - - - -2.写入指令 - -往W10,W11写入AABB,CCDD - -2.1. 发送 - -80 00 02 001700 001800 FF 0102 B1 000A00 0002 AABBCCDD - -80:ICF; - -00:RSV; - -02:GCT; - -00:PLC网络地址; - -17:PLC节点地址; - -00:PLC单元地址; - -00:PC网络地址; - -18:PC节点地址; - -00:PC单元地址; - -FF:SID; - -0102:写指令; - -B1:读地址区(D位:02,D字:82,W位:31,C位:30,W字:B1,C字:B0); - -000A00:起始地址; - -0002:写个数; - -AABBCCDD:写入数据。 - - - -2.2. 反馈 - -C0 00 02 001800 001700 FF 0102 0000 - -C0:ICF; - -00:RSV; - -02:GCT; - -00:PC网络地址; - -18:PC节点地址; - -00:PC单元地址; - -00:PLC网络地址; - -17:PLC节点地址; - -00:PLC单元地址; - -FF:SID; - -0102:写指令; - -0000:写入成功标识。 - - - -# 三、错误代码 - -![img.png](img.png) - - - -# 四、测试 - -##### 注:DB 需要 x 256 在转16进制 - - - -#### 读取 - -```TXT -读指令:46494E530000001A000000020000000080000200CA00003D00FF0101821774000001 -46494E53 -0000001A -00000002 -00000000 -80 -00 -02 -00CA00 -003D00 -FF -0101:读指令 -82:D字 -177400:DB位 × 256 -0001:偏移量 -返回数据:46 49 4E 53 00 00 00 18 00 00 00 02 00 00 00 00 C0 00 02 00 3D 00 00 CA 00 FF 01 01 00 00 00 07 -说明:读取D6004,返回数据为7 -``` - - - -#### 写入 - -```TXT -写指令:46494E5300000023000000020000000080000200CA00003D00FF010202177000000101 -46494E53 -00000023 -00000002 -00000000 -80 -00 -02 -00CA00 -003D00 -FF -0102:写指令 -02:D字 -177000:DB位 × 256 -0001:偏移量 -01:写入值 -返回值:46 49 4E 53 00 00 00 16 00 00 00 02 00 00 00 00 C0 00 02 00 3D 00 00 CA 00 FF 01 02 00 00 -说明:写入D6000.1,值为true,长度不足四位需要补足 -``` +## 开发贡献 +欢迎贡献代码,请遵循以下规范: +1. Fork仓库 +2. 创建新分支 +3. 提交代码 +4. 创建Pull Request +## 许可协议 +本项目采用Apache 2.0协议,请查看LICENSE文件获取详细信息。 \ No newline at end of file -- Gitee