浅谈 Ethernet/IP 协议

前言

笔者独立完成过 Ethernet/IP 协议主站(Scanner)和从站(Adapter)的开发。且开发的从站(Adapter)通过了 ODVA 官方的 Conformance Test。本文档记录笔者对于 Etherenet/IP 协议的理解。

什么是 Ethernet/IP 协议

Ethernet/IP(以太网工业协议)是一种基于以太网的工业通信协议,主要用于工业自动化和控制系统中。它由ODVA(Open DeviceNet Vendors Association)开发,并基于标准的以太网技术,结合了CIP(Common Industrial Protocol)协议,支持实时控制和信息交换。

该协议一般用于工业生产场景,用于不同的工业设备之间的通信。 例如: 根据产线要求,一个PLC连接多个机器人,以实现产线的整体启停等。 部分焊机设备也使用该协议用于焊机的控制, 例如:麦格米特焊接电源。

目前支持该协议的厂家有: 汇川,欧姆龙, Rockwell,codesys,三菱,纳博特等。

Ethernet/IP协议内容

具体的协议规范加入ODVA的会员获取,由于版权问题,这里无法提供具体的协议细节。这里讲述一下笔者所理解的 Ethernet/IP 协议。

这个协议可以简单理解为 TCP/IP + CIP 协议。

Ethernet/IP协议基于标准以太网, 它在 TCP 和 UDP 的基础上, 添加应用层协议 CIP 。

应用层协议CIP规定了Ethernet/IP从站设备的四个部分: 对象模型(Object Model),服务(Services),消息路由(Message Routing),连接管理(Connection Management).

其中最关键的是对象模型.

CIP 中的每个设备都是由多个对象(Objects)组成,每个对象都有以下属性:

Class(类): 定义对象的类型,例如 Identity Object、Connection Object 等。
Instance(实例): 类的具体实现,表示实际的设备组件。
Attributes(属性): 描述对象的状态或配置参数。
Services(服务): 提供对对象的操作(如读写、配置等)。

Ethernet/IP的消息主要有两种, 显式消息(ExplicitMessage)和 隐式消息(ImplicitMessage)。

所有的通信都是由主站发起,从站响应的。从站无法主动发起通信。 

显式消息使用 TCP 进行传输, 端口一般是44818, 通信模式是请求响应模式.  主站向从站发送消息, 从站回应主站的消息. 例如主站向从站发送显示消息.  针对Class 1(Identity),的 Instance 1的Attributes 1 Vendor ID (供应商ID)执行 Services 0x0E Get_Attribute_Single(获取单个属性) 操作, 从站在收到该信息后将自己的供应商ID返回给主站. 这就是一次完整的显式消息.

隐式消息(有些厂商也叫做IO消息)使用 UDP进行传输, 端口一般是 2222. 通信的模式是连接式的. 首先主站通过显式消息向从站发起连接请求. 主要是针对 Class 6 (Connection Manager)的 Instance 1 执行 Services 0x54 Forward_Open, 主站发送连接请求时会附带连接参数等信息.从站在收到这些 Forward_Open 之后, 会根据自身的状态判断是否可以建立连接, 如果可以会通过显式消息返回给主站连接成功的信息. 随后主站和从站会按照连接参数中约定的通信周期, 周期性通过UDP的2222端口向对方发送数据. 

Ethernet/IP的性能

Ethernet/IP总线的实时性是通过设置消息的 Qos 来实现的. 市面上常见的Ethernet/IP设备的实时性大部分在 5-10ms. 相比起 EhterCAT 等电机控制协议的1ms通信周期, 这个实时性还是较差的. 所以Ethernet/IP协议只能用作过程控制, 无法用于运动控制.

 Ethernet/IP协议的使用方法

在工业场景中, 很少有使用显式消息的情况, 大部分情况都是主站和从站间通过隐式消息通信 (部分厂家把这个叫做 IO 连接). 这里介绍较为通用的主站连接从站的方法.

对于任何一个 Ethernet/IP 从站设备, 都会配套有一份 eds 文件(设备描述文件). 该文件记录了 从站设备 中所实现的CIP对象模型中的类的信息, 以及进行IO连接时所需参数信息. 

首先将从站的 eds 文件导入主站, 然后主站通过扫描网络中从站的方式(或者手动输入的方式)获取从站的IP地址信息.

随后正常启动主站即可建立 Ethernet/IP 网络连接.

不同的主站厂商提供的导入eds文件和扫描从站的方式不一样, 请以主站厂商的用户手册为准.

Ethernet/IP协议的实现

Ethernet/IP的主站和从站都有开源的实现.

从站 OpENer : GitHub - EIPStackGroup/OpENer: OpENer is an EtherNet/IP stack for I/O adapter devices. It supports multiple I/O and explicit connections and includes objects and services for making EtherNet/IP-compliant products as defined in the ODVA specification.

主站 EIPScanner : GitHub - nimbuscontrols/EIPScanner: Free implementation of EtherNet/IP in C++

### 回答1: 问题描述: 在使用Spark SQL操作Hive时,出现了报错,如下所示: ``` Exception in thread "main" java.lang.NoSuchMethodError: org.apache.hadoop.hive.ql.exec.Utilities.clearWorkMap()V at org.apache.spark.sql.hive.client.ClientWrapper.<init>(ClientWrapper.scala:204) at org.apache.spark.sql.hive.client.IsolatedClientLoader.createClient(IsolatedClientLoader.scala:271) at org.apache.spark.sql.hive.HiveUtils$.newClientForMetadata(HiveUtils.scala:362) at org.apache.spark.sql.hive.HiveUtils$.newClientForMetadata(HiveUtils.scala:266) at org.apache.spark.sql.hive.HiveSharedState.metadataHive$lzycompute(HiveSharedState.scala:39) at org.apache.spark.sql.hive.HiveSharedState.metadataHive(HiveSharedState.scala:38) at org.apache.spark.sql.hive.HiveSharedState.externalCatalog$lzycompute(HiveSharedState.scala:46) at org.apache.spark.sql.hive.HiveSharedState.externalCatalog(HiveSharedState.scala:45) at org.apache.spark.sql.hive.HiveSessionState.catalog$lzycompute(HiveSessionState.scala:50) at org.apache.spark.sql.hive.HiveSessionState.catalog(HiveSessionState.scala:48) at org.apache.spark.sql.hive.HiveSessionState$$anon$1.<init>(HiveSessionState.scala:63) at org.apache.spark.sql.hive.HiveSessionState.analyzer$lzycompute(HiveSessionState.scala:63) at org.apache.spark.sql.hive.HiveSessionState.analyzer(HiveSessionState.scala:62) at org.apache.spark.sql.execution.QueryExecution.assertAnalyzed(QueryExecution.scala:49) at org.apache.spark.sql.Dataset$.ofRows(Dataset.scala:64) at org.apache.spark.sql.SparkSession.sql(SparkSession.scala:582) ``` 解决方法: 该问题是由于Hive版本与Spark版本不兼容导致的。解决方法如下: 1. 确认Hive版本与Spark版本是否兼容,可以在Spark官网查看版本兼容性。 2. 如果版本不兼容,可以升级或降级Hive版本,或者升级或降级Spark版本。 3. 如果版本兼容,可以尝试重新启动Spark和Hive服务,或者重新编译Spark和Hive。 4. 如果以上方法都无法解决问题,可以尝试使用其他的SQL操作Hive的工具,如Beeline等。 总之,要保证Spark和Hive版本兼容,并且正确配置Spark和Hive的环境,才能避免出现该问题。 ### 回答2: 在使用Spark-SQL操作Hive时,常常会遇到一些错误。其中一些常见的错误可能包括: 1. ClassNotFoundException: org.apache.hadoop.hive.ql.metadata.HiveException 这个错误通常表示你的 Spark 集群无法找到 Hive 函数库。可能的解决方案是确认你是否正确安装 Hive 或者使用了正确配置的 Spark 路径: - 如果你没有安装 Hive,你需要从 Hive 下载页面下载Hive 安装。成功安装后,需要将 $HIVE_HOME/lib/hive-exec.jar 添加到 Spark 的 classpath 中(例如通过 spark.driver.extraClassPath 和 spark.executor.extraClassPath 参数来添加)。 - 如果你安装了 Hive,但是仍然出现此错误,你需要检查你的 Spark 是否在使用正确的类路径。可能需要设置 PATH 或者 SPARK_DIST_CLASSPATH 等环境变量。 2. org.apache.spark.SparkException: Exception thrown in awaitResult 如果出现这个错误,通常说明 Spark-SQL 查询需要更多的内存或者计算能力。可能需要调整 Spark-SQL 相关的配置: - 设置 Spark 的执行器内存和执行器核心(例如通过 spark.executor.memory 和 spark.executor.cores 这两个参数),以确保足够的计算资源; - 增加 Spark-SQL 相关的内存限制(例如通过设置 spark.sql.shuffle.partitions、spark.sql.autoBroadcastJoinThreshold、spark.driver.memory 等参数); - 减小查询数据量等其他引起内存不足的原因。 3. Command failed: java.io.IOException: Cannot run program "hadoop" 如果出现这个错误,可能是由于缺少 Hadoop CLI 或者 Hadoop 开发包(Hadoop SDK)。 - 确认你已经安装了 Hadoop CLI 和 Hadoop SDK - 确认 Spark 的 Hadoop 配置和你的集群匹配。具体来说,你需要确保环境变量 HADOOP_HOME 或者 HADOOP_CONF_DIR 指向正确的路径,或者在 Spark 集群初始化时正确设置好 Hadoop 配置。 总之,遇到 Spark-SQL 操作 Hive 中的错误时,首先需要明确错误的原因,然后根据具体情况采用相应的解决方案。常见的解决方案包括: - 确认 Hive 安装及环境变量设置是否正确; - 调整 Spark-SQL 相关参数以适应查询需求; - 确保 Hadoop CLI 及 Hadoop SDK 是否已正确安装。 ### 回答3: 在使用Spark-SQL操作Hive时,可能会遇到一些常见的报错,以下是其中一些问题和可能的解决方案。 1. hive文件丢失或权限不足 有时候,您在使用Spark-SQL操作Hive时,可能会遇到hive文件丢失或无法访问的权限问题。这可能是由于文件系统权限或文件本身的原因导致的。为了解决这个问题,您应该确保获取足够的权限来访问hive文件,并且检查您的文件系统是否正确。 2. classnotfoundexception:HiveCli 当您使用Spark-SQL操作Hive时,您可能会遇到一个类找不到的错误-"classnotfoundexception:HiveCli"。 这是因为hive-jdbc驱动程序文件缺失或未正确设置驱动程序路径所导致的。Solution是安装hive-jdbc驱动程序,并将其正确设置为Spark应用程序的驱动程序路径。 3. NoClassDefFoundError: org/apache/hive/service/cli/thrift/ThriftCLIService 这个错误的原因是由于您的Spark版本与Hive版本不适配,具体来说是Spark版本过高,导致Hive使用的jar包不兼容。解决方法是降低Spark版本或使用Spark程序库的API时使用其兼容的Hive版本。 4. MetaException(message: NoSuchObjectException:database not found) 如果您正在尝试使用Spark-SQL查询Hive数据库,并且收到此错误消息,则表示您正在尝试访问不存在的数据库。 解决方法是创建一个名为该数据库的数据库或检查查询中是否存在语法错误。 5. Spark-SQL执行查询失败 Spark-SQL执行查询失败往往是由于应用程序逻辑或数据源的不足所致。解决方法包括检查您的查询语句是否正确设置,处理空值和异常情况,以及监视应用程序和集群资源以提高性能。 为了避免上述报错,您应该确保在使用Spark-SQL操作Hive之前做好准备工作,包括检查应用程序和数据源的兼容性,设置正确的驱动程序路径,并提供足够的资源来处理您的查询。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值