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

news2024/11/26 21:25:23

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、怎么办呢

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

 

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

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

相关文章

Spring Cloud Gateway + Nacos 灰度发布

前言 本文将会使用 SpringCloud Gateway 网关组件配合 Nacos 实现灰度发布&#xff08;金丝雀发布&#xff09; 环境搭建 创建子模块服务提供者 provider&#xff0c;网关模块 gateway 父项目 pom.xml 配置 <?xml version"1.0" encoding"UTF-8"?…

数据结构OJ实验9-图存储结构和遍历

A. 图综合练习--构建邻接表 题目描述 已知一有向图&#xff0c;构建该图对应的邻接表。 邻接表包含数组和单链表两种数据结构&#xff0c;其中每个数组元素也是单链表的头结点&#xff0c;数组元素包含两个属性&#xff0c;属性一是顶点编号info&#xff0c;属性二是指针域n…

数据结构期末复习(fengkao课堂)

学习数据结构时&#xff0c;以下建议可能对您有所帮助&#xff1a; 理解基本概念&#xff1a;首先&#xff0c;确保您理解数据结构的基本概念&#xff0c;例如数组、链表、栈、队列、树、图等。了解它们的定义、特点和基本操作。 学习时间复杂度和空间复杂度&#xff1a;了解如…

【LeetCode:34. 在排序数组中查找元素的第一个和最后一个位置 | 二分】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

simulink代码生成(八)——应用串口输入的16进制数

1、串口输入的是16进制数&#xff0c;如何将其应用到算法中&#xff1f; 串口输入的数据是16进制数&#xff1b;要解决这个问题必须要理解matlab的数据类型&#xff1b;数据类型一般用来标明数据的系列参数&#xff0c;包含有精度、动态范围、性能和存储的资源。模型会默认使…

你好2024!

大家好&#xff0c;我是小悟 2024年1月1日&#xff0c;新年的第一天&#xff0c;阳光明媚&#xff0c;空气中弥漫着希望和新的开始的气息。在这个特别的日子里&#xff0c;大家纷纷走出家门&#xff0c;迎接新年的到来。 街道上&#xff0c;熙熙攘攘的人群中&#xff0c;有孩…

开放原子训练营(第四季)TobudOS——TobudOS内核移植(keil版)

前言 12月份参加了开放原第四季线下活动&#xff0c;觉得很有意义。通过这篇博文&#xff0c;记录一下这次活动进行的移植TobudOS内核的过程&#xff0c;下面就让我们开始吧。 开发板介绍 本次使用的开发板型号为STM32H750&#xff0c;当然了&#xff0c;其他型号的开发版也…

Django 实现Web便签

效果图 会用到的知识 目录结构与URL路由注册request与response对象模板基础与模板继承ORM查询后台管理 实现步骤 1. terminal 输入 django-admin startapp the_10回车 2. 注册&#xff0c; 在 tutorial子文件夹settings.py INSTALLED_APPS 中括号添加 "the_10" IN…

C++日期类的实现

前言&#xff1a;在类和对象比较熟悉的情况下&#xff0c;我们我们就可以开始制作日期表了&#xff0c;实现日期类所包含的知识点有构造函数&#xff0c;析构函数&#xff0c;函数重载&#xff0c;拷贝构造函数&#xff0c;运算符重载&#xff0c;const成员函数 1.日期类的加减…

pyqt5用qtdesign设计页面时,去掉页面的空白界面、边框和标题栏

前言 Windows默认的标题栏有时候自己觉得不太美观&#xff0c;就想自己设计一个&#xff0c;然后把默认的去掉&#xff0c;并且把长方形的边框和多余的空表界面去掉&#xff0c;就是下图中圈出来的区域&#xff1a; 去掉之后的效果如图&#xff1a; 这样我们就可以自定义窗…

SpringBoot + Vue 抖音全平台项目

简介 本项目是一个短视频平台&#xff0c;拥有热度排行榜&#xff0c;热门视频&#xff0c;兴趣推送&#xff0c;关注推送&#xff0c;内容审核等功能。 源码下载 网盘 (访问密码: 8418) 登录/注册 首页 创作中心 架构设计 上传视频业务流程 视频推送流程 1.用户订阅分类后…

OSPFv2 LSA类型

OSPFv2需要了解的6种LSA&#xff0c;分别是&#xff1a;1类LSA、2类LSA、3类LSA、4类LSA、5类LSA、7类LSA。 我们先了解一下LSA的组成&#xff0c;LSA由LSA头部和LSA内容组成&#xff0c;其中LSA头部是每一类LSA都相同的&#xff0c;有Type&#xff08;LSA的类型&#xff09;、…

iMazing 2 .17.16最新官方中文版免费下载安装激活

iMazing 2 .17.16最新版是一款帮助用户管理IOS手机的应用程序&#xff0c;iMazing2最新版能力远超iTunes提供的终极的iOS设备管理器。IMazing与你的iOS设备(iPhone、 iPad或iPod)相连&#xff0c;使用起来非常的方便。作为苹果指定的iOS设备同步工具。 mazing什么意思 iMazing…

软件推荐:MobaXterm

介绍 MobaXterm 是远程计算的终极工具箱&#xff0c;它提供了几乎所有重要的远程网络工具&#xff0c;SSH、RDP、FTP、VNC&#xff0c;只要你能想到的&#xff0c;都可以在MobaXterm中找到。除了海量协议外&#xff0c;MobaXterm 还支持安装额外的插件来扩展其功能。 软件官网…

深度学习核心技术与实践之自然语言处理篇

非书中全部内容&#xff0c;只是写了些自认为有收获的部分。 自然语言处理简介 NLP的难点 &#xff08;1&#xff09;语言有很多复杂的情况&#xff0c;比如歧义、省略、指代、重复、更正、倒序、反语等 &#xff08;2&#xff09;歧义至少有如下几种&#xff1a; …

Linux学习第49天:Linux块设备驱动实验(一):Linux三大驱动之一

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 本章学习Linux三大驱动之一的块设备驱动&#xff0c;主要应用场景为存储设备。 本章的思维导图如下&#xff1a; 一、什么是块设备 块设备---存储设备 以块为单位…

经典目标检测YOLO系列(一)复现YOLOV1(3)正样本的匹配及损失函数的实现

经典目标检测YOLO系列(一)复现YOLOV1(3)正样本的匹配及损失函数的实现 之前&#xff0c;我们依据《YOLO目标检测》(ISBN:9787115627094)一书&#xff0c;提出了新的YOLOV1架构&#xff0c;并解决前向推理过程中的两个问题&#xff0c;继续按照此书进行YOLOV1的复现。 经典目标…

数据结构OJ实验8-赫夫曼树编码及应用

A. DS二叉树--赫夫曼树的构建与编码 题目描述 给定n个权值&#xff0c;根据这些权值构造huffman树&#xff0c;并进行huffman编码 大家参考课本算法6.12为主&#xff0c;注意数组访问是从位置1开始 要求&#xff1a;赫夫曼的构建中&#xff0c;默认左孩子权值不大于右孩子权…

webRTC实时通信demo

参考文档&#xff1a; https://www.jianshu.com/p/f439ce5cc0be https://www.w3cschool.cn/socket demo流程示意图&#xff08;用户A向用户B推送视频&#xff09;&#xff1a; #mermaid-svg-0KZaDQ5DBl28zjmZ {font-family:"trebuchet ms",verdana,arial,sans-seri…

JavaWeb——前端之HTMLCSS

学习视频链接&#xff1a;https://www.bilibili.com/video/BV1m84y1w7Tb/?spm_id_from333.999.0.0 一、Web开发 1. 概述 能通过浏览器访问的网站 2. Web网站的开发模式——主流是前后端分离 二、前端Web开发 1. 初识 前端编写的代码通过浏览器进行解析和渲染得到我们看到…