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

news2024/9/28 21:30:09

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.coloradmin.cn/o/1333878.html

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

相关文章

王者荣耀展示

..在写代码前要创建这些文件夹,并储存图片 代码 package com.sxt; import javax.swing.*; import java.awt.*; public class Background extends GameObject { public Background(GameFrame gameFrame) { super(gameFrame); // TODO Aut…

第5章 散列

我们在第4章讨论了查找树ADT,它允许对一组元素进行各种操作。本章讨论散列表(hash table)ADT,不过它只支持二叉查找树所允许的一部分操作。 散列表的实现常常叫作散列(hashing)。散列是一种以常数平均时间执行插入、删除和查找的技术。但是,那…

运维大模型探索之 Text2PromQL 问答机器人

作者:陈昆仪(图杨) 大家下午好,我是来自阿里云可观测团队的算法工程师陈昆仪。今天分享的主题是“和我交谈并获得您想要的PromQL”。今天我跟大家分享在将AIGC技术运用到可观测领域的探索。 今天分享主要包括5个部分:…

【Linux系统基础】(3)在Linux上部署运维监控Zabbix和Grafana

目录 运维监控Zabbix部署简介安装安装前准备 - Mysql安装Zabbix Server 和 Zabbix Agenta. 安装Zabbix yum库b. 安装Zabbix Server、前端、Agentc. 初始化Mysql数据库d. 为Zabbix Server配置数据库e. 配置Zabbix的PHP前端 配置zabbix 前端(WEB UI) 运维监…

学习在UE中通过Omniverse实现对USD文件的Live-Sync(实时同步编辑)

目标 前一篇 学习了Omniverse的一些基础概念。本篇在了解这些概念的基础上,我想体验下Omniverse的一些具体的能力,特别是 Live-Sync (实时同步) 相关的能力。 本篇实践了使用Omniverse的力量在UE中建立USD文件的 Live-Sync 编辑。由于相关的知识我是从…

将Go语言开发的Web程序部署到K8S

搭建K8S基础环境 如果已经有K8S环境的同学可以跳过,如果没有,推荐你看看我的《Ubuntu22加Minikue搭建K8S环境》,课程目录如下: Ubuntu22安装Vscode 下载:https://code.visualstudio.com/Download 安装命令&#…

Unity之DOTweenPath轨迹移动

Unity之DOTweenPath轨迹移动 一、介绍 DOTweenPath二、操作说明1、Scene View Commands2、INfo3、Tween Options4、Path Tween Options5、Path Editor Options:轨迹编辑参数,就不介绍了6、ResetPath:重置轨迹7、Events:8、WayPoin…

ioDraw AI:思维导图、流程图、序列图、类图、饼图,一应俱全

前言 在信息爆炸的时代,我们每天接收着大量的信息,如何高效地整理和呈现这些信息成为了一项重要的挑战。思维导图作为一种可视化思维工具,能够帮助我们快速构建和整理复杂的信息结构,便于我们理解和记忆。ioDraw AI绘图工具正是基…

图像ISP处理——畸变校正算法

图像畸变校正算法主要用于矫正图像中因为摄像机镜头畸变而引起的形状和尺寸变化。摄像机镜头畸变主要包括径向畸变和切向畸变。以下是一些常见的图像畸变校正算法: 多项式畸变校正法(Polynomial Distortion Correction): 原理&am…

Settings中电池选项-Android13

Settings中电池选项-Android13 1、设置中界面2、电池计算2.1 充电时间计算2.1.1 BatteryUsageStats获取2.1.2 BatteryStatsImpl计算 2.2 电池剩余使用时间2.2.1 Estimate获取2.2.2 BatteryStatsImpl计算 3、电池信息来源4、命令模拟* 日志 [电池]Android 9.0 电池未充电与充电字…

C语言:字符串字面量及其保存位置

相关阅读 C语言https://blog.csdn.net/weixin_45791458/category_12423166.html?spm1001.2014.3001.5482 虽然C语言中不存在字符串类型,但依然可以通过数组或指针的方式保存字符串,但字符串字面量却没有想象的这么简单,本文就将对此进行讨论…

Java进阶(第六期): Arrays类(数组工具)、冒泡排序、选择排序、二分查找、【正则表达式】、Java正则爬取信息

文章目录 一、Arrays1.1代码示例: 二、冒泡排序2.1 代码示例 三、选择排序3.1 代码示例 四、二分查找4.1 代码示例 (这里采用乱序数组) 五、正则表达式5.1 正则表达式的基本使用5.2 正则表达式爬取信息练习 Java进阶(第六期&#…

hash长度扩展攻击

作为一个信息安全的人,打各个学校的CTF比赛是比较重要的! 最近一个朋友发了道题目过来,发现有道题目比较有意思,这里跟大家分享下 这串代码的大致意思是: 这段代码首先引入了一个名为"flag.php"的文件&am…

redis的那些事(二)——布隆过滤器

什么是布隆过滤器? 布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。 布隆过滤器实现原理 布隆过滤器是一个bit向量或者说是一个b…

Redis基础-Redis概念及常见命令

1.nosql数据库 NoSQL数据库是一种提供了非关系型数据存储的数据库系统,与传统的关系型数据库(如SQL数据库)不同。NoSQL数据库的特点是灵活性高,能够处理结构化、半结构化或非结构化数据。它们通常用于大数据和实时Web应用。NoSQL数…

C语言之字符串数组

目录 字符串数组 读取字符串数组中字符串 注意 字符串可以用数组来表示,所以字符串的集合也可以用数组的数组(即多维数组)来表示,下面我们就来学习字符串数组。 字符串数组 类型相同的数据集合适合用数组来实现,所…

多款双向晶闸管调光电路

双向晶闸管调光控制电路原理图 交流调压是把不变的交流电压变换成有效值可调的交流电压,用一只双向晶闸管代替两只反并联晶闸管,可使电路大大简化。被广泛应用于工业加热、灯光控制、感应电动机的调速以及电解电镀的交流侧调压等场合。 用双向晶闸管组…

工具系列:TensorFlow决策森林_(3)使用dtreeviz可视化

文章目录 介绍设置安装 TF-DF 和 dtreeviz导入库 可视化分类树加载、清洗和准备数据分割训练/测试集并训练模型训练一个随机森林分类器显示决策树检查叶节点统计信息决策树如何对实例进行分类特征空间划分 可视化回归树加载、清洗和准备数据分割训练/测试集并训练模型训练一个随…

【JavaEE初阶一】线程的概念与简单创建

1. 认识线程(Thread) 1.1 关于线程 1.1.1 线程是什么 由前一节的内容可知,进程在进行频繁的创建和销毁的时候,开销比较大(主要体现在资源的申请和释放上),线程就是为了解决上述产生的问题而提…

运筹视角下,体系化学习机器学习算法原理的实践和总结

文章目录 引言目标设计目标实践文章汇总经验总结一则预告 引言 上两周总结了我在体系化学习运筹学基础知识方面的个人经验,看过那篇文章的人可能知道,今年我还花了很多时间学习机器学习中各种模型的算法原理。 在工业应用中,机器学习和运筹…