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

这篇具有很好参考价值的文章主要介绍了使用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展示

通用工业协议(ethernet/ip) 例程,tcp/ip,网络,网络协议,c#,CIP,EIP

通用工业协议(ethernet/ip) 例程,tcp/ip,网络,网络协议,c#,CIP,EIP

下载链接点击

你也可以直接加我VX:zhu1013443437. 加的时候备注CSDN。有偿 文章来源地址https://www.toymoban.com/news/detail-844586.html

到了这里,关于使用CIP采集欧姆龙EtherNet/IP从入门到精通的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ​Profinet转EtherNET/IP从站连接欧姆龙plc与西门子200smart通讯的配置方法​

    本案例是200smart plc与欧姆龙plc进行通讯的方法,远创智控YC-PNM-EIP网关可以读写全系列西门子 PLC 数据。一般不需要 PLC 里做特殊的设置。只需要把 PLC 的变量地址配置到网关中,网关就可以读取指定地址的数据或者写数据到指定的地址。 PLC 通过网线连接到网关,设备 PLC 和网

    2024年02月08日
    浏览(31)
  • 晨控CK-FR03-EIP读卡器与欧姆龙NX/NJ系列EtherNet/IP通讯手册

    晨控CK-FR03-EIP读卡器与欧姆龙NX/NJ系列EtherNet/IP通讯手册 CK-FR03-EIP是一款基于射频识别技术的高频RFID标签读卡器,读卡器工作频率为13.56MHZ,支持对I-CODE 2、I-CODE SLI等符合ISO15693国际标准协议格式标签的读取。 读卡器同时支持标准工业通讯协议EtherNet IP,方便用户通集成到PLC等

    2024年02月01日
    浏览(40)
  • 欧姆龙以太网模块如何设置ip连接 Kepware opc步骤

    在数字化和自动化的今天,PLC在工业控制领域的作用日益重要。然而,PLC通讯口的有限资源成为了困扰工程师们的问题。为了解决这一问题,捷米特推出了JM-ETH-CP转以太网模块,让即插即用的以太网通讯成为可能,不仅有效利用了PLC的通讯资源,还提高了数据传输的效率和稳

    2024年02月16日
    浏览(63)
  • WPF真入门教程26--项目案例--欧姆龙PLC通讯工具

    前面已经完成了25篇的文章介绍,概括起来就是从0开始,一步步熟悉了wpf的概念,UI布局控件,资源样式文件的使用,MVVM模式介绍,命令Command等内容,这节来完成一个实际的项目开发,虽然小案例,但是可以把前面的知识融合起来,比如控件的布局,命令的绑定,视图模型的

    2024年02月02日
    浏览(35)
  • 欧姆龙SysmacStudio 关于模块化编程的使用技巧---全局变量和数据类型

    在平常使用欧姆龙SysmacStudio 编程时,有新建大量的结构体和全局变量,若不分类进行模块化,会造成查找不方便,下面分享的就是对全局变量和数据类型进行模块分类,方便查找,提高编程效率。 下图中是新建的一个系统周期时钟频率的FB块 为了方便在程序中使用,将FB的输

    2024年02月06日
    浏览(52)
  • 欧姆龙CX系列PLC串口转以太网欧姆龙cp1hplc以太网连接电脑

    你是否还在为工厂设备信息采集困难而烦恼?捷米特JM-ETH-CX转以太网通讯处理器为你解决这个问题! 捷米特JM-ETH-CX转以太网通讯处理器专门为满足工厂设备信息化需求而设计,可以用于欧姆龙多个系列PLC的太网数据采集,非常方便构建生产管理系统。而且,该处理器采用模块

    2024年02月16日
    浏览(31)
  • 欧姆龙PLC仿真环境搭建及通信测试

    欧姆龙PLC是工控领域市场率较高的品牌之一,有低端CP/CH系列,中端CJ系列,高端NX/NJ系列。对于上位机开发来说,主要的协议有Hostlink协议、FinsTCP/UDP协议、EtherNetIP协议,今天主要跟大家分享一下,我们在上位机学习中如何通过软件来搭建仿真环境,在没有硬件的情况下,也

    2024年02月09日
    浏览(89)
  • 基于HslCommunication的欧姆龙Fins TCP通讯

    dathlin大佬的HslCommunication.dll控件具有强大的功能有效减少通讯编程时间,现就利用该控件进行欧姆龙Fins TCP通讯,读取与写入操作。 1.先布局相关控件:   2.引入HslCommunication.dll 解决方案管理器→右击引用→引用管理器→找到并选中HslCommunication.dll 注:HslCommunication.dll可以在网

    2024年02月15日
    浏览(37)
  • 欧姆龙cx-one v4.6下载分享

    作为一个想学习的新手小白,在找cx-one文件上可谓一言难尽,算了,直接来干货吧 欧姆龙cx-one 4.6版 百度网盘 上面这个百度网盘直接镜像安装就可以了,安装教程我就偷懒不搞了,抖音,网上到处搜都有 下面有自己想熟悉下,自己去官网下载的流程     第一步:通过这个连

    2024年02月09日
    浏览(100)
  • 上位机与欧姆龙PLC的Fins tcp通讯

    参考1:(147条消息) 欧姆龙PLC的FinsTCP协议_weixin_37700863的博客-CSDN博客_欧姆龙fins协议tcp   参考2:(147条消息) FinsTCP协议报文详细分析_常哥说编程的博客-CSDN博客_fins协议 参考3:(147条消息) 欧姆龙FINS通讯命令实例详解_搬砖dog的博客-CSDN博客_欧姆龙fins 上述文档中有部分描述错误

    2024年02月11日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包