使用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。有偿 

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

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

相关文章

CSS:过渡动画 (Transition)与关键帧动画(Keyfram)

一、过渡动画 (Transition) 1.简单介绍 Transition能为样式的变化提供过渡效果&#xff0c;例如在下面的代码中&#xff1a; .main {width: 300px;height: 100px;background-color: #d26f6f;}.main:hover {width: 300px;height: 200px;background-color: #5e3e3e;transition:…

关于如何重燃学习的激情

3月1日是我回学校的第一天。经历了长达8个月在家的昏暗时刻&#xff0c;我这10天的感觉和在家的感觉发生了翻天覆地的变化&#xff0c;最明显的莫过于学习状态的改变。 倒不是说在家学的不好&#xff0c;而是说在学校&#xff0c;我对学习的整体感觉&#xff0c;以及专注程度&…

警惕Memcached协议滥用!网络攻击愈演愈烈,如何做好服务器防御?

近期&#xff0c;网络安全领域迎来了一场新的挑战。Memcached协议&#xff0c;这个原本用于提升数据库读取性能的开源内存缓存系统&#xff0c;近期被恶意攻击者所滥用&#xff0c;进行大规模分布式拒绝服务&#xff08;DDoS&#xff09;放大攻击。全球多家公司服务器受到波及&…

2024年腾讯云优惠券领取入口整理汇总

腾讯云作为国内领先的云服务提供商&#xff0c;一直以其稳定、高效、安全的服务赢得了广大用户的信赖。为了回馈广大用户&#xff0c;腾讯云经常会推出各种优惠活动&#xff0c;其中优惠券就是最为常见和受欢迎的一种。 一、腾讯云优惠券领取入口 渠道一&#xff1a;腾讯云官网…

【云呐】固定资产管理系统处理哪些业务

固定资产管理是企业经营全过程中非常重要的任务。涉及到公司的核心资产&#xff0c;包括土地、建筑、设备、车辆等。许多企业选择固定资产管理系统&#xff0c;以确保这些资产的高效管理和合理使用。所以&#xff0c;固定资产管理系统解决了哪些业务&#xff1f;步骤是什么&…

资深老鸟,自动化测试分层模型与落地总结,“我“该如何提升?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、自动化测试的分…

可视化场景(4):财务场景,公司经营的晴雨表。

在财务场景中&#xff0c;可视化大屏具有以下8个应用价值&#xff1a; 销售和收入分析 可视化大屏可以展示销售额、收入来源、销售渠道等数据&#xff0c;帮助财务团队分析销售趋势和收入结构&#xff0c;发现潜在的增长机会和问题。 成本和费用管理 可视化大屏可以显示成本…

超越文本:对话式人工智能如何理解上下文

智能对话助手&#xff0c;让沟通无障碍 在当今的数字时代&#xff0c;对话式人工智能已经成为我们日常互动中不可或缺的一部分&#xff0c;从客户服务机器人到 Siri 和 Google Assistant 等个人助理。 这些系统从简单的基于文本的响应到理解上下文的演变是人工智能的重大飞跃。…

onecloud刷CasaOS系统后如何安装内网穿透实现公网访问本地文件

文章目录 1. CasaOS系统介绍2. 内网穿透安装3. 创建远程连接公网地址4. 创建固定公网地址远程访问 2月底&#xff0c;玩客云APP正式停止运营&#xff0c;不再提供上传、云添加功能。3月初&#xff0c;有用户进行了测试&#xff0c;局域网内的各种服务还能继续使用&#xff0c;但…

BugKu刷题日记(web)一

文章目录 lfi题目页面恶意构造解题思路 Whois题目页面恶意构造解题思路 lfi 来源&#xff1a;https://ctf.bugku.com/challenges/detail/id/429.html 漏洞类型&#xff1a;文件包含漏洞 同类型BugKu&#xff1a;baby ifi、baby ifi 2 题目页面 恶意构造 http://example.com/…

解锁基于LLMS的咒语:通过上下文学习重新思考对齐

一、写作动机&#xff1a; 最近的一项研究&#xff0c;LIMA&#xff0c;表明仅使用1K个示例进行SFT也可以实现显著的对齐性能&#xff0c;这表明对齐微调的效果可能是“表面的”。&#xff08;知识和推理能力来源于预训练&#xff0c;而不是必须通过对齐微调获得的。&#xff…

带大家做一个,易上手的家常炒紫甘蓝

这里 拿了半个紫甘蓝 半个就够炒一盘子 按 片 切成 片条 因为 你切开就会发现 里面很多地方会变成一条一条的 切小一点 因为紫甘蓝相对其他蔬菜 会硬一些 切大了 不好咬 然后过清水洗干净 两瓣蒜 切片 然后 起锅烧油 下入三个干辣椒 炒一小会儿 然后 下入 甘蓝翻炒 翻炒几…