C#上位机与三菱PLC的通信05--MC协议之QnA-3E报文解析

2024-02-09 20:04

本文主要是介绍C#上位机与三菱PLC的通信05--MC协议之QnA-3E报文解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、MC协议回顾

MC是公开协议 ,所有报文格式都是有标准 ,MC协议可以在串口通信,也可以在以太网通信

串口:1C、2C、3C、4C

网口:4E、3E、1E

A-1E是三菱PLC通信协议中最早的一种,它是一种基于二进制通信协议的协议,适用于三菱FX系列PLC和A系列PLC。该协议支持点对点通信和多点通信,可以实现PLC之间的数据交换和远程监控等功能,该内容在前面已经介绍过,可以看这两个文章:C#上位机与三菱PLC的通信03--MC协议之A-1E报文解析-CSDN博客。

C#上位机与三菱PLC的通信04--MC协议之A-1E报文测试-CSDN博客

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

2、 Qna-3E协议介绍

 1、软元件(存储区)分类及访问规则 

注意2个问题:

1、bit和word,bit就是一个位,二进制中的位bit,0或1算一个位,word叫字,一个字就16位,就是2个字节,一个字节是8位,2个字节就是16位,也就是16个bit,简单讲就是word占2个字节,另外0X是16进制的表示,而float占4个字节。

2、小端处理

进行数据转换的时候需要注意, 西门子PLC的S7是大端处理,MC协议是小端处理,比如X区的代码是0x58 0x20,发送报文时需要变成0x20 0x58

2、命令类型

当发送报文时,命令是由主命令+子命令组合起来,比如成批读出,则是0x04 0x01 0x00 0x00,按小端处理的,所以应该是0x01 0x04 0x00 0x00。

3、模拟器介绍
 

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

 自研的模拟器,自定Logo,飞常屌,帅逼列

4、位bit与字word成批操作

骚等

5、位bit与字word随机读取

骚等

6、位bit与字word随机写入

骚等

3、Qna-3E报文解析

启动服务器

1、读字数据,读取D100开始的2个数据, short/ushort

 发送:50 00 00 FF FF 03 00 0C 00 0A 00 01 04 00 00 64 00 00 A8 02 00   
 5000,//请求副头部,固定50 00
 00,// 网络号,可变,根据PLC的设置
 FF,//PLC编号,固定值
 FF03,//目标模块IO编号,固定FF 03
 00,// 可变,目标模块站号
 0C00,  // 剩余字节长度,当前字节往后
 0A00,//PLC响应超时时间,以250ms为单位计算
 0104,// 成批读出,主命令
 0000,// 字操作
 640000,// 起始地址,100转换成16进制就是64,按小端处理占3个字节就是64 00 00 
 A8,// 区域代码 
 0200 //读取长度 

接收:D0 00 00 FF FF 03 00 06 00 00 00 23 00 1D 00
D0 00:响应副头部,固定D0 00
00:网络号
FF:PLC编号 
FF 03:目标模块IO编号,固定FF 03
00:目标模块站号 
06 00:响应数据长度,当前字节往后
00 00:结束代码,状态码,表示正常
23 00:一个Word数据,这是一个小端的格式,换成正常顺序是0023,转换成10进制就是35
1D 00:一个Word数据,这是一个小端的格式,换成正常顺序是001D,转换成10进制就是29

2、读取D102开始的1个字数据, 即float类型

发送:50 00 00 FF FF 03 00 0C 00 0A 00 01 04 00 00 66 00 00 A8 02 00  
 5000,//请求副头部,固定50 00
 00,// 网络号,可变,根据PLC的设置
 FF,//PLC编号,固定值
 FF03,//目标模块IO编号,固定FF 03
 00,// 可变,目标模块站号
 0C00,  // 剩余字节长度,当前字节往后
 0A00,//PLC响应超时时间,以250ms为单位计算
 0104,// 成批读出,主命令
 0000,// 字操作,子命令
 660000,// 起始地址102,102转换成16进制就是66,占3个字节,所以是00 00 64,然后按小端处理方式,最终就是66 00 00 。
 A8,// 区域代码 
 0200 //读取长度,为什么是2,不是1,不是一个float类型的数据吗?注意:一个float占2个长度,也就是说float占2个word的长度,通俗地说就是flaot占2个寄存器,word占1个寄存器。
 
接收:D0 00 00 FF FF 03 00 06 00 00 00 CD CC 94 41 
D0 00:响应副头部,固定D0 00
00:网络号
FF:PLC编号 
FF 03:目标模块IO编号,固定FF 03
00:目标模块站号 
06 00:响应数据长度,当前字节往后
00 00:结束代码,状态码
CD CC 94 41:一个float数据,这是一个小端的格式,转换成10进制就是18.6,这个工具软件是识别不了的,需要在程序代码中进行处理转换。 

3、读位数据,即X102开始的1个位(true/false)

发送:50 00 00 FF FF 03 00 0C 00 0A 00 01 04 01 00 02 01 00 9C 01 00  
 50,00,//请求副头部,固定50 00
 00,// 网络号,可变,根据PLC的设置
 FF,//PLC编号,固定值
 FF03,//目标模块IO编号,固定FF 03
 00,// 可变,目标模块站号
 0C00,  // 剩余字节长度,当前字节往后
 0A00,//PLC响应超时时间,以250ms为单位计算
 0104,// 成批读出,主命令
 0100,// 子命令 - 位操作 
 020100,// 起始地址,占3个字节,地址是102,用000102表示,因为是小端,前后颠倒,变成了   020100,这里的X区地址不需要转换成16进制,而是用10进制 ,注意这个坑
 9C// 区域代码 
 01,00 //读取长度 

接收:D0 00 00 FF FF 03 00 03 00 00 00 10 
D0 00:响应副头部,固定D0 00
00:网络号
FF:PLC编号 
FF 03:目标模块IO编号,固定FF 03
00:目标模块站号 
03 00:响应数据长度,当前字节往后
00 00:结束代码,状态码
10 : 这是一个小端的格式,转换成2进制00010000,前面的0001就是true

 4、读取字数据,即读取X100地址的int16类型数据,short或ushort类型的,如-79,35

发送:50 00 00 FF FF 03 00 0C 00 0A 00 01 04 00 00 00 01 00 9C 01 00  
 50,00,
 00,// 可变,根据PLC的设置
 FF,//PLC编号,固定值
 FF03,//目标模块IO编号,固定FF 03
 00,// 可变
 0C00,  // 剩余字节长度
 0A00,//超时时间
 0104,// 成批读出,主操作命令
 0000,// 子命令 - 字操作
 000100,// 起始地址,X区地址不要转换成16进制,用来的10进制,所以100用3个字节表示就是000100,小端处理前后倒置就是000100
 9C,// 区域代码   X
 0100 //读取长度    

接收:D0 00 00 FF FF 03 00 04 00 00 00 EE FF 
D0 00:响应副头部,固定D0 00
00:网络号
FF:PLC编号 
FF 03:目标模块IO编号,固定FF 03
00:目标模块站号 
04 00:响应数据长度,当前字节往后
00 00:结束代码,状态码
EE FF : 这是补码格式,转换成10进制-18,工具软件处理不了这个,需要在程序中处理

5、写入字数据,即按字写入地址为D200开始的2个数据short类型的,即111/222

发送:50 00 00 FF FF 03 00 10 00 0A 00 01 14 00 00 C8 00 00 A8 02 00 6F 00 DE 00 
 50 00,
 00,// 可变,根据PLC的设置
 FF,
 FF 03,
 00,// 可变
 10 00,  // 剩余字节长度
 0A 00,
 01 14,// 成批写入
 00 00,// 字操作
 C8 00 00,// 起始地址
 A8,// 区域代码 
 02 00, //写入长度

6F 00 DE 00  //具体的数据值,111转换成16进制就是6f,小端处理就是6f00,222小端处理就是de00
  

接收:D0 00 00 FF FF 03 00 02 00 00 00 
D0 00:响应副头部,固定D0 00
00:网络号
FF:PLC编号 
FF 03:目标模块IO编号,固定FF 03
00:目标模块站号 
02 00:响应数据长度,当前字节往后
00 00:结束代码,状态码

6、写入字数据,即按字写入地址为D112开始的1个数据,即float类型的13.9

发送:50 00 00 FF FF 03 00 10 00 0A 00 01 14 00 00 70 00 00 A8 02 00 66 66 5E 41  
5000,
00,// 可变,根据PLC的设置
FF,
FF03,
00,// 可变 
1000,  // 剩余字节长度
0A00,超时时间
0114,// 成批写入
0000,// 字操作 
700000,// 起始地址,占3个字节,112转换成16进制的小端格式是700000
A8,// 区域代码 
0200, //写入长度,float的长度是2个长度
66665e41//具体的数据值,float占4个字节,分别是66,66,5e,41

接收:D0 00 00 FF FF 03 00 02 00 00 00  
D0 00:响应副头部,固定D0 00
00:网络号
FF:PLC编号 
FF 03:目标模块IO编号,固定FF 03
00:目标模块站号 
02 00:响应数据长度,当前字节往后
00 00:结束代码,状态码

4、小结

创作不易,打字截图不易,整理思路不易,走过路过不要错过,点赞关注收藏又圈粉,共同致富。

创作不易,打字截图不易,整理思路不易,走过路过不要错过,点赞关注收藏又圈粉,共同致富。

创作不易,打字截图不易,整理思路不易,走过路过不要错过,点赞关注收藏又圈粉,共同致富。

欢迎转载,复制,抄习,分享,打印。

这篇关于C#上位机与三菱PLC的通信05--MC协议之QnA-3E报文解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/695167

相关文章

C# 中变量未赋值能用吗,各种类型的初始值是什么

对于一个局部变量,如果未赋值,是不能使用的 对于属性,未赋值,也能使用有系统默认值,默认值如下: 对于 int 类型,默认值是 0;对于 int? 类型,默认值是 null;对于 bool 类型,默认值是 false;对于 bool? 类型,默认值是 null;对于 string 类型,默认值是 null;对于 string? 类型,哈哈,没有这种写法,会出错;对于 DateTime 类型,默

解析 XML 和 INI

XML 1.TinyXML库 TinyXML是一个C++的XML解析库  使用介绍: https://www.cnblogs.com/mythou/archive/2011/11/27/2265169.html    使用的时候,只要把 tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.

通信系统网络架构_2.广域网网络架构

1.概述          通俗来讲,广域网是将分布于相比局域网络更广区域的计算机设备联接起来的网络。广域网由通信子网于资源子网组成。通信子网可以利用公用分组交换网、卫星通信网和无线分组交换网构建,将分布在不同地区的局域网或计算机系统互连起来,实现资源子网的共享。 2.网络组成          广域网属于多级网络,通常由骨干网、分布网、接入网组成。在网络规模较小时,可仅由骨干网和接入网组成

ROS话题通信流程自定义数据格式

ROS话题通信流程自定义数据格式 需求流程实现步骤定义msg文件编辑配置文件编译 在 ROS 通信协议中,数据载体是一个较为重要组成部分,ROS 中通过 std_msgs 封装了一些原生的数据类型,比如:String、Int32、Int64、Char、Bool、Empty… 但是,这些数据一般只包含一个 data 字段,结构的单一意味着功能上的局限性,当传输一些复杂的数据,比如:

探索蓝牙协议的奥秘:用ESP32实现高质量蓝牙音频传输

蓝牙(Bluetooth)是一种短距离无线通信技术,广泛应用于各种电子设备之间的数据传输。自1994年由爱立信公司首次提出以来,蓝牙技术已经经历了多个版本的更新和改进。本文将详细介绍蓝牙协议,并通过一个具体的项目——使用ESP32实现蓝牙音频传输,来展示蓝牙协议的实际应用及其优点。 蓝牙协议概述 蓝牙协议栈 蓝牙协议栈是蓝牙技术的核心,定义了蓝牙设备之间如何进行通信。蓝牙协议

C#中,decimal类型使用

在Microsoft SQL Server中numeric类型,在C#中使用的时候,需要用decimal类型与其对应,不能使用int等类型。 SQL:numeric C#:decimal

tf.split()函数解析

API原型(TensorFlow 1.8.0): tf.split(     value,     num_or_size_splits,     axis=0,     num=None,     name='split' ) 这个函数是用来切割张量的。输入切割的张量和参数,返回切割的结果。  value传入的就是需要切割的张量。  这个函数有两种切割的方式: 以三个维度的张量为例,比如说一

【杂记-浅谈DHCP动态主机配置协议】

DHCP动态主机配置协议 一、DHCP概述1、定义2、作用3、报文类型 二、DHCP的工作原理三、DHCP服务器的配置和管理 一、DHCP概述 1、定义 DHCP,Dynamic Host Configuration Protocol,动态主机配置协议,是一种网络协议,主要用于在IP网络中自动分配和管理IP地址以及其他网络配置参数。 2、作用 DHCP允许计算机和其他设备通

使用JWT进行安全通信

在现代Web应用中,安全通信是至关重要的。JSON Web Token(JWT)是一种流行的安全通信方式,它允许用户和服务器之间安全地传输信息。JWT是一种紧凑的、URL安全的表示方法,用于在两方之间传输信息。本文将详细介绍JWT的工作原理,并提供代码示例帮助新人理解和实现JWT。 什么是JWT? JWT是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以JSO

陀螺仪LSM6DSV16X与AI集成(8)----MotionFX库解析空间坐标

陀螺仪LSM6DSV16X与AI集成.8--MotionFX库解析空间坐标 概述视频教学样品申请源码下载开启CRC串口设置开启X-CUBE-MEMS1设置加速度和角速度量程速率选择设置FIFO速率设置FIFO时间戳批处理速率配置过滤链初始化定义MotionFX文件卡尔曼滤波算法主程序执行流程lsm6dsv16x_motion_fx_determin欧拉角简介演示 概述 本文将探讨