C#上位机与欧姆龙PLC的通信05---- HostLink协议

1、介绍

Hostlink协议是欧姆龙PLC与上位机链接的公开协议。上位机通过发送Hostlink命令,可以对PLC进行I/O读写、可以对PLC进行I/O读写、改变操作模式、强制置位/复位等操作。由于是公开协议,即便是非欧姆龙的上位设备(软件),都可以通过该协议和欧姆龙PLC实现通信链接,

Hostlink通讯协议有两种模式:C-mode和FINS

1.Cmode:专用于hostlink通讯指令,采用的是ASCII码,适用于所有OMRON的PLC通讯。只能上位机发出指令给CPU,CPU无法主动发数据给上位机。

2.FINS:采用的二进制码,适用于新开发的PLC,可用在多种网络设备(Controller  Link,  Ethernet,  etc),可被 CPU、IO模块、上位机主动发出,不同的指令分别适用于不同的信息接受单元。有两种链接协议:CMND和hostlink,当上位机是做发送源时,必须采用hostlink协议。 

欧姆龙PLC与上位机连接时一般采用的是Hoslink协议,它是一种简易经济的通讯方式,比较适合一台上位机和一台PLC或者多台PLC进行通讯。上位机可对PLC进行程序传送和读写等操作。HOSTLINK系统允许一台上位机通过上位机链接命令向HOSTLINK系统的PLC发送命令,PLC处理来自上位机的每条指令,并把结果传回上位机。

RS-232C链接(1:1) 

 当使用RS-232C链接时,只可实现1:1的通信,即一台上位机与一台PLC进行通信,最大通信距离不超过15m。

使用PLC自带的口 RS-232C口

 2、如何读懂Hostlink协议格式?

命令格式:
①起始符@,该符号必须置于每个命令的开头;
②节点号即PLC单元号,用于辨识PLC,范围为0~30(BCD数);
③命令符即发送命令的目的,设置2个字符的命令代码;
④操作内容表示命令符操作的参数,命令不同,内容也不一样;
⑤校验符为FCS校验,对校验的内容进行异或运算,结果为2个字符;
⑥结束符为*号+回车键
响应格式
①起始符@,该符号必须置于每个响应的开头;
②节点号表示返回的响应数据PLC的单元号;
③命令符表示本帧返回的是何种命令的响应数据;
④状态符即显示正常或错误的响应结果;
⑤操作内容为根据命令符,返回的响应数据;
⑥FCS校验码
⑦结束符*号+回车键

HostLink通讯协议的数据,由4部分组成。
1. 头代码
2. FINS命令
3. 异或校验
4. 结束码

如:@00FA0000000000101B0006400000175*
数据分析如下:
@-起始符,固定写法
00-PLC地址,默认0,占2位
FA-头编码,可以是FA,RD,WR
0-等待单位,默认为0MS
00-SID,默认00
00-SA2,默认00
00-DA2,默认00
00-ICF,默认00
0101-读取命令
B0-存储区代号,B0表示CIO区字,也就是指CIO存储是2进制类型的
006400-起始地址,占3个字节,0064为存储器的编号(16进制的0064为10进制的100) ,后面的00为存储器的位(HEX 00)
0001-数量,占2个字节
75-异或校验
*-固定写法

比如

发送:@00FA000000000010130000000000571*\CR
接收:@00FA004000000001010000010000010142*\CR

发送分析如下:
@-起始符,固定写法
00-PLC地址,默认0,占2位
FA-头编码,可以是FA,RD,WR
0-等待单位,默认为0MS
00-SID,默认00
00-SA2,默认00
00-DA2,默认00
00-ICF,默认00
0101-读取命令
30-存储区代号,B0表示CIO区字,也就是指CIO存储是2进制类型的, 存储区代号=>D位:02,D字:82,W位:31,C位:30,W字:B1,C字:B0
000000-起始地址,占3个字节,0000为存储器的编号,后面的00为存储器的位
0005-数量,占2个字节
71-异或校验
*-固定写法
\CR-回车

接收分析如下:
@-起始符,固定写法
00-PLC地址,默认0,占2位
FA-头编码,可以是FA,RD,WR
0-等待单位,默认为0MS
00-SID,默认00
00-SA2,默认00
00-DA2,默认00
00-ICF,默认00
0101-读取命令
0000-错误码,0000表示没有错误,即正常
0100000101-返回的具体数据,占4个字节,分别是01,00,00,01,01即true,false,false,true,true
42-异或校验
*-固定写法
\CR-回车

 3、开搞Hostlink

3.1 首先确定设置的是Hostlink协议

3.2  打开Commix 1.4.exe工具软件

3.3 读取和写入CIO数据

 (1)读取CIO0开始的5个字 

打开CIO区,设置5个数据,这里是设置0.0,0.1,0.2,0.3,0.4共5个位的数据,分别为10011

发送指令  @00FA0000000000101300000000005

发送:@00FA000000000010130000000000571*\CR
接收:@00FA004000000001010000010000010142*\CR
发送分析如下:
@-起始符,固定写法
00-PLC地址,默认0,占2位
FA-头编码,可以是FA,RD,WR
0-等待单位,默认为0MS
00-SID,默认00
00-SA2,默认00
00-DA2,默认00
00-ICF,默认00
0101-读取命令
30-存储区代号,B0表示CIO区字,也就是指CIO存储是2进制类型的, 存储区代号=>D位:02,D字:82,W位:31,C位:30,W字:B1,C字:B0
000000-起始地址,占3个字节,0000为存储器的编号,后面的00为存储器的位
0005-数量,占2个字节
71-异或校验
*-固定写法
\CR-回车

接收分析如下:
@-起始符,固定写法
00-PLC地址,默认0,占2位
FA-头编码,可以是FA,RD,WR
0-等待单位,默认为0MS
00-SID,默认00
00-SA2,默认00
00-DA2,默认00
00-ICF,默认00
0101-读取命令
0000-错误码,0000表示没有错误,即正常
0100000101-返回的具体数据,占4个字节,分别是01,00,00,01,01即true,false,false,true,true
42-异或校验
*-固定写法
\CR-回车

注意:

存储区代号:D位:02,D字:82,W位:31,W字:B1,C位:30,C字:B0

读取命令0101,写入命令0102

所有指令是16进制格式的ASCII码 ,存储区代号和读取写入命令都是固定的,这是协议手册上定义死的,不能改的,有兴趣的可以看官方协议手册。

(2)写入CIO100.05-100.09数据为11001

发送:@00FA0000000000102300064050005010100000174*\CR 
接收:@00FA00400000000102000040*\CR
发送报文分析如下:
@-起始符,固定写法
00-PLC地址,默认0,占2位
FA-头编码,可以是FA,RD,WR
0-等待单位,默认为0MS
00-SID,默认00
00-SA2,默认00
00-DA2,默认00
00-ICF,默认00
0102-写入命令,占2个字节
30-存储区代号,占1个字节,B0表示CIO区字,也就是指CIO存储是2进制类型的, 存储区代号=>D位:02,D字:82,W位:31,C位:30,W字:B1,C字:B0
006405-起始地址,占3个字节,0064为存储器的编号,0064转为10进制就是100,后面的05为存储器的位,表示第5位
0005-数量,占2个字节
74-异或校验
*-固定写法
\CR-回车
****************************************************************************************************************************************
发送:@00FA0000000000102300064050005010100000174*\CR 
接收:@00FA00400000000102000040*\CR
接收报文分析如下:
@-起始符,固定写法
00-PLC地址,默认0,占2位
FA-头编码,可以是FA,RD,WR
0-等待单位,默认为0MS
00-SID,默认00
00-SA2,默认00
00-DA2,默认00
00-ICF,默认00
0102-写入命令
0000-错误码,0000表示没有错误,即正常 
40-异或校验
*-固定写法
\CR-回车 

3.4 读取和写入D区数据

设置D区100开始的4个数据123,900,78,4569

发送指令 

(1)读取D区100开始的4个short类型数据
发送:@00FA0 00 00 0A 00 01018200640000040A*\CR 
接收:@00FA00400A000001010000007B0384004E11D9 44*\CR 
发送分析如下:
@-起始符,固定写法
00-PLC地址,默认0,占2位
FA-头编码,可以是FA,RD,WR
0-等待单位,默认为0MS
00-SID,默认00
00-SA2,默认00
0A-DA2,默认00
00-ICF,默认00
0101-读取命令
82-存储区代号,B0表示CIO区字,也就是指CIO存储是2进制类型的, 存储区代号=>D位:02,D字:82,W位:31,C位:30,W字:B1,C字:B0
006400-起始地址,占3个字节,0064为存储器的编号,即10进制的100,后面的00为存储器的位
0004-数量,占4个字节
0A-异或校验
*-固定写法
\CR-回车

接收分析如下:
@-起始符,固定写法
00-PLC地址,默认0,占2位
FA-头编码,可以是FA,RD,WR
0-等待单位,默认为0MS
00-SID,默认00
00-SA2,默认00
0A-DA2,默认00
00-ICF,默认00
0101-读取命令
0000-错误码,0000表示没有错误,即正常
007B0384004E11D9-返回的具体数据,占16个字节,分别是16进制的007B,0384,004E,11D9,即123,900,78,4569
0A-异或校验
*-固定写法
\CR-回车

(2)向D区40的地址写入4个ushor数据110, 120, 130, 140


发送:@00FA000000A000102820028000004006E00780082008C0C*\CR
接收:@00FA00400A00000102000031*\CR
 发送分析如下:
@-起始符,固定写法
00-PLC地址,默认0,占2位
FA-头编码,可以是FA,RD,WR
0-等待单位,默认为0MS
00-SID,默认00
00-SA2,默认00
0A-DA2,默认00
00-ICF,默认00
0102-读取命令
82-存储区代号,B0表示CIO区字,也就是指CIO存储是2进制类型的, 存储区代号=>D位:02,D字:82,W位:31,C位:30,W字:B1,C字:B0
002800-起始地址,占3个字节,0028为存储器的编号,即10进制的40,后面的00为存储器的位
0004-写入数量,占2个字节
006E00780082008C-写入的数据,这里是16进制的,即006E,0078,0082,008C,转换成10进制就是110, 120, 130, 140
0C-异或校验
*-固定写法
\CR-回车

接收分析如下:
@-起始符,固定写法
00-PLC地址,默认0,占2位
FA-头编码,可以是FA,RD,WR
0-等待单位,默认为0MS
00-SID,默认00
00-SA2,默认00
0A-DA2,默认00
00-ICF,默认00
0102-读取命令
0000-错误码,0000表示没有错误,即正常 
31-异或校验
*-固定写法
\CR-回车

3.5读取和写入W区数据

设置W区104开始的4个数据

发送指令

 


发送分析如下:
@-起始符,固定写法
00-PLC地址,默认0,占2位
FA-头编码,可以是FA,RD,WR
0-等待单位,默认为0MS
00-SID,默认00
00-SA2,默认00
0A-DA2,默认00
00-ICF,默认00
0101-读取命令
B1-存储区代号,B1表示W区字,  存储区代号=>D位:02,D字:82,W位:31,C位:30,W字:B1,C字:B0
006800-起始地址,占3个字节,0068为存储器的编号,即10进制的104,后面的00为存储器的位
0008-读取数量,占2个字节,浮点型数据中一个数据占2个寄存器,4个数据就占8个寄存器,所以是0008
73-异或校验
*-固定写法
\CR-回车

接收分析如下:
@-起始符,固定写法
00-PLC地址,默认0,占2位
FA-头编码,可以是FA,RD,WR
0-等待单位,默认为0MS
00-SID,默认00
00-SA2,默认00
0A-DA2,默认00
00-ICF,默认00
0101-读取命令
0000-错误码,0000表示没有错误,即正常
147B3F8E147BC00E333343CBC000C470-返回的具体数据,分别是10进制的1.11,-2.22,406.4,-963
0A-异或校验
*-固定写法
\CR-回车

147B3F8E147BC00E333343CBC000C470-返回的具体数据,其实应该分别是10进制的1.11,-2.22,406.4,-963 ,但这个软件返回的数据解析不正确 ,说明这软件有问题,不好,有问题需要改进,下节看我写的工具软件,比这个解析强多了。

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

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

相关文章

速通Python基础语法--函数篇

目录 一 函数的定义和调用 二 函数的实参和形参 ​编辑 三 函数的返回值 耦合 一个函数中可以有多个return 一次return可以返回多个值 四 全局变量和局部变量 读取 写入 global关键字 其它语句产生的代码块 五 PyCharm调试器观察函数执行 六 函数的链式调用和嵌套…

【prompt一】Domain Adaptation via Prompt Learning

1.Motivation 当前的UDA方法通过对齐源和目标特征空间来学习域不变特征。这种对齐是由诸如统计差异最小化或对抗性训练等约束施加的。然而,这些约束可能导致语义特征结构的扭曲和类可辨别性的丧失。在本文中,引入了一种新的UDA提示学习范式,…

【C语言】指针详解(三)

1.指针运算 指针的基本运算有三种,分别是:⭐指针-整数 ⭐指针-指针 ⭐指针的关系运算 1.1指针 - 整数 因为数组在内存中是连续存放的,只要知道第一个元素的地址,顺藤摸瓜就能找到后面的所有元素。 int arr[10]{1,2,3,4,5,6,7,8,9,10} #inc…

MyBatis增删改查基础及其xml文件

目录 一.增删改查基础 1.增 增Insert 获取自增ID 对insert参数进行重命名 2.删 3.改 4.查 1)对MySQL查询结果进行重命名 从MySQL层面--as 从mybatis层面--Results注解 复用Results的定义 2)配置自动转换驼峰命名(推荐) 二.Mybatis xml配置…

Linux一行命令配置jdk环境

使用方法: 压缩包上传 到/opt, 更换命令中对应的jdk包名即可。 注意点:jdk-8u151-linux-x64.tar.gz 解压后名字是jdk1.8.0_151 sudo tar -zxvf jdk-8u151-linux-x64.tar.gz -C /opt && echo export JAVA_HOME/opt/jdk1.8.0_151 | sudo tee -a …

重生奇迹mu翅膀合成

在重生奇迹mu中,合成翅膀需要准备好翅膀碎片、宝石、羽毛、强化精华等材料,而其中不同翅膀合成要求的材料和数量略有不同。以下是一般合成翅膀的步骤: 1.首先,需要在背包中准备好所有的合成材料。如果缺少任何一种材料&#xff0…

MyBatisX生成时的选项的含义

一般,annotation和template勾选MyBatis-Plus 3 options中各选项的作用 comment:实体类各属性的注释(数据库中有的话)以及生成TableId注解,同时会给serialVersionUID属性加上TableField(exist false) toString/hashCo…

分布式任务调度QuartZ框架使用(通过注解使用quartz)

1、Quartz概述 quartz官网文档:http://www.quartz-scheduler.org/ quartz是一个定时调度的框架,属于比较早期的产品,现在市面上流行的xxl-Job,elastic-Job分布式调度框架都是基于该产品。虽然很多人说quartz的使用不是很方便&am…

【电源专题】Buck电源上电震荡谁的错?

在文章:【电源专题】案例:Buck芯片上电瞬间波形震荡?从别的人案例中来学习软启参数中我们通过别人的文章了解到了Buck芯片上电瞬间波形震荡有几个方法可以解决,但主要还是围绕着软启动参数去学习。因为文章中无法知道编者所用的电源芯片和电路,所以无法进行分析。 最近我…

软件工程中关键的图-----知识点总结

目录 1.数据流图 2.变换型设计和事务型设计 3.程序流程图 4.NS图和PAD图: 5.UML图 1.用例图 2.类图 3.顺序图 4.协作图 本文为个人复习资料,包含个人复习思路,多引用,也想和大家分享一下,希望大家不要介意~ …

NPOI 导出Excel提示内容有问题的解决方法

NPOI导出Excel 使用Microsoft Excel 打开提示内容有问题,如下: 原因是:在使用NPOI导出excel时,获得 workbook.Write(ms)生成的 MemoryStream后,使用了 ms.GetBuffer()返回文件内容,导致生成的 Excel文件结尾…