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、小结
到目前为止,还没有网上有哪个文章有我如此的报文分析,操作实例,一大批都是抄来抄去,仅以此文章献给最爱的粉丝,希望对各位大师有些启示。
原创真的不容易,走过路过不要错过,点赞关注收藏又圈粉,共同致富。
原创真的不容易,走过路过不要错过,点赞关注收藏又圈粉,共同致富。
原创真的不容易,走过路过不要错过,点赞关注收藏又圈粉,共同致富。
相关文章:

C#上位机与三菱PLC的通信03--MC协议之A-1E报文解析
1、MC协议帧 MC协议可以在串口通信,也可以在以太网通信,有A-1E和Qna-3E两种模式,这两种都是三菱PLC通信协议中比较常用的两种,一般我们使用比较多的是以太网通信,对于FX5U系列/Q系列/Qna系列/L系列的PLC,…...

nodeJS 的 npm 设置国内高速镜像之淘宝镜像的方法
1、我们知道 nodeJS 是老外搞出来的,服务器放在了国外,国内的小朋友访问起来会比较慢,阿里巴巴的淘宝给出了有力支持,现在我们就将 nodeJS 的镜像地址切换为国内的淘宝镜像。 2、查看当前的镜像地址: npm get registr…...
Nginx方向代理和负载均衡配置
1. Nginx介绍 2.Nginx常用命令 cd /usr/local/nginx/sbin/ ./nginx 启动 ./nginx -s stop 停止 ./nginx -s quit 安全退出 ./nginx -s reload 重新加载配置文件 如果我们修改了配置文件,就需要重新加载。 ps aux|grep nginx 查看nginx进程3.nginx配置文件 …...

贪心算法篇
“靠漫步,将生趣填饱~” 贪心算法简介? 贪心算法(Greedy Algorithm),也称为贪婪算法,是一种在解决问题时采取贪心策略的方法。其基本原理是很简单的: “在每个决策点上都选择当下看似最好的选项…...
springboot/ssm大学生就业服务平台就业招聘宣传管理系统Java系统
springboot(ssm大学生就业服务平台 就业招聘宣传管理系统Java系统 开发语言:Java 框架:springboot(可改ssm) vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql…...

上下固定中间自适应布局
实现上下固定中间自适应布局 1.通过position:absolute实现 定义如下结构 <body> <div class"container"> <div class"top"></div> <div class"center"></div> <div class"bottom&…...

3分钟部署完成Docker Registry及可视化管理工具Docker-UI
安装docker-registry 由于镜像文件会非常占用空间,因此需要选择一个磁盘充裕的位置来存放镜像数据。 这里设置为:-v /data/registry:/var/lib/registry,其中/data/registry是宿主机存放数据的位置。 docker run -d -p 5000:5000 --restart…...

【npm】修改npm全局安装包的位置路径
问题 全局安装的默认安装路径为:C:\Users\admin\AppData\Roaming\npm,缓存路径为:C:\Users\admin\AppData\Roaming\npm_cache(其中admin为自己的用户名)。 由于默认的安装路径在C盘,太浪费C盘内存啦&#…...

数据库切片大对决:ShardingSphere与Mycat技术解析
欢迎来到我的博客,代码的世界里,每一行都是一个故事 数据库切片大对决:ShardingSphere与Mycat技术解析 前言ShardingSphere与Mycat简介工作原理对比功能特性对比 前言 在数据库的舞台上,有两位颇受欢迎的明星,它们分别…...

macbook电脑如何永久删除app软件?
在使用MacBook的过程中,我们经常会下载各种App来满足日常的工作和娱乐需求。然而,随着时间的积累,这些App不仅占据了宝贵的硬盘空间,还可能拖慢电脑的运行速度。那么,如何有效地管理和删除这些不再需要的App呢…...
安卓——计算器应用(Java)
步骤 1: 设置Android Studio项目 创建一个新的Android项目,选择Java作为编程语言。 步骤 2: 设计用户界面 打开activity_main.xml文件,在res/layout目录下,设计你的计算器用户界面。这个例子使用了LinearLayout来排列两个EditText输入框和…...
【笔记】Helm-5 Chart模板指南-8 命名模板
命名模板 此时需要越过模板,开始创建其他内容了。该部分我们会看到如何在一个文件中定义 命名模板,并在其他地方使用。命名模板(有时称作一个部分或一个子模板)仅仅是在文件内部定义的模板,并使用了一个名字。有两种创…...

Github 2024-02-08 开源项目日报 Top9
根据Github Trendings的统计,今日(2024-02-08统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Ruby项目1HTML项目1Python项目1Scala项目1PLpgSQL项目1Rust项目1NASL项目1C项目1TypeScript项目1非开发语言项目…...

c语言贪食蛇游戏
演示视频 目录 一.概述 二.游戏开始前 修改控制台程序标题和大小 Win32 API GetStdHandle函数 GetConsoleCursorInfo函数和SetConsoleCursorInfo函数 SetConsoleCursorPosition函数 游戏开篇界面处理 创建地图 蛇身节点以及食物节点初始化 蛇身的初始化 整体蛇节点…...

国际物流数字化运输方式选择指南 | 箱讯科技
国际物流涉及多种运输方式,每种方式都有其独特的优势和适用场景。选择合适的运输方式对于确保货物安全、及时到达目的地并控制成本至关重要。以下是对六种主要国际运输方式的简要介绍和选择建议: 国际快递:适用于小件、高价值或急需的货物。…...
FPS游戏框架漫谈第二十天
今天我们聊的话题是: 《吃鸡中武器护甲逻辑》 当我们接到一个需求就是给我们游戏中的特定的模式指定的武器支持加护甲的功能 那么这个流程是什么样的呢? 第一步一般这个新增护甲的配置属性肯定是加载武器的Config json文件里面的呢,并且是支持…...

ChatGPT高效提问—prompt常见用法(续篇四)
ChatGPT高效提问—prompt常见用法(续篇四) 1.1 知识生成 知识生成是指使用自然语言处理技术,通过ChatGPT等AI模型生成与特定主题相关的知识、文本或回答。在知识生成过程中,模型接收prompt输入的问题、指令或上下文信息&…...

【蓝桥杯单片机记录】IO基础与LED控制
目录 一、IO基础 1.1 IAP15F2K61S2芯片原理图 1.2不同工作模式 二、新建工程的一些补充 2.1 keil中没有IAP15F2K61S2的头文件 解决:在isp软件中找到如下编辑 2.2keil中的芯片选择 2.3推荐字体 三、sbit关键字 四、LED控制 4.1原理图 4.2不能直接通过IO…...
java 回答问题
1. How do you create a variable with the numeric value 5? int x 5; 2. The value of a string variable can be surrounded by single quotes. False 3. Which method can be used to return a string in upper case letters? toUpperCase()...

彻底学会系列:一、机器学习之线性回归(一)
1.基本概念(basic concept) 线性回归: 有监督学习的一种算法。主要关注多个因变量和一个目标变量之间的关系。 因变量: 影响目标变量的因素: X 1 , X 2 . . . X_1, X_2... X1,X2... ,连续值或离散值。 目标变量: …...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...

使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...