python实现FINS协议的TCP服务端(篇一)
python实现FINS协议的TCP服务端是一件稍微麻烦点的事情。它不像modbusTCP那样,可以使用现成的pymodbus模块去实现。但是,我们可以根据协议帧进行组包,自己去实现帧的格式,而这一切可以基于socket模块。本文为第一篇。
一、了解FINS协议
参考文档:FinsTCP协议报文详细分析 - 知乎
1、什么是FINS协议
FINS(Factory Interface Network Service)是欧姆龙(Omron)工业自动化设备使用的通信协议,这表明我们需要查阅官方文档来实现这个协议,而该协议具有以下特点:
高效性: FINS协议是为了在工业自动化环境中实现高效通信而设计的,具有较低的通信延迟和高速数据传输能力。
灵活性: FINS协议支持多种通信方式,包括串行通信、以太网通信等,可以适应不同的网络环境和硬件设备。
多功能性: FINS协议支持多种通信功能,包括读写PLC的数据、控制PLC的操作、监控PLC的状态等,提供了丰富的通信能力。
可靠性: FINS协议具有良好的错误检测和纠正机制,确保通信数据的可靠性和完整性。
扩展性: FINS协议支持多种数据类型和数据格式,可以满足不同应用场景下的需求,具有较强的扩展性。
标准化: FINS协议是欧姆龙PLC的标准通信协议,得到了广泛应用和认可,在工业自动化领域具有一定的标准性和通用性。
易用性: FINS协议的通信指令相对简单,易于理解和实现,使得工程师能够快速开发和部署与欧姆龙PLC通信的应用程序。
2、FINS TCP与TCP的关系
FINS TCP(Factory Interface Network Service over TCP/IP)是FINS协议在TCP/IP网络上的实现方式。它是FINS协议的一种变体,使用TCP/IP作为传输层协议,用于在工业自动化系统中实现设备之间的通信。
TCP(Transmission Control Protocol)是互联网上的一种通信协议,它是面向连接、可靠的、基于字节流的传输层协议。TCP提供了数据的可靠传输,确保数据在传输过程中不会丢失或损坏。TCP协议在网络通信中广泛应用,用于建立可靠的、稳定的数据传输连接。
FINS TCP是在TCP协议的基础上实现的FINS协议,它使用TCP连接来传输FINS协议的数据。在FINS TCP中,FINS帧(Frame)被封装在TCP报文中进行传输。FINS帧包含了FINS协议的控制信息和数据内容,通过TCP连接传输到目标设备,然后在目标设备上进行解析和处理。
FINS TCP的使用使得在工业自动化系统中,不同设备(如PLC、传感器、HMI等)之间可以通过TCP/IP网络进行可靠的通信。这种通信方式广泛应用于现代工厂自动化系统中,为设备间的数据交换提供了高效、可靠的解决方案。
这也是为什么我们可以通过socket模块来实现的原因。
3、TCP的三次握手+一次FINS握手
(1)握手请求
46494E53 0000000C 00000000 00000000 00000000
"46494E53":ASCII编码,表示"FINS",表明这是一个FINS协议的数据帧。
"0000000C":指示后面跟随的字节长度,即4字节。
"00000000":固定命令部分,通常为零。
"00000000":错误代码,通常为零,表示没有错误。
"00000000":PC节点IP地址,当设置为0时,通常表示会自动获取节点IP。
这个指令是一个典型的FINS TCP握手指令,用于建立FINS通信连接。在该指令中,"46494E53"表示"FINS",指示这是一个FINS数据帧。接着,"0000000C"表示后续数据的长度为4字节。然后,"00000000"和"00000000"分别表示固定命令和错误代码,通常为零。最后,"00000000"表示PC节点的IP地址,当设置为0时,表示会自动获取节点IP。
(2)握手响应
46494E53 00000010 00000000 00000000 00000001 00000001
- "46494E53":ASCII编码,表示"FINS",指示这是一个FINS协议的数据帧。
- "00000010":指示后面跟随的字节长度,即16字节(包括这个长度字段自身)。
- "00000001":固定命令部分,通常为1,表示这是一个特定类型的FINS命令。
- "00000000":错误代码,通常为零,表示没有错误。
- "00000001":本机电脑的节点IP地址。
- "00000001":PLC节点的IP地址。
4、请求包
46 49 4E 53 00 00 00 1A 00 00 00 02 00 00 00 00 80 00 02 00 01 00 00 01 00 0F 01 01 82 00 64 00 00 01
5、响应包
46 49 4E 53 00 00 00 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 01 00 00 73 00
相关文章:

python实现FINS协议的TCP服务端(篇一)
python实现FINS协议的TCP服务端是一件稍微麻烦点的事情。它不像modbusTCP那样,可以使用现成的pymodbus模块去实现。但是,我们可以根据协议帧进行组包,自己去实现帧的格式,而这一切可以基于socket模块。本文为第一篇。 一、了解FI…...

利用uni-app 开发的iOS app 发布到App Store全流程
1.0.3 20200927 更新官方对应用审核流程的状态。 注:最新审核后续将同步社区另一篇记录 AppStore 审核被拒原因记录及解决措施 :苹果开发上架常见问题 | appuploader使用教程 1.0.2 20200925 新增首次驳回拒绝邮件解决措施。 1.0.1 20200922 首次…...

5个高质量的实用办公软件,每一款都是良心推荐
在现代办公环境中,高效的办公软件可以极大地提升工作效率,简化工作流程,帮助我们更好地完成工作。今天就给大家分享5个高质量的实用办公软件,每一款都是良心推荐。 01、FastStone Capture(截图工具) FastSt…...

基于GPTs个性化定制SCI论文专业翻译器
1. 什么是GPTs GPTs是OpenAI在2023年11月6日开发者大会上发布的重要功能更新,允许用户根据特定需求定制自己的ChatGPT模型。 Introducing GPTs 官方介绍页面https://openai.com/blog/introducing-gpts 在原有自定义ChatGPT的流程中,首先需要自己编制p…...

Final Cut Pro X for Mac:打造专业级视频剪辑的终极利器
随着数字媒体技术的不断发展,视频剪辑已经成为各行各业不可或缺的一部分。Final Cut Pro X for Mac作为一款专业的视频剪辑软件,凭借其强大的功能和易用性,已经成为Mac用户的首选。本文将向您详细介绍Final Cut Pro X for Mac的优势、功能以及…...

c++分割路径的字符串,得到 目录 文件名 扩展名
简单的做一个c小代码片的记录 c分割了图片的 路径字符串,得到 目录 文件名 扩展名 #include <iostream> using namespace std;int main() {std::string path "E:\\set1_seg\\32.jpg";//index:"\\"在字符串中的位置int index path.find…...
ABAP OpenSQL 分页处理
功能实现 在 ABAP 中,可以使用 OpenSQL 来实现分页功能。下面是一种实现分页的示例方法: 首先,定义一个内部表来存储查询结果数据: DATA lt_data TYPE TABLE OF your_data_type.然后,使用 SELECT 语句将数据查询到内…...
kubeasz一键部署k8s集群
下载程序 部署说明 部署文档 rootiZj6cd9joygowsf7am5hryZ:~# apt-get update rootiZj6cd9joygowsf7am5hryZ:~# apt-get upgrade rootiZj6cd9joygowsf7am5hryZ:~# export release3.6.2 rootiZj6cd9joygowsf7am5hryZ:~# wget https://github.com/easzlab/kubeasz/releases/…...

高性能图表库LightningChart JS v5.0 - 轻松实现图表自定义布局
LightningChart JS是Web上性能最高的图表库具有出色的执行性能 - 使用高数据速率同时监控数十个数据源。 GPU加速和WebGL渲染确保您的设备的图形处理器得到有效利用,从而实现高刷新率和流畅的动画。 点击获取LightningChart JS v5.0正式版下载 LightningChart JS …...

深度学习的集体智慧:最新发展综述
一、说明 我们调查了来自复杂系统的想法,如群体智能、自组织和紧急行为,这些想法在机器学习中越来越受欢迎。人工神经网络正在影响我们的日常生活,从执行预测性任务(如推荐、面部识别和对象分类)到生成任务(…...

Java之“数字困境”:资产管理项目中的Bug追踪与启示
目录 1 前言2 问题的发现3 调试的开始4 深入调试5 调试心得与反思6 结语 1 前言 在程序员的日常工作中,我们时常面对各种令人头疼的问题,其中最令人崩溃的瞬间之一,就是当我们花费大量时间追踪一个看似复杂的bug,最终发现问题的根…...
小程序微信登录授权突然没反应的原因和解决方案
之前的小程序微信授权一直用的很好 今天突然点击没反应了 马上在开发工具试一试 返现点击授权返回错误信息 排除所有代码问题(之前一直用的好好的)和服务器承载问题(就几个人点击) 第一反应就是小程序有啥政策改变的问题&#x…...
文本提交时如何使用PHP替换回车为br
1、使用PHP内置的nl2br()函数 nl2br()函数是PHP内置的函数,可以将任何字符串中的回车符(\n)替换为HTML中的换行符(br)。具体使用方法如下: $string "这里有一个\n换行符"; $string nl2br($str…...

安全框架SpringSecurity-1(认证入门数据库授权)
一、Spring Security ①:什么是Spring Security Spring Security是一个能够为基于Spring的企业应用系统提供声明式(注解)的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring …...

【MybatisPlus】条件构造器、自定义SQL、Service接口
🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaEE 操作系统 Redis 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 MybatisPlus 一、条件构造器1.1 基于QueryW…...
数组计算广播
Numpy数组不需要循环遍历,即可对每个元素执行批量的算术运算操作(矢量化运算)。当两个数组大小(Numpy.shape)不同时,进行算术运算会出现广播机制。 数组广播 数组在进行矢量化运算的时,要求数组…...
代码解读:Zero-shot 视频生成任务 Text2Video-Zero
Diffusion Models视频生成-博客汇总 前言:上一篇博客《【ICCV 2023 Oral】解读Text2Video-Zero:解锁 Zero-shot 视频生成任务》解读了这篇论文《Text2Video-Zero: Text-to-Image Diffusion Models are Zero-Shot Video Generators》。这篇论文的创新点比较多,含金量很高,而…...

hub.docker访问不了的问题(一步解决)
暂时我也不清楚,但是下面这个网址可以用(可以先用着)Docker Hub Container Image Library | App Containerization (axlinux.top)https://hub.axlinux.top/...
[.NET] Speex 语音编解码介绍, 使用, 代码示例
Speex 是一个开源的, 适合语音编解码的算法, 常应用于网络电话中. 在下面的的介绍中, 我们将使用 SpeexSharp 对 Speex 编码在 .NET 中的使用做介绍 SpeexSharp 可以在 nuget 中直接安装, 并且已经封装了编解码器的类供使用. 如果你不希望了解 Speex 的具体编解码过程, 可以忽…...

小样本目标检测(Few-Shot Object Detection)综述
背景 前言:我的未来研究方向就是这个,所以会更新一系列的文章,就关于FSOD,如果有相同研究方向的同学欢迎沟通交流,我目前研一,希望能在研一发文,目前也有一些想法,但是具体能不能实现还要在做的过程中慢慢评估和实现.写文的主要目的还是记录,避免重复劳动,我想用尽量简洁的语言…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...

华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...