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),用于医疗保健、运动健身、安防、工业控制、家庭娱乐等领域。在如今的物联网时代下大放异彩,扮演者重要一环ÿ…...
c语言排序算法
C语言代码示例: 冒泡排序(Bubble Sort): 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 概述 模式识别,简单来讲,就是分类问题。 模式识别应用:医学影像分析、人脸识别、车牌识别、遥感图像 2 模式分类器 分类器的分类:线性分类器、非线性分类器、最近邻分类器 2.1 分类器的训练(学习)过…...
【Prometheus|报错】Out of bounds
【背景】进入Prometheus地址的9090端口,pushgateway(0/1)error : out of bounds 【排查分析】 1、out of bounds报错,是由于Prometheus向tsdb存数据出错,与最新存数据的时间序列有问题,有可能当前时间与最…...
【音视频】Mesh、Mcu、SFU三种框架的总结
目录 三种网络场景介绍 【Mesh】 【MCU】(MultiPoint Control Unit) 【SFU】(Selective Forwarding Unit) 三种网络架构的优缺点 Mesh架构 MCU架构(MultiPoint Control Unit) SFU架构(Selective Forwarding Unit) 总结 参考文章 三种网络场景介绍 【Mesh】 Mesh架构…...
高级算法设计与分析(四) -- 贪心算法
系列文章目录 高级算法设计与分析(一) -- 算法引论 高级算法设计与分析(二) -- 递归与分治策略 高级算法设计与分析(三) -- 动态规划 高级算法设计与分析(四) -- 贪心算法 高级…...
MATLAB - 机器人逆运动学设计器(Inverse Kinematics Designer APP)
系列文章目录 前言 一、简介 通过逆运动学设计器,您可以为 URDF 机器人模型设计逆运动学求解器。您可以调整逆运动学求解器并添加约束条件,以实现所需的行为。使用该程序,您可以 从 URDF 文件或 MATLAB 工作区导入 URDF 机器人模型。调整逆…...
使用OpenCV DNN模块进行人脸检测
内容的一部分来源于贾志刚的《opencv4应用开发、入门、进阶与工程化实践》。这本书我大概看了一下,也就后面几章比较感兴趣,但是内容很少,并没有想像的那种充实。不过学习还是要学习的。 在实际工程项目中,并不是说我们将神经网络…...
C#中使用OpenCV的常用函数
以下是一些C#中使用OpenCV的常用函数例子: 1. 加载图像: using OpenCvSharp;Mat image Cv2.ImRead("path_to_your_image.jpg", ImreadModes.Color); 2. 显示图像: Cv2.NamedWindow("Image Window", WindowFlags.Nor…...
使用Swift Package Manager (SPM)实现xcframework分发
Swift Package Manager (SPM) 是苹果官方提供的用于管理 Swift 项目的依赖关系和构建过程的工具。它是一个集成在 Swift 编程语言中的包管理器,用于解决在开发过程中管理和构建包依赖项的需求。 1、上传xcframework.zip到服务端 压缩xcframeworks成一个zip包&…...
非阻塞 IO(NIO)
文章目录 非阻塞 IO(NIO)模型驱动程序应用程序模块使用 非阻塞 IO(NIO) 上一节中 https://blog.csdn.net/tyustli/article/details/135140523,使用等待队列头实现了阻塞 IO 程序使用时,阻塞 IO 和非阻塞 IO 的区别在于文件打开的时候是否使用了 O_NONB…...
Android应用-flutter使用Positioned将控件定位到底部中间
文章目录 场景描述示例解释 场景描述 要将Positioned定位到屏幕底部中间的位置,你可以使用MediaQuery来获取屏幕的高度,然后设置Positioned的bottom属性和left或right属性,一般我们left和right都会设置一个值让控制置于合适的位置࿰…...
Django 简单图书管理系统
一、图书需求 1. 书籍book_index.html中有超链接:查看所有的书籍列表book_list.html页面 2. 书籍book_list.html中显示所有的书名,有超链接:查看本书籍详情book_detail.html(通过书籍ID)页面 3. 书籍book_detail.html中书的作者和出版社&…...
C++内存管理和模板初阶
C/C内存分布 请看代码: 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(QRO)是Qt提供的一种用于实现远程对象通信的机制。 QtRO支持两种类型的通信:RPC(远程过程调用)和LPC(本地进程通信)。 RPC(远程过程调用…...
【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:启动离线集…...
leetCode算法—12. 整数转罗马数字
12. 整数转罗马数字 难度:中等 ** 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即…...
使用OpenCV4实现工业缺陷检测的六种方法
目录 1 机器视觉2 缺陷检测3 工业上常见缺陷检测方法 1 机器视觉 机器视觉是使用各种工业相机,结合传感器跟电气信号实现替代传统人工,完成对象识别、计数、测量、缺陷检测、引导定位与抓取等任务。其中工业品的缺陷检测极大的依赖人工完成,…...
Excel 获取当前行的行数
ROW() 获取当前行 ROW()1 获取当前行然后支持二次开发...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...
绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化
iOS 应用的发布流程一直是开发链路中最“苹果味”的环节:强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说,这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发(例如 Flutter、React Na…...
前端开发者常用网站
Can I use网站:一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use:Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站:MDN JavaScript权威网站:JavaScript | MDN...
ArcPy扩展模块的使用(3)
管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如,可以更新、修复或替换图层数据源,修改图层的符号系统,甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...
