当前位置: 首页 > news >正文

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 ,但这个软件返回的数据解析不正确 ,说明这软件有问题,不好,有问题需要改进,下节看我写的工具软件,比这个解析强多了。

相关文章:

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

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

Uniapp 开发 BLE

BLE 低功耗蓝牙(Bluetooth Low Energy,或称Bluetooth LE、BLE,旧商标Bluetooth Smart),用于医疗保健、运动健身、安防、工业控制、家庭娱乐等领域。在如今的物联网时代下大放异彩,扮演者重要一环&#xff…...

c语言排序算法

C语言代码示例&#xff1a; 冒泡排序&#xff08;Bubble Sort&#xff09;&#xff1a; void bubbleSort(int arr[], int n) {for (int i 0; i < n-1; i) {for (int j 0; j < n-i-1; j) {if (arr[j] > arr[j1]) {int temp arr[j];arr[j] arr[j1];arr[j1] temp;…...

【机器学习】模式识别

1 概述 模式识别&#xff0c;简单来讲&#xff0c;就是分类问题。 模式识别应用&#xff1a;医学影像分析、人脸识别、车牌识别、遥感图像 2 模式分类器 分类器的分类&#xff1a;线性分类器、非线性分类器、最近邻分类器 2.1 分类器的训练&#xff08;学习&#xff09;过…...

【Prometheus|报错】Out of bounds

【背景】进入Prometheus地址的9090端口&#xff0c;pushgateway&#xff08;0/1&#xff09;error : out of bounds 【排查分析】 1、out of bounds报错&#xff0c;是由于Prometheus向tsdb存数据出错&#xff0c;与最新存数据的时间序列有问题&#xff0c;有可能当前时间与最…...

【音视频】Mesh、Mcu、SFU三种框架的总结

目录 三种网络场景介绍 【Mesh】 【MCU】(MultiPoint Control Unit) 【SFU】(Selective Forwarding Unit) 三种网络架构的优缺点 Mesh架构 MCU架构(MultiPoint Control Unit) SFU架构(Selective Forwarding Unit) 总结 参考文章 三种网络场景介绍 【Mesh】 Mesh架构…...

高级算法设计与分析(四) -- 贪心算法

系列文章目录 高级算法设计与分析&#xff08;一&#xff09; -- 算法引论 高级算法设计与分析&#xff08;二&#xff09; -- 递归与分治策略 高级算法设计与分析&#xff08;三&#xff09; -- 动态规划 高级算法设计与分析&#xff08;四&#xff09; -- 贪心算法 高级…...

MATLAB - 机器人逆运动学设计器(Inverse Kinematics Designer APP)

系列文章目录 前言 一、简介 通过逆运动学设计器&#xff0c;您可以为 URDF 机器人模型设计逆运动学求解器。您可以调整逆运动学求解器并添加约束条件&#xff0c;以实现所需的行为。使用该程序&#xff0c;您可以 从 URDF 文件或 MATLAB 工作区导入 URDF 机器人模型。调整逆…...

使用OpenCV DNN模块进行人脸检测

内容的一部分来源于贾志刚的《opencv4应用开发、入门、进阶与工程化实践》。这本书我大概看了一下&#xff0c;也就后面几章比较感兴趣&#xff0c;但是内容很少&#xff0c;并没有想像的那种充实。不过学习还是要学习的。 在实际工程项目中&#xff0c;并不是说我们将神经网络…...

C#中使用OpenCV的常用函数

以下是一些C#中使用OpenCV的常用函数例子&#xff1a; 1. 加载图像&#xff1a; using OpenCvSharp;Mat image Cv2.ImRead("path_to_your_image.jpg", ImreadModes.Color); 2. 显示图像&#xff1a; Cv2.NamedWindow("Image Window", WindowFlags.Nor…...

使用Swift Package Manager (SPM)实现xcframework分发

Swift Package Manager (SPM) 是苹果官方提供的用于管理 Swift 项目的依赖关系和构建过程的工具。它是一个集成在 Swift 编程语言中的包管理器&#xff0c;用于解决在开发过程中管理和构建包依赖项的需求。 1、上传xcframework.zip到服务端 压缩xcframeworks成一个zip包&…...

非阻塞 IO(NIO)

文章目录 非阻塞 IO(NIO)模型驱动程序应用程序模块使用 非阻塞 IO(NIO) 上一节中 https://blog.csdn.net/tyustli/article/details/135140523&#xff0c;使用等待队列头实现了阻塞 IO 程序使用时&#xff0c;阻塞 IO 和非阻塞 IO 的区别在于文件打开的时候是否使用了 O_NONB…...

Android应用-flutter使用Positioned将控件定位到底部中间

文章目录 场景描述示例解释 场景描述 要将Positioned定位到屏幕底部中间的位置&#xff0c;你可以使用MediaQuery来获取屏幕的高度&#xff0c;然后设置Positioned的bottom属性和left或right属性&#xff0c;一般我们left和right都会设置一个值让控制置于合适的位置&#xff0…...

Django 简单图书管理系统

一、图书需求 1. 书籍book_index.html中有超链接&#xff1a;查看所有的书籍列表book_list.html页面 2. 书籍book_list.html中显示所有的书名&#xff0c;有超链接&#xff1a;查看本书籍详情book_detail.html(通过书籍ID)页面 3. 书籍book_detail.html中书的作者和出版社&…...

C++内存管理和模板初阶

C/C内存分布 请看代码&#xff1a; int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const char* pChar3 "abcd";int* ptr1 (int*)mallo…...

QtRO(Qt Remote Objects)分布式对象远程通信

一、什么是QtRO Qt Remote Objects&#xff08;QRO&#xff09;是Qt提供的一种用于实现远程对象通信的机制。 QtRO支持两种类型的通信&#xff1a;RPC&#xff08;远程过程调用&#xff09;和LPC&#xff08;本地进程通信&#xff09;。 RPC&#xff08;远程过程调用&#xf…...

【K8s】1# 使用kuboard-spray安装K8s集群

文章目录 搭建k8s集群1.推荐配置1.1.服务器配置1.2.软件版本 2.使用Kuboard-Spray安装k8s集群2.1.配置要求2.2.操作系统兼容性2.3.安装 Kuboard-Spray2.4.加载离线资源包2.5.规划并安装集群2.6.安装成功2.7.访问集群 3.涉及的命令3.1.linux 4.问题汇总Q1&#xff1a;启动离线集…...

leetCode算法—12. 整数转罗马数字

12. 整数转罗马数字 难度&#xff1a;中等 ** 罗马数字包含以下七种字符&#xff1a; I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如&#xff0c; 罗马数字 2 写做 II &#xff0c;即…...

使用OpenCV4实现工业缺陷检测的六种方法

目录 1 机器视觉2 缺陷检测3 工业上常见缺陷检测方法 1 机器视觉 机器视觉是使用各种工业相机&#xff0c;结合传感器跟电气信号实现替代传统人工&#xff0c;完成对象识别、计数、测量、缺陷检测、引导定位与抓取等任务。其中工业品的缺陷检测极大的依赖人工完成&#xff0c;…...

Excel 获取当前行的行数

ROW() 获取当前行 ROW()1 获取当前行然后支持二次开发...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...