c#基于TCP/IP、CIP协议的欧姆龙PLC通信
一、关于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协议之上。
三、CIP通信报文
1.注册会话ID
private byte[] Registercmd = new byte[28]
{
//--------------------------------------------------------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-注册请求的应答报文
private 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
};
public byte[] SessionHandle=new byte[4]{0x6B,0x01,0x01,0x00};//从应答报文提取的会话ID
后续读写PLC的报文中,需要包含PLC返回的会话ID
3.读数据服务请求报文
报文由三部分组成 Header 24个字节 、CommandSpecificData 16个字节、以及CIP消息(由读取的标签生成)
实例,读取单个标签名为 TAG1的报文总长度为64个字节
private 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
};
private 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的长度)
};
private byte[] CipMessage = new byte[24]
{
0x52,0x02 //服务默认0x52 请求路径大小 默认2
0x22,06,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回复报文:
6F0018006B01010000000000000000000000000000000000000000000100020000000000B200
为数据false
实例,读取多个标签名为 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数量不匹配
c#基于TCP/IP、CIP协议的欧姆龙PLC通信的更多相关文章
- 基于TCP/IP协议的C++网络编程(API函数版)
源代码:http://download.csdn.net/detail/nuptboyzhb/4169959 基于TCP/IP协议的网络编程 定义变量——获得WINSOCK版本——加载WINSOCK库 ...
- EtherNet/IP CIP协议
EtherNet/IP CIP协议 1.EtherNet/IP简述 EtherNet/IP(Ethernet/Indstrial Protocol,以太网/工业协议)是一种基于以太网和TCP/IP技术 ...
- TCP/IP网络协议的通俗理解,SOCKET,HTTP,SOAP
TCP/IP,HTTP,SOAP等协议之区别 术语TCP/IP代表传输控制协议/网际协议,指的是一系列协议.“IP”代表网际协议,TCP和UDP使用该协议从一个网络传送数据包到另一个网络.把IP想 ...
- Linux学习(1)- TCP/IP网络协议基础
Linux学习(1)- TCP/IP网络协议基础 一.TCP/IP 简介 学习内容 TCP/IP(Transmission Control Protocol/Internet Protocol)是传输 ...
- TCP/IP四层协议模型与ISO七层模型
TCP/IP四层协议模型与ISO七层模型 在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别.就好像圣经中上帝打乱了各地人的口音,让他 ...
- JAVA Socket 底层是怎样基于TCP/IP 实现的???
首先必须明确:TCP/IP模型中有四层结构: 应用层(Application Layer).传输层(Transport Layer).网络层(Internet Layer ).链路层( ...
- TCP/IP网络协议基础
实验楼学习网络协议传送门 一.TCP/IP简介 TCP/IP(Transmission Control Protocol/Internet Protocol)是传输控制协议和网络协议的简称,它定义了电 ...
- Fixed-Length Frames 谈谈网络编程中应用层(基于TCP/UDP)的协议设计
http://blog.sina.com.cn/s/blog_48d4cf2d0101859x.html 谈谈网络编程中应用层(基于TCP/UDP)的协议设计 (2013-04-27 19:11:00 ...
- 基于TCP与UDP协议的socket通信
基于TCP与UDP协议的socket通信 C/S架构与初识socket 在开始socket介绍之前,得先知道一个Client端/服务端架构,也就是 C/S 架构,互联网中处处充满了 C/S 架构(Cl ...
随机推荐
- sql server management studio 连接时指定非默认端口 ,port
- sqlalchemy连接 MySQL(转)
from sqlalchemy import create_engine,Table,Column,Integer,String,MetaData,ForeignKey engine=create_e ...
- 阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_02-Eureka注册中心-搭建Eureka单机环境
我们先搭建单机环境 govern是治理的意思, 这样就把工程创建好了 创建包 创建SpringBoot的启动类. 在父工程里面已经确定了Spring Cloud的版本了.相当于锁定了版本 接下里只需要 ...
- Python基础之set集合与函数
set集合 集合是一个无序且不重复的元素组合,以大括号表示.使用详情: >>> b=set(a) >>> type(b) <class 'set'> & ...
- C#将HTML代码转换为图片
前端通过富文本控件接收到了一段html代码,后端想通过图片的形式展示到另外的地方,这种情况怎么处理呢.直接上代码: using System; using System.Collections.Gen ...
- 简介Python中用于处理字符串的center()方法
简介Python中用于处理字符串的center()方法 这篇文章主要介绍了简介Python中用于处理字符串的center()方法,是Python入门中的基础知识,需要的朋友可以参考下 center() ...
- (四)Centos之查询目录中内容命名ls
一.查询目录中内容命名ls 1.1 root代表当前登录用户,localhost代表主机名, ~代表当前主机目录,#代表用户权限 #表示超级用户,$表示普通用户: 1.2 查询目录中内容命令 ls ...
- Levenberg-Marquardt迭代(LM算法)-改进Guass-Newton法
1.前言 a.对于工程问题,一般描述为:从一些测量值(观测量)x 中估计参数 p?即x = f(p), ...
- 【C#设计模式2】简单工厂模式
我们在编程的时候,每当"new"一个对象之后,这个对象就依赖于这个类了.如果在后期的维护过程中由于某些原因需要修改一下这个类,则唯一的做法就是打开源代码,进行修改,修改所有与这个对 ...
- Egret入门学习日记 --- 第十九篇(书中 8.8~8.10 节 内容)
第十九篇(书中 8.8~8.10 节 内容) 开始 8.8节. 重点: 1.类型推断. 2.类型强制转换,使其拥有代码提示功能. 3.除了TS自带的类型判断,Egret官方也提供了类型判断的方法. 操 ...