C#上位机与三菱PLC的通信03--MC协议之A-1E报文解析

1、MC协议帧 

MC协议可以在串口通信,也可以在以太网通信,有A-1E和Qna-3E两种模式,这两种都是三菱PLC通信协议中比较常用的两种,一般我们使用比较多的是以太网通信,对于FX5U系列/Q系列/Qna系列/L系列的PLC,通常会使用QnA兼容3E帧,对于FX3U系列,我们需要加以太网模块,采用A兼容1E帧。

A-1E是三菱PLC通信协议中最早的一种,它是一种基于二进制通信协议的协议,适用于三菱FX系列PLC和A系列PLC。该协议支持点对点通信和多点通信,可以实现PLC之间的数据交换和远程监控等功能。

Qna-3E模式是三菱PLC通信协议中较新的一种,它是一种基于ASCII码通信协议的协议,适用于三菱Q系列PLC和FX5U系列PLC。该协议支持点对点通信和多点通信,可以实现PLC之间的数据交换、远程监控和远程编程等功能。

2、A-1E协议介绍

1、读取数据的报文结构

可以看到读取数据发送12个字节,响应4个字节,各个字节的意义如下(0x表示16进制),注意响应并不一定是4个字节,如果读取长度不是一个,则响应肯定大于4个字节,具体看后面的实例操作,总之结构就是如下表示:

 

2、写入数据的报文结构

可以看到写入数据发送14个字节,响应2个字节,各个字节的意义如下(0x表示16进制),注意请求不一定是14个字节,如果写入的长度不止一个长度,则报文字节肯定大于14,总之报文结构如下:

 3、软元件分类及访问规则

注意这个操作方式中的bit和word,bit就是一个位,二进制中的位bit,0或1算一个位,word叫字,一个字就16位,就是2个字节,一个字节是8位,2个字节就是16位,也就是16个bit,在C#中就是2个ascii码,比如01就是2个字节,就是一个word,简单讲就是word占2个字节,另外0X是16进制的表示。

4、命令类型(功能码,副头部)

上述不管是读取还是写入的请求报文中,第一个字节是功能码,也就是指命令类型,A-1E的命令类型具体如下:

0x00 批量位读取

0x01 批量字读取

0x02 批量位写入

0x03 批量字写入

0x04 随机位写入

0x05 随机字写入

注意响应报文中的状态码00表示正常

3、模拟器介绍

这里我们介绍两个模拟器,所讲的模拟器就是一个三菱的MC服务器,也就是说是一台虚拟的PLC,如果没有模拟器,那就需要一台真实的PLC硬件,但是FX5U之类的PLC价格要好几K以上,屌丝者成本较大,承担不起,对于很多学习者,培训者,爱好者花大洋有些心疼,所以提供2个模拟器,这个模拟器就是一台真实的PLC设备。

1、HslCommunicationDemo-v11.8.1

 这个是一个强大的工业通信工具,在业界有很高的知名度,具体信息看这个地址(  http://www.hslcommunication.cn/):

胡工科技

胡工科技

2、本人自研的模拟器,自定Logo,飞常屌,帅逼列

3、为什么要模拟器?

上面介绍的2个模拟器与三菱gx work3自带的gx simulator3的模拟器有什么不同?

simulator3是模拟运行PLC程序的,它没有提供任何外界接口供外部应用程序调用,串口也好,网口也好,都没有,也就是说外部的应用程序,java,C#,python等无法与simulator3通讯,你写一个通信程序是无法与simulator3通信,从而无法读取和写入Plc程序,当然如果你有真家伙,那是例外,所以上面的2个模拟器就是真实的虚拟PLC硬件,小伙伴们,能明白这个意思吗?

4、你有真家伙,设备PLC的TCP参数方法如下

1、下载 GX Works3

这个过程在前面的文章已介绍过。

C#上位机与三菱PLC的通信01--搭建仿真环境

2、新建工程,选择自己的 PLC 型号,这里用的是 FX5U 系列

3、设置 PLC 以太网端口

 4、测试plcl连接

5、把配置写入 PLC 

跳出弹窗,全部选择 “是”,写入完成之后需要给 PLC 断电重启 

4、工具软件

因为是需要发送tcp的报文,无论是A-1E还是Qna-3E,它们都是网络报文,需要TCP网络通信,所以这个工具软件就是发送和接收报文,从而达到分析报文的目的。这个远程主机地址就是Plc的IP地址,远程主机端口就是PLC的端口,PLC作为TCP服务器,工具软件作为TCP客户端。

TCP面向连接,提供可靠交付,有流量控制、拥塞控制面向字节流(从上层传下的数据进行分割,分割成合适运输的数据块)只能是一对一连接。 

3、A-1E报文解析

1、读取D100地址开始的2个int类型数据

 

 

发送:01 FF 0A 00 64 00 00 00 20 44 02 00,占12个字节

01:副头部,也叫功能码,也叫命令类型(0x00 批量位读取、0x01 批量字读取、0x02 批量位写入、0x03 批量字写入、0x04 随机位写入、0x05 随机字写入)

FF:PLC编号

0A 00:超时时间,超时时间是以单位:250ms。 

64 00 00 00:地址占4个字节,要读取的地址是100,换成16进制就是64,那为什么是64 00 00 00,这里需要掌握什么是小端处理,小端是三菱的数据设置方式,也有其他PLC是大端处理,大端与小端格式是什么意思,自行百度消化,小端的意思是低位放前面,高位放后面,64用4个字节来表示的话就是00 00 00 64,按小端处理的要求就是前后倒置,所以是64 00 00 00

20 44:存储区,查前面的表就是44 20,同样按小端处理,高位放后面,低位放前面,就变成了20 44。

02 00:读取2个数据,长度是2,长度占2个字节,所以是00 02,按小端处理要求就是02 00

响应:81 00 19 00 26 00 ,占6个字节

81:副头部
00:状态码,表示正常
19 00:要将1900变成0019,为什么了?刚才说了是小端处理,那么得到的数据19是低位,00是高位,所以是0019,即19,它换成10进制就是25。
26 00 :同样2600就是38 。

与实际数据一致,读取成功。

 

 2、 通过A1E进行D102的双字 DWord(Float) 读取,即读取float类型--4Byte 

 

 
发送:01 FF 0A 00 66 00 00 00 20 44 04 00  

01:副头部,也叫功能码,也叫命令类型(0x00 批量位读取、0x01 批量字读取、0x02 批量位写入、0x03 批量字写入、0x04 随机位写入、0x05 随机字写入)

FF:PLC编号

0A 00:超时时间,超时时间是以单位:250ms。 

66 00 00 00:地址占4个字节,要读取的地址是102,换成16进制就是66 

20 44:存储区,查前面的表就是44 20,同样按小端处理,高位放后面,低位放前面,就变成了20 44。

04 00:读取1个float类型的数据,占4个字节,所以是00 04,按小端处理要求就是04 00,word占2个字节,float占4个字节,记住就搞定了。

接收:81 00 33 33 35 42 00 00 00 00 

81:副头部
00:状态码,表示正常
33 33 35 42:这个是字节byte,不能直接看出是45.3,它需要在程序代码中进行处理,比如代码Console.WriteLine(BitConverter.ToSingle(temp));//字节数组转换成float数据,这个工具软件不能处理,所以你看到的是33 33 35 42。

3、通过A1E进行位的读取M16,M区的地址要转换成16进制,即读取bool类型数据

发送:00 FF 0A 00 10 00 00 00 20 4D 01 00 

 00:副头部,也叫功能码,也叫命令类型(0x00 批量位读取、0x01 批量字读取、0x02 批量位写入、0x03 批量字写入、0x04 随机位写入、0x05 随机字写入)

FF:PLC编号

0A 00:超时时间,超时时间是以单位:250ms。 

10 00 00 00:地址占4个字节,要读取的地址是16,换成16进制就是10

20 4D:存储区,查前面的表就是4D 20,同样按小端处理,高位放后面,低位放前面,就变成了20 4D。

01 00:读取1个bool类型的数据,占1个字节,所以是01 00 

接收:80 00 10  
80:副头部
00:状态码,表示正常成功
10:10是一个字节,其中1就是true,后面的0不要用了,同样的,这个工具软件处理不了,需要在程序代码中处理,但结果一定是OK的。

4、通过A1E进行字的写入,即向 D20,D21写入34,45

先看报文结构,再开始搞事。

发送:03 FF 0A 00 14 00 00 00 20 44 02 00 22 00 2D 00  

03:副头部,也叫功能码,也叫命令类型(0x00 批量位读取、0x01 批量字读取、0x02 批量位写入、0x03 批量字写入、0x04 随机位写入、0x05 随机字写入)

FF:PLC编号

0A 00:超时时间,超时时间是以单位:250ms。 

14 00 00 00:地址占4个字节,要读取的地址是20,换成16进制就是14

20 44:存储区,查前面的表就是44 20,同样按小端处理,高位放后面,低位放前面,就变成了20 44。

02 00:写入长度2个

22 00:要写入的数据是34,换成16进制就是22,用2个字节表示就是0022,按小端处理要求就是2200

2D 00:要写入的数据是45,换成16进制就是2D,用2个字节表示就是002D,按小端处理要求就是2D00

接收:83 00 
83:副头部
00:状态码,表示正常成功 

5、通过A1E向 D30 写入一个Float数据24.5,一个float占4个字节

 

发送:03 FF 0A 00 1E 00 00 00 20 44 02 00 00 00 C4 41 

03:副头部,也叫功能码,也叫命令类型(0x00 批量位读取、0x01 批量字读取、0x02 批量位写入、0x03 批量字写入、0x04 随机位写入、0x05 随机字写入)

FF:PLC编号

0A 00:超时时间,超时时间是以单位:250ms。 

1E 00 00 00:地址占4个字节,要读取的地址是30,换成16进制就是1E

20 44:存储区,查前面的表就是44 20,同样按小端处理,高位放后面,低位放前面,就变成了20 44。

02 00:写入长度2个,为什么不是01而是02,因为float占2个word的长度。

00 00 C4 41:要写入的数据是24.5,换成字节就是C4 41 

接收:83 00 

83:副头部
00:状态码,表示正常成功 

4、小结

 到目前为止,还没有网上有哪个文章有我如此的报文分析,操作实例,一大批都是抄来抄去,仅以此文章献给最爱的粉丝,希望对各位大师有些启示。

原创真的不容易,走过路过不要错过,点赞关注收藏又圈粉,共同致富。

原创真的不容易,走过路过不要错过,点赞关注收藏又圈粉,共同致富。

原创真的不容易,走过路过不要错过,点赞关注收藏又圈粉,共同致富。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2775672.html

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

相关文章

目标检测 | 卷积神经网络(CNN)详细介绍及其原理详解

前言:Hello大家好,我是小哥谈。卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习模型,主要用于图像识别和计算机视觉任务。它的设计灵感来自于生物学中视觉皮层的工作原理。CNN的核心思想是通…

Stable Diffusion教程——使用TensorRT GPU加速提升Stable Diffusion出图速度

概述 Diffusion 模型在生成图像时最大的瓶颈是速度过慢的问题。为了解决这个问题,Stable Diffusion 采用了多种方式来加速图像生成,使得实时图像生成成为可能。最核心的加速是Stable Diffusion 使用了编码器将图像从原始的 3512512 大小转换为更小的 46…

Leetcode刷题笔记题解(C++):面试题 08.07. 无重复字符串的排列组合

思路:因为字符之间互不相同,故使用全排列的方式去解题; 字符串长度为n,将第一个字母分别与后面每一个字母进行交换,生成n种不同的全排列;再用第二个元素与后面每一个元素进行交换,生成n - 1种不…

Transformer的PyTorch实现之若干问题探讨(一)

《Transformer的PyTorch实现》这篇博文以一个机器翻译任务非常优雅简介的阐述了Transformer结构。在阅读时存在一些小困惑,此处权当一个记录。 1.自定义数据中enc_input、dec_input及dec_output的区别 博文中给出了两对德语翻译成英语的例子: # S: de…

《PCI Express体系结构导读》随记 —— 第II篇 第4章 PCIe总线概述(10)

接前一篇文章:《PCI Express体系结构导读》随记 —— 第II篇 第4章 PCIe总线概述(9) 4.2 PCIe体系结构的组成部件 PCIe总线作为处理器系统的局部总线,其作用与PCI总线类似,主要目的是为了连接处理器系统中的外部设备&…

Vue源码系列讲解——虚拟DOM篇【二】(Vue中的DOM-Diff)

目录 1. 前言 2. patch 3. 创建节点 4. 删除节点 5. 更新节点 6. 总结 1. 前言 在上一篇文章介绍VNode的时候我们说了,VNode最大的用途就是在数据变化前后生成真实DOM对应的虚拟DOM节点,然后就可以对比新旧两份VNode,找出差异所在&…

MATLAB知识点:使用逻辑值修改或删除矩阵元素

​讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili 节选自第3章 3.4.4 逻辑运算 3.4.4.3 使用逻辑值修改或删…

Elasticsearch(四)

是这样的前面的几篇笔记,感觉对我没有形成知识体系,感觉乱糟糟的,只是大概的了解了一些基础知识,仅此而已,而且对于这技术栈的学习也是为了在后面的java开发使用,但是这里的API学的感觉有点乱!然…

熔断机制解析:如何用Hystrix保障微服务的稳定性

微服务与系统的弹性设计 大家好,我是小黑,在讲Hystrix之前,咱们得先聊聊微服务架构。想象一下,你把一个大型应用拆成一堆小应用,每个都负责一部分功能,这就是微服务。这样做的好处是显而易见的,更新快,容错性强,每个服务可以独立部署,挺美的对吧?但是,问题也随之而…

PKI - 借助Nginx 实现Https 服务端单向认证、服务端客户端双向认证

文章目录 Openssl操系统默认的CA证书的公钥位置Nginx Https 自签证书Nginx Https 使用CA签发证书客户端使用自签证书供服务端验证客户端使用 根证书 签发客户端证书 供服务端验证 Openssl https://www.openssl.net.cn/ openssl是一个功能丰富且自包含的开源安全工具箱。 它提…

放假--寒假自学版 day1(补2.5)

fread 函数: 今日练习 C语言面试题5道~ 1. static 有什么用途?(请至少说明两种) 1) 限制变量的作用域 2) 设置变量的存储域 2. 引用与指针有什么区别? 1) 引用必须被初始化,指针不必。 2) 引用初始…

无心剑七绝《龙年大吉》

七绝龙年大吉 龙腾五岳九州圆 年吼佳音万里传 大漠苍鹰华夏梦 吉人天相铸奇缘 2024年2月8日 平水韵一先平韵 这首藏头七绝《龙年大吉》是无心剑为2024年春节所创作的诗作。2024年是农历的甲辰年,即龙年。在中国传统文化中,龙是吉祥的象征,代表…

PSM-Net根据Stereo图像生成depth图像

一、新建文件夹 在KITTI数据集下新建depth_0目录 二、激活anaconda环境 conda activate pt14py37三、修改submission.py文件 3.1 KITTI数据集路径 parser.add_argument(--datapath, default/home/njust/KITTI_DataSet/00/, helpselect model)3.2 深度图像输出路径 save…

【复现】九思OA系统 SQL注入漏洞_43

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一: 四.修复建议: 五. 搜索语法: 六.免责声明 一.概述 九思软件自主研发的iThink协同OA办公自动化系统是面向中高端企业、政府机关和事业单位、等大型企业的协同办公软件,面…

pythn-scipy 查漏补缺

1. 2. 3. 4. 5. 6. 7. 8. 9. 偏度 skewness,峰度 kurtosis

TS学习与实践

文章目录 学习资料TypeScript 介绍TypeScript 是什么?TypeScript 增加了什么?TypeScript 开发环境搭建 基本类型编译选项类声明属性属性修饰符getter 与 setter方法static 静态方法实例方法 构造函数继承 与 super抽象类接口interface 定义接口implement…

Linux操作系统基础(二):Linux操作系统概述

文章目录 Linux操作系统概述 一、Linux起源 二、Linux 的含义 三、Linux发行版 Linux操作系统概述 一、Linux起源 Linux创始人——林纳斯 托瓦兹 Linux 诞生于1991年,作者上大学期间实现的 Linux的特点:开源、免费、拥有最为庞大的源码贡献者 …

nginx+flask+Gunicorn反代理服务拿不到真实IP的解决

背景 本人在宝塔linux环境,要部署flask的简单后端并且用Ngnix反代理,用Gunicorn框架部署。(o(╥﹏╥)o中间磕磕绊绊总算部署上去了,需要了解Gunicorn怎么部署的朋友,评论区留言,我加补一篇介绍)…

VuePress + Travis CI + Github Pages 全自动上线文档

整体思路 1.Github 创建项目,本地创建切换到 docs 分支,通过 VuePress 构建文档项目(写一些文档),上传至 Github。 2.Travis CI 自动 clone 后安装依赖、编译、上传至 Github master 分支。 3.通过 GitHub Pages 功…

[UI5 常用控件] 08.Wizard,NavContainer

文章目录 前言1. Wizard1.1 基本结构1.2 属性1.2.1 Wizard:complete1.2.2 Wizard:finishButtonText1.2.3 Wizard:currentStep1.2.4 Wizard:backgroundDesign1.2.5 Wizard:enableBranching1.2.6 WizardStep:…