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.mzph.cn/news/314691.shtml

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

相关文章

Codeforces Round #737 (Div. 2) D. Ezzat and Grid 线段树动态开点

传送门 文章目录题意:思路:题意: 思路: 比较套路的一个题,我们维护一个dp[i]dp[i]dp[i]表示到了第iii行能保留的区间最多是多少。 转移比较明显:dp[i]max(dp[j])dp[i]max(dp[j])dp[i]max(dp[j]) 其中jjj能…

从零开始实现ASP.NET Core MVC的插件式开发(三) - 如何在运行时启用组件

标题:从零开始实现ASP.NET Core MVC的插件式开发(三) - 如何在运行时启用组件 作者:Lamond Lu地址:https://www.cnblogs.com/lwqlun/p/11260750.html源代码:https://github.com/lamondlu/DynamicPlugins前情回顾•从零开始实现ASP…

SP1043 GSS1 - Can you answer these queries I 猫树

传送门 文章目录题意:思路:题意: 思路: 猫树是一种可以O(nlogn)O(nlogn)O(nlogn)预处理,O(1)O(1)O(1)查询的数据结构。预处理的信息应该满足可合并的性质,与线段树pushuppushuppushup的原理相同&#xff0…

动手造轮子:基于 Redis 实现 EventBus

动手造轮子:基于 Redis 实现 EventBusIntro上次我们造了一个简单的基于内存的 EventBus,但是如果要跨系统的话就不合适了,所以有了这篇基于 Redis 的 EventBus 探索。本文的实现是基于 StackExchange.Redis 来实现。RedisEventStore 实现既然…

最小生成树KrusKal算法(并查集)

洛谷p1111链接 克鲁斯卡尔算法的思路就是由森林变成树的过程,其中最主要的就是贪心和并查集的应用。 我们知道链接n个点需要n-1条边,这就满足的最后生成的是一颗树,而不是一个环。在这n-1条边的选择上我们又要尽可能的让边的权重小&#xff0…

#6278. 数列分块 2 分块 + 块内二分

传送门 文章目录题意:思路:题意: 思路: 真 调一晚上血压上来了。 考虑第一个操作,块内打个标记,其他的暴力查询即可。 考虑第二个操作,讲块内元素排序之后,直接二分查询。 注意修改…

使用腾讯云提供的针对Nuget包管理器的缓存加速服务

继阿里巴巴开源镜像站(https://opsx.alibaba.com/)、华为云镜像站点(https://mirrors.huaweicloud.com/ )之后,腾讯也已于近日上线了类似的服务,官方名称为腾讯云软件源(Tencent Open Source Mi…

最小生成树Prime算法

洛谷p1546链接 Prime算法的核心也是贪心&#xff0c;但是不同的就是&#xff0c;它是一直维护一颗树&#xff0c; 直到变成一颗最小生成树&#xff0c; #include<bits/stdc.h> using namespace std; const int maxn 110; const int inf 0x3f3f3f3f; int maze[maxn][m…

#6284. 数列分块 8 分块

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 乍一看貌似没有什么东西能维护块内同一个数的个数&#xff0c;但是通过第六感可以发现每次操作后区间都会被推成一个数&#xff0c;那么我们分个块&#xff0c;让后块内打个标记&#xff0…

最短路弗洛伊德(Floyd)算法加保存路径

弗洛伊德算法大致有点像dp的推导 dp[i][j] min(dp[i][k] dp[k][j], dp[i][j]), 其中 i 是起始点&#xff0c;j 是终止点。k是它们经过的中途点。 通过这个公式不断地更新dp[i][j],得到最短路径长。 我们先定义两个矩阵&#xff0c;minpath[i][j],表示的是从 i 到 j 当前得到的…

云考古 | Azure 自建 RDS 让 iPad 跑 Office 97

导语苹果一直在尝试把iPad做成电脑&#xff0c;但效果始终不如真正的PC理想。如果能在iPad上运行PC软件&#xff0c;如完整版的Office&#xff0c;那一定是一种非常理想的方式。我小时候电脑启蒙使用的第一个软件就是Office 97里的Word&#xff0c;这也是第一款引入Office助手&…

P3338 [ZJOI2014]力 FFT + 推式子

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 这个式子看起来很FFTFFTFFT&#xff0c;让我们来化简一下。 考虑EEE中直接将qiq_iqi​约掉&#xff0c;所以Ei∑j1i−1qj(i−j)2−∑ji1nqj(i−j)2E_i\sum_{j1}^{i-1}\frac{q_j}{(i-j)^2}-…

DevOps案例研究:庖丁解牛,剖析Google持续交付之道

内容来源&#xff1a;DevOps案例深度研究 –Google持续交付实践战队&#xff08;本文只展示部分PPT及研究成果&#xff0c;更多细节请关注案例分享会&#xff0c;及本公众号。&#xff09;本案例内容贡献者&#xff1a;姚元庆 (Topic Leader) 、任跃兵、王红阳、王晓敏、张彪本…

架构杂谈《八》Docker 架构

Docker 架构 一、Docker 引擎的三大组件1&#xff09;Docker 后台服务&#xff08;Docker Daemon&#xff09;&#xff1a;是长时间运行在后台的守护进程&#xff0c;是Docker的核心服务&#xff0c;可以通过命令dockerd与它进行交互通信。2&#xff09;REST 接口&#xff08;R…

P3723 [AH2017/HNOI2017]礼物 FFT + 式子化简

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 首先可以知道&#xff0c;我们对某个数组加上一个正数数的操作可以转换成对一个数组加上一个任意数&#xff0c;所以我们设变化量为xxx。 对于∑i1n(ai−bi)2\sum_{i1}^n(a_i-b_i)^2i1∑n​…

.net core 基于 IHostedService 实现定时任务

.net core 基于 IHostedService 实现定时任务Intro从 .net core 2.0 开始&#xff0c;开始引入 IHostedService&#xff0c;可以通过 IHostedService 来实现后台任务&#xff0c;但是只能在 WebHost 的基础上使用。从 .net core 2.1 开始微软引入通用主机( GenericHost)&#x…

nowcoder 清楚姐姐的翅膀们 F 一般图的最大匹配

传送门 文章目录题意思路&#xff1a;题意 思路&#xff1a; 这个题很容易就会掉到二分图匹配的坑里。。 但实际上这个是一个一般图匹配。 考虑将妹子拆点&#xff0c;一个入点一个出点&#xff0c;入点出点都连蝴蝶结。 我们看看最终会有三种匹配情况&#xff1a; (1)(1)(1)妹…

HDU - 7072 Boring data structure problem 双端队列 + 思维

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 你需要实现如下四个操作 q≤1e7q\le1e7q≤1e7 思路&#xff1a; 做的时候想了个链表的思路让队友写了&#xff0c;懒。 看了题解感觉题解还是很妙的。 你需要快速插入一个数在前后两端&#xff0c;还需要…

C#中谁最快:结构还是类?

前言在内存当道的日子里&#xff0c;无论什么时候都要考虑这些代码是否会影响程序性能呢&#xff1f;在现在的世界里&#xff0c;几乎不会去考虑用了几百毫秒&#xff0c;可是在特别的场景了&#xff0c;往往这几百毫米确影响了整个项目的快慢。通过了解这两者之间的性能差异&a…

阅读nopcommerce startup源码

创建一个asp.net core项目&#xff0c;可以到到startup类有两个方法// This method gets called by the runtime. Use this method to add services to the container.public void ConfigureServices(IServiceCollection services)public void Configure(IApplicationBuilder a…