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

news2024/9/24 5:30:41

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

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

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

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

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://www.coloradmin.cn/o/1440332.html

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

相关文章

vue教程-介绍与使用

vue介绍 介绍 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。 安装 最简单的例子就是&#xff0c;创建一个htm…

2024年【广东省安全员B证第四批(项目负责人)】考试及广东省安全员B证第四批(项目负责人)考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 广东省安全员B证第四批&#xff08;项目负责人&#xff09;考试考前必练&#xff01;安全生产模拟考试一点通每个月更新广东省安全员B证第四批&#xff08;项目负责人&#xff09;考试题题目及答案&#xff01;多做几…

代码随想录算法训练营第二十五天 |216.组合总和III,17.电话号码的字母组合(已补充)

剪枝操作讲解&#xff1a;&#xff08;已观看&#xff09; 带你学透回溯算法-组合问题的剪枝操作&#xff08;对应力扣题目&#xff1a;77.组合&#xff09;| 回溯法精讲&#xff01;_哔哩哔哩_bilibili 216.组合总和III&#xff08;已观看&#xff09; 1、题目链接&#xf…

文件上传-Webshell

Webshell简介 webshell就是以aspphpjsp或者cgi等网页文件形式存在的一种命令执行环境&#xff0c;也可以将其称做为一种网页木马后门。 攻击者可通过这种网页后门获得网站服务器操作权限&#xff0c;控制网站服务器以进行上传下载文件、查看数据库、执行命令等… 什么是木马 …

设计模式2-对象池模式

对象池模式&#xff0c;Object Pool Pattern&#xff0c;当你的应用程序需要频繁创建和销毁某种资源&#xff08;比如数据库连接、线程、socket连接等&#xff09;时&#xff0c;Object Pool 设计模式就变得很有用。它通过预先创建一组对象并将它们保存在池中&#xff0c;以便在…

压敏电阻简介

压敏电阻 原理 压敏电阻器是一种具有瞬态电压抑制功能的元件&#xff0c;可以用来代替瞬态抑制二极管、齐纳二极管和电容器的组合。压敏电阻器可以对IC及其它设备的电路进行保护&#xff0c;防止因静电放电、浪涌及其它瞬态电流&#xff08;如雷击等&#xff09;而造成对它们…

什么是GitOps

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 GitOps 改变了软件和基础设施的管理方式&#xff0c;以 Git 作为管理和自动化应用程序和基础设施整个生命周期的中心枢纽。 它建立在版本控制、协作以及持续集成和…

axios get 请求 url 转码 空格转成+,导致请求失败(前端解决)

问题 GET 请求参数&#xff1a; URL-encoded 后&#xff1a; 浏览器将空格转成了&#xff0c;导致服务报错&#xff0c;返回 400。 解决 在请求拦截器中&#xff0c;对 params 进行处理。 axios.interceptors.request.use((config) > {let url config.url;if (config…

k8s-项目部署案例

一、容器交付流程 在k8s平台部署项目流程 在K8s部署Java网站项目 DockerFile 如果是http访问&#xff0c;需要在镜像仓库配置可信任IP 三、使用工作负载控制器部署镜像 建议至少配置两个标签 一个是声明项目类型的 一个是项目名称的 继续配置属性 资源配额 健康检查 五、使…

elk之search API

写在前面 本文看下查询相关内容&#xff0c;这也是我们在实际工作中接触的最多的&#xff0c;所以有必要好好学习下&#xff01; 1&#xff1a;查询的分类 主要分为如下2类&#xff1a; 1:基于get查询参数的URI search 2&#xff1a;基于post body的request body search&am…

机器学习1一knn算法

1.基础知识点介绍 曼哈顿距离一般是比欧式距离长的除非在一维空间 拐弯的就是曼哈顿距离 Knn查看前5行数据head()&#xff0c;info看空非空 查看特征对应的类型 Head()默认前5行&#xff0c;head&#xff08;3&#xff09;就是前3行数据 Unique()可以查看分类后的结果 csv的…

《学成在线》微服务实战项目实操笔记系列(P1~P83)【上】

史上最详细《学成在线》项目实操笔记系列【上】&#xff0c;跟视频的每一P对应&#xff0c;全系列12万字&#xff0c;涵盖详细步骤与问题的解决方案。如果你操作到某一步卡壳&#xff0c;参考这篇&#xff0c;相信会带给你极大启发。 一、前期准备 1.1 项目介绍 P2 To C面向…

Leecode之随机链表的复制

一.题目及剖析 https://leetcode.cn/problems/copy-list-with-random-pointer/ 这个题目的意思就是拷贝一份复杂链表,难点在于它的random指针所指向的空间与拷贝下来的链表之间缺少一种联系,当然可以用遍历链表的方式通过value去找那块空间,不过时间复杂度太高. 二.思路引入 …

hook函数——useState

useState useState是React中的一个Hook函数&#xff0c;用于在函数组件中添加状态。基本使用语法如下&#xff1a; const [state, setState] useState(initialState) state&#xff1a;表示当前状态的值setState&#xff1a;更新状态的函数initialState&#xff1a;初始状态…

Java基础(二十四):网络编程

Java基础系列文章 Java基础(一)&#xff1a;语言概述 Java基础(二)&#xff1a;原码、反码、补码及进制之间的运算 Java基础(三)&#xff1a;数据类型与进制 Java基础(四)&#xff1a;逻辑运算符和位运算符 Java基础(五)&#xff1a;流程控制语句 Java基础(六)&#xff1…

[Python] 函数详讲

可莉将这篇博客收录在了&#xff1a;《Python》 可莉推荐的一位优质博主&#xff1a;Keven ’ bloghttp://t.csdnimg.cn/6iwnv 跟着可莉一起学习&#xff0c;一篇文章来带你理解Python中的函数的奥秘~ 一、语法格式 定义函数 def 函数名(形参列表):#函数体return 返回值 调用函…

猫头虎分析:如何利用ChatGPT及生成式AIGC提高工作效率 ‍

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

小区创业项目推荐:小投资大回报的店铺类型

作为一位拥有5年鲜奶吧创业经验的自媒体博主&#xff0c;我深知在小区内寻找一个既小投资又能带来大回报的创业项目是多么重要。今天&#xff0c;我要为大家推荐的&#xff0c;正是这样一个项目——鲜奶吧。 一、鲜奶吧&#xff1a;小区内的健康食品新宠 随着健康饮食观念的深…

【SpringBoot】JWT令牌

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;SpringBoot ⛺️稳重求进&#xff0c;晒太阳 什么是JWT JWT简称JSON Web Token&#xff0c;也就是通过JSON形式作为Web应用的令牌&#xff0c;用于各方面之间安全的将信息作为JSON对象传输…

mac终端怎么恢复初始设置?图文教程不想看看吗?

某网友说“不小心把终端弄成了这样&#xff1f;请问该怎么办呢&#xff1f;mac终端怎么恢复初始设置&#xff1f;” 其实&#xff0c;这个问题不难&#xff0c;在终端中选择【还原初始值】即可。 Mac终端初始化具体怎么操作&#xff1f;话不多说&#xff0c;图文教程分享给大…