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 获取当前行然后支持二次开发...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
 
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
 
GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...
 
Java后端检查空条件查询
通过抛出运行异常:throw new RuntimeException("请输入查询条件!");BranchWarehouseServiceImpl.java // 查询试剂交易(入库/出库)记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...
 
渗透实战PortSwigger Labs指南:自定义标签XSS和SVG XSS利用
阻止除自定义标签之外的所有标签 先输入一些标签测试,说是全部标签都被禁了 除了自定义的 自定义<my-tag onmouseoveralert(xss)> <my-tag idx onfocusalert(document.cookie) tabindex1> onfocus 当元素获得焦点时(如通过点击或键盘导航&…...
 
大模型——基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程
基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程 下载安装Docker Docker官网:https://www.docker.com/ 自定义Docker安装路径 Docker默认安装在C盘,大小大概2.9G,做这行最忌讳的就是安装软件全装C盘,所以我调整了下安装路径。 新建安装目录:E:\MyS…...
 
OPENCV图形计算面积、弧长API讲解(1)
一.OPENCV图形面积、弧长计算的API介绍 之前我们已经把图形轮廓的检测、画框等功能讲解了一遍。那今天我们主要结合轮廓检测的API去计算图形的面积,这些面积可以是矩形、圆形等等。图形面积计算和弧长计算常用于车辆识别、桥梁识别等重要功能,常用的API…...
 
HTML版英语学习系统
HTML版英语学习系统 这是一个完全免费、无需安装、功能完整的英语学习工具,使用HTML CSS JavaScript实现。 功能 文本朗读练习 - 输入英文文章,系统朗读帮助练习听力和发音,适合跟读练习,模仿学习;实时词典查询 - 双…...
JS的传统写法 vs 简写形式
一、条件判断与逻辑操作 三元运算符简化条件判断 // 传统写法 let result; if (someCondition) {result yes; } else {result no; }// 简写方式 const result someCondition ? yes : no;短路求值 // 传统写法 if (condition) {doSomething(); }// 简写方式 condition &…...
