一、关于CIP协议

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

二、EtherNet/IP通信

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

//1.注册会话ID

byte[] registerSessionCommand = new byte[]
            {
                //--------------------------------------------------------Header 24byte-------------------------------------
  0x6F,0x00,//命令 2byte
  0x04,0x00,//Header后面数据的长度 2byte
  0x00,0x00,0x00,0x00,//会话句柄 4byte
  0x00,0x00,0x00,0x00,//状态默认0 4byte
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//发送方描述默认0 8byte
  0x00,0x00,0x00,0x00,//选项默认0 4byte
    //-------------------------------------------------------CommandSpecificData 指令指定数据 4byte
  0x01,0x00,//协议版本 2byte
  0x00,0x00,//选项标记 2byte
            };

//2.提取会话ID-注册请求的应答报文

byte[] RefRegisterCmd = new byte[28]
{

//--------------------------------------------------------Header 24byte-------------------------------------
    0x6F, 0x00,//命令 2byte
    0x04, 0x00,//CommandSpecificData的长度 2byte
    0x6B, 0x01, 0x01, 0x00,//会话句柄 4byte 由PLC生成
    0x00, 0x00, 0x00, 0x00,//状态默认0 4byte
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,//发送方描述默认0 8byte
    0x00, 0x00, 0x00, 0x00,//选项默认0 4byte

//-------------------------------------------------------CommandSpecificData 指令指定数据 4byte

0x01, 0x00,//协议版本 2byte
    0x00, 0x00,//选项标记 2byte
};
            byte[] SessionHandle = new byte[4] { 0x6B, 0x01, 0x01, 0x00 };//从应答报文提取的会话ID:索引4开始,查找4个字节

//------------------3.读数据服务请求报文-------------------------

//报文由三部分组成 Header 24个字节 、CommandSpecificData 16个字节、以及CIP消息(由读取的标签生成)实例,
            //读取单个标签名为 TAG1的报文总长度为64个字节
            byte[] Header = new byte[24]
{
0x6F,0x00,//命令 2byte
  0x28,0x00,//长度 2byte(总长度-Header的长度)=40 
  0x6B,0x01,0x01,0x00,//会话句柄 4byte
  0x00,0x00,0x00,0x00,//状态默认0 4byte
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//发送方描述默认0 8byte
  0x00,0x00,0x00,0x00,//选项默认0 4byte
};
            byte[] CommandSpecificData = new byte[16]
{
0x00,0x00,0x00,0x00,//接口句柄 CIP默认为0x00000000 4byte
  0x01,0x00,//超时默认0x0001 4byte
  0x02,0x00,//项数默认0x0002 4byte
  0x00,0x00,//空地址项默认0x0000 2byte
  0x00,0x00,//长度默认0x0000 2byte
  0xb2,0x00,//未连接数据项默认为 0x00b2
  0x18,0x00,//后面数据包的长度 24个字节(总长度-Header的长度-CommandSpecificData的长度)
};

byte[] CipMessage = new byte[24]
{

0x52,0x02,     //服务默认0x52  请求路径大小 默认2

0x22,0x06,0x24,0x01,//请求路径 默认0x01240622 4byte
  0x0A,0xF0,//超时默认0xF00A 4byte
  0x0A,0x00,//Cip指令长度  服务标识到服务命令指定数据的长度 
  0x4C,//服务标识固定为0x4C 1byte  
  0x03,// 节点长度 2byte  规律为 (标签名的长度+1/2)+1
  0x91,//扩展符号 默认为 0x91
  0x04,//标签名的长度

  0x54,0x41,0x47,0x31,//标签名 :TAG1转换成ASCII字节 当标签名的长度为奇数时,需要在末尾补0  比如TAG转换成ASCII为0x54,0x41,0x47,需要在末尾补0 变成 0x54,0x41,0x47,0

0x01,0x00,//服务命令指定数据 默认为0x0001 

   0x01,0x00,0x01,0x00//最后一位是PLC的槽号

};
            //PLC回复报文:
            //6F00 1800 6B010100 00000000 0000000000000000 00000000 00000000 0100 0200 00000000 B200

//实例,读取多个标签名为 TAG、TAG1的报文总长度为86个字节
            //6F003E006B01010000000000000000000000000000000000000000000100020000000000B2002E005202200624010AF020000A02200224010200060010004C0391035441470001004C03910454414731010001000100

//Header:6F003E006B01010000000000000000000000000000000000      24byte

//CommandSpecificData: 00 00 00 00 0100020000000000B2002E00     16byte
            /*
            CipMessage:
            -服务代码 - 请求路径大小 - 请求路径  0AF0超时   20 00 CIP指令长度 (0A - 00之间的长度为32个字节)
            -请求路径大小  请求路径 0200 标签的数量  0600 偏移量(初始值为:2 + 标签数量 * 2)
            1000 偏移量 = 标签服务长度 + 初始偏移量(有几个标签就有几个偏移量)
            4C 03 91 03 54414700 0100  标签TAG  4C039104544147310100 标签TAG1

PLC回复报文:
            6F00006B01010000000000000000000000000000000000000000000100020000000000B200008A000000020006001300CC000000D00005003232323232CC000000D00005003232323232    76byte

Header:6F0034006B01010000000000000000000000000000000000  24byte
            CommandSpecificData:000000000100020000000000B2002400  16byte
            CipMessage:    CC000000D00005003232323232
            8A - 多个标签   0000 - 状态  0200 - 项数  0600 - 标签TAG偏移量  1300 - 标签TAG1偏移量  0000 - 状态0正常 D000 - 数据类型:string
            0500:字符串长度(字符串类型特有的)
            3232323232 - 数据 "22222":
            目前常用的数据类型: C1 - BOOL C2 - SINT C3 - Short C4 - Int  C7 - UShort C8 - UInt  CA - Float CB - Double  D0 - String
            */

//-----------------4.写入数据服务报文--------------------------

/*实例,往标签名为:TAG1 写入true  数据类型为 bool

写入报文:68byte

6F002C006B01010000000000000000000000000000000000 000000000100020000000000B2001C00 5202200624010AF00E004D03910454414731C1000100010001000100

header:6F002C006B01010000000000000000000000000000000000   24byte
            CommandSpecificData:000000000100020000000000B2001C00     16byte

20062401 0AF0  0E00 4D 03 91 04 54414731 C100 0100 0100 01000100   28byte

-请求路径大小  20062401-请求路径,默认   0AF0-超时           0E00-CIP指令长度(绿色部分的长度)

4D-写入标识     03-(标签名的长度+1)/2+1   91-扩展符号    04-标签TAG1的长度   54414731 -标签名的ASCII表示

C100-数据类型    0100-默认项   0100-数据 TRUE(2byte)          01000100 - 默认最后一位为PLC槽号

PLC回复报文:

6F0014006B0101 00000 00000000000000000000000000000 000000000100020000000000B2000400CD000000   44byte

header:6F0014006B01010000000000000000000000000000000000 24byte

CommandSpecificData:000000000100020000000000B2000400  16byte

CIPMessage:CD 00 0000     CD-服务标识  00-填充字节  0000-状态好

注意:当写入字符串类型时,写入的数据长度为奇数时,需要在数据后填充一个字节0,必须为偶数
            */

//----  5.扩展知识----------------------

/*首先建立起TCP连接,CIP通信端口默认为44818。TCP连接成功后,发送会话消息,获取四个字节的会话ID,就可以正常读写了。

000000000000000000000000000000 24byte

0x0000:状态正常(在报文里低位在前高位在后)

0x0001:发出了无效或不受支持的封装命令;

0x0002:接收器中的内存资源不足,无法处理命令;

0x0003:封装消息的数据部分中的数据形成不良或不正确;

0x0004:Reserved for legacy(RA);

0x0064:向目标发送封装消息时,始发者使用了无效的会话句柄;

0x0065:目标收到一个无效长度的信息

0x0069:不支持的封装协议修订

0x0000 - 成功

0x0004 - 它没有正确生成或匹配标记不存在

0x0005 - 引用的特定项(通常是实例)无法找到

0x0006 - 请求的数据量不适合响应缓冲区。 发生了部分数据传输

0x000A - 尝试处理其中一个属性时发生错误

0x0013 - 命令中没有提供足够的命令数据 / 参数来执行所请求的服务

0x001C - 与属性计数相比,提供的属性数量不足

0x001E - 此服务中的服务请求出错

0x0020 - 命令中参数的数据类型与实际参数的数据类型不一致

0x0026 - IOI字长与处理的IOI数量不匹配*/

欧姆龙PLC的CIP协议报文相关推荐

  1. 晨控CK-GW208-EC与欧姆龙PLC工业EtherCAT协议通讯指南

    晨控CK-GW208-EC与欧姆龙PLC工业EtherCAT协议通讯指南 EtherCAT 是一种实时以太网络通讯协议,旨在解决传统现场总线系统在数据传输速率和复杂性方面的限制.相比传统现场总线,Et ...

  2. 爱普生机器人与欧姆龙PLC Fins/Tcp协议驱动程序 自己开发,提供项目源码Fins/Tcp协议源码

    爱普生机器人与欧姆龙PLC Fins/Tcp协议驱动程序 自己开发,提供项目源码Fins/Tcp协议源码

  3. 西门子PLC协议转换CIP协议,实现与罗克韦尔/AB、欧姆龙PLC之间通讯

    IGT-DSER智能网关模块支持西门子.三菱.欧姆龙.AB等各种品牌的PLC之间通讯,同时也支持PLC与Modbus协议的工业机器人.智能仪表等设备通讯.网关有多个网口.串口,也可选择WIFI,4G无 ...

  4. 西门子PLC的S7协议报文解析说明

    我们以S7的1500系列来查看握手和读取.写入[字Word或者位Bit]命令报文 以下报文不做说明时都是十六进制字节. 西门子PLC需要连接成功后发送两次握手命令方可进行读写通信. 西门子PLC的S7 ...

  5. 三菱PLC之SLMP协议报文说明

    -Begin- 前言 SLMP是三菱PLC用于CPU模块或外部设备(个人计算机或显示器等)使用以太网对PLC设备进行数据访问的一种协议,SLMP协议是基于TCP/IP,因此会存在服务器和客户端的功能区 ...

  6. 以太网Profinet协议工业RFID读写器与欧姆龙PLC配置与联机操作说明

    随着工业自动化的推进和变革,越来越多的知名品牌RFID公司投入研发自己的RFID识别系统.百花齐放,使得工业自动化RFID识别技术得到长足发展与进步,但各家使用的工业RFID通信协议也竞相不同,例如西 ...

  7. 欧姆龙PLC HostLink通讯 C-MODE格式

    协议说明 HostLink C-mode可以直接通过PC连接欧姆龙PLC,可以直接读取/写入欧姆龙PLC寄存器的协议. 其中分为1对1,以及1对N模式,1对1表示1台PC只能连接一个PLC,1对N表示 ...

  8. Ethernet/IP和cip协议的介绍与分析

    一. CIP协议簇介绍 CIP 协议族是由 ODVA .CI 等机构联合推出的应用层协议标准, 又称为控制与信息协议, 它为采用不同物理层和数据链路层的各层网络提供了统一的应用层协议标准, 使得各层网 ...

  9. 欧姆龙PLC与DGUSⅡ屏软硬件连接指南

                       DGUS应用锦集(四)欧姆龙PLC软硬件连接指南 PLC本质上是一种专用于工业控制的计算机,使用可编程存储器储存指令,并通过模拟或数字I/O组件,控制各种机械或生 ...

最新文章

  1. CVPR2020:4D点云语义分割网络(SpSequenceNet)
  2. Configure NFS Server On AIX 6.1
  3. YOLOX——Windows 10下环境配置
  4. 从第一碗粉到云手机,天心很行
  5. js温故而知新11(AJAX)——学习廖雪峰的js教程
  6. mysql源码_MySql轻松入门系列——第一站 从源码角度轻松认识mysql整体框架图
  7. 小龙多功能工具箱,邮件群发微信多开
  8. ubuntu安装vasp_科学网—Ubuntu18.04编译VASP.5.4.1两种方法的详细过程 - 木留华的博文...
  9. ios系统微信浏览器、safari浏览器中h5页面上拉下滑导致悬浮层脱离窗口的解决方法
  10. java做h5小游戏服务端_神藏西游H5游戏源码服务端+客户端+搭建教程
  11. 获取两个字符串中最大相同子串
  12. Atitit springboot 上传与下载总结 上传 使用file对象的transferTo保存方法最简单 @RequestMapping(value = /up, method = R
  13. email 邮件发送源代码(c++实现)
  14. 普罗米修斯 Prometheus
  15. 【命令】Java调用Windows运行命令打开\关闭软键盘
  16. 2019-2020-1 1823《程序设计与数据结构》每周成绩
  17. PNP三极管的分析方法
  18. 常用汉字的UNICODE和对应的繁体字
  19. 登录EMC VNX5100存储管理界面报Java版本问题处理
  20. 如何处理项目遗留问题?

热门文章

  1. 神舟上网本安装一键还原精灵出现error loading os的解决办法
  2. PHP根据经纬度计算两地之间的距离
  3. 东莞横沥压铸是一种常用的金属铸造工艺
  4. 如何更科学地设计压铸锥形流道?
  5. VS运行变得异常卡顿的记录及其解决
  6. CTF二维码题(01转二维码)
  7. Synopsys Sentaurus TCAD系列教程之-- Sdevice《3》Electrode模块
  8. 基于SpringBoot 的CMS系统,拿去开发企业官网真香(附源码)
  9. android开发 九宫格,Android开发(2) - 九宫格的实现
  10. 第十七届全国大学生智能车竞赛华南赛区奖项