当前位置: 首页 > news >正文

springboot整合modbus实现通讯

springboot整合modbus4j实现tcp通讯

前言

本文基于springboot和modbus4j进行简单封装,达到开箱即用的目的,目前本方案仅实现了tcp通讯。代码会放在最后,按照使用方法操作后就可以直接使用

介绍

在使用本方案之前,有必要对modbus有一个简单的认知,其中包含modbus协议

Modbus通讯协议简介

Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。 [1]Modbus比其他通信协议使用的更广泛的主要原因有:

  1. 公开发表并且无版权要求
  2. 易于部署和维护
  3. 对供应商来说,修改移动本地的比特或字节没有很多限制

Modbus允许多个 (大约240个) 设备连接在同一个网络上进行通信,举个例子,一个测量温度和湿度的装置,并且将结果发送给计算机。在数据采集与监视控制系统(SCADA)中,Modbus通常用来连接监控计算机和远程终端控制系统(RTU)。

Modbus功能码(部分)

代码

名称

寄存器地址范围

位/字操作

操作数量

01

读线圈状态(Read Coils)

00001 ~ 09999

位操作

单个或多个

02

读离散输入状态(Read Discrete Inputs)

10001 ~ 19999

位操作

单个或多个

03

读保存寄存器(Read Holding Registers)

40001 ~ 49999

字操作

单个或多个

04

读输入寄存器(Read Input Registers)

30001 ~ 39999

字操作

单个或多个

05

写单个线圈(Write Single Coil)

00001 ~ 09999

字操作

单个

06

写单个保存寄存器(Write Single Register)

40001 ~ 49999

字操作

单个

Modbus仿真软件

**modbus poll:**modbus主机(master)仿真器,用于测试和调试modbus从设备。该软件支持modbus rtu、ASCII、TCP/IP。用来帮助开发人员测试modbus从设备,或者其它modbus协议的测试和仿真。它支持多文档接口,即,可以同时监视多个从设备/数据域。每个窗口简单地设定从设备ID,功能,地址,大小和轮询间隔。你可以从任意一个窗口读写寄存器和线圈。如果你想改变一个单独的寄存器,简单地双击这个值即可。或者你可以改变多个寄存器/线圈值。提供数据的多种格式方式,比如浮点、双精度、长整型(可以字节序列交换)。

**modbus slave:**modbus从设备(slave)仿真器,可以仿真32个从设备/地址域。每个接口都提供了对EXCEL报表的OLE自动化支持。主要用来模拟Modbus从站设备,接收主站的命令包,回送数据包。帮助Modbus通讯设备开发人员进行Modbus通讯协议的模拟和测试,用于模拟、测试、调试Modbus通讯设备。可以32个窗口中模拟多达32个Modbus子设备。与Modbus Poll的用户界面相同,支持功能01、02、03、04、05、06、15、16、22和23,监视串口数据。

image-20241016140552969

这两款软件请自行下载

使用方式

本方案基于springboot,可以在springboot中引入该项目后简单操作(maven安装到本地,modbus4j install > modbus-spring-boot-autoconfigure install > modbus-spring-boot-starter)直接使用,高效方便~

引入jar包
<dependency><groupId>com.dashuai</groupId><artifactId>modbus-spring-boot-starter</artifactId><version>0.0.1-SNAPSHOT</version>
</dependency>
编写配置文件

配置根据实际情况下编写,支持一下所有的配置,至于是服务器做主还是做从,根据实际情况而定

modbus:tcp:master:# 默认的主设备地址和端口default-ip: 192.168.11.180default-port: 502# 主设备的地址和端口集合,按照顺序一一对应ips:- 192.168.11.180ports:- 1502slave:# 从设备端口port: 1502encapsulated: false# 从设备详细配置process-images:# 从设备号,可创建多个- slave-id: 1# 线圈coils:# 地址位和默认值- offset: 0value: true# 离散输入状态inputs:- offset: 100value: true# 保持寄存器holding-register:# 起始地址位和寄存器个数start-offset: 200count: 100# 输入寄存器input-register:start-offset: 300count: 100- slave-id: 2coils:- offset: 0value: trueinputs:- offset: 100value: trueholding-register:start-offset: 200count: 100input-register:start-offset: 300count: 100
注入ModbusTCPMaster对象
    @Autowiredprivate ModbusTCPMaster modbusTCPMaster;
支持的方法
  1. 读取01/02/03/04功能码的数据
  2. 按照数据类型(目标类型、返回类型)直接读取
  3. 批量读取
  4. 写入数据
Master测试案例

由于是测试Modbus TCP 的通讯,所以我准备了两台机器,我本地ip是192.168.11.180,测试机器ip为192.168.11.194

Master可以理解为客户端,Slave可以理解为服务端,客户端向服务器请求(读取)数据,我在我本地和测试机器中分别启动一个modbus slave,在我本地使用当前方案进行读取

读取线圈状态

在本地中开启一个modbus slave,连接方式为TCP/IP,端口为502

image-20241017155742240

选择Setup->Slave Definition,开启一个从设备,从设备为1,功能码为01,地址位从10开始,一共2个

image-20241017160426459

设置10号地址位的值为0(false),11号地址位的值为1(true),使用以上同样的方式在192.168.11.194上设置一个从设备,端口为1502,从设备号为1,10号地址位的值为1(true),11号地址位的值为0(flase)

image-20241017160711847

测试程序配置文件,默认的master为读取我本地的数据

modbus:tcp:master:# 默认的主设备地址和端口default-ip: 192.168.11.180default-port: 502# 主设备的地址和端口集合,按照顺序一一对应ips:- 192.168.11.194ports:- 1502

注入ModbusTCPMaster对象

    @Autowiredprivate ModbusTCPMaster modbusTCPMaster;

测试方法

	@Testpublic void readCoilStatus() throws ErrorResponseException, ModbusTransportException, ModbusInitException {// 使用默认的master进行读取Boolean value = modbusTCPMaster.readCoilStatus(1, 10);System.out.println("default,slaveId:1,address:10,value = " + value);value = modbusTCPMaster.readCoilStatus(1, 11);System.out.println("default,slaveId:1,address:11,value = " + value);// 指定ip进行读取,默认的master也可以进行指定ip读取value = modbusTCPMaster.readCoilStatus("192.168.11.194", 1502, 1, 10);System.out.println("ip:192.168.11.194,port:1502,slaveId:2,address:10,value = " + value);value = modbusTCPMaster.readCoilStatus("192.168.11.194", 1502, 1, 11);System.out.println("ip:192.168.11.194,port:1502,slaveId:2,address:11,value = " + value);}

测试结果

image-20241021163937169

读取离散输入状态

在本地新建一个slave,File->New,选择Setup->Slave Definition将slaveId设置为2,选择02功能码,地址位从100开始,初始化2个寄存器,100地址位的值设置为1,101地址位的值设置为0,用同样的方式在192.168.11.194那台测试服务器上配置,地址位一样,但是值都配置为1进行测试读取

image-20241021165637473

测试方法

	@Testpublic void readInputStatus() throws ErrorResponseException, ModbusTransportException, ModbusInitException {// 使用默认的master进行读取Boolean value = modbusTCPMaster.readInputStatus(2, 100);System.out.println("default,slaveId:2,address:100,value = " + value);value = modbusTCPMaster.readInputStatus(2, 101);System.out.println("default,slaveId:2,address:101,value = " + value);// 指定ip进行读取value = modbusTCPMaster.readInputStatus("192.168.11.194", 1502, 2, 100);System.out.println("ip:192.168.11.194,port:1502,slaveId:2,address:100,value = " + value);value = modbusTCPMaster.readInputStatus("192.168.11.194", 1502, 2, 101);System.out.println("ip:192.168.11.194,port:1502,slaveId:2,address:101,value = " + value);}

测试结果

image-20241021165847599

读取保存寄存器
读取整数

在本地新建一个slave,File->New,选择Setup->Slave Definition将slaveId设置为3,选择03功能码,地址位从200开始,初始化2个寄存器,200地址位的值设置为20,201地址位的值设置为21,用同样的方式在192.168.11.194那台测试服务器上配置,地址位一样,值分别设置成30和31

image-20241021170146747

测试方法

	@Testpublic void read03Short() throws ErrorResponseException, ModbusTransportException, ModbusInitException {Short value = modbusTCPMaster.read03Short(3, 200);System.out.println("default,slaveId:3,address:200,value = " + value);value = modbusTCPMaster.read03Short(3, 201);System.out.println("default,slaveId:3,address:201,value = " + value);value = modbusTCPMaster.read03Short("192.168.11.194", 1502, 3, 200);System.out.println("ip:192.168.11.194,port:1502,slaveId:3,address:200,value = " + value);value = modbusTCPMaster.read03Short("192.168.11.194", 1502, 3, 201);System.out.println("ip:192.168.11.194,port:1502,slaveId:3,address:201,value = " + value);}

测试结果

image-20241021171146468

读取小数

在本地继续新建一个slave,File->New,选择Setup->Slave Definition将slaveId设置为4,选择03功能码,地址位从300开始,初始化4个寄存器

image-20241021172206160

按住Ctrl+A全选,点击鼠标右键,选择Format,选择Float AB CD,双击数值区域将300地址位的值设置成33.33,302地址位的数值设置成44.44,在192.168.11.194测试服务器上做同样的操作,数值分别设置成55.55和66.66

image-20241021172343483

image-20241021172607128

测试代码

	@Testpublic void read03FloatABCD() throws ErrorResponseException, ModbusTransportException, ModbusInitException {Float value = modbusTCPMaster.read03FloatABCD(4, 300);System.out.println("default,slaveId:4,address:300,value = " + value);value = modbusTCPMaster.read03FloatABCD(4, 302);System.out.println("default,slaveId:4,address:302,value = " + value);value = modbusTCPMaster.read03FloatABCD("192.168.11.194", 1502, 4, 300);System.out.println("ip:192.168.11.194,port:1502,slaveId:4,address:300,value = " + value);value = modbusTCPMaster.read03FloatABCD("192.168.11.194", 1502, 4, 302);System.out.println("ip:192.168.11.194,port:1502,slaveId:4,address:302,value = " + value);}

测试结果

image-20241021174011993

批量读取

在本地新建一个slave,File->New,选择Setup->Slave Definition将slaveId设置为5,选择03功能码,地址位从400开始,初始化5个寄存器,400地址位的值设置为0,后续5个地址的数值依次加1,分别为0、1、2、3、4,用同样的方式在192.168.11.194那台测试服务器上配置,地址位一样,值分别设置成0、11.11、22.22、33.33、44.44、55.55,批量读取支持两种方式进行

本地slave

image-20241101165518769

192.168.11.194测试机器上slave配置

image-20241101165554364

测试方法1

	@Testpublic void testBatchRead() throws ModbusTransportException, ErrorResponseException {final ArrayList<BatchReadParam> batchReadParamList = new ArrayList<>();for (int i = 0; i < 5; i++) {final BatchReadParam batchReadParam = new BatchReadParam(5, 400 + i);batchReadParamList.add(batchReadParam);}final Map<Integer, Short> resultMap = modbusTCPMaster.batchRead(batchReadParamList,DataType.TWO_BYTE_INT_SIGNED, Short.class);System.out.println("default,slaveId:5,address:400~404,resultMap = " + resultMap);}

测试结果1

image-20241101165656423

测试方法2

	@Testpublic void testBatchRead2() throws ModbusTransportException, ErrorResponseException, ModbusInitException {List<Integer> floatOffsets = Arrays.asList(400, 402, 404, 406, 408);final Map<Integer, Float> resultMap = modbusTCPMaster.batchRead("192.168.11.194", 1502,5,floatOffsets, DataType.FOUR_BYTE_FLOAT, Float.class);System.out.println("ip:192.168.11.194,port:1502,slaveId:5,address:400~408,resultMap = " + resultMap);}

测试结果2

image-20241101165752508

写入线圈状态

在本地新建一个slave,File->New,选择Setup->Slave Definition将slaveId设置为6,选择01功能码,地址位从600开始,初始化2个寄存器,用同样的方式在192.168.11.194那台测试服务器上配置,初始化的地址位一样。我们分别向本地的600地址位写入true和194上的600以及601批量写入true

本地配置

image-20241101170445460

192.168.11.194测试机器上slave配置

image-20241101170516539

测试代码1

    @Testpublic void testWriteCoil() throws ModbusTransportException {final boolean result = modbusTCPMaster.writeCoil(6, 600, true);System.out.println("default,slaveId:6,address:600,result = " + result);}

测试结果1

image-20241101170901798

测试代码2

	@Testpublic void testBatchWriteCoil() throws ModbusTransportException {final boolean[] writeValueArr = {true, true};final boolean result = modbusTCPMaster.batchWriteCoil("192.168.11.194", 1502, 6, 600, writeValueArr);System.out.println("ip:192.168.11.194,port:1502,slaveId:6,address:600~601,result = " + result);}

测试结果2

image-20241101171228623

image-20241101171243945

写入保存寄存器

在本地新建一个slave,File->New,选择Setup->Slave Definition将slaveId设置为7,选择03功能码,地址位从700开始,初始化4个寄存器,我们向本地的700地址位写入11.11

本地配置

image-20241101172924234

测试代码

    @Testpublic void testWriteHoldingRegister() throws ModbusTransportException, ErrorResponseException {modbusTCPMaster.writeHoldingRegister(7, 700, 11.11, DataType.FOUR_BYTE_FLOAT);}

测试结果

image-20241101172823442

其实还有一些方法,这里就不进行逐个测试了,有兴趣的可以自己搭建测试一下~~~

Slave测试案例

使用我本地的环境进行测试,测试在我本地启动一个slave,并初始化对应的地址位和数值,然后使用modbus poll软件进行连接和读取

测试程序配置文件(主要是slave部分)

modbus:tcp:master:# 默认的主设备地址和端口default-ip: 192.168.11.180default-port: 502# 主设备的地址和端口集合,按照顺序一一对应ips:- 192.168.11.194ports:- 1502slave:# 从设备端口port: 2502# 从设备详细配置process-images:# 从设备号,可创建多个- slave-id: 1# 线圈coils:# 地址位和默认值- offset: 1value: true# 离散输入状态inputs:- offset: 100value: true# 保持寄存器holding-register:# 起始地址位和寄存器个数start-offset: 200count: 100# 输入寄存器input-register:start-offset: 300count: 100- slave-id: 2coils:- offset: 500value: true

**解释:**我在我本地启动了2个从设备,从设备号分别为1和2,在从设备1中,我启动了线圈状态,地址位为1,默认数值为true,启动了离散输入状态,地址位为100,默认数值为true,启动了保存寄存器,起始地址位为200,一共初始化100个地址位,启动了输入寄存器,起始位置为300,也是初始化100个地址位;在从设备2中,我只启动了线圈状态,地址位为500,默认数值为true

测试代码

	@Testpublic void testModbusSlave() {System.out.println("我启动了slave~~~~~");System.out.println("modbusTCPSlave = " + modbusTCPSlave);try {Thread.sleep(600000);} catch (InterruptedException e) {e.printStackTrace();}}

测试结果

image-20241101175008614

image-20241101175117260

image-20241101175221033

image-20241101175254835

image-20241101175338392

可以看到全部都能够正常连接并读取,写入的话就不测试了

代码地址

到此结束,附上代码,请动动小手给个star,谢谢~~~

modbus4j:https://github.com/MangoAutomation/modbus4j.git

modbus-spring-boot-autoconfigure:https://gitee.com/qiu_min/modbus-spring-boot-autoconfigure.git

modbus-spring-boot-starter:https://gitee.com/qiu_min/modbus-spring-boot-starter.git

相关文章:

springboot整合modbus实现通讯

springboot整合modbus4j实现tcp通讯 前言 本文基于springboot和modbus4j进行简单封装&#xff0c;达到开箱即用的目的&#xff0c;目前本方案仅实现了tcp通讯。代码会放在最后&#xff0c;按照使用方法操作后就可以直接使用 介绍 在使用本方案之前&#xff0c;有必要对modb…...

【java面试】线程篇

1.什么是线程&#xff1f; 线程是操作系统能够进行运算调度的最小单位&#xff0c;它被包含在进程之中&#xff0c;是进程中的实际运作单位。 2.线程和进程有什么区别&#xff1f; 线程是进程的子集&#xff0c;一个进程可以有很多线程&#xff0c;每条线程并行执行不同的任…...

DeepSeek官方发布R1模型推荐设置

今年以来&#xff0c;DeepSeek便在AI领域独占鳌头&#xff0c;热度一骑绝尘。其官方App更是创造了惊人纪录&#xff0c;成为史上最快突破3000万日活的应用&#xff0c;这一成绩无疑彰显了它在大众中的超高人气与强大吸引力。一时间&#xff0c;各大AI及云服务厂商纷纷投身其中&…...

Vue CLI 配置与插件

Vue CLI 配置与插件 今天我们来聊聊 Vue CLI 的配置与插件。随着项目复杂度的增加&#xff0c;合理配置 Vue CLI 可以帮助我们更高效地管理项目&#xff0c;同时利用插件机制快速集成各种功能。下面我就和大家详细介绍如何配置 Vue CLI&#xff0c;以及如何使用和开发插件&…...

Spring Boot (maven)分页3.0版本 通用版

前言&#xff1a; 通过实践而发现真理&#xff0c;又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识&#xff0c;又从理性认识而能动地指导革命实践&#xff0c;改造主观世界和客观世界。实践、认识、再实践、再认识&#xff0c;这种形式&#xff0c;循环往…...

pip 与 conda 的故事

pip 换源 pip 官方源 -i https://pypi.python.org/simple pip 清华源 -i https://pypi.tuna.tsinghua.edu.cn/simple pip 阿里源 -i https://mirrors.aliyun.com/pypi/simple PyTorch 安装 pip3 install torch torchvision torchaudio pip3 install torch torchvision torchaud…...

清华大学KVCache.AI团队联合趋境科技联合的KTransformers开源项目为什么那么厉害

KTransformers是一个由清华大学KVAV.AI团队开发的开源项目&#xff0c;旨在优化大语言模型&#xff08;LLM&#xff09;的推理性能&#xff0c;特别是在有限显存资源下运行大型模型。以下是KTransformers的详细介绍&#xff1a; 1. 核心特点 高性能优化&#xff1a;KTransfor…...

DeepSeek 遭 DDoS 攻击背后:DDoS 攻击的 “千层套路” 与安全防御 “金钟罩”_deepseek ddos

当算力博弈升级为网络战争&#xff1a;拆解DDoS攻击背后的技术攻防战——从DeepSeek遇袭看全球网络安全新趋势 在数字化浪潮席卷全球的当下&#xff0c;网络已然成为人类社会运转的关键基础设施&#xff0c;深刻融入经济、生活、政务等各个领域。从金融交易的实时清算&#xf…...

4090单卡挑战DeepSeek r1 671b:尝试量化后的心得的分享

引言&#xff1a; 最近&#xff0c;DeepSeek-R1在完全开源的背景下&#xff0c;与OpenAI的O1推理模型展开了激烈竞争&#xff0c;引发了广泛关注。为了让更多本地用户能够运行DeepSeek&#xff0c;我们成功将R1 671B参数模型从720GB压缩至131GB&#xff0c;减少了80%&#xff…...

【动态路由】系统Web URL资源整合系列(后端技术实现)【apisix实现】

需求说明 软件功能需求&#xff1a;反向代理功能&#xff08;描述&#xff1a;apollo、eureka控、apisix、sentinel、普米、kibana、timetask、grafana、hbase、skywalking-ui、pinpoint、cmak界面、kafka-map、nacos、gateway、elasticsearch、 oa-portal 业务应用等多个web资…...

【Elasticsearch】通过运行时字段在查询阶段动态覆盖索引字段

在 Elasticsearch 中&#xff0c;Override field values at query time是指通过运行时字段&#xff08;runtime fields&#xff09;在查询阶段动态覆盖索引字段的值&#xff0c;而无需修改原始索引数据。这种功能特别适用于以下场景&#xff1a; 1. 动态修改字段值&#xff1a…...

【stm32】定时器

stm32f4xx&#xff1a; APB2 ----> TIM1,TIM8,TIM9,TIM10,TIM11 APB1 ----> TIM2,TIM3,TIM4,TIM5,TIM6,TIM7,TIM12,TIM13,TIM14 一、定时器介绍 1、基本定时器 1.1、TIM6 和 TIM7 的主要特性 ● 16 位自动重载递增计数器 ● 16 位可编程…...

滑动窗口算法篇:连续子区间与子串问题

1.滑动窗口原理 那么一谈到子区间的问题&#xff0c;我们可能会想到我们可以用我们的前缀和来应用子区间问题&#xff0c;但是这里对于子区间乃至子串问题&#xff0c;我们也可以尝试往滑动窗口的思路方向去进行一个尝试&#xff0c;那么说那么半天&#xff0c;滑动窗口是什么…...

华三交换机-链路聚合配置案例

目录 1.链路聚合简述:2.链路聚合的作用:3.链路聚合的模式:4.网络拓扑:5.实验需求:6.网络配置&#xff1a;6.1 链路聚合配置(静态聚合)6.1.1 链路聚合配置:6.1.2 查看链路聚合状态: 6.2 链路聚合配置(动态聚合)6.2.1 链路聚合配置:6.2.2 查看链路聚合状态: 7.网络连通性测试:(接…...

Qwen2-VL 的重大省级,Qwen 发布新旗舰视觉语言模型 Qwen2.5-VL

Qwen2.5-VL 是 Qwen 的新旗舰视觉语言模型&#xff0c;也是上一代 Qwen2-VL 的重大飞跃。 Qwen2.5-VL主要特点 视觉理解事物&#xff1a;Qwen2.5-VL不仅能够熟练识别花、鸟、鱼、昆虫等常见物体&#xff0c;而且还能够分析图像中的文本、图表、图标、图形和布局。 代理性&…...

关系数据库标准语言SQL

1.SOL称为结构化查询语言&#xff0c;它是由1974年由Boyce和Chamberlin提出的&#xff0c;1975年至1979年IBM公司的San Jose Research Laboratory研制了关系数据库管理系统的原型系统SystemR,并实现了这种语言。 2.SQL(Structured Ouery Language)称为结构化查询语言 3.SQL数…...

mysql8.0使用MGR实现高可用与利用MySQL Router构建读写分离MGR集群

MGR是MySQL Group Replication的缩写&#xff0c;即MySQL组复制。 在以往&#xff0c;我们一般是利用MySQL的主从复制或半同步复制来提供高可用解决方案&#xff0c;但这存在以下几个比较严重的问题&#xff1a; 主从复制间容易发生复制延迟&#xff0c;尤其是在5.6以前的版本…...

《AI大模型开发笔记》MoE模型技术对比(Mixtral,Qwen2-MoE,DeepSeek-v3)

MoE模型技术对比(Mixtral,Qwen2-MoE,DeepSeek-v3) MoE(混合专家)大模型进入爆发期!本期我们对比三大开源MoE LLM:Mixtral、Qwen2-MoE 和最新爆火的 DeepSeek-V3。从 2023 年 Mixtral 开启风潮,到 2024 年 DeepSeek-V3 让全球瞩目,MoE 模型到底经历了怎样的进化? De…...

Vue.js 组件开发深入解析:Vue 2 vs Vue 3

Vue.js 是一个渐进式框架&#xff0c;旨在通过声明式渲染和组件化开发来提高开发效率和可维护性。组件是 Vue 应用的基本组成部分&#xff0c;几乎所有的功能都可以通过组件来实现。随着 Vue 3 的发布&#xff0c;Vue.js 引入了许多新的特性&#xff0c;使得组件的开发变得更加…...

DeepSeek大模型一键部署解决方案:全平台多机分布式推理与国产硬件优化异构计算私有部署

DeepSeek R1 走红后&#xff0c;私有部署需求也随之增长&#xff0c;各种私有部署教程层出不穷。大部分教程只是简单地使用 Ollama、LM Studio 单机运行量化蒸馏模型&#xff0c;无法满足复杂场景需求。一些操作配置也过于繁琐&#xff0c;有的需要手动下载并合并分片模型文件&…...

多个用户如何共用一根网线传输数据

前置知识 一、电信号 网线&#xff08;如以太网线&#xff09;中传输的信号主要是 电信号&#xff0c;它携带着数字信息。这些信号用于在计算机和其他网络设备之间传输数据。下面是一些关于网线传输信号的详细信息&#xff1a; 1. 电信号传输 在以太网中&#xff0c;数据是…...

DeepSeek官方推荐的AI集成系统

DeepSeek模型虽然强大先进&#xff0c;但是模型相当于大脑&#xff0c;再聪明的大脑如果没有输入输出以及执行工具也白搭&#xff0c;所以需要有配套工具才能让模型发挥最大的作用。下面是一个典型AI Agent架构图&#xff0c;包含核心组件与数据流转关系&#xff1a; #mermaid-…...

el-select 添加icon

Element-ui-plus 新版本&#xff1a;Select 选择器 | Element Plus 要实现如上的效果 &#xff0c;要用到具名插槽 prefix&#xff0c;看代码&#xff1a; <template><el-dialog ref"dialogRef" v-model"dialogVisible" :title"title"…...

Qt的QPushButton样式设置

在Qt中&#xff0c;可以通过样式表&#xff08;QSS&#xff09;为QPushButton设置丰富的样式。以下是常见样式设置方法的详细说明&#xff1a; 1. 基础样式 // 设置背景色、文字颜色、圆角边框 button->setStyleSheet("QPushButton {"" background-color…...

Java函数计算冷启动从8s到800ms的优化实录

在函数计算场景中,冷启动性能对用户体验至关重要。本文将分享如何将 Java 函数计算的冷启动时间从 8 秒优化到 800 毫秒,包括具体的技术手段和代码示例。 一、背景介绍 函数计算是一种事件驱动的计算服务,用户只需上传代码,无需管理服务器。但在实际使用中,函数计算的冷…...

通过例子学 rust 个人精简版 1-1

1-1 Hello World fn main() {println!("Hello World!");// 动手试一试println!("Im a Rustacean!"); }Hello World! Im a Rustacean!要点1 &#xff1a;println 自带换行符 注释 fn main() {let x 5 /* 90 */ 5;println!("Is x 10 or 100? x …...

STM32、GD32驱动TM1640原理图、源码分享

一、原理图分享 二、源码分享 /************************************************* * copyright: * author:Xupeng * date:2024-07-18 * description: **************************************************/ #include "smg.h"#define DBG_TAG "smg&…...

Centos安装php-8.0.24.tar

查看系统环境 cat /etc/redhat-release 预先安装必要的依赖 yum install -y \ wget \ gcc \ gcc-c \ autoconf \ automake \ libtool \ make \ libxml2 \ libxml2-devel \ openssl \ openssl-devel \ sqlite-devel yum update 1、下载解压 cd /data/ wget https:/…...

VNC远程控制Mac

前言 macOS系统自带有VNC远程桌面&#xff0c;我们可以在控制端上安装配置VNC客户端&#xff0c;以此来实现远程控制macOS。但通常需要在不同网络下进行远程控制&#xff0c;为此&#xff0c;我们可以在macOS被控端上使用cpolar做内网穿透&#xff0c;映射VNC默认端口5…...

基于大数据的北京市天气数据分析系统的设计与实现

【Flask】基于Flask的北京市天气数据分析系统的设计与实现&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统采用Python和Flask框架&#xff0c;结合Pandas、NumPy等数据处理库及Echarts进…...

20250214在ubuntu20.04下使用obs studio录制外挂的1080p的USB摄像头【下载安装】

20250214在ubuntu20.04下使用obs studio录制外挂的1080p的USB摄像头 2025/2/14 9:10 缘起&#xff1a;笔记本电脑在ubuntu20.04下使用Guvcview录制自带的摄像头&#xff0c;各种问题。 1、降帧率。WIN10/11自带的相机应用可以满速30fps&#xff0c;马上重启到ubuntu20.04&#…...

OpenEuler学习笔记(三十):在OpenEuler上搭建3D建模环境

在OpenEuler上搭建3D建模环境&#xff0c;通常可以选择一些常见的3D建模软件&#xff0c;如Blender、FreeCAD等。以下以搭建Blender和FreeCAD这两款软件的使用环境为例&#xff0c;为你详细介绍搭建步骤。 搭建Blender 3D建模环境 1. 更新系统软件包 首先&#xff0c;确保系…...

Deepseek R1模型本地化部署+API接口调用详细教程:释放AI生产力

文章目录 前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装ollama2部署DeepSeek R1模型删除已存在模型&#xff0c;以7b模型为例 三、DeepSeek API接口调用Cline配置 前言 随着最近人工智能 DeepSeek 的爆火&#xff0c;越来越多的技术大佬们开始关注如…...

Ubuntu添加桌面快捷方式

以idea为例 一. 背景 在ubuntu中&#xff0c;很多时候是自己解压的文件并没有桌面快捷方式&#xff0c;需要自己找到对应的目录的执行文件手动打开&#xff0c;很麻烦 而只需要在 /usr/share/applications 中创建自定义的desktop文件就能自动复制到桌面 二. 添加方法 创建desk…...

教程:使用 Vue 3 和 arco 实现表格合并

1. 功能概述 本教程将介绍如何使用 Vue 3 和 arco 组件库实现表格合并功能。具体来说&#xff0c;我们会根据表格数据中的某个字段&#xff08;如 type&#xff09;对表格的某一列&#xff08;如入库类型列&#xff09;进行合并&#xff0c;同时将质检说明列合并为一列。 2. …...

【MySQL数据库】Ubuntu下的mysql

目录 1&#xff0c;安装mysql数据库 2&#xff0c;mysql默认安装路径 3&#xff0c;my.cnf配置文件? 4&#xff0c;mysql运用的相关指令及说明 5&#xff0c;数据库、表的备份和恢复 mysql是一套给我们提供数据存取的&#xff0c;更加有利于管理数据的服务的网络程序。下…...

Java实现MinIO上传PDF文件并配置浏览器在线打开而非下载

在Minio中上传PDF文件后&#xff0c;通常文件的访问方式&#xff08;即URL&#xff09;是配置为允许下载文件的&#xff0c;因为大多数Web服务器和存储服务默认将PDF文件视为应下载的内容类型&#xff08;Content-Type: application/pdf&#xff09;。但是&#xff0c;如果你想…...

CSV格式和普通EXCEL格式文件的区别

CSV 文件&#xff08;.csv&#xff09; 普通的 Excel 文件&#xff08;.xlsx 或 .xls) 主要体现在 文件格式、数据存储、功能支持 等方面: 文件格式 比较项CSV 文件 (.csv)Excel 文件 (.xlsx/.xls)文件类型纯文本文件二进制或 XML 格式数据分隔逗号&#xff08;,&#xff09…...

安卓基础(持续更新的笔记)

为什么要这样&#xff1a; // 创建请求体RequestBody body RequestBody.create(MediaType.parse("application/json; charsetutf-8"),jsonObject.toString()); jsonObject 就包含了一个 JSON 数据&#xff0c;它其实就是&#xff1a; {"name": "张…...

大模型Deepseek的使用_基于阿里云百炼和Chatbox

目录 前言1. 云服务商2. ChatBox参考 前言 上篇博文中探索了&#xff08;本地&#xff09;部署大语言模型&#xff0c;适合微调、数据高隐私性等场景。随着Deepseek-R1的发布&#xff0c;大语言模型的可及性得到极大提升&#xff0c;应用场景不断增加&#xff0c;对高可用的方…...

数学建模基础训练-1:概念解析

文章目录 数学建模基础训练-1&#xff1a;概念解析问题一&#xff1a;如何找到“概念”&#xff1f;问题二&#xff1a;如何全面理解概念的基础含义&#xff1f;问题三&#xff1a;如何深刻理解概念并作出创新点发掘&#xff1f;实际举例问题一 :研究并给出寒假开学某大学返校交…...

【mybatis】基本操作:详解Spring通过注解和XML的方式来操作mybatis

mybatis 的常用配置 配置数据库连接 #驱动类名称 spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver #数据库连接的url spring.datasource.urljdbc:mysql://127.0.0.1:3306/mybatis_test characterEncodingutf8&useSSLfalse #连接数据库的名 spring.datasourc…...

联邦学习中的“参数聚合“机制详解:医疗数据隐私保护的技术实现路径

一、技术原理&#xff1a;参数聚合的数学本质 1.1 核心数学公式 联邦平均算法&#xff08;FedAvg&#xff09;&#xff1a; \theta_{global}^{t1} \sum_{k1}^K \frac{n_k}{N} \theta_k^t其中&#xff1a; K K K&#xff1a;参与本轮训练的客户端数量 n k n_k nk​&#xff…...

LVS 负载均衡集群(NAT模式)

一、环境准备 四台主机&#xff08;一台 LVS、两台 RS、一台客户端&#xff09; 注意每个虚拟机都需要关闭防火墙和 selinux 1.1.LVS 主机 LVS 主机&#xff08;两块网卡&#xff09; 第一块&#xff1a;NAT模式&#xff08;内网&#xff09; 第二块&#xff1a;添加网卡&am…...

Rocky Linux系统修改网卡全攻略

Rocky Linux系统修改网卡全攻略 Rocky Linux系统修改网卡全攻略一、了解网卡相关知识二、查看当前网卡配置(一)使用ip命令(二)使用ifconfig命令(需安装)三、修改网卡配置文件(一)修改IP地址(二)修改网关和DNS服务器(三)保存并退出配置文件四、重启网络服务使配置生…...

常用查找算法整理(顺序查找、二分查找、哈希查找、二叉排序树查找、平衡二叉树查找、红黑树查找、B树和B+树查找、分块查找)

常用的查找算法&#xff1a; 顺序查找&#xff1a;最简单的查找算法&#xff0c;适用于无序或数据量小的情况&#xff0c;逐个元素比较查找目标值。二分查找&#xff1a;要求数据有序&#xff0c;通过不断比较中间元素与目标值&#xff0c;将查找范围缩小一半&#xff0c;效率…...

自动化办公|xlwings 数据类型和转换

xlwings 数据类型和转换&#xff1a;Python 与 Excel 的桥梁 在使用 xlwings 进行 Python 和 Excel 数据交互时&#xff0c;理解两者之间的数据类型对应关系至关重要。本篇将详细介绍 Python 数据类型与 Excel 数据类型的对应关系&#xff0c;以及如何进行数据类型转换。 一、…...

Edge浏览器清理主页

我们都知道&#xff0c;Microsoft Edge浏览器是微软创造的搜索浏览器&#xff0c;Windows10、11自带。但是你可以看到&#xff0c;每次你打开Edge浏览器的时候都可以看到许多的广告&#xff0c;如图&#xff1a; 导致打开Edge浏览器的时候会遭受卡顿&#xff0c;广告骚扰&#…...

RedHat8安装postgresql15和 postgis3.4.4记录及遇到的问题总结

安装包对照版本参考 UsersWikiPostgreSQLPostGIS – PostGIS 如果Red Hat系统上有旧版本的PostgreSQL需要卸载 在较新的Red Hat版本&#xff0c;使用dnf包管理器卸载&#xff1a;sudo dnf remove postgresql-server postgresql 旧版本&#xff0c;使用yum包管理器卸载 sudo y…...

Java 大视界 -- 绿色大数据:Java 技术在节能减排中的应用与实践(90)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...