omron fins 内存区域写入(MEMORY AREA WRITE)

news2024/11/23 19:15:54

1. 完整的代码如下:

import socket
import binascii


class Omron:
    def __init__(self, ip, port=9600):
        self.ip = ip  # PLC的IP地址
        self.port = port  # PLC的端口,默认为9600

    def send_receive_fins(self):
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sc:
            sc.settimeout(30)  # 设置socket超时时间为30秒
            try:
                sc.connect((self.ip, self.port))  # 尝试连接到PLC
                sc.send(binascii.unhexlify('46494e530000000c000000000000000000000000'))  # 发送初始化包
                response = sc.recv(4096)  # 接收PLC的响应

                if binascii.hexlify(response)[:4] != b'4649':  # 检查响应是否以'FINS'开始
                    return False

                # 第一部分:FINS/TCP Header 字段信息
                magic_bytes = "46494e53"  # FINS, 4个字节

                # 修改:需要根据写入数据的长度来设置长度字段
                length = "0000002c"  # length以后所有字段的长度,4个字节
                # 修改:需要根据写入数据的长度来设置长度字段

                command = "00000002"  # 发送帧,4个字节
                error_code = "00000000"  # 错误码,4个字节

                # 第二部分:FINS Header 字段信息
                information_control_field = "80"  # 信息控制字段,1个字节
                reserved = "00"  # 保留,1个字节
                gateway_count = "02"  # 网关数
                destination_network_address = "00"  # 目标网络地址,1个字节
                destination_node_number = self.extract(response, 46)  # 提取PLC返回的server_node_address
                destination_unit_address = "00"  # 目标单元地址,1个字节
                source_network_address = "00"  # 源网络地址,1个字节
                source_node_number = "00"  # 源节点地址,1个字节
                source_unit_address = "ef"  # 源单元地址,1个字节

                # 修改部分
                service_id = "00"  # 服务ID,此处为00,表示读取数据,1个字节
                command_code = "0102"  # 命令代码,此处为内存区域写入,2个字节
                memory_area_code = "82"  # 内存区域代码,1个字节,此处为82,表示为PLC的DM区域
                beginning_address = "006400"  # 起始地址,3个字节,此处为0x6400
                item_count = "0009"  # 写9个字的数据,2个字节,一个字为2个字节
                data = "617164627432707737396d306964746b3833"  # 待写入的数据,# len(data) = item_count * 2 = 18字节
                # 修改部分

                cmd_packet = magic_bytes + \
                             length + \
                             command + \
                             error_code + \
                             information_control_field + \
                             reserved + \
                             gateway_count + \
                             destination_network_address + \
                             destination_node_number + \
                             destination_unit_address + \
                             source_network_address + \
                             source_node_number + \
                             source_unit_address + \
                             service_id + \
                             command_code + \
                             memory_area_code + \
                             beginning_address + \
                             item_count + \
                             data

                print('cmd_packet:', binascii.unhexlify(cmd_packet))
                sc.send(binascii.unhexlify(cmd_packet))  # 发送指令包
                response = sc.recv(1024)  # 接收PLC的响应
            except Exception as e:
                print(f"连接或传输错误: {e}")  # 输出错误信息
                return False

    @staticmethod
    def extract(data, offset):
        hex_data = binascii.hexlify(data).decode()  # 将数据转换为十六进制字符串
        return hex_data[offset:offset + 2]  # 返回指定位置的数据


if __name__ == '__main__':
    omron_plc = Omron('89.186.98.168', 9600)  # 实例化Omron类,设置IP和端口
    print(omron_plc.send_receive_fins())  # 发送请求并打印返回的PLC信息

2. 需要修改的字段包括:length、service_id、 command_code、memory_area_code、 beginning_address 、item_count、data,具体如下:
length = TCP length - 8 = 24 + item_count的字节数 + item_count (十进制)* 2

length = "0000002c" 
command = "00000002"  # 4个字节
error_code = "00000000"  # 4个字节

# 第二部分:FINS Header 字段信息
information_control_field = "80"  # 1个字节
reserved = "00" # 1个字节
gateway_count = "02"  # 1个字节
destination_network_address = "00"  # 1个字节
destination_node_number = self.extract(response, 46)  # 1个字节
destination_unit_address = "00"  # 1个字节
source_network_address = "00"  # 1个字节
source_node_number = "00"  # 1个字节
source_unit_address = "ef"  # 1个字节

# 修改部分
service_id = "00"  # 1个字节
command_code = "0102"  # 2个字节
memory_area_code = "82"  # 1个字节
beginning_address = "006400"  # 3个字节
item_count = "0009"  # 2个字节,写9个字的数据,一个字为2个字节
data = "617164627432707737396d306964746b3833"  # len(data) = item_count * 2 = 18字节

3. 捕获的数据包如下:

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

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

相关文章

某个应用的CPU使用率居然达到100%,我该怎么办?

摘至https://learn.lianglianglee.com/ CPU使用率 Linux 作为一个多任务操作系统,将每个 CPU 的时间划分为很短的时间片,再通过调度器轮流分配给各个任务使用,因此造成多任务同时运行的错觉。 为了维护 CPU 时间,Linux 通过事先定…

使用标签实现MyBatis的基础操作

目录 前言 1.配置MyBatis⽇志打印 2.参数传递 2.1 #{} 和 ${}区别 2.2传递多个参数 3.增删改查 3.1增(Insert) 3.2删(Delete) 3.3改(Update) 3.4查(Select) 前言 接下来我们会使用的数据表如下: 对应的实体类为:UserInfoMapper 所有的准备工作都…

全局数据在Python包中模块间管理方法探讨

在开发大型 Python 应用程序时,有时需要多个模块共享和管理全局数据。如何优雅地在 Python 包内的不同模块间共享全局数据是一个常见的设计问题。我们希望避免全局变量的混乱和难以维护的代码,但同时能够安全、高效地管理这些共享数据。 下面我们将探讨…

低代码赋能汽车制造产业链场景系列

当前汽车行业数字化智能化转型浪潮下,整车及其上下游产业链的协同创新正变得至关重要。头部车企与上下游供应链企业正逐步解决在生产管理、业务互通、系统集成等方面的痛点与挑战。电动化、智能化、网联化作为汽车产业的三大趋势,正共同推动未来汽车产业…

MS SQL Server 实战 统计与汇总重复记录

目录 需求 范例运行环境 数据样本设计 功能实现 上传EXCEL文件到数据库 分组统计 SQL 语句 分组汇总 SQL 语句 having 语句过滤最终统计结果 小结 需求 在日常的数据管理应用中,统计和汇总重复记录的情况是经常遇到的一个问题,然后我们会根据统…

文字转语音软件哪个好?这里告诉你

在英语学习的众多环节中,听力练习无疑是至关重要的一环。 然而,平时缺乏英语环境,如何高效地利用身边的英语材料进行听力训练呢?这时,英语文字转语音工具就很重要了! 今天,就为大家介绍五款优…

【C++】认识匿名对象

文章目录 目录 文章目录前言一、对匿名对象的解读二、匿名对象的对象类型三、匿名对象的使用总结 前言 在C中,匿名对象是指在没有呗命名的情况下创建的临时对象。它们通常在单个语句中执行一系列操作或调用某个函数,并且不需要将结果存放进变量中。 匿名…

常用动词敬语形式大揭秘,柯桥零基础日语培训

一、常用动词的敬语形式 1. する(做) • 尊敬语: なさる (Nasaru) 例:社長はよく運動をなさいます。 (社长经常锻炼。) • 谦逊语: いたす (Itasu) 例:この仕事は私がいたします。 &…

Java解析图形mdb矢量mdb

Java解析图形mdb矢量mdb 背景:项目中需要解析图形mdb,同事积累下的代码无法读取复杂图形;终于在某位大佬的博客下发现新的 解析方法,特此整理记录下。原理:jackcess(assess提供解析mdb属性)、es…

C++模拟实现二叉搜索树

目录 1.二叉搜索树的概念 2.二叉搜索树的性能分析 3.二叉搜索树的结构和中序遍历 3.1二叉搜索树中节点的结构 3.2二叉搜索树的结构 3.3中序遍历 4.二叉搜索树的插入 5.二叉搜索树的查找 6.二叉树搜索树的删除 7. 二叉搜索树的默认成员函数 8.参考代码 9.二叉搜…

常见的图像处理算法:Canny边缘检测

一、Canny边缘检测算子的由来 Canny 边缘检测算子是一种多级检测算法。1986 年由 John F. Canny 提出,同时提出 了边缘检测的三大准则: 1、低错误率的边缘检测:检测算法应该精确地找到图像中的尽可能多的边缘,尽可能的减少漏检…

【一起学Rust | 框架篇 | Tauri2.0框架】高级概念之安全特性的权限与能力

文章目录 前言一、开发前准备1. 准备项目2. 需求分析1. 监听系统热键2. 切换窗口无边框3. 切换窗口全屏 二、安装插件三、前端实现功能四、配置权限 前言 当前时间为 2024 年 9 月,距离Tauri 2.0 的 RC 版本发布迄今已近一个月。从 Tauri 官方渠道可以看出&#xf…

李飞飞:我不知道什么是AGI

图片来源:Stanford University 你对人工通用智能(AGI)感到困惑吗?这就是 OpenAI 执着于最终以“造福全人类”的方式创造的东西。你可能想认真对待他们,因为他们刚筹集了 66 亿美元以更接近这个目标。 但如果你仍然在…

揭秘Sui存储基金:灵活且可持续的链上数据管理解决方案

链上数据存储的方法常常被忽视,因为所使用的机制通常是传统和常见的。然而,在去中心化网络中,数据存储对确保数据完整性和长期可访问性至关重要。Sui的链上存储与其他区块链有所不同。 Sui存储基金是为了解决链上数据永久存储问题而设计的核…

企业架构系列(16)ArchiMate第14节:实施和迁移视角

在企业架构中,为了有效地规划和管理架构的变更与实施,通常会使用不同的视角来描述架构的不同方面。本篇涉及到三个主要视角:项目视角、迁移视角以及实施与迁移视角。 一、实施和迁移视角概览 1.项目视角 元素与关系:关注项目本身…

“网络安全等级保护测评入门:基础概念与重要性“

网络安全等级保护测评(简称“等保测评”)是依据国家网络安全等级保护制度,对信息系统安全等级进行评估和评定的过程。它是提高信息系统安全性、保障信息安全的重要手段。以下是关于等保测评的基础概念与重要性的详细解读: 一、等…

【钱拿不回来了,中介说开源吧】《刚体旋转的四元数模型及捷联惯性导航系统中定向算法》

《刚体旋转的四元数模型及捷联惯性导航系统中定向算法》 1. 摘要 本文深入探讨了四元数在刚体旋转描述中的核心作用以及其在捷联惯性导航系统(SINS)中确定方向的算法。详细阐述了四元数的理论基础、数学性质和实际应用优势,包括与卡丹角和欧…

小红书AI商单变现,单月收入10000+,真猛!

AI相关的话题在这两年来一直很火爆,很多行业也纷纷和AI结合起来, 从而达到更好的变现效果,这也是未来的发展趋势, 有这个工具确实能给我们的工作和生活带来一些便利 之前也拆解过很多类似的玩法, 比如AI古诗词、数…

软件测试之压力测试

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 压力测试 压力测试是一种软件测试,用于验证软件应用程序的稳定性和可靠性。压力测试的目标是在极其沉重的负载条件下测量软件的健壮性和错误处理能力&…

GSLAM——一个通用的SLAM架构和基准

GSLAM: A General SLAM Framework and Benchmark 开源地址 摘要: SLAM技术最近取得了许多成功,并吸引了高科技公司的关注。然而,如何同一现有或新兴算法的界面,一级有效地进行关于速度、稳健性和可移植性的基准测试仍然是问题。本…