python实现Ethernet/IP协议的客户端(三)

Ethernet/IP是一种工业自动化领域中常用的网络通信协议,它是基于标准以太网技术的应用层协议。作为工业领域的通信协议之一,Ethernet/IP 提供了一种在工业自动化设备之间实现通信和数据交换的标准化方法。python要实现Ethernet/IP的客户端,可以采用pycomm3模块,但不一定是pycomm3,其中原委咋们慢慢聊,本文为第三篇。
 

一、关于CIPDriver模块

1、官方例子

Generic Messaging - pycomm3 1.2.14 documentation

 在官方例子中,出现率最高的方法是 generic_message ,我们再去看看他的API。

2、API

CIPDriver API - pycomm3 1.2.14 documentation

在这个文档中,我们惊讶地发现他的主要方法也只是generic_message,这让人感觉不太可能实现第一篇文章的交互。

3、还是先用吧

明知这个类大概率实现不了,为什么还要继续呢?

我们在实现一个协议时,最起码先了解这个协议吧?在第一篇文章中,我们了解的情况是阅读了一些官方文档,也了解了EDS文件,但没有一个具体的实验。因此,继续是有必要的,至少能了解协议本身。

4、generic_message方法

对于官方例子,我们先结合源码描述简单分析:

(1)源码描述

    def generic_message(
        self,
        service: Union[int, bytes],
        class_code: Union[int, bytes],
        instance: Union[int, bytes],
        attribute: Union[int, bytes] = b"",
        request_data: Any = b"",
        data_type: Optional[Union[Type[DataType], DataType]] = None,
        name: str = "generic",
        connected: bool = True,
        unconnected_send: bool = False,
        route_path: Union[bool, Sequence[CIPSegment], bytes, str] = True,
        **kwargs,
    ) -> Tag:
        """
        Perform a generic CIP message.  Similar to how MSG instructions work in Logix.

        :param service: service code for the request (single byte)
        :param class_code: request object class ID
        :param instance: ID for an instance of the class
                         If set with 0, request class attributes.
        :param attribute: (optional) attribute ID for the service/class/instance
        :param request_data: (optional) any additional data required for the request.
        :param data_type: a ``DataType`` class that will be used to decode the response, None to return just bytes
        :param name:  return ``Tag.tag`` value, arbitrary but can be used for tracking returned Tags
        :param connected: ``True`` if service required a CIP connection (forward open), ``False`` to use UCMM
        :param unconnected_send: (Unconnected Only) wrap service in an UnconnectedSend service
        :param route_path: (Unconnected Only) ``True`` to use current connection route to destination, ``False`` to ignore,
                           Or provide a path string, list of segments to be encoded as a PADDED_EPATH, or
                           an already encoded path.
        :return: a Tag with the result of the request. (Tag.value for writes will be the request_data)
        """

(2)简单分析

官方文档直接给了一个函数,我做了一些引入的补充,即“from pycomm3 import CIPDriver, Services, INT” :

from pycomm3 import CIPDriver, Services, INT

def read_pf525_parameter():
    drive_path = '10.10.10.100/bp/1/enet/192.168.1.55'

    with CIPDriver(drive_path) as drive:
        param = drive.generic_message(
            service=Services.get_attribute_single,
            class_code=b'\x93',
            instance=41,  # Parameter 41 = Accel Time
            attribute=b'\x09',
            data_type=INT,
            connected=False,
            unconnected_send=True,
            route_path=True,
            name='pf525_param'
        )
        print(param)

对于    drive_path = '10.10.10.100/bp/1/enet/192.168.1.55' 这个语句,再结合上次的实验,我猜测EIP设备是10.10.10.100,并且该EIP设备是有一些子模块的,192.168.1.55便是内部的子模块地址。中间的/bp/1/enet则是按照EIP协议规定的路径。

在使用 with 语句创建了一个 CIPDriver 的实例(即自动调用了open()方法),确保在代码块结束时正确关闭连接后,接着调用了generic_message方法发送了一个通用的消息。具体参数如下:

  • service=Services.get_attribute_single: 使用 EtherNet/IP 协议中的 get_attribute_single 服务。
  • class_code=b'\x93': 类别代码,可能是特定设备或对象类型的标识。
  • instance=41: 代表要访问的具体实例,这里是 Parameter 41。
  • attribute=b'\x09': 属性标识,可能代表具体要获取的信息的类型。
  • data_type=INT: 数据类型,这里是整数。
  • connected=False: 表示使用不连接的方式发送消息。
  • unconnected_send=True: 允许未连接发送,可能用于广播或多播。
  • route_path=True: 表示要使用路由路径(如果需要)。
  • name='pf525_param': 为此消息指定了一个名称,这个名称在返回的结果中可以用于标识。

好了,通过上述解释其实还有很多不理解的地方,我们继续实验来进一步了解。

二、继续实验

1、请求看看

修改代码让其请求成功,提示如下:

pf525_param, None, INT, IOI syntax error. A syntax error was detected decoding the Request Path (see extended status) - Extended status out of memory  (04, 00)

表明没有异常,只是服务器没有这些扩展状态,说明我们请求的资源不存在。

from pycomm3 import CIPDriver, Services, INT

def read_pf525_parameter():
    drive_path = '192.168.1.189'

    with CIPDriver(drive_path) as drive:
        param = drive.generic_message(
            service=Services.get_attribute_single,
            class_code=b'\x93',
            instance=41,
            attribute=b'\x09',
            data_type=INT,
            connected=False,
            unconnected_send=True,
            route_path=True,
            name='pf525_param'
        )
        print(param)

read_pf525_parameter()

查看了报文依旧在报路径错误。

我们对比一下正常的请求,我们的请求缺失了请求服务列表这一步,打开路径时是以不连接进行打开的,因此差异很大。

2、怎么办呢

莫慌,问题总会得到解决的,而且现在我们的思路很清晰,即我们的请求有问题,下一步就是不断实验就好。现在我们应该具备一系列的进行实验的素质,这些素质有助于确保实验的成功进行并获得可靠的结果。以下是一些进行实验时应具备的素质:

好奇心: 具备对未知事物的好奇心,愿意去探索和发现新知识。

耐心: 实验过程中可能需要耐心等待结果或进行多次试验,特别是在研究型实验中。

精确性: 具备准确记录实验数据的能力,以确保实验结果的可信度。

逻辑思维: 能够理清实验的步骤和逻辑,分析实验结果并得出结论。

实验设计能力: 能够设计合理的实验方案,考虑到实验的目的、变量和控制措施。

安全意识: 遵守实验室安全规定,正确使用实验设备,确保实验过程中的安全。

团队合作: 在团队中合作顺利,有时实验需要多人协作完成。

问题解决能力: 遇到实验中的问题时能够迅速分析并找到解决方案。

记录与报告: 能够准确地记录实验步骤和结果,并能够撰写清晰的实验报告。

批判性思维: 能够审慎评估实验的方法和结果,对实验中的偏差和误差有清晰的认识。

耐受失败: 实验中可能会遇到失败或意外,具备面对挫折的耐受力。

道德责任感: 遵守科学研究的伦理规范,保护实验对象和参与者的权益。

这些素质有助于建立一个科学、安全、可靠的实验环境,确保实验的有效进行和获得有意义的结果。

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

灸哥问答:软件架构在软件研发中的作用

软件架构在软件开发中扮演着至关重要的角色。我们在软件研发的过程中,类比于建造一座公寓楼,而软件架构就像是盖楼之前的设计图纸,如果没有设计图纸就直接盖楼,可想而知带来的后果是什么。我对软件架构的作用表现总结如下&#xf…

Go语言TCP Socket编程

:::tip 声明 本文源于Go语言TCP Socket编程 | Tony Bai,可能会有稍微的修改。 ::: 文章目录 一、模型二、TCP连接的建立对于客户端而言,连接的建立会遇到如下几种情形:1、网络不可达或对方服务未启动2、对方服务的listen backlog满3、网络延…

【重磅新品】小眼睛科技推出紫光同创盘古系列FPGA开发板套件,盘古200K开发板,紫光同创PG2L200H,Logos2系列

FPGA,即现场可编程门阵列,作为可重构电路芯片,已经成为行业“万能芯片”,在通信系统、数字信息处理、视频图像处理、高速接口设计等方面都有不俗的表现。近几年,随着国家战略支持和产业发展,国产FPGA迎来迅…

PyTorch官网demo解读——第一个神经网络(4)

上一篇:PyTorch官网demo解读——第一个神经网络(3)-CSDN博客 上一篇我们聊了手写数字识别神经网络的损失函数和梯度下降算法,这一篇我们来聊聊激活函数。 大佬说激活函数的作用是让神经网络产生非线性,类似人脑神经元…

Python算法例33 删除数字

1. 问题描述 给出一个字符串A,表示一个n位的正整数,删除其中k位数字,使得剩余的数字仍然按照原来的顺序排列产生一个新的正整数,本例将找到删除k个数字之后的最小正整数,其中n≤240,k≤n。 2. 问题示例 …

HarmonyOS4.0系统性深入开发10卡片事件能力说明

卡片事件能力说明 ArkTS卡片中提供了postCardAction()接口用于卡片内部和提供方应用间的交互,当前支持router、message和call三种类型的事件,仅在卡片中可以调用。 接口定义:postCardAction(component: Object, action: Object): void 接口…

性能优化(CPU优化技术)-ARM Neon详细介绍

本文主要介绍ARM Neon技术,包括SIMD技术、SIMT、ARM Neon的指令、寄存器、意图为读者提供对ARM Neon的一个整体理解。 🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:高性能(HPC&#xff09…

IRQ Handler 的使用——以USART串口接收中断分别在标准库与HAL库版本下的举例

前言: 1.中断系统及EXTI外部中断知识点见我的博文: 9.中断系统、EXTI外部中断_eirq-CSDN博客文章浏览阅读301次,点赞7次,收藏6次。EXTI(Extern Interrupt)外部中断EXTI可以监测指定GPIO口的电平信号&…

关于镜头景深的计算

1、问题背景 在调试项目的过程中,我们需要知道所搭配镜头的对焦距离、景深范围是多少, 这属于基本的项目信息,很多时候往往就因为忽略了这些小的信息,而导致一系列问题。 比如之前调试的一款化妆镜的设备,客户反馈了…

bootstrap5开发房地产代理公司Hamilton前端页面

一、需求分析 房地产代理网站是指专门为房地产行业提供服务的在线平台。这些网站的主要功能是连接房地产中介机构、房产开发商和潜在的买家或租户,以促成买卖或租赁房产的交易。以下是一些常见的房地产代理网站的功能: 房源发布:房地产代理网…

git解决冲突场景

文章目录 git解决冲突场景 git解决冲突场景 假设我们在公司开发了一个功能修改了一个文件 我们现在模拟修改文件之后提交一个版本到本地,但是不上传到远程仓库 假设我们现在回到家开发代码,需要拉去最新的代码 提示已经更新。根本没有最新的代码改动&am…

Android Studio 如何申请免费的api接口之聚合数据--建议收藏备用!

目录 前言 一、申请接口 二、使用接口 三、总结 四、更多资源 前言 在开发应用程序过程中,获取免费的 API 接口和数据源是非常重要的。它们可以为你的应用程序提供各种功能和数据,使其更加实用和丰富。本文将介绍如何申请免费的 API 接口以及一些建…

【图像拼接】源码精读:Seam-guided local alignment and stitching for large parallax images

第一次来请先看这篇文章:【图像拼接(Image Stitching)】关于【图像拼接论文源码精读】专栏的相关说明,包含专栏内文章结构说明、源码阅读顺序、培养代码能力、如何创新等(不定期更新) 【图像拼接论文源码精…

Vue3全局属性app.config.globalProperties

文章目录 一、概念二、实践2.1、定义2.2、使用 三、最后 一、概念 一个用于注册能够被应用内所有组件实例访问到的全局属性的对象。点击【前往】访问官网 二、实践 2.1、定义 在main.ts文件中设置app.config.globalPropertie import {createApp} from vue import ElementPl…

BLP模型

本篇文章是调研了许多资料后对 BLP 模型的一个总结 首发公号:Rand_cs MLS,Multi-level Security,主要关心的是数据机密性 D. Elliott Bell 和 Leonard J. LaPadula 在 1996 年提出了基本的 BLP 模型,主要有两个性质:…

【Spring实战】16 Profile

文章目录 1. 定义2. 使用2.1 定义 Profile2.2 激活 Profile 3. 演示3.1 properties文件3.2 打印日志3.3 启动服务&验证3.4 修改 active3.5 重启服务&验证 4. 应用场景4.1 数据库配置4.2 日志配置 5. 代码详细总结 Spring 框架提供了一种强大的机制,允许在不…

Github 2024-01-01 开源项目月报 Top20

根据Github Trendings的统计,本月(2024-01-01统计)共有20个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目5TypeScript项目3JavaScript项目3非开发语言项目2Java项目2HTML项目2Jupyter Notebook项目2PHP项目…

Linux系统驱动要如何学习

1.你将获得: 快速上手 Linux 操作系统; 掌握Linux 内核工作原理; 掌握Linux 内核调试手段; 掌握复杂驱动:USB、PCIE、V4L2等 这门课程旨在为你打开Linux内核驱动的大门,让你在探索Linux内核的旅程中获得前…

【STM32F103】SysTick系统定时器延时函数

SysTick SysTick是Cortex-M3内核中的一个外设,内嵌在NVIC中,叫系统定时器。 当处理器在调试期间被喊停时,SysTick也将暂停运作。 一共有四个寄存器,不过我们通常用前三个,不需要校准。下图出自《STM32F10xxx Cortex…

【算法提升—力扣每日一刷】五日总结【12/25--12/29】

文章目录 LeetCode每五日一总结【12/25--12/29】2023/12/25今日数据结构:双锁实现阻塞队列 2023/12/26每日力扣:[215. 数组中的第K个最大元素(堆实现)](https://leetcode.cn/problems/kth-largest-element-in-an-array/) 2023/12/…