modbus 通信协议介绍与我的测试经验分享

1、简介

Modbus 协议是一种通信协议,用于工业自动化系统中的设备间通信。该协议最初由 Modicon 公司开发,并于 1979 年发布。
Modbus 协议通过串行通信格式进行通信,在物理层上支持 RS-232、RS-422 和 RS-485 等多种通信方式。在协议层面,Modbus 协议分为应用层、数据链路层和物理层。
应用层定义了 Modbus 消息的格式和内容,包含功能码、数据地址、数据长度以及数据内容等信息。数据链路层则负责传输 Modbus 消息,包括帧起始符、帧结束符、校验位等。物理层则定义了消息的物理传输方式,如电气特性、传输速率等。
Modbus 协议广泛应用于工业自动化系统中的各种设备之间的通信,如 PLC、传感器、伺服控制器等。它已成为一个通用的标准,被广泛采用和支持。
RS-485 通信距离可以达到 1200 米,但实际距离取决于许多因素,例如通信速度、电缆质量、环境噪声和阻抗匹配等。在高速通信和长距离通信的情况下,建议采用特殊的通信线缆并添加信号放大器以提高通信质量。此外,在布置电缆时要注意避免电缆与强电设备或其他干扰源的交叉干扰。
注释:下文描述主机(上位机),从机(下位机)

2、应用场景

目前大部分工业产品,串口有线通信基本上使用 Modbus 协议 RS-485 通信方式,实现设备与设备之间数据传输;设备与设备直接接线,接线方式很多,比如树型接线,星型接线,推荐方式为 “手拉手接线(菊花链接法)”,应用方案和场景很多,需要根据实际业务设定,以下简单介绍,熟悉的应用场景。
1、主控和线控模式:主控作为 “主”,线控作为 “从”,主控自动查询线控状态;
2、从机设备可以为同类产品,也可以不同类产品,举例子:使用 1-8 从机为温度控器,9-15 从机为混水控制器,16-20 为新风控制器等

繁杂的应用场景:

遇到这样的复杂系统测试时,首先不要慌张,先查看各个产品的通信协议,逐步拆解到每一个设备,进行单元测试,确保每一部分的功能正常和数据正常;比如首先使用 modbus poll 模拟主机设备,测试每一个设备功能是否正常,数据上报格式是否正常;再次使用 modbus Slave 模拟从机设备,查看设备实际运行逻辑是否正常,获取从机数据显示是否正常。如果在集成测试时,遇到问题时,可以使用 SSCOM 软件,查看主从机直接通信情况。

3、RS-485 通信协议基础

一、基础知识

RS485 是一个定义平衡数字多点系统中的驱动器和接收器的电气特性的标准,该标准由电信行业协会和电子工业联盟定义。使用该标准的数字通信网络能在远距离条件下以及电子噪声大的环境下有效传输信号。RS-485 使得连接本地网络以及多支路通信链路的配置成为可能。
RS485 有两线制和四线制两种接线,四线制只能实现点对点的通信方式,现很少采用,很多采用的是两线制接线方式,这种接线方式为总线式拓扑结构,在同一总线上最多可以挂接 256 个节点,挂最多少节点,决定在于芯片。
在 RS485 通信网络中一般采 用的是主从通信方式,即一个主机带多个从机。
RS485 硬件工具:

二、Modbus 协议

Modbus 协议可以说是工业自动化领域应用最为广泛的通讯协议,因为他的开放性、可扩充性和标准化使它成为一个通用工业标准。有了它,不同厂商的产品可以简单可靠的接入网络,实现系统的集中监控,分散控制功能。
在串行通信中,用 “波特率” 来描述数据的传输速率。国际上规定了一个标准波特率系列:110、300、600、1200、1800、2400、4800、9600、14.4Kbps、19.2Kbps、28.8Kbps、33.6Kbps、56Kbps。例如:9600bps,指每秒传送 9600 位,包含字符的数位和其它必须的数位,如起始位、停止位和奇偶校验位等。
编码系统:8 位二进制,十六进制 0-9,A-F
数据位: 1 起始位
8 位数据,低位先送
奇/偶校验时 1 位;无奇偶校验时 0 位
带校验时 1 位停止位;无校验时 2 位停止位
错误校验区:循环冗余校验 (CRC)
从站地址设置:信息地址包括 2 个字符 (ASCII) 或 8 位 (RTU),有效的从机设备地址范围 0-247(十进制)。

三、Modbus 的功能码


一般使用到功能码 03、06、16。

03(0x03) 功能码——查询多个寄存器

下文中所示例的发送和接收数据,其格式全部为 16 进制,例如 01 为 0x01,C5 为 0xC5
集成系统发送: 01 03 00 00 00 06 C5 C8
集成系统接收: 01 03 0C 00 00 00 02 00 19 00 01 00 00 00 00 3F 11
集成系统发送码含义:
第 1 字节(01)——空调网关设备地址(MODBUS 定义为 Slave ID),出厂默认为 01。如果是 00,表示广播
第 2 字节(03)——MODBUS 功能码,其意义为读取一系列寄存器的值。
第 3,4 字节(00 00)——从 00 00 位置开始读取一系列寄存器的值
第 5,6 字节(00 06)——从 第 3,4 字节指定的寄存器开始,共读取 00 06 个寄存器。
第 7,8 字节(C5 C8)——该帧数据的校验字节(校验方式:CRC16)
集成系统接收码含义:
第 1 字节(01)——空调网关设备地址(MODBUS 定义为 Slave ID)
第 2 字节(03)——MODBUS 功能码。
第 3 字节(0C)——对应于查询指令,空调网关共返回 0C(十进制:12)个字节的数据
第 4~15 字节 —— 空调网关返回 12 字节的被读取数据
第 16,17 字节( 3F 11)——该帧数据的校验字节(校验方式:CRC16)

06(0x06) 功能码——操作单个寄存器

01 06 0F A0 00 01 4B 3C --- 开启
01 06 0F A0 00 01 4B 3C --- 回复开启
集成系统发送码含义:
第 1 字节(01)——空调网关设备地址(MODBUS 定义为 Slave ID)
第 2 字节(06)——MODBUS 功能码,其意义为设定一个寄存器的值。
第 3,4 字节(0F A0)——从 0F A0 位置开始设定一个寄存器的值。
第 5,6 字节(00 01)——将 第 3,4 字节所指定的寄存器写入值 00 01
第 7,8 字节(4B 3C)——该帧数据的校验字节(校验方式:CRC16)
*集成系统接收码含义: *
第 1 字节(01)——空调网关设备地址(MODBUS 定义为 Slave ID)
第 2 字节(06)——MODBUS 功能码,其意义为设定一个寄存器的值。
第 3,4 字节(0F A0)——从 0F A0 位置开始设定一个寄存器的值。
第 5,6 字节(00 01)——将 第 3,4 字节所指定的寄存器写入值 00 01
第 7,8 字节(4B 3C)——该帧数据的校验字节(校验方式:CRC16)

16(0x10) 功能码——操作多个连续寄存器

01 10 0F A0 00 04 08 00 01 00 04 00 14 00 03 C0 B1
--- 同时设定 4 项参数 (开启 送风 20 度 高风) 其中温度和风向无效
01 10 0F A0 00 04 C2 FC --- 回复 4 项变更
集成系统发送码含义:
第 1 字节(01)——空调网关设备地址(MODBUS 定义为 Slave ID)
第 2 字节(10)——MODBUS 功能码,其意义为一次设定多个寄存器的值。
第 3,4 字节(0F A0)——从 0F A0 位置开始一次设定多个寄存器的值。
第 5,6 字节(00 04)——从第 3,4 字节指定位置开始,一次设定 4 个寄存器的值。
第 7 字节(08)——要设定写入的总字节数为 8( 4 个寄存器 x 2 字节/寄存器)
第 8~15 字节 ——要设定的 4 个寄存器的具体值,第 8,9 字节写入第一个寄存器,第 10, 11 字节写入第 2 个寄存器,第 12,13 字节写入第 3 个寄存器,第 14,15 字节写入第 4 个寄存器
第 16,17 字节(C0 B1)——该帧数据的校验字节(校验方式:CRC16)
集成系统接收码含义:
第 1 字节(01)——空调网关设备地址(MODBUS 定义为 Slave ID)
第 2 字节(10)——MODBUS 功能码,其意义为一次设定多个寄存器的值。
第 3,4 字节(0F A0)——从 0F A0 位置开始,一次设定多个寄存器的值。
第 5,6 字节(00 04)——从第 3,4 字节指定位置开始,一次设定 4 个寄存器的值。
第 7,8 字节(C2 FC)——该帧数据的校验字节(校验方式:CRC16)
PS:只支持修改连续的寄存器地址值;

4、测试工具介绍

一、SSCOM 软件使用分享

主要用途:通过 RS485 控制设备或者监听同路上接 N 个从机设备与主机通信
缺点:需要熟悉 modbus 协议内容,分析数据比较麻烦,需要将看到 16 进制数转为 10 进制数;


配置文件,查看产品开发协议文档
举例子:
端口号(Port):选择连接电脑 RS485 设备端口号;
波特率(Baud rate):9600,4800
数据位(Data bits): 8 位
停止位(Stop bits):1
校验(Parity):N
步骤 1:连接 RS485 工具的端口
步骤 2:设置 modbus 协议的环境参数
步骤 3:选择连接从机设备的波特率,如果手中的设备和设置的波特率不一致,会导致不能正常通信;
步骤 4:打开串口,连接设备,若提示以下信息,说明端口被占用等;


步骤 5:发送指令内容;详情查看 Modbus 的功能码讲解
举例子:02 06 10 01 00 00 DC F9 向从机地址 2,1001(开关机),设置 00(关机)
PS:工具功能比较多,不一一讲解,详情自己探索:比如 “扩展” 功能自动定时发送不同指令参数;

二、modbus Poll 软件使用分享


主要用途:代替为主机,时刻查询从机设备状态,并且实时展现
优点:参数值默认转为十进制,查看参数通俗易懂,设置参数值操作简单,支持同时查询多个设备情况,参数表支持保存下次继续使用;
缺点:设备只能为从机,若设备为主机协议,需使用 modbus Slave 软件工具测试;

工具介绍:

1、工具栏:
新键配置表、导入配置表、保存配置表、打印配置表、取消、配置从机参数、断开连接、连接设备、功能码区域(05/06/15/16/17/22/23)、TC、日志查询
2、当前寄存器地址:显示为十进制数
3、寄存器地址描述,支持自定义
4、寄存器的读取参数值

操作介绍:

第一步:设置参数值

第二步:设置从机地址和初始寄存器地址,读取参数数量

点击 Setup →Read/Write Definition


Slave ID: 当前设备的 RS485 地址,2 代表当前设备 RS485 地址为 2
Address:读取设备的初始地址,填写十进制地址,比如初始地址十六进制为 1001,转成十进制为 4097
Quantity:需读取参数数量,若超过设备参数范围,会导致参数异常的现象
ScanRate :查询参数的速度值,默认为 1000ms(此参数可能影响到设备的丢包现象)
TX :表示总共发送多少次查询指令
Err:表示返回错误值次数(丢包次数)
ID:表示当前的设备 RS485 地址
F:表示功能吗:03
SR:表示查询速率:1000ms

第三步:修改参数值

双击参数值后,会弹窗显示以下内容


举例子:修改设备开关机状态,双击开关机地址,在 Value 中填写 0-关机或者 1-开机,点击 Send 发送指令。06 和 16 分别表示功能码,需要查看设备是否支持 06 和 16 功能码。

查看日志:

在工具栏中,点击日志按钮,支持暂停日志和保存日志功能,若需要分析日志内容,可以返回查看基础讲解的 Modbus 的功能码。
日志显示数据为 16 进制数,因此需要转换为 10 进制数

通信日志监听:

在日常工作中,总是想着监听一些参数值,在一段时间中时刻变化,但又不想着时刻去记录这些数据,此软件提供日志系统,直接输出到 Excel 或者 Text;
操作步骤:Setup →Excel log 或者 log

参数值显示类型切换:

在日常工作中,遇到参数为 Bit 类型参数,如果使用十进制数查看比较麻烦,需要转换为二进制,软件支持显示类型转换;如果参数为 Bit 类型,请使用 Binary 类型

三、Modbus Slave 软件使用分享


主要用途:模拟从机设备,并且支持同时模拟多个从机设备;
优点:参数值默认转为十进制,查看参数通俗易懂,设置参数值操作简单,支持同时模拟多个从机设备情况,参数表支持保存下次继续使用;

工具介绍


1、工具栏:
新键配置表、导入配置表、保存配置表、打印配置表、配置从机参数、断开连接、连接设备
2、状态栏:
ID=10 表示模拟从机地址为 10 的设备
F = 03 表示功能码为 03


01 Coil Status 寄存器地址用于获取数字输出(Coil)的状态信息。这些数字输出通常是硬件上的继电器或开关等,可以通过 Modbus 协议进行控制。读取 01 Coil Status 寄存器地址将返回一个位图(bitmap),每个位代表一个数字输出的状态,通常为 0 或 1,表示关闭或打开。
02 Input Status 寄存器地址用于获取数字输入(Input)的状态信息。这些数字输入通常是传感器或其他设备提供的信号,可以通过 Modbus 协议获取。读取 02 Input Status 寄存器地址将返回一个位图,每个位代表一个数字输入的状态,通常为 0 或 1,表示低电平或高电平。
03 Holding Register 寄存器地址用于读取和写入模拟量输出(Holding Register)的值。这些模拟量输出通常是一些设备的状态量或控制量,可以通过 Modbus 协议进行读写操作。读取 03 Holding Register 寄存器地址将返回一个字(16 位),表示模拟量输出的当前值;写入 03 Holding Register 寄存器地址将设置模拟量输出的目标值。
04 Input Registers 寄存器地址用于读取模拟量输入(Input Registers)的值。这些模拟量输入通常是传感器或其他设备提供的模拟量信号,可以通过 Modbus 协议获取。读取 04 Input Registers 寄存器地址将返回一个字(16 位),表示模拟量输入的当前值。
3、寄存器地址描述,支持自定义
4、寄存器的写入参数值,若遇到写入的值为 Bit 类型时,选择需要参数值,右键选择 “Format” 改成 Binary


3、参数设置:


Slave ID:表示模拟从机地址
Address:表示初始地址
Quantity: 表示模拟 39 位数据
Fit ot Quantity:表示垂直显示数据

查看日志:

在工具栏 “Display“,点击 communication Traffic,支持暂停日志和保存日志功能,若需要分析日志内容,可以返回查看基础讲解的 Modbus 的功能码。
日志显示数据为 16 进制数,因此需要转换为 10 进制数

5、测试事项介绍

Modbus RS-485 通信测试方法和 APP 测试相似,比如稳定性测试,功能逻辑,参数边界值、等价值测试等;
1、RS-485 参数值输入范围仅支持-32768 到 32767 整数范围;
2、在 RS-485 修改参数时,需要结合参数公式转换,比如温度值上报 225,显示端应显示为 “22.5”℃
3、主要协议点位计量单位,比如协议中单位为 W,但是显示端(APP 或者设备)需要显示为 kW,因此 10000W,最终应该显示为 10kW
4、遇到复杂的设备系统时,比如多设备直接互相通信时,先确认每一个对接产品的功能是否正常,再组装成完整系统测试;

一、基本功能测试

产品 RS-485 协议文档中,规定当前值的类型和参数范围如下所示:
PS:DIGI1,TEMP1 定义由自己公司制定,没有统一标准
DIGI1:表示无符号 byte,单位 1,显示 123 时,数据传输是 123。
TEMP1:有符号 byte,0.1℃分辨率,公式:T*10,温度范围为-30~97℃(显示 25 度时,其协议传输的数据根据上述公式是 250;显示-25 度时,其协议传输的数据是-250;bit15 为 1 时表示负数,bit15 为 0 时,表示整数;),当该值为 32767 时表示对应传感器故障。

| Address
(10 进制) | Function | Content | | Byte length | mode | Description | Remark |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 1001 | 03/16/06 | 开关机 | | 双字节 | 读/写 | 0-关机/1-开机 | DIGI1 |
| 1002 | 03/16/06 | 设定温度 | | 双字节 | 读/写 | 5.0℃~50.0℃ | TEMP1 |

举例子:
1、设定温度类型为 “TEMP1” 类型,若需要设置温度为 25.5℃,需要在协议中输入 “255”,并同时查看界面显示值为 25.5℃;
2、设定开关机类型为 “DIGI1” 类型,若设置 1-开机,则输入 “1”,并查看界面确认设备是否开机;
3、超过范围值输入,需求不一样,呈现效果不一样;
比如需求为超过范围值时,设置成为范围值最大或者最小值,比如设定温度最小值为 5℃,最大值为 50℃,因此输入 40(4℃),会直接设定为 50(5℃),若输入为 611(61.1℃),会设定为 500(50℃);
比如需求为超过范围值时,设置成为范围值不处理,比如当前设定温度值为 200(20℃),输入 40(4℃),不接收,依然为 200(20℃);

二、通信丢包率测试

我司测试标准,查看 Err 标识数,通信在 1/100000 丢包率;

三、稳定性测试

方法一、设备为从机情况下,通过 SSCOM 软件中 “扩展” 功能,设定循环执行的指令
勾选循环发送,会无限循环发送指令
发送字符串内容,可以为读取 03 指令,写入 06 或者 16 指令,同时内容为异常值和正常值

方法二、通过编写自动化脚本,循环发送指定指令内容(后期讲解)

四、测试遇到问题及解决方案

1、短距离通信时,遇到丢包率比较高的现象

原因分析:
一、通信代码逻辑问题,初代产品时,遇到过此现象;
二、产品周围存在信号干扰;
解决方案:
一、优化代码逻辑,比如将响应时间变短;
二、使用双层的屏蔽线,或者直接将信号干扰源关闭

2、设备手拉手通信,长距离时遇到远距离的设备,通信异常

原因分析:
通信信号随着距离增加性能将降低;
解决方案:
在 485 通信距离超过 300 米的情况下,要在 485 通讯的开始端和结束端增加终端电阻或者在仅一端加电阻。


注释:图片来源电子发烧友

3、接线时遇到烧掉 RS485 芯片

原因分析:
RS485-A 和 RS485-B 接到供电口,直接烧坏芯片
解决方案:
接线时,主要 RS485-AB 口不能接到供电口,并且 RS485-A 接对应 RS485-A 口,RS485-B 接对应 RS485-B 口

4、测试业务功能时,需要记录某段时间内,点位数据变化情况

解决方案:
如果设备为从机时,使用 modbus Poll 软件中 “通信日志监听” 功能,会输出 exlce 表或者 Log 表,同时带有时间标识;比如在测试睡眠功能时,需求是每个小时都会将设定温度调节,因此使用此功能,第二天过来,将表格过滤分析,就知道测试结果。

5、遇到过主机设备,接 16 台设备超过设备会通信异常现象,都是有一些产品可以支持 32 台设备通信

原因分析:
RS-485 芯片的性能问题
解决方案:
使用高性能的 RS-485 芯片,或者限制设备仅支持设备数量;
对接设备越多,轮询时间越长,用户体验越差;目前我司产品,最多支持 32 台设备联动

6、单主控,多从机,如何让从机每一个状态都与主控同步

一、备份和同步逻辑
二、广播指令机制下发参数
三、定时查询全部设备

7、遇到设备端存在丢包或者不响应的问题

解决方案:主控存在重发机制,比如发送第一包数据,没回应,会触发重发机制,再次发送两次,判定是否 RS-485 在线(断开)

8、设备遇到数据包错位情况

举例子:主控发送 A 数据段查询,从机回应 B 数据内容
解决方案:回应的数据段中,包含当前数据段标识值,比如 A 段包中有某个点位参数中包含 A 标识符;

总结

 感谢每一个认真阅读我文章的人!!!


那么在这里我也精心准备了软件测试、自动化测试的详细资料包含:电子书,简历模块,各种工作模板,面试宝典,自学项目等。需要的点击下方名片加入群聊与我一起学习交流。谢谢大家。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python3GUI--仿win风格天气By:PyQt5

文章目录 一.前言二.展示1.首页-白色1.首页-白色22.首页-黑色3.天气预报视频4.天气资讯-白色5.天气资讯-黑色6.收藏夹-白色7.收藏夹-黑色8.搜索9.mini-白色10.mini-黑色11.光遇天气 三.心得四.总结五.参考 一&#xff…

软件设计师——计算机网络(三)

📑前言 本文主要是【计算机网络】——软件设计师——计算机网络的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 &#x1…

uniapp之屏幕右侧出现滚动条去掉、隐藏、删除【好用!】

目录 问题解决大佬地址最后 问题 解决 在最外层view上加上class“content”;输入以下样式。注意:两个都必须存在在生效。 .content {/* 跟屏幕高度一样高,不管view中有没有内容,都撑开屏幕高的高度 */height: 100vh; overflow: auto; } .content::-webkit-scrollb…

【JavaWeb】往浏览器打印一个hello world

上集:建一个web项目 第一步:建好Servlet类的文件 右键src,建一个class 就行 第二步:编代码 可以直接复制粘贴 用来测试的类 import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; //↓是注解&#xff0…

同义词替换降低论文抄袭率的有效性探讨 papergpt

大家好,今天来聊聊同义词替换降低论文抄袭率的有效性探讨,希望能给大家提供一点参考。 以下是针对论文重复率高的情况,提供一些修改建议和技巧,可以借助此类工具: 标题:同义词替换降低论文抄袭率的有效性探…

持续集成交付CICD:Jenkins使用GitLab共享库实现基于SaltStack的CD流水线部署前后端应用

目录 一、实验 1.Jenkins使用GitLab共享库实现基于SaltStack的CD流水线部署前后端应用 2.优化共享库代码 二、问题 1.Jenkins手动构建后端项目流水线报错 一、实验 1.Jenkins使用GitLab共享库实现基于SaltStack的CD流水线部署前后端应用 (1)GitLa…

云原生之深入解析Kubernetes Operator的最佳实践和最常见的问题分析

一、Kubernetes Operator 简介 Kubernetes Operator 是通过连接主 API 并 watch 时间的一组进程,一般会 watch 有限的资源类型。当相关 watch 的 event 触发的时候,operator 做出响应并执行具体的动作。这可能仅限于与主 API 交互,但通常会涉…

python快速实现简单的图片透明化

整张图片透明化的完整代码如下: import os import glob from PIL import Imagedef convert_to_transparent(image_path, output_folder):image Image.open(image_path)image image.convert("RGBA")data image.getdata()new_data []for item in data:…

verilog语法进阶-分布式ram原语

概述 官方提供的原语 RAM16X1S_1 #(.INIT(16h0000) // Initial contents of RAM) RAM16X1S_1_inst (.O(O), // RAM output.A0(A0), // RAM address[0] input.A1(A1), // RAM address[1] input.A2(A2), // RAM address[2] input.A3(A3), // RAM address[3…

SpringMVC上传下载文件解读

知识点 文件上传(File Upload): 创建一个控制器方法,使用 MultipartFile 参数来接收上传的文件。在 Spring 配置文件中配置一个 MultipartResolver,常用的实现类是 CommonsMultipartResolver。在 MultipartResolver …

PyTorch官网demo解读——第一个神经网络(1)

神经网络如此神奇,feel the magic 今天分享一下学习PyTorch官网demo的心得,原来实现一个神经网络可以如此简单/简洁/高效,同时也感慨PyTorch如此强大。 这个demo的目的是训练一个识别手写数字的模型! 先上源码: fr…

crmeb v5新增一个功能的完整示例记录

首先,需求 工作中的二开需求是这样的,修改首页的装修,并新增回收报价的功能 开始动手 第一步,我们要到后面的管理界面,去装修中修改首面的展示 首页的页面配置好之后,就要在 前端的展示程序中 配置相…

105基于matlab的阶次分析算法

基于matlab的阶次分析算法,用于变转速机械故障特征提取,可运行,包含寻找脉冲时刻,等角度时刻。数据可更换自己的,程序已调通,可直接运行。 105阶次分析变转速信号处理 (xiaohongshu.com)

二十七、读写文件

二十七、读写文件 27.1 文件类QFile #include <QCoreApplication>#include<QFile> #include<QDebug>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QFile file("D:/main.txt");if(!file.open(QIODevice::WriteOnly | QIODe…

Arrays.asList()方法:陷阱与解决之道

在Java编程中&#xff0c;Arrays类提供了一系列用于操作数组的实用方法。其中&#xff0c;​Arrays.asList()​方法是一个常用的方法&#xff0c;用于快速将数组转换为List集合。然而&#xff0c;这个方法存在一些潜在的陷阱&#xff0c;可能导致出现意外的行为。本文将介绍​A…

数据可视化---柱状图

import matplotlib.pyplot as plt import numpy as npdef plot_bar_chart(data, labels, colorsNone, title"Bar Chart", xlabel"X-Axis", ylabel"Y-Axis"):"""绘制柱状图&#xff0c;并在柱子上显示数量和比例。:param data: 包…

【C++11特性篇】C++11中新增的initializer_list——初始化的小利器(2)

前言 大家好吖&#xff0c;欢迎来到 YY 滴C11系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 一.探究std::initializer_list是什么…

OceanBase 4.2.1社区版 最小资源需求安装方式

OceanBase 4.2.1社区版 最小资源需求安装方式 资源需求 资源需求分析 observer Memory 控制参数&#xff1a; memory_limit_percentage 默认80% memory_limit 直接设定observer Memory 大小 System memory 可设为1G 租户内存:sys租户内存设为1G&#xff0c;OCP需要的租户oc…

Mac brew install youtube-dl 【 youtube 下载工具:youtube-dl 安装】

文章目录 1. 简介2. 预备3. 安装4. 命令5. 测试 1. 简介 youtube-dl - 从youtube.com或其他视频平台下载视频 https://github.com/ytdl-org/youtube-dl 2. 预备 安装并配置 git安装 brew 3. 安装 MacBook-Pro ~ % brew install youtube-dl Warning: youtube-dl has been …

【Java系列】详解多线程(三)—— 线程安全(上篇)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Java系列专栏】【JaveEE学习专栏】 本专栏旨在分享学习Java的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 一…