当前位置: 首页 > news >正文

使用CIP采集欧姆龙EtherNet/IP从入门到精通

本文将会从以下几个方面介绍

1.CIP是什么

2.EtherNet/IP通信是什么

3.CIP通信报文解析

4.使用CIP常用的方法和功能介绍(UCMM)

5.自己封装了一个类,只要知道标签名称,和数据类型即可读写数据

6.demo展示

1.CIP是什么

        CIP通信是Common Industrial Protocl(CIP)的简称,它是一个点到点的面向对象协议,能够实现工业器件(传感器,执行器)之间的连接,和高等级的控制器之间的连接。目前,有3种网络DeviceNet,ControlNet,EtherNet/IP使用CIP通信协议作为其上层网络协议,由ODVA组织统一管理,以确保其一致性和精确性。

2.EtherNet/IP通信是什么

        EtherNet/IP(Ethernet/Industrial Protocol),是一个工业级的通信网络,用于工业器件间高速的信息交换,这些器件包括简单的IO器件(传感器),还有复杂的控制器(机器人,PLC,焊机,过程控制器)。EtherNet/IP使用CIP(Common Industrial Protocl),其使用EtherNet和TCP/IP技术传送CIP通信包,CIP作为开放的应用层,位于EtherNet和TCP/IP协议之上。

        欧姆龙使用该协议,PLC端只要设置好数据类型和标签名称。上位机端根据数据类型和标签拼接报文即可实现读写。

3.CIP通信报文解析

        这里参考:c#基于TCP/IP、CIP协议的欧姆龙PLC通信 - 非凡AFK - 博客园 (cnblogs.com)

欧姆龙NX系列EtherNet/IP通信 - 知乎 (zhihu.com)  这两篇文章即可。里面说的都很详细

4.使用CIP常用的方法和功能介绍(UCMM)

        本质就是使用TcpClient连接,但是报文需要根据欧姆龙要求格式封装。

        ①首先用TcpClient建立连接

        private void button1_Click(object sender, EventArgs e)//建立socket TCP通讯{client = new TcpClient();//client1 = new UdpClient();client.Connect(IPAddress.Parse("192.168.250.1"), 44818);ns = client.GetStream();if (client.Connected){MessageBox.Show("服务器连接成功");}}

②获取会话句柄,msg400就是获取的会话句柄。无论读写报文的会话句柄都要替换成它

        private void button3_Click(object sender, EventArgs e)//建立会话{if (client.Connected){ byte[] msg6 = new byte[28];//string ch6 = null;ns.Write(msg1, 0, msg1.Length);ns.Read(msg6, 0, msg6.Length);msg400 = msg6.Skip(4).Take(4).ToArray();//跳过4个,保留4个// msg400 = msg400.Reverse().ToArray();//数组高低字节互换位置Buffer.BlockCopy(msg400, 0, msg2, 4, 4);Buffer.BlockCopy(msg400, 0, msg4, 4, 4);Buffer.BlockCopy(msg400, 0, msgReal, 4, 4);Buffer.BlockCopy(msg400, 0, msgint2, 4, 4);string str1 = string.Join("", msg400.Select(b => string.Format("{0:X2} ", b)));//十六进制原义转换成字符串//string str1 = BitConverter.ToString(msg400);//uint PLC_FINS_NODE = System.BitConverter.ToUInt32(msg400, 0);textBox1.Text = str1;CIP_CONNECT = true;}}

③读取这个假设标签为SS,类型为Int16

        byte[] msg2 = new byte[] { 0x6F, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB2, 0x00, 0x08, 0x00, 0x4C, 0x02, 0x91, 0x02, 0x53, 0x53, 0x01, 0x00};//读SS变量private void Run(){(client.Connected&&CIP_CONNECT){Thread.Sleep(1000);//暂停线程1000毫秒,相当于间隔1000毫秒读取数据byte[] msg300 = new byte[2];byte[] msg301 = new byte[2];byte[] msg302 = new byte[2];byte[] msg303 = new byte[2];byte[] msg304 = new byte[2];byte[] msg7 = new byte[70];/*ushort read_channel1 = Convert.ToUInt16(numericUpDown1_read.Value);msg300 = System.BitConverter.GetBytes(read_channel1);//数据转数组msg301 = msg300.Reverse().ToArray();//数组高低字节互换位置Buffer.BlockCopy(msg301, 0, msg2, 29, 2);//字节数组复制*/ns.Write(msg2, 0, msg2.Length);ns.Read(msg7, 0, msg7.Length);//msg303 = msg7.Skip(28).Take(2).ToArray();if (msg7[42] == 0X00){msg304 = msg7.Skip(46).Take(2).ToArray();//跳过46个,保留2个//msg304 = msg304.Reverse().ToArray();short rdi = BitConverter.ToInt16(msg304, 0);//string rds = string.Concat(msg304[0].ToString("X2"), msg304[1].ToString("X2")); //字符串连接//[=int rd = Convert.ToInt16(msg304);textBox3.Text = rdi.ToString(); }}}

④ 写值,假设标签依然是SS

        byte[] msg4 = new byte[] { 0x6F, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB2, 0x00, 0x0C, 0x00, 0x4D, 0x02, 0x91, 0x02, 0x53, 0x53, 0xC3, 0x00, 0x01, 0x00, 0x78, 0x56 };//写入SS变量private void button6_Click(object sender, EventArgs e)//SS变量写数据{byte[] msg200 = new byte[2];byte[] msg201 = new byte[2];byte[] msg202 = new byte[2];byte[] msg203 = new byte[2];byte[] msg204 = new byte[50];byte[] msg205 = new byte[1];byte[] msg300 = new byte[2];if (client.Connected && CIP_CONNECT){ short write_data = Convert.ToInt16(textBox4.Text, 10);//10表示字符串数据为十进制//string wds = write_data.ToString("X4");msg300 = System.BitConverter.GetBytes(write_data);//十进制数转十六进制数组Buffer.BlockCopy(msg300, 0, msg4, 50, 2);ns.Write(msg4, 0, msg4.Length);ns.Read(msg204, 0, msg204.Length);msg205 = msg204.Skip(42).Take(1).ToArray();if (msg205[0] == 0X00){MessageBox.Show("写入成功");}else{MessageBox.Show("写入失败");}}}

⑤断开连接

        private void button2_Click(object sender, EventArgs e)//关闭socket TCP通讯{client.Close();if (!client.Connected){MessageBox.Show("服务器连接关闭");}}

5.自己封装了一个类,只要知道标签名称,和数据类型即可读写数据

因为我觉得封装报文太麻烦了,所以我封装了一个类,在这里你读值时只要传入标签名称即可。写值时你需要传入标签和值即可。把繁琐的报文拼接同一封装。懒得拼接报文的可以直接使用该类

        //读取private void button10_Click(object sender, EventArgs e){var a = pro_EtherNetIP.Read<Int16>("w_int");var a1 = pro_EtherNetIP.Read<float>("w_real");var a2 = pro_EtherNetIP.Read<string>("w_string888");var a3 = pro_EtherNetIP.Read<string>("w_string");var a4 = pro_EtherNetIP.Read<bool>("w_bool");}private void button11_Click(object sender, EventArgs e){var b = pro_EtherNetIP.Write<Int16>("w_int", 11);var b1 = pro_EtherNetIP.Write<float>("w_real", 11.8f);var b2 = pro_EtherNetIP.Write<double>("t_msH", 195.8);//var b3 = pro_EtherNetIP.Write<string>("w_string888", "bn5");//var b4 = pro_EtherNetIP.Write<string>("w_string", "as5");var b5 = pro_EtherNetIP.Write<bool>("w_bool", false);}

6.demo展示

下载链接点击

你也可以直接加我VX:zhu1013443437. 加的时候备注CSDN。有偿 

相关文章:

使用CIP采集欧姆龙EtherNet/IP从入门到精通

本文将会从以下几个方面介绍 1.CIP是什么 2.EtherNet/IP通信是什么 3.CIP通信报文解析 4.使用CIP常用的方法和功能介绍&#xff08;UCMM&#xff09; 5.自己封装了一个类&#xff0c;只要知道标签名称&#xff0c;和数据类型即可读写数据 6.demo展示 1.CIP是什么 CIP通信…...

企业如何高效管理微信里的客户?

对于企业来说&#xff0c;懂得高效管理微信列表的客户是非常重要的一件事&#xff0c;只有把客户管理好了&#xff0c;才能更好地提高客户的满意度和忠诚度&#xff0c;我们的销售业务才能顺利进行。 那么&#xff0c;应该怎样管理才能算是高效管理呢&#xff1f;下面就给大家…...

怎么在windows系统上查看kylinos的md5、sha1、sha256值

背景 当前信创行业正如火如荼进行中,当下载kylinos镜像到windows系统下,如何核对镜像是否有损坏,确保文件不被篡改,需要使用工具计算md5、sha1、sha256、sha512值,并与出库邮件中的md5比对。 QuickHash GUI软件简介 QuickHash GUI是一款开源代码的哈希工具,注意哈希能够…...

Windows中在C#中使用Dapper和Mysql.Data库连接MySQL数据库

Windows中在C#中使用Dapper和Mysql.Data库连接MySQL数据库 在Windows中使用C#连接Mysql数据库比较简单&#xff0c;可以直接使用MySql.Data库&#xff0c;目前最新版本为&#xff1a;8.3.0。 当然也可以结合MySql.Data和Dapper库一起使用&#xff0c;目前Dapper的最新版本为&a…...

大一专科,物联网专业,变态成长偏方!

最近看到一个大一&#xff0c;物联网专业的学生提问&#xff1a; 印象中&#xff0c;物联网专业2011年才有的&#xff0c;正好是我毕业那年。 我大概看过物联网专业要学的内容&#xff0c;总结下来就是&#xff0c;比软件不如计算机&#xff0c;比硬件知识不如电子。 不知道老师…...

MyBatis入门(JDBC规范,MyBatis,连接池,Lombok)【详解】

目录 一、JDBC规范【了解】 1. JDBC介绍 2. JDBC示例 3. JDBC的问题 二、MyBatis入门【重点】 1. Mybatis是什么 2. Mybatis使用步骤 3. Mybatis入门案例 1.创建SpringBoot工程 2.创建Mapper 3.功能测试 三、连接池【了解】 1. 什么是连接池 2. 有哪些数据库连接池…...

Vue3--数据和方法

data 组件的 data 选项是一个函数。Vue 在创建新组件实例的过程中会自动调用此函数。   data选项通常返回一个对象&#xff0c;然后 Vue 会通过响应性系统将其包裹起来&#xff0c;并以 $data 的形式存储在组件实例中。 <!DOCTYPE html> <html lang"en"&g…...

网络编程面试题

一、什么是IP地址 1.IP地址是主机在网路中的唯一标识&#xff0c;&#xff0c;当主机从一个网络切换到另一个网络时&#xff0c;会更改IP地址&#xff0c;同样的IP地址也是路由器进行路由选择的标识 2.IP地址的分类 IPV4&#xff1a;采用4字节无符号整数存储 IPV6&#xff…...

移动端区分点击和长按

为了适配移动端&#xff0c;图片加入touchstart&#xff0c;touchend&#xff0c;并加了 e.preventDefault() 屏蔽默认菜单。 然而突然发现移动端图片的链接无响应了&#xff0c;PC端没问题。 而且功能需要区分点击和长按。 原生js如何判断移动端的tap,dbltap&#xff0c;lo…...

虚拟环境的激活

(此博客仅用于我记录虚拟环境的激活方法) 虚拟环境的激活命令: venv/Scripts/activate 在F:\git repo\Database-Course-Design 这个文件夹中启动命令行 这个文件夹中含有虚拟环境venv 输入命令venv/Scripts/activate&#xff0c;就得到下面的结果: 此时就激活了虚拟环境&…...

宏集案例 | 风电滑动轴承齿轮箱内多点温度采集与处理

前言 风力发电机组中的滑动轴承齿轮箱作为关键的传动装置&#xff0c;承担着将风能转化为电能的重要角色。齿轮箱内多点温度的实时监测可以有效地预防设备故障和性能下降。实时监测齿轮箱内多点温度可以有效地预防设备故障和性能下降。 为了确保风力发电机组的安全稳定运行&a…...

linux 16进制写入

1.简单用法[推荐] echo 001122334455 | xxd -r -ps > test // 6 个字节xxd // xxd 命令用于用二进制或十六进制显示文件的内容 -r // 把xxd的十六进制输出内容转换回原文件的二进制内容 -ps // 以 postscript的连续十六进制转储输出&#xff0c;这也叫做纯十六进…...

代码随想录算法训练营第60天| Leetcode 84.柱状图中最大的矩形

文章目录 Leetcode 84.柱状图中最大的矩形 Leetcode 84.柱状图中最大的矩形 题目链接&#xff1a;Leetcode 84.柱状图中最大的矩形 题目描述&#xff1a; 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。求在该柱状…...

编写一个简单的cmakelist.txt

文章目录 代码main.cpp头文件和子模块CMakeLists.txtsubModule/CMakeLists.txt顶层CMakeLists.txtCMakeList中的内容说明生成跨平台到Visual studio下上一篇提到了cmake的设计目的与作用,这一篇就来手动编写一个基本的cmakelist.txt,并演示一下如何生成不同平台的构建文件。 …...

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的零售柜商品检测软件(Python+PySide6界面+训练代码)

摘要&#xff1a;开发高效的零售柜商品识别系统对于智能零售领域的进步至关重要。本文深入介绍了如何运用深度学习技术开发此类系统&#xff0c;并分享了全套实现代码。系统采用了领先的YOLOv8算法&#xff0c;并与YOLOv7、YOLOv6、YOLOv5进行了性能比较&#xff0c;呈现了诸如…...

数据库的学习

数据库软件&#xff1a; 关系型数据库&#xff1a;Mysql Oracle SqlServer Sqlite 非关系型数据库&#xff1a;Redis NoSQL 1.数组&#xff0c;链表&#xff0c;文件&#xff0c;数据库 数组&#xff0c;链表&#xff1a;内存存放数据的方式&…...

matlab去除图片上的噪声

本问题来自CSDN-问答板块,题主提问。 如何利用matlab去除图片上的噪声? 一、运行效果图 左边是原图,右边是去掉噪音后的图片。 二、中文说明 中值滤波是一种常见的图像处理技术,用于去除图像中的噪声。其原理如下: 1. 滤波器移动:中值滤波器是一个小的窗口,在图像上移…...

C++超详细知识点(五):类的友元函数和友元类

目录 标题&#xff1a; 友元函数和友元类1. 友元函数2. 友元类 标题&#xff1a; 友元函数和友元类 友元函数和友元类是C中的概念&#xff0c;它们允许某些函数或类访问另一个类的私有成员。这样的访问权限超过了通常的私有和保护访问级别。请注意&#xff0c;友元类的使用应该…...

SOC设计:关于reset的细节

有如下几个信号 1、时钟&#xff1a;clk_top 2、总的reset信号&#xff1a;rstn_top 3、scan的reset信号&#xff1a;scan_rstn 4、软件复位信号&#xff1a;rstn_soft_sub 5、scan模式信号&#xff1a;scan_mode 6、reset bypass 信号&#xff1a;scan_rstn_sel 功能&a…...

支小蜜AI校园防欺凌系统可以使用在宿舍吗?

随着人工智能技术的快速发展&#xff0c;AI校园防欺凌系统已成为维护校园安全的重要手段。然而&#xff0c;关于这一系统是否适用于宿舍环境&#xff0c;仍存在一些争议和讨论。本文将探讨AI校园防欺凌系统在宿舍中的适用性&#xff0c;分析其潜在的优势与挑战&#xff0c;并提…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

webpack面试题

面试题&#xff1a;webpack介绍和简单使用 一、webpack&#xff08;模块化打包工具&#xff09;1. webpack是把项目当作一个整体&#xff0c;通过给定的一个主文件&#xff0c;webpack将从这个主文件开始找到你项目当中的所有依赖文件&#xff0c;使用loaders来处理它们&#x…...

leetcode73-矩阵置零

leetcode 73 思路 记录 0 元素的位置&#xff1a;遍历整个矩阵&#xff0c;找出所有值为 0 的元素&#xff0c;并将它们的坐标记录在数组zeroPosition中置零操作&#xff1a;遍历记录的所有 0 元素位置&#xff0c;将每个位置对应的行和列的所有元素置为 0 具体步骤 初始化…...

跨平台商品数据接口的标准化与规范化发展路径:淘宝京东拼多多的最新实践

在电商行业蓬勃发展的当下&#xff0c;多平台运营已成为众多商家的必然选择。然而&#xff0c;不同电商平台在商品数据接口方面存在差异&#xff0c;导致商家在跨平台运营时面临诸多挑战&#xff0c;如数据对接困难、运营效率低下、用户体验不一致等。跨平台商品数据接口的标准…...

【大模型】RankRAG:基于大模型的上下文排序与检索增强生成的统一框架

文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构C.1 指令微调阶段C.2 排名与生成的总和指令微调阶段C.3 RankRAG推理&#xff1a;检索-重排-生成 D 实验设计E 个人总结 A 论文出处 论文题目&#xff1a;RankRAG&#xff1a;Unifying Context Ranking…...