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

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

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

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

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

1、A-1E协议回顾

 

上节文章完成了下面几项操作:

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

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

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

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

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

通过5个操作实例掌握了报文的结构,发送和接收都有报文的结构,但那是通过工具软件“网络调试助手”实现的,这节来通过C#代码组成报文结构并测试效果,需要用到vs2022开发工具,字节数组,socket通信等知识。

2、启动mc服务器

3、创建项目方案

打开VS2022,创建控制台项目

 

4、报文组装与测试

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

发送:01 FF 0A 00 64 00 00 00 20 44 02 00 

响应:81 00 19 00 26 00 

 

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

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

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

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

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

接收:80 00 10  

 

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

发送:03 FF 0A 00 14 00 00 00 20 44 02 00 22 00 2D 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 

接收:83 00 

6、完整代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;namespace MitSUBISHI.MCProtocol.Test
{internal class Program{static void Main(string[] args){MCTestA1E();  Console.WriteLine("执行完成!");Console.ReadKey();}private static void MCTestA1E(){// 连接Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);socket.Connect("192.168.1.3", 6000);#region 1、通过A1E进行D100地址按字进行读取2个,即读取int类型  //int len = 2;//byte[] bytes = new byte[] {//        0x01,//        0xFF,0x0A,0x00,//        0x64,0x00,0x00,0x00, // 起始地址//        0x20,0x44, // 存储区 //        (byte)(len%256),//        (byte)(len/256%256) // 读取长度//    };//socket.Send(bytes);//byte[] respBytes = new byte[len * 2 + 2];//socket.Receive(respBytes);//for (int i = 2; i < respBytes.Length; i++)//{//    //每2个字节一组//    byte[] temp = new byte[2];//    temp[0] = respBytes[i];//    temp[1] = respBytes[++i];//    Console.WriteLine(BitConverter.ToInt16(temp, 0));//字节数组转换成int16数据//}#endregion#region 2、通过A1E进行D102的双字 DWord(Float) 读取,即读取float类型--4Byte //int len = 2;//byte[] bytes = new byte[] {//    0x01,//0x01代表按批量字//    0xFF,0x0A,0x00,//    0x66,0x00,0x00,0x00, // 起始地址//    0x20,0x44, // 存储区 //    (byte)(len*2%256),//    (byte)(len*2/256%256) // 读取长度//};//socket.Send(bytes);//byte[] respBytes = new byte[len * 2 * 2 + 2];//socket.Receive(respBytes);//for (int i = 2; i < respBytes.Length; i++)//{//    //每4个字节一组//    byte[] temp = new byte[4];//    temp[0] = respBytes[i];//    temp[1] = respBytes[++i];//    temp[2] = respBytes[++i];//    temp[3] = respBytes[++i];//    Console.WriteLine(BitConverter.ToSingle(temp, 0));//字节数组转换成float数据//}#endregion#region 3、通过A1E进行位的读取M16,M区的地址要转换成16进制,即读取bool类型数据//int len = 1;//byte[] bytes = new byte[] {//    0x00,  // 代表批量位//    0xFF,0x0A,0x00,//    0x10,0x00,0x00,0x00, // 起始地址//    0x20,0x4D, // 存储区 //    (byte)(len%256),//    (byte)(len/256%256) // 读取长度//};//socket.Send(bytes);最终的数据长度是多少个字节  //int readLen = (int)Math.Ceiling(len * 1.0 / 2);//byte[] respBytes = new byte[readLen + 2];//socket.Receive(respBytes);//string binaryStr = "";//List<string> tempList = new List<string>();//for (int i = 2; i < respBytes.Length; i++)//{//    binaryStr = Convert.ToString(respBytes[i], 2).PadLeft(8, '0');//    // 每转换一次可以拿两个位信息//    tempList.Add(binaryStr.Substring(0, 4));//    tempList.Add(binaryStr.Substring(4));//}//for (int i = 0; i < len; i++)//{//    Console.WriteLine(tempList[i] == "0001");//}#endregion#region 4、通过A1E进行字的写入,即向 D20,D21写入34,45//int len = 2;//short v1 = 34, v2 = 45;//byte[] bytes = new byte[] {//    0x03,  // 代表批量位字//    0xFF,0x0A,0x00,//    0x14,0x00,0x00,0x00, // 起始地址//    0x20,0x44, // 存储区 //    // 写入长度//    (byte)(len%256),//低位//    (byte)(len/256%256), //高位//    //第一个数据//    (byte)(v1%256),//低位//    (byte)(v1/256%256),//高位//    //第二个数据//    (byte)(v2%256),//    (byte)(v2/256%256)//};//socket.Send(bytes);//int readLen = (int)Math.Ceiling(len * 1.0 / 2);//byte[] respBytes = new byte[2];//socket.Receive(respBytes);//var obj = respBytes;//if (Convert.ToInt16(respBytes[1]) == 0)//{//    Console.WriteLine("写入成功");//}#endregion#region 5、通过A1E向 D30 写入一个Float数据24.5,一个float占4个字节int len = 1;   // 一个值是4个字节    2个寄存器float value = 24.5f;byte[] bytes = new byte[] {0x03,  // 代表批量字0xFF,0x0A,0x00,0x1E,0x00,0x00,0x00, // 起始地址0x20,0x44, // 存储区 (byte)(len*2%256),(byte)(len*2/256%256), // 写入长度BitConverter.GetBytes(value)[0],BitConverter.GetBytes(value)[1],BitConverter.GetBytes(value)[2],BitConverter.GetBytes(value)[3]};socket.Send(bytes);int readLen = (int)Math.Ceiling(len * 1.0 / 2);byte[] respBytes = new byte[2];socket.Receive(respBytes);var obj = respBytes;if (Convert.ToInt16(respBytes[1]) == 0){Console.WriteLine("写入成功");}#endregion}}
}

5、小结

 

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

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

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

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

 

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

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

相关文章

MySQL-索引(INDEX)

文章目录 1. 索引概述及优劣势2. 索引结构和不同引擎对索引的支持情况2.1 Btree2.2 Hash索引 3. 索引分类4. 索引语法5. 索引在什么情况下会失效&#xff1f;5.1 最左前缀法则5.2 范围查询5.3 索引列运算5.4 头部模糊查询5.5 OR连接条件5.6 字符串不加引号5.7 数据分布影响 6. …

【Qt学习笔记】Qt Creator环境下 信号与槽 详解(自定义信号槽、断连、lambda表达式等)

文章目录 1. 信号槽概念1.1 信号的本质1.2 槽的本质1.3 标准信号槽1.4 信号槽 实例 2. 自定义信号槽2.1 自定义槽函数2.2 自定义信号2.3 带参 信号槽 3. 信号槽的意义 与 作用4. 信号槽断连 &#xff08;了解&#xff09;5. lamda表达式的使用5.1 基本用法5.2 捕获局部变量5.3 …

七、Nacos源码系列:Nacos服务发现

目录 一、服务发现 二、getServices()&#xff1a;获取服务列表 2.1、获取服务列表 2.2、总结图 三、getInstances(serviceId)&#xff1a;获取服务实例列表 3.1、从缓存中获取服务信息 3.2、缓存为空&#xff0c;执行订阅服务 3.2.1、调度更新&#xff0c;往线程池中…

【VTKExamples::PolyData】第二十三期 InterpolateMeshOnGrid

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享VTK样例InterpolateMeshOnGrid,并解析接口vtkProbeFilter 、vtkWarpScalar & vtkDealuany2D等多个接口,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步!…

用友U8+OA doUpload.jsp 文件上传漏洞复现

0x01 产品简介 用友U8+ OA经过20多年的市场锤炼,不断贴近客户需求,以全新UAP为平台,应对中型及成长型企业客户群的发展,提供的是一整套企业级数智化升级解决方案,为成长型企业构建精细管理、产业链协同、社交化运营为一体的企业互联网经营管理平台,助力企业应势而变,赢…

navigator.mediaDevices.getUserMedia获取本地音频/麦克权限并提示用户

navigator.mediaDevices.getUserMedia获取本地音频/麦克权限并提示用户 效果获取权限NotFoundErrorNotAllowedError 代码 效果 获取权限 NotFoundError NotAllowedError 代码 // 调用 captureLocalMedia()// 方法 function captureLocalMedia() {console.warn(Requesting lo…

软件应用实例分享,电玩计时计费怎么算,佳易王PS5游戏计时器系统程序教程

软件应用实例分享&#xff0c;电玩计时计费怎么算&#xff0c;佳易王PS5游戏计时器系统程序教程 一、前言 以下软件教程以 佳易王电玩计时计费管理系统软件V17.9为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 点击开始计时后&#xff0c;图片…

数字图像处理(实践篇)四十三 OpenCV-Python 使用SURF算法检测图像上的特征点的实践

目录 一 SURF算法概述 1 积分图 2 SURF算法 3 SIFT与SURF 二 涉及的函数 三 实践 一 SURF算法概述

jmeter的简单使用

1、打开jmeter 打开Jmeter 安装包&#xff0c;进入\bin 中&#xff0c;找到“ApacheJMeter.jar”或"jmeter.bat", 双击打开即可 2、建立线程组 如下图所示&#xff0c;右击TestPlan&#xff0c;点击ADD->Threads(Users)->ThreadGroup 线程组页面分析&#xf…

中科星图——如何利用中科星图智脑引擎来下载0.5米分辨率的高清遥感影像

简介 如何利用中科星图智脑引擎来下载0.5米分辨率的高清遥感影像,这里我们一旦您有GEE的基础那么还是非常好的接入到这个平台当中的,所以这里我们依旧是使用的JavaScript语言来进行编程,地球计算器-地球编程 (geovisearth.com) 这里有一个好处是这里的函数我们可以直接悬浮…

LoveWall v2.0Pro社区型校园表白墙源码

校园表白墙&#xff0c;一个接近于社区类型的表白墙&#xff0c;LoveWall。 源码特色&#xff1b; 点赞&#xff0c; 发评论&#xff0c; 发弹幕&#xff0c; 多校区&#xff0c; 分享页&#xff0c; 涉及违禁物等名词进行检测&#xff01; 安装教程: 环境要求&#xff1b;…

应用案例 | Softing dataFEED OPC Suite助力挤出机械自动化系统OPC UA升级

某知名挤出机械整体方案供应商在其最新自动化系统中采用了Softing dataFEED OPC Suite作为标准的OPC UA通信方案&#xff0c;不仅可采集多个西门子S7-1200控制器数据&#xff0c;而且为终客户提供了可靠、高性能的挤出机械自动化解决方案。 一 背景 多年前&#xff0c;该挤出机…

Codeforces Round 923 (Div. 3)D. Find the Different Ones! 双指针

Problem - D - Codeforces 双指针O(2n)&#xff0c;其实本场B题我写的是O(26n)&#xff0c;结果这道题不敢想哈哈。 题意就是给你一串数字&#xff0c;然后问区间(l , r)内是否有不同的数字&#xff0c;输出任意一组下标即可&#xff0c;没有就输出 -1 -1 所以我们看l 在 l1~…

Python(21)正则表达式中的“元字符”

大家好&#xff01;我是码银&#x1f970; 欢迎关注&#x1f970;&#xff1a; CSDN&#xff1a;码银 公众号&#xff1a;码银学编程 获取资源&#xff1a;公众号回复“python资料” 在本篇文章中介绍的是正则表达式中一部分具有特殊意义的专用字符&#xff0c;也叫做“元…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Stepper组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Stepper组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Stepper组件 鸿蒙&#xff08;HarmonyOS&#xff09;仅能包含子组件StepperIte…

服务器与电脑的区别?

目录 一、什么是服务器 二、什么是电脑 三、服务器和电脑的区别 一、什么是服务器 服务器是指一种专门提供计算和存储资源、运行特定软件服务的物理或虚拟计算机。服务器主要用于接受和处理来自客户端&#xff08;如个人电脑、手机等&#xff09;的请求&#xff0c;并向客户…

力扣精选算法100道—— 连续数组(前缀和专题)

连续数组&#xff08;前缀和专题&#xff09; 目录 &#x1f6a9;了解题意 &#x1f6a9;算法原理 ❗为什么hash设置成<0,-1>键值对 ❗与和为K的子数组比较hash的键值对 &#x1f6a9;代码实现 &#x1f6a9;了解题意 我们看到给定数组里面只有0和1&#xff0c;我们…

高斯伪谱C++封装库开源!

Windows x64/86 C无依赖运行高斯伪谱法求解最优控制问题&#xff0c;你只需要ElegantGP! Author: Y. F. Zhang His Github: https://github.com/ZYunfeii 写在前面 这个库在你下载它的那一时刻起不再依赖任何其他代码&#xff0c;直接可用来构建C的最优控制问题并进行求解。…

[C/C++] -- CMake使用

CMake&#xff08;Cross-platform Make&#xff09;是一个开源的跨平台构建工具&#xff0c;用于自动生成用于不同操作系统和编译器的构建脚本。它可以简化项目的构建过程&#xff0c;使得开发人员能够更方便地管理代码、依赖项和构建设置。 CMake 使用一个名为 CMakeLists.tx…

微服务入门篇:Nacos注册中心(Nacos安装,快速入门,多级存储,负载均衡,环境隔离,配置管理,热更新,集群搭建,nginx反向代理)

目录 1.Nacos安装1.官网下载2.解压到本地3.启动nacos 2.Nacos快速入门1.在父工程中导入nacos依赖2.给子项目添加客户端依赖3.修改对应服务的配置文件4.启动服务&#xff0c;查看nacos发现情况 3.Nacos服务多级存储模型4.NacosRule负载均衡5. 服务实例的权重设置6.环境隔离&…