C#实现三菱FX-3U SerialOverTcp

设备信息

测试结果

D值测试

 Y值写入后读取测试

 协议解析

三菱FX 3U系列PLC的通信协议

1. 每次给PLC发送指令后,必须等待PLC的应答完成才能发送下一条指令;
2. 报文都是十六进制ASCII码的形式
3. 相关指令

指令 命令码(ASCII码) 操作原件
读 0(30H) X,Y,M,S,T,C,D
写 1(31H) X,Y,M,S,T,C,D
置位 7(37H) X,Y,M,S,T,C
复位 8(38H) X,Y,M,S,T,C

地址换算:D123这个地址写入数据,那么地址为: address = 123*2 + 4096 = 4342 = 10F6
==================================================================================
读指令

上位机请求:STX(1) + CMD(1) + Address(4) + Length(2) + ETX(1) + SUM(2,从cmd到etx)

PLC响应:STX(1) + 值(n字节) + ETX(1) + SUM(2)

**********************************************************************************
例子:
X,Y,D通过相应的地址换算成新的地址

读取Y005 / Y006 bool

02 30 30 30 41 30 30 31 03 36 35 :范围(0-7 地址) 地址: A0 160
02 30 30 30 41 31 30 31 03 36 36 :范围(10-17 地址) 地址: A1 161
02 30 30 30 41 32 30 31 03 36 37 :范围(20-27 地址) 地址: A2 162

02 30 30 30 41 30 30 31 03 36 35

02 32 30 03 36 35:5亮 32 30 -> 20H -> 转二进制 0010 0000

02 36 30 03 36 39:5,6亮 36 30 -> 60H -> 转二进制 0110 0000


D123读取2个字节,short类型
新版:指令45
老版:
02 30 31 30 46 36 30 32 03 37 32
02 30 30 30 30 03 43 33 -- 值为0
02 30 31 30 30 03 43 34 -- 值为1

==================================================================================
写指令

上位机请求:STX(1) + CMD(1) + Address(4) + Length(2) + Data(4*n)+ ETX(1) + SUM(2,从cmd到etx)

PLC响应:STX(1) + 值(1字节 正确:06H;错误:15H) + ETX(1) + SUM(2)

例子:

Y006设置true
02 37 30 36 30 35 03 30 35
06

D123写入2个字节,short类型,值1

新版
0245313034304636303230313030034143
06

老版:写入值:1
02 31 31 30 46 36 30 34 30 31 30 30 30 30 30 30 03 46 36
06

================================================

核心代码

复制代码

using MelsecFxOverTcp;
using System;
using System.Net.Sockets;
using System.Text;namespace MelsecFxSerialOverTcp.Util
{class MelsecFx{string ip = string.Empty;int port = 0;int SendTimeout = 2000;int ReceiveTimeout = 2000;public MelsecFx(string ip, int port){this.ip = ip;this.port = port;}static string NotSupportedDataType => "输入的类型不支持,请重新输入";/// <summary>/// 地址解析/// </summary>static void FxAnalysisAddress(string address, ref MelsecMcDataType Content1, ref ushort Content2){switch (address[0]){case 'M':case 'm':Content1 = MelsecMcDataType.M;Content2 = Convert.ToUInt16(address.Substring(1), MelsecMcDataType.M.FromBase);break;case 'X':case 'x':Content1 = MelsecMcDataType.X;Content2 = Convert.ToUInt16(address.Substring(1), 8);break;case 'Y':case 'y':Content1 = MelsecMcDataType.Y;Content2 = Convert.ToUInt16(address.Substring(1), 8);break;case 'D':case 'd':Content1 = MelsecMcDataType.D;Content2 = Convert.ToUInt16(address.Substring(1), MelsecMcDataType.D.FromBase);break;case 'S':case 's':Content1 = MelsecMcDataType.S;Content2 = Convert.ToUInt16(address.Substring(1), MelsecMcDataType.S.FromBase);break;case 'T':case 't':if (address[1] == 'N' || address[1] == 'n'){Content1 = MelsecMcDataType.TN;Content2 = Convert.ToUInt16(address.Substring(2), MelsecMcDataType.TN.FromBase);break;}if (address[1] == 'S' || address[1] == 's'){Content1 = MelsecMcDataType.TS;Content2 = Convert.ToUInt16(address.Substring(2), MelsecMcDataType.TS.FromBase);break;}if (address[1] == 'C' || address[1] == 'c'){Content1 = MelsecMcDataType.TC;Content2 = Convert.ToUInt16(address.Substring(2), MelsecMcDataType.TC.FromBase);break;}throw new Exception(NotSupportedDataType);case 'C':case 'c':if (address[1] == 'N' || address[1] == 'n'){Content1 = MelsecMcDataType.CN;Content2 = Convert.ToUInt16(address.Substring(2), MelsecMcDataType.CN.FromBase);break;}if (address[1] == 'S' || address[1] == 's'){Content1 = MelsecMcDataType.CS;Content2 = Convert.ToUInt16(address.Substring(2), MelsecMcDataType.CS.FromBase);break;}if (address[1] == 'C' || address[1] == 'c'){Content1 = MelsecMcDataType.CC;Content2 = Convert.ToUInt16(address.Substring(2), MelsecMcDataType.CC.FromBase);break;}throw new Exception(NotSupportedDataType);default:throw new Exception(NotSupportedDataType);}}public bool ConnectServer(){bool ret = false;TcpClient client = null;try{using (client = new TcpClient(ip, port)){ret = client.Connected;client.Close();}}catch (Exception ex){}finally{if (null != client) client.Close();}return ret;}/// <summary>/// // 串口或者网口发送数据/// </summary>/// <exception cref="Exception"></exception>byte[] SendWaitResponse(byte[] data){var requestStr = DataHelper.ToHexString(data, data.Length, true);DataMgr.MainUI.AddMessage("C -> S: " + requestStr);byte[] ret = null;using (var client = new TcpClient(ip, port)){client.SendTimeout = SendTimeout;client.ReceiveTimeout = ReceiveTimeout;var netstream = client.GetStream();//netstream.Write(data, 0, data.Length);//byte[] temp = new byte[2048];int recvnum = netstream.Read(temp, 0, temp.Length);if (recvnum == 0){throw new Exception("数据接收超时");}ret = new byte[recvnum];Array.Copy(temp, 0, ret, 0, recvnum);}var responseStr = DataHelper.ToHexString(ret, ret.Length, true);DataMgr.MainUI.AddMessage("S -> C: " + responseStr);return ret;}public bool[] ReadBool(string address, int length){Console.WriteLine($"ReadBool,address={address},length={length}");MelsecMcDataType Content1 = MelsecMcDataType.M;ushort Content2 = 0;FxAnalysisAddress(address, ref Content1, ref Content2);// 地址转换ushort content = Content2;if (Content1 == MelsecMcDataType.M){content = ((content < 8000) ? ((ushort)((int)content / 8 + 256)) : ((ushort)((content - 8000) / 8 + 480)));}else if (Content1 == MelsecMcDataType.X){content = (ushort)((int)content / 8 + 128);}else if (Content1 == MelsecMcDataType.Y){content = (ushort)((int)content / 8 + 160);}else if (Content1 == MelsecMcDataType.S){content = (ushort)((int)content / 8);}else if (Content1 == MelsecMcDataType.CS){content = (ushort)((int)content / 8 + 448);}else if (Content1 == MelsecMcDataType.CC){content = (ushort)((int)content / 8 + 960);}else if (Content1 == MelsecMcDataType.TS){content = (ushort)((int)content / 8 + 192);}else{if (Content1 != MelsecMcDataType.TC){ throw new Exception("当前的类型不支持位读写");}content = (ushort)((int)content / 8 + 704);}var Content3 = (ushort)((int)Content2 % 8);ushort num = (ushort)((Content2 + length - 1) / 8 - (int)Content2 / 8 + 1);byte[] array = new byte[11]{2,48,SoftBasic.BuildAsciiBytesFrom(content)[0],SoftBasic.BuildAsciiBytesFrom(content)[1],SoftBasic.BuildAsciiBytesFrom(content)[2],SoftBasic.BuildAsciiBytesFrom(content)[3],SoftBasic.BuildAsciiBytesFrom((byte)num)[0],SoftBasic.BuildAsciiBytesFrom((byte)num)[1],3,0,0};DataHelper.FxCalculateSum(array).CopyTo(array, 9); byte[] response = SendWaitResponse(array);// **********************// Y005 or Y006 读取测试//string responseStr = "02 36 30 03 36 39";// 5亮:02 32 30 03 36 35 // 5和6亮:02 36 30 03 36 39//var response = DataHelper.ToHexByte(responseStr); var results = ExtractActualBoolData(response, Content3, length); return results;}public byte[] ReadWord(string address, ushort length, bool isNewVersion = false){Console.WriteLine($"ReadWord,address={address},length={length}");MelsecMcDataType Content1 = MelsecMcDataType.M;ushort Content2 = 0;FxAnalysisAddress(address, ref Content1, ref Content2);ushort content = Content2;if (Content1 == MelsecMcDataType.D){content = ((content < 8000) ? (isNewVersion ? ((ushort)(content * 2 + 16384)) : ((ushort)(content * 2 + 4096))) : ((ushort)((content - 8000) * 2 + 3584)));}else if (Content1 == MelsecMcDataType.CN){content = ((content < 200) ? ((ushort)(content * 2 + 2560)) : ((ushort)((content - 200) * 4 + 3072)));}else{if (Content1 != MelsecMcDataType.TN){ throw new Exception("当前的类型不支持字读写");}content = (ushort)(content * 2 + 2048);}length = (ushort)(length * 2);byte[] array;if (isNewVersion){array = new byte[13]{2,69,48,48,SoftBasic.BuildAsciiBytesFrom(content)[0],SoftBasic.BuildAsciiBytesFrom(content)[1],SoftBasic.BuildAsciiBytesFrom(content)[2],SoftBasic.BuildAsciiBytesFrom(content)[3],SoftBasic.BuildAsciiBytesFrom((byte)length)[0],SoftBasic.BuildAsciiBytesFrom((byte)length)[1],3,0,0};DataHelper.FxCalculateSum(array).CopyTo(array, 11);}else{array = new byte[11]{2,48,SoftBasic.BuildAsciiBytesFrom(content)[0],SoftBasic.BuildAsciiBytesFrom(content)[1],SoftBasic.BuildAsciiBytesFrom(content)[2],SoftBasic.BuildAsciiBytesFrom(content)[3],SoftBasic.BuildAsciiBytesFrom((byte)length)[0],SoftBasic.BuildAsciiBytesFrom((byte)length)[1],3,0,0};DataHelper.FxCalculateSum(array).CopyTo(array, 9);}//var request = DataHelper.ToHexString(array, array.Length, true);//DataMgr.MainUI.AddMessage("request:" + request);// 串口或者网口发送数据// .....// // **********************// D123 读取测试//string responseStr = "02 30 31 30 30 03 43 34";// 值为0:02 30 30 30 30 03 43 33 // 值为1:02 30 31 30 30 03 43 34//var response = DataHelper.ToHexByte(responseStr);//DataMgr.MainUI.AddMessage(responseStr);var response = SendWaitResponse(array);var results = ExtractActualData(response);return results;}public void WriteBool(string address, bool value){Console.WriteLine($"WriteBool,address={address},value={value}");MelsecMcDataType Content1 = MelsecMcDataType.M;ushort Content2 = 0;FxAnalysisAddress(address, ref Content1, ref Content2);  ushort content = Content2;if (Content1 == MelsecMcDataType.M){content = ((content < 8000) ? ((ushort)(content + 2048)) : ((ushort)(content - 8000 + 3840)));}else if (Content1 == MelsecMcDataType.S){content = content;}else if (Content1 == MelsecMcDataType.X){content = (ushort)(content + 1024);}else if (Content1 == MelsecMcDataType.Y){content = (ushort)(content + 1280);}else if (Content1 == MelsecMcDataType.CS){content = (ushort)(content + 448);}else if (Content1 == MelsecMcDataType.CC){content = (ushort)(content + 960);}else if (Content1 == MelsecMcDataType.CN){content = (ushort)(content + 3584);}else if (Content1 == MelsecMcDataType.TS){content = (ushort)(content + 192);}else if (Content1 == MelsecMcDataType.TC){content = (ushort)(content + 704);}else{if (Content1 != MelsecMcDataType.TN){// "当前的类型不支持位读写"return ;}content = (ushort)(content + 1536);}byte[] array = new byte[9]{2,(byte)(value ? 55 : 56),SoftBasic.BuildAsciiBytesFrom(content)[2],SoftBasic.BuildAsciiBytesFrom(content)[3],SoftBasic.BuildAsciiBytesFrom(content)[0],SoftBasic.BuildAsciiBytesFrom(content)[1],3,0,0};DataHelper.FxCalculateSum(array).CopyTo(array, 7);SendWaitResponse(array);}//public static void Write(string address, int value)//{//    Write(address, new int[1] { value });//}//public static void Write(string address, int[] values)//{//    Write(address, ByteTransformBase.TransByte(values));//}public void WriteWord(string address, byte[] value, bool isNewVersion = false){Console.WriteLine($"WriteBytes,address={address},value={value}");MelsecMcDataType Content1 = MelsecMcDataType.M;ushort Content2 = 0;FxAnalysisAddress(address, ref Content1, ref Content2);ushort content = Content2;if (Content1 == MelsecMcDataType.D){content = ((content < 8000) ? (isNewVersion ? ((ushort)(content * 2 + 16384)) : ((ushort)(content * 2 + 4096))) : ((ushort)((content - 8000) * 2 + 3584)));}else if (Content1 == MelsecMcDataType.CN){content = ((content < 200) ? ((ushort)(content * 2 + 2560)) : ((ushort)((content - 200) * 4 + 3072)));}else{if (Content1 != MelsecMcDataType.TN){return;// 当前的类型不支持字读写}content = (ushort)(content * 2 + 2048);}if (value != null){value = SoftBasic.BuildAsciiBytesFrom(value);}byte[] array = null;if (isNewVersion){array = new byte[13 + value.Length];array[0] = 2;array[1] = 69;array[2] = 49;array[3] = 48;array[4] = SoftBasic.BuildAsciiBytesFrom(content)[0];array[5] = SoftBasic.BuildAsciiBytesFrom(content)[1];array[6] = SoftBasic.BuildAsciiBytesFrom(content)[2];array[7] = SoftBasic.BuildAsciiBytesFrom(content)[3];array[8] = SoftBasic.BuildAsciiBytesFrom((byte)(value.Length / 2))[0];array[9] = SoftBasic.BuildAsciiBytesFrom((byte)(value.Length / 2))[1];Array.Copy(value, 0, array, 10, value.Length);array[array.Length - 3] = 3; }else{array = new byte[11 + value.Length];array[0] = 2;array[1] = 49;array[2] = SoftBasic.BuildAsciiBytesFrom(content)[0];array[3] = SoftBasic.BuildAsciiBytesFrom(content)[1];array[4] = SoftBasic.BuildAsciiBytesFrom(content)[2];array[5] = SoftBasic.BuildAsciiBytesFrom(content)[3];array[6] = SoftBasic.BuildAsciiBytesFrom((byte)(value.Length / 2))[0];array[7] = SoftBasic.BuildAsciiBytesFrom((byte)(value.Length / 2))[1];Array.Copy(value, 0, array, 8, value.Length);array[array.Length - 3] = 3;}DataHelper.FxCalculateSum(array).CopyTo(array, array.Length - 2);SendWaitResponse(array); }public static string CheckPlcReadResponse(byte[] ack){if (ack.Length == 0){return "接收的数据长度为0";}if (ack[0] == 21){return "PLC反馈的数据无效,Actual: " + SoftBasic.ByteToHexString(ack, ' ');}if (ack[0] != 2){return "PLC反馈信号错误:" + ack[0] + " Actual: " + SoftBasic.ByteToHexString(ack, ' ');}if (!DataHelper.CheckSum(ack)){return "PLC反馈报文的和校验失败!";}return string.Empty;}public static byte[] ExtractActualData(byte[] response){byte[] array = new byte[(response.Length - 4) / 2];for (int i = 0; i < array.Length; i++){byte[] bytes = new byte[2]{response[i * 2 + 1],response[i * 2 + 2]};array[i] = Convert.ToByte(Encoding.ASCII.GetString(bytes), 16);}return array;}public static bool[] ExtractActualBoolData(byte[] response, int start, int length){// 02 32 30 03 36 35 Data:20H -> 十进制32 -> 0010 0000// 02 36 30 03 36 39 Data:60H -> 十进制96 -> 0110 0000byte[] Content = ExtractActualData(response);bool[] arraybool = new bool[length];bool[] array2 = SoftBasic.ByteToBoolArray(Content, Content.Length * 8);// false false false false true false falsefor (int i = 0; i < length; i++){arraybool[i] = array2[i + start];}return arraybool;}}
}

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

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

相关文章

Selenium的xpath高级写法-实用篇

系列文章目录 提示&#xff1a;阅读本章之前&#xff0c;请先阅读目录 文章目录 系列文章目录前言获取父级获取前一个兄弟级获取后一个兄弟级获取内容包含某些内容获取内容是空消除不可见的内容 前言 获取父级 //div[text()‘我是子级’]/parent::div[text()‘我是父级’] 获取…

06 - Stream如何提高遍历集合效率?

前面我们讲过 List 集合类&#xff0c;那我想你一定也知道集合的顶端接口 Collection。 在 Java8 中&#xff0c;Collection 新增了两个流方法&#xff0c;分别是 Stream() 和 parallelStream()。 1、什么是 Stream&#xff1f; 现在很多大数据量系统中都存在分表分库的情况…

vue3部署宝塔后请求接口404以及刷新页面404的问题解决方案

技术&#xff1a;vue3.2.13 UI框架:element-plus 2.1.1 服务器&#xff1a;腾讯云Centos系统宝塔面板 Nginx:1.22.1 前提&#xff1a;宝塔面板》网站PHP项目 已经新建了项目 1.处理vue页面刷新报错404 如上图&#xff0c;在PHP网站》设置》配置文件&#xff0c;新增如下代码…

springboot 多模块 每个模块进行单独打包

springboot项目目录结构 打包模块需要进行的配置 配置文件引入打包插件 <build><finalName>api</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifac…

css3 实现文字横幅无缝滚动

css3 实现文字横幅无缝滚动 使用 css3 关键帧 keyframes 和 animation 属性实现文字横幅无缝滚动。 <template><div class"skiHallBanner"><div class"skiHallBanner-text"><span>{{ text }}</span></div></div>…

GIT-HUB上传大文件.docx

下载git Github上传大文件&#xff08;&#xff1e;25MB&#xff09;教程_UestcXiye的博客-CSDN博客 上传流程 https://blog.csdn.net/weixin_35770067/article/details/116564429?spm1001.2101.3001.6661.1&utm_mediumdistribute.pc_relevant_t0.none-task-blog-2%7Ed…

【locust】使用locust + boomer实现对接口的压测

目录 背景 环境安装 脚本编写 master slave节点&#xff08;golang/boomer&#xff09; 问题 资料获取方法 背景 很早之前&#xff0c;考虑单机执行能力&#xff0c;使用locust做过公司短信网关的压测工作&#xff0c;后来发现了一个golang版本的locust&#xff0c;性能…

windows 10 远程桌面配置

1. 修改远程桌面端口&#xff08;3389&#xff09; 打开注册表&#xff08;winr&#xff09;, 输入regedit 找到配置项【计算机\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Terminal Server\Wds\rdpwd\Tds\tcp】 &#xff0c; 可以通过搜索“Wds”快速定位。 修改端口配…

【C++】STL map和set用法基本介绍

map、set用法简介 前言正式开始set构造erasefindswapcountlower_bound 和 upper_boundlower_boundupper_bound equal_rangepair multiusetfinderasecount map构造insert[ ][ ]底层原理 multimap两道题目前K个高频单词两个数组的交集 前言 首先&#xff0c;使用map和set最少要了…

Jmeter(六) - 从入门到精通 - 建立数据库测试计划(详解教程)

1.简介 在实际工作中&#xff0c;我们经常会听到数据库的性能和稳定性等等&#xff0c;这些有时候也需要测试工程师去评估和测试&#xff0c;因此这篇文章主要介绍了jmeter连接和创建数据库测试计划的过程,在文中通过示例和代码非常详细地介绍给大家&#xff0c;希望对各位小伙…

使用idea如何生成webservice客户端

需求阐述 在和外围系统对接的时候&#xff0c;对方只给了wsdl地址&#xff0c;记得之前了解到的webservice&#xff0c;可以用idea生成客户端代码。先记录生成的步骤 使用idea如何生成webservice客户端 1.创建一个Java项目 2.第二步生成代码 我的idea再右键要生成文件目录里…

【目标检测系列】YOLOV2解读

为更好理解YOLOv2模型&#xff0c;请先移步&#xff0c;了解YOLOv1后才能更好的理解YOLOv2所做的改进。 前情回顾&#xff1a;【目标检测系列】YOLOV1解读_怀逸%的博客-CSDN博客 背景 通用的目标检测应该具备快速、准确且能过识别各种各样的目标的特点。自从引入神经网络以来&a…

【go语言学习笔记】04 Go 语言工程管理

文章目录 一、质量保证1. 单元测试1.1 定义1.2 Go 语言的单元测试1.3 单元测试覆盖率 2. 基准测试2.1 定义2.2 Go 语言的基准测试2.3 计时方法2.4 内存统计2.5 并发基准测试2.6 基准测试实战 3. 特别注意 二、性能优化1. 代码规范检查1.1 定义1.2 golangci-lint1.2.1 安装1.2.2…

【C# 基础精讲】循环语句:for、while、do-while

循环语句是C#编程中用于重复执行一段代码块的关键结构。C#支持for、while和do-while三种常见的循环语句&#xff0c;它们允许根据条件来控制代码块的重复执行。在本文中&#xff0c;我们将详细介绍这三种循环语句的语法和使用方法。 for循环 for循环是一种常见的循环结构&…

MySQL8是什么-MySQL8知识详解

从今天起&#xff0c;开始更新MySQL8的教程&#xff0c;今天更新MySQL8的第一篇文章&#xff0c;主要讲了MySQL8是什么、MySQL数据库的概念、MySQL的优势和MySQL的发展历史。 1、MySQL8是什么 MySQL 8是一个开源的关系型数据库管理系统。它是MySQL数据库的最新版本&#xff0c…

【RTT驱动框架分析06】-pwn驱动框架分析+pwm驱动实现

pwm pwm应用程序开发 访问 PWM 设备API 应用程序通过 RT-Thread 提供的 PWM 设备管理接口来访问 PWM 设备硬件&#xff0c;相关接口如下所示&#xff1a; 函数描述rt_device_find()根据 PWM 设备名称查找设备获取设备句柄rt_pwm_set()设置 PWM 周期和脉冲宽度rt_pwm_enable…

Tomcat 部署及优化

Tomcat概述 Tomcat 是 Java 语言开发的&#xff0c;Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器&#xff0c;是 Apache 软件基金会的 Jakarta 项目中的一个核心项目&#xff0c;由 Apache、Sun 和其他一些公司及个人共同开发而成。在中小型系统和并发访问用户不是很…

【腾讯云 Cloud Studio 实战训练营】基于Cloud Studio构建React完成点餐H5页面

前言 【腾讯云 Cloud Studio 实战训练营】基于Cloud Studio 构建React完成点餐H5页面一、Cloud Studio介绍1.1 Cloud Studio 是什么1.2 相关链接1.3 登录注册 二、实战练习2.1 初始化工作空间2.2 开发一个简版的点餐系统页面1. 安装 antd-mobile2. 安装 less 和 less-loader3. …

opencv基础-38 形态学操作-闭运算(先膨胀,后腐蚀)cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

闭运算是先膨胀、后腐蚀的运算&#xff0c;它有助于关闭前景物体内部的小孔&#xff0c;或去除物体上的小黑点&#xff0c;还可以将不同的前景图像进行连接。 例如&#xff0c;在图 8-17 中&#xff0c;通过先膨胀后腐蚀的闭运算去除了原始图像内部的小孔&#xff08;内部闭合的…

剑指offer39.数组中出现次数超过一半的数字

这个题非常简单&#xff0c;解法有很多种&#xff0c;我用的是HashMap记录每个元素出现的次数&#xff0c;只要次数大于数组长度的一半就返回。下面是我的代码&#xff1a; class Solution {public int majorityElement(int[] nums) {int len nums.length/2;HashMap<Integ…