python实现FINS协议的TCP服务端(篇一)

news2024/11/24 17:21:51

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1191400.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习之基于Python+OpenCV(DNN)性别和年龄识别系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 基于Python和OpenCV的深度学习性别和年龄识别系统是一种利用深度学习模型来自动识别人脸照片中的性别和年龄的技术。…

95 课程表

课程表 题解1 BFS(拓扑图模板)题解2 DFS 你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] [ai, bi] &am…

PostgreSQL 技术内幕(十一)位图扫描

扫描算子在上层计算和底层存储之间,向下扫描底层存储的数据,向上作为计算的输入源,在SQL的执行层中,起着关键的作用。顺序、索引、位图等不同类型的扫描算子适配不同的数据分布场景。然而,扫描算子背后的实现原理是怎样…

Linux nohup后台启动/ 后台启动命令中nohup 、、重定向的使用

文章目录 一、前言二、nohup(不挂断)简介三、nohup使用3.1、nohup启动3.2、nohup与&,后台运行3.3、nohup与>,日志重定向3.4、nohup后台启动-综合使用(推荐)2>&1 3.5、nohup后台启动(不生成日志) 四、查看进程五、知…

输出所有最长公共子序列

输出所有最长公共子序列 什么是最长公共子序列过程讲解完整程序代码(python) 什么是最长公共子序列 在力扣题库中的1143题有一道最长公共子序列,但是那个只是返回最长子序列的长度,而没有输出所有的最长子序列 通过上图中的举例…

VR全景技术,为养老院宣传推广带来全新变革

现如今,人口老龄化的现象加剧,养老服务行业也如雨后春笋般不断冒头,但是市面上各式的养老院被包装的五花八门,用户实际参访后却差强人意,如何更好的给父母挑选更为舒心的养老环境呢?可以利用720度VR全景技术…

响应式艺术作品展示前端html网站模板源码

响应式艺术作品展示网站模板是一款适合各种艺术作品在线展示的响应式网站模板下载。提示:本模板调用到谷歌字体库,可能会出现页面打开比较缓慢。 转载自 https://www.qnziyw.cn/wysc/qdmb/23778.html

文献管理软件Zotero之同步篇(2)

文章目录 0、前言1、官方自带同步1.1、Zotero的同步逻辑【必须掌握】1.2、自带同步设置 2、官网进行数据同步,同步网盘进行文件同步的方案2.1、对1.1同步逻辑的补充说明2.2、同步设置2.2.1、同步网盘的选择:2.2.2、同步设置2.2.2.1、分别在每一台计算机中…

JMeter参数化方式:三招让你的性能测试更灵活!

科技新势力,引领向未来 今天我们将探讨关于JMeter(Apache JMeter)性能测试工具中的参数化方式,这些方法可以帮助你更灵活地进行性能测试,并更好地模拟实际用户行为。JMeter是一款强大的开源工具,可用于测试…

R-install_miniconda()卸载 | conda命令行报错及解决方法

运行以下代码&#xff0c;突然报错&#xff1a; C:\Users\hp>conda info-e >>>>>>>>>>>>>>>>>>>>>> ERROR REPORT <<<<<<<<<<<<<<<<<<<<&…

AI:74-基于深度学习的宠物品种识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

VScode 右键没有转到定义等的菜单

问题&#xff1a; 右键点击该函数出现的结果只能是这样的&#xff1a; 解决&#xff1a; 通过修改 settings.json 文件&#xff0c;以解决问题&#xff1a; 这是原来有问题的配置&#xff1a; {"python.autoComplete.extraPaths": ["/home/robot/1-temp_mak…

【Linux】 reboot 命令使用

reboot 命令用于用来重新启动计算机。 语法 reboot [参数] 命令选项及作用 执行令 man --reboot 执行命令结果 参数 -n : 在重开机前不做将记忆体资料写回硬盘的动作-w : 并不会真的重开机&#xff0c;只是把记录写到 /var/log/wtmp 档案里-d : 不把记录写到 /var/log…

锁策略与CAS

目录 ♫什么是锁策略 ♫乐观锁与悲观锁 ♫互斥锁和读写锁 ♫重量级锁和轻量级锁 ♫自旋锁和挂起等待锁 ♫公平锁和非公平锁 ♫可重入锁和不可重入锁 ♫什么是CAS ♫CAS实现原子类 ♫CAS实现自旋锁 ♫CAS的ABA问题 ♫什么是锁策略 锁策略指的是在并发访问数据时&#xf…

创建一个自定义关卡资源(二)

接上一篇文章&#xff0c;做加载 再做加载之前&#xff0c;提一下 关于上一篇文章中的扩展编辑器&#xff0c;会有点小问题&#xff0c;会有重置的现象&#xff0c;现在有点忙&#xff0c;暂时不研究。 如果研究的话&#xff0c;我会出一篇&#xff08;三&#xff09; 否则就没…

哈希的介绍及开散列和闭散列的实现(c++)

本文主要对哈希的相关知识进行一定的介绍&#xff0c;并对哈希中结构的闭散列和开散列进行一定的介绍和部分功能的实现。 目录 一、哈希概念 二、哈希冲突 三、哈希函数 1. 直接定址法--(常用) 2. 除留余数法--(常用) 3. 平方取中法 4. 折叠法 5. 随机数法 6. 数学分析…

利用servlet实现对书籍书名、单价、数量等信息的添加,计算总价

1.题目要求 利用servlet实现对书籍书名、单价、数量等信息的添加&#xff0c;计算总价。 要求&#xff1a;输入两次表单信息&#xff0c;在一个成功返回的页面里面显示两次的数据。 2.Book实体类 package com.hjj.sevletgk.hw7.book;/*** author:嘉佳 Date:2023/10/8 15:16*…

Spring 常见面试题

1、Spring概述 1.1、Spring是什么? Spring是一个轻量级Java开发框架,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题Spring最根本的使命是解决企业级应用开发的复杂性&#xff0c;即简化Java开发。这些功能的底层都依赖于它的两个核心特性&#xff0c;也就是…

Html 引入element UI + vue3 报错Failed to resolve component: el-button

问题&#xff1a;Html 引入element UI vue3 &#xff0c;el-button效果不出来 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><!-- import Vue before Element --> <!-- <script src"https://unpkg.com/vue2/dist…

每次重启完IDEA,application.properties文件里的中文变成?

出现这种情况&#xff0c;在IDEA打开Settings-->Editor-->File Encodings 然后&#xff0c;你需要将问号改为你需要的汉字。 重启IDEA&#xff0c;再次查看你的.properties文件就会发现再没有变成问号了