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 classIf 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, oran 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, INTdef 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 Timeattribute=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, INTdef 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.hqwc.cn/news/314773.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 13 - Media框架(29)- MediaCodec(四)

上一节我们了解了如何通过 onInputBufferAvailable 和 getInputBuffer 获取到 input buffer index,接下来我们一起学习上层如何拿到buffer并且向下写数据的。 1、获取 input Buffer 获取 MediaCodec 中的 buffer 有两种方式,一种是调用 getInputBuffers…

JavaWeb——前端之HTMLCSS

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

JMeter之测试WebService接口

JMeter之测试WebService接口 1 背景2 目的3 介绍4 具体操作4.1 soapUI调用4.2 JMeter工具调用4.3 操作步骤流程4.3 重点 1 背景 WebService应用的范围是非常广,任何需要跨平台、跨系统进行数据交换和功能调用的场景都可以用此来实现,在实际的工作中也常常…

C#上位机与欧姆龙PLC的通信08----开发自己的通讯库读写数据

1、介绍 前面已经完成了7项工作: C#上位机与欧姆龙PLC的通信01----项目背景-CSDN博客 C#上位机与欧姆龙PLC的通信02----搭建仿真环境-CSDN博客 C#上位机与欧姆龙PLC的通信03----创建项目工程-CSDN博客 C#上位机与欧姆龙PLC的通信04---- 欧姆龙plc的存储区 C#上…

如何用 100 行 Shell 脚本实现一个 Docker?

本文主要介绍使用 shell 实现一个简易的 Docker。 一、目的 在初接触Docker的时候,我们必须要了解的几个概念就是Cgroup、Namespace、RootFs,如果本身对虚拟化的发展没有深入的了解,那么很难对这几个概念有深入的理解。 本文的目的就是通过…

Pix2Pix如何工作?

一、说明 在本指南中,我们将重点介绍 Pix2Pix [1],它是用于配对图像翻译的著名且成功的深度学习模型之一。在地理空间科学中,这种方法可以帮助传统上不可能的广泛应用,在这些应用中,我们可能希望从一个图像域转到另一个…

大创项目推荐 深度学习乳腺癌分类

文章目录 1 前言2 前言3 数据集3.1 良性样本3.2 病变样本 4 开发环境5 代码实现5.1 实现流程5.2 部分代码实现5.2.1 导入库5.2.2 图像加载5.2.3 标记5.2.4 分组5.2.5 构建模型训练 6 分析指标6.1 精度,召回率和F1度量6.2 混淆矩阵 7 结果和结论8 最后 1 前言 &…

Cypress安装与使用教程(3)—— 软测大玩家

😏作者简介:博主是一位测试管理者,同时也是一名对外企业兼职讲师。 📡主页地址:【Austin_zhai】 🙆目的与景愿:旨在于能帮助更多的测试行业人员提升软硬技能,分享行业相关最新信息。…

nest框架的bull队列的基本使用

前言 nestjs/bull是一个用于处理队列的Nest.js模块。它基于Bull库,提供了在Nest框架中使用队列的功能,这个模块要跟redis联合起来使用 1.下载队列模块: npm install --save nestjs/bull bull redis 项目结构: 2. 在模块中导入B…

深度学习|5.2 偏差和方差

偏差和方差 Bias(偏差):偏差是指对样本点的估计值和实际值的偏离程度。偏差越大,样本点越不符合实际值。偏差衡量单个数据点的偏离程度,如下图的第二行。 Variance(方差):方差能代表…

CCNP课程实验-03-Route_Path_Control_CFG

目录 实验条件网络拓朴需求 基础配置需求实现1.A---F所有区用Loopback模拟,地址格式为:XX.XX.XX.XX/32,其中X为路由器编号。根据拓扑宣告进对应协议。A1和A2区为特例,A1:55.55.55.0/24,A2:55.55…

ES6之解构赋值详解

✨ 专栏介绍 在现代Web开发中,JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性,还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言,JavaScript具有广泛的应用场景&#x…