TwinCAT3 Modbus-TCP Client/Server使用

news2024/12/23 10:27:11

目录

一、环境配置和准备

1、PLC中安装TF6250-Modbus-TCP库

2、勾选TF6250的license

3、PLC工程中添加Tc2_ModbusSrv库文件

4、分别创建测试ModbusTCP测试的Server和Client程序

二、PLC作为Client端

1、设置测试电脑IP地址

2、运行MobusTCP测试工具

3、PLC端程序编写

(1)读取离散量输入

(2)读取线圈

(3)单个线圈写操作

(4)多个线圈写操作

(5)读取输入寄存器值

(6)读取保持寄存器值

(7)单个保持寄存器写操作

(8)多个保持寄存器写操作

三、PLC作为Server端

1、PLC程序

(1)寄存器变量定义

2、Client客户端工具

3、通讯测试

(1)客户端写操作

四、PLC中使用服务端和客户端程序进行寄存器操作

1、PLC程序

(1)服务端程序

(2)客户端程序

2、通讯测试

(1)寄存器说明

(2)PLC的Client程序读操作

(3)PLC的Client程序写操作

五、测试工程下载


一、环境配置和准备

1、PLC中安装TF6250-Modbus-TCP库

PLC地址

安装库文件

PLC硬件环境设置、库文件安装、防火墙设置等,参见博客文章:TwinCAT3中ModbusTCP Server和C# Client连接-CSDN博客

2、勾选TF6250的license

3、PLC工程中添加Tc2_ModbusSrv库文件

4、分别创建测试ModbusTCP测试的Server和Client程序

将创建的程序添加到Task中。

二、PLC作为Client端

1、设置测试电脑IP地址

测试电脑IP地址和PLC的IP地址在一个网段内。

2、运行MobusTCP测试工具

使用测试工具ModSim32,创建ModbusTCP Server服务端。端口号默认502,测试软件默认IP地址是计算机本地地址。

3、PLC端程序编写

定义变量:ModbusTCP Server服务端ip地址

Server_IpAddress	:STRING:='192.168.1.33';        //ModbusTCP Server服务端ip地址

(1)读取离散量输入

定义变量

	02: Input Status 读取//
	fbReadInputs      : FB_MBReadInputs;						(*读取离散量输入功能块*)
	bReadInputs       : BOOL;									(*读取离散量输入执行条件*)
 	nQuantityinput    : WORD:=1 ;								(*读取离散量输入个数*)
 	nMBAddrinput      : WORD:=1 ;								(*读取离散量输入起始地址*)
 	arrDatainput      : BYTE;									(*存放离散量输入的值*)

程序

nUnitID:Modbus-Tcp从站号。如果实际中不知道从站号多少,默认写1就行。

fbReadInputs(
	//sIPAddr:='169.254.0.1' , 				//modsim32的IP地址
	sIPAddr:=Server_IpAddress , 				//modsim32的IP地址
	nTCPPort:=502, 							//Modbus-Tcp端口号
	nUnitID:=1 , 							//Modbus-Tcp从站号
	nQuantity:=nQuantityinput , 			//读取离散量输入个数
	nMBAddr:= nMBAddrinput, 				//读取离散量输入 Modbus起始地址
	cbLength:= SIZEOF(arrDatainput), 		//存放离散量输入变量的个数
	pDestAddr:=ADR(arrDatainput), 			//存放离散量输入变量指针起始地址
	bExecute:=bReadInputs , 				//读取离散量输入执行条件
	tTimeout:=T#1S ,    
	bBusy=> , 
	bError=> , 
	nErrId=> , 
	cbRead=> );

运行测试1,单个离散量读操作:

对10002写1

PLC读取

读取个数是1,nQuantityinput值为1

起始地址nMBAddrinput写1对应的寄存器是10002。离散变量实际地址=10001+nMBAddrinput

读取

运行测试2,多个离散量读操作:

对10002写1、10003写1、10004写1

PLC读取

设置读取个数是3。读取出来的值是7。(三个位都为1,就是7)

(2)读取线圈

定义变量

    fbReadCoils       			: FB_MBReadCoils;				(*读取线圈功能块*) 
 	bReadCoils        			: BOOL; 						(*读取线圈执行条件*)      
 	nQuantitycoils    			: WORD :=3;  					(*读取线圈个数*) 
 	nMBAddrcoils      			: WORD :=1;  					(*读取线圈起始地址*) 
 	arrDatacoils      			: BYTE;							(*存放线圈的值*)

PLC程序

fbReadCoils(
	//sIPAddr:='169.254.0.1' , 				//modsim32的IP地址
	sIPAddr:=Server_IpAddress , 				//modsim32的IP地址
	nTCPPort:=502 ,							//Modbus-Tcp端口号 
	nUnitID:=1 , 							//Modbus-Tcp从站号
	nQuantity:=nQuantitycoils , 			//读取线圈个数
	nMBAddr:=nMBAddrcoils , 				//读取线圈 Modbus起始地址
	cbLength:=SIZEOF(arrDatacoils) , 		//存放线圈变量的个数
	pDestAddr:=ADR(arrDatacoils) , 			//存放线圈变量指针起始地址
	bExecute:=bReadCoils , 					//读取线圈执行条件
	tTimeout:= T#1S, 
	bBusy=> , 
	bError=>, 
	nErrId=> , 
	cbRead=> );

运行测试,多个线圈读操作:

对线圈00005/00006/0007/0008/00009写1操作

PLC

nMBAddrcoils:读取线圈的地址

nQuantitycoils:读取的线圈个数

线圈的实际地址=00001+nMBAddrcoils。

00005对应的nMBAddrcoils地址设置就是4。

5个线圈的值都是ON,即31

PLC中数据显示,2进制、10进制、16进制显示设置

(3)单个线圈写操作

定义变量

    fbWriteSingleCoil       	: FB_MBWriteSingleCoil;			(*写入单个线圈功能块*)
 	bWriteSingleCoil            : BOOL;							(*写入单个线圈执行条件*)
 	nMBAddrWriteSingleCoil      : WORD := 3;					(*写入单个线圈Modbus 地址*)
 	nValueWriteSingleCoil       : WORD := 16#FF00;				(*16#FF00:True;16#0000:False*)

PLC程序

fbWriteSingleCoil(
	//sIPAddr:='169.254.0.1' , 				//modsim32的IP地址
	sIPAddr:=Server_IpAddress , 				//modsim32的IP地址
	nTCPPort:= 502, 						//Modbus-Tcp端口号
	nUnitID:= 1, 							//Modbus-Tcp从站号
	nMBAddr:=nMBAddrWriteSingleCoil , 		//写入单个线圈Modbus起始地址
	nValue:=nValueWriteSingleCoil , 		//写入单个线圈的值:16#FF00:True;16#0000:False
	bExecute:=bWriteSingleCoil , 			//写入单个线圈执行条件
	tTimeout:=T#1S , 
	bBusy=> , 
	bError=> , 
	nErrId=> );

运行测试,单个线圈写操作:

对线圈00004写操作

线圈地址nMBAddrWriteSingleCoil值设置:3。(线圈地址=00001+nMBAddrWriteSingleCoil)

nValueWriteSingleCoil值设置:

TRUE:16#FF00,即10进制65280。

FALSE:16#0000,即10进制0。

(4)多个线圈写操作

变量定义

  	fbWriteCoils       			: FB_MBWriteCoils;				(*写入线圈功能块*)
  	bWriteCoils      			: BOOL;							(*写入线圈执行条件*)
  	nQuantityWriteCoils 		: WORD := 10;					(*写入离散量输入个数*)
  	nMBAddrWriteCoils   		: WORD := 14;					(*写入离散量输入起始地址*)
  	arrDataWriteCoils   		: ARRAY[1..2] OF  BYTE  := [16#11, 16#33];(*写入离散量输入的值*)

PLC程序

fbWriteCoils(
	//sIPAddr:='169.254.0.1' , 				//modsim32的IP地址
	sIPAddr:=Server_IpAddress , 				//modsim32的IP地址
	nTCPPort:=502, 							//Modbus-Tcp端口号
	nUnitID:=1 , 							//Modbus-Tcp从站号
	nQuantity:= nQuantityWriteCoils , 		//写入线圈个数
	nMBAddr:=nMBAddrWriteCoils , 			//写入线圈Modbus起始地址
	cbLength:=SIZEOF(arrDataWriteCoils), 	//写入线圈的变量个数
	pSrcAddr:=ADR(arrDataWriteCoils), 		//写入线圈的变量指针起始地址
	bExecute:=bWriteCoils , 				//写入线圈的执行条件
	tTimeout:=T#1S , 
	bBusy=> , 
	bError=> , 
	nErrId=> );

运行测试,多个线圈写操作:

写16个线圈,线圈地址从00006开始。(00001+nMBAddrWriteCoils,nMBAddrWriteCoils设置值为5)。

1个BYTE是8位,8位都是1即BYTE值是255。

BYTE数组arrDataWriteCoils长度为2、即16位。最多可以写16个线圈操作。

注意:的线圈BYTE个数要和数组长度相同,16个线圈2个BYTE。对应否则会报错。)

(5)读取输入寄存器值

变量定义

    fbReadInputRegs    : FB_MBReadInputRegs;		(*读取输入寄存器功能块*)
 	bReadInputRegs     : BOOL;						(*读取输入寄存器执行条件*)
 	nQuantityInputRegs : WORD := 3;					(*读取输入寄存器个数*)
 	nMBAddrInputRegs   : WORD:= 2;					(*读取输入寄存器起始地址*)
 	arrDataInputRegs   : ARRAY [1..3] OF WORD;		(*存放输入寄存器的值*)

PLC程序

fbReadInputRegs(
	//sIPAddr:='169.254.0.1' , 				//modsim32的IP地址
	sIPAddr:=Server_IpAddress , 				//modsim32的IP地址
	nTCPPort:=502, 							//Modbus-Tcp端口号
	nUnitID:=1, 							//Modbus-Tcp从站号
	nQuantity:=nQuantityInputRegs, 			//读取输入寄存器个数
	nMBAddr:=nMBAddrInputRegs  , 			//读取输入寄存器Modbus起始地址
	cbLength:= SIZEOF(arrDataInputRegs),	//存放输入寄存器变量的个数和指针起始地址
	pDestAddr:=ADR(arrDataInputRegs), 		//存放输入寄存器变量指针起始地址
	bExecute:= bReadInputRegs  , 			//读取输入寄存器执行条件
	tTimeout:=T#1S , 
	bBusy=> , 
	bError=> , 
	nErrId=> , 
	cbRead=> );

运行测试,多个输入寄存器读操作:

给30003、30004、30005赋值

PLC读

寄存器地址30003=30001+nMBAddrInputRegs,nMBAddrInputRegs设置值2

多三个寄存器

注意:读的寄存器个数要和数组长度相同,否则会报错。)

(6)读取保持寄存器值

变量定义:

    fbReadRegs        			: FB_MBReadRegs;				(*读取保持寄存器功能块*)
 	bReadRegs         			: BOOL;     					(*读取保持寄存器执行条件*) 
 	nQuantityregs     			: WORD:=2;   					(*读取保持寄存器个数*)
 	nMBAddrregs       			: WORD:=24;   					(*读取保持寄存器起始地址*)
 	arrDataregs       			: ARRAY [1..2] OF WORD;			(*存放保持寄存器的值*)

PLC程序:

fbReadRegs(
	//sIPAddr:='169.254.0.1' , 				//modsim32的IP地址
	sIPAddr:=Server_IpAddress , 				//modsim32的IP地址
	nTCPPort:=502,							//Modbus-Tcp端口号
	nUnitID:= 1, 							//Modbus-Tcp从站号
	nQuantity:=nQuantityregs, 				//读取保持寄存器个数
	nMBAddr:=nMBAddrregs , 					//读取保持寄存器Modbus起始地址
	cbLength:=SIZEOF(arrDataregs) , 		//存放保持寄存器变量的个数
	pDestAddr:=ADR(arrDataregs) , 			//存放保持寄存器变量指针起始地址
	bExecute:=bReadRegs, 					//读取保持寄存器执行条件
	tTimeout:= T#1S , 
	bBusy=> , 
	bError=> , 
	nErrId=> , 
	cbRead=> );

运行测试,多个保持寄存器读操作:

读保持寄存器40005、40006

寄存器首地址40005=40001+nMBAddrregs,设置nMBAddrregs值为4。读两个寄存器。

注意:读的寄存器个数要和数组长度相同,否则会报错。)

(7)单个保持寄存器写操作

变量定义:

 	fbWriteSingleReg            : FB_MBWriteSingleReg;			(*写入单个寄存器功能块*)
 	bWriteSingleReg             : BOOL;							(*写入单个寄存器执行条件*)
 	nMBAddrSingleReg            : WORD := 4;					(*写入单个寄存器Modbus 地址*)
 	nValueSingleReg             : WORD := 16#1234;				(*写入单个寄存器数值*)

PLC程序:

fbWriteSingleReg(
	//sIPAddr:='169.254.0.1' , 				//modsim32的IP地址
	sIPAddr:=Server_IpAddress , 				//modsim32的IP地址
	nTCPPort:=502, 							//Modbus-Tcp端口号
	nUnitID:=1 , 							//Modbus-Tcp从站号
	nMBAddr:=nMBAddrSingleReg, 				//写入单个保持寄存器起始地址
	nValue:=nValueSingleReg, 				//写入单个寄存器数值
	bExecute:=bWriteSingleReg , 			//写入单个寄存器的执行条件
	tTimeout:=T#1S , 
	bBusy=> , 
	bError=> , 
	nErrId=> );	

运行测试,单个保持寄存器写操作:

写保持寄存器40005。40005=40001+nMBAddrSingleReg,设置nMBAddrSingleReg值为4

(8)多个保持寄存器写操作

变量定义:

  	fbWriteRegs         		: FB_MBWriteRegs;				(*写入保持寄存器功能块*)
  	bWriteRegs          		: BOOL;							(*写入保持寄存器个数*)
  	nQuantityWriteRegs  		: WORD := 4;					(*写入保持寄存器个数*)
  	nMBAddrWriteRegs    		: WORD := 4;					(*写入保持寄存器起始地址*)
  	arrDataWriteRegs			: ARRAY[1..4] OF WORD := [1122, 3344, 5566, 7788];(*写入保持寄存器的值*)

PLC程序:

fbWriteRegs(
	//sIPAddr:='169.254.0.1' , 				//modsim32的IP地址
	sIPAddr:=Server_IpAddress , 				//modsim32的IP地址
	nTCPPort:=502, 							//Modbus-Tcp端口号
	nUnitID:=1 ,							//Modbus-Tcp从站号
	nQuantity:=nQuantityWriteRegs , 		//写入保持寄存器个数
	nMBAddr:= nMBAddrWriteRegs , 			//写入保持寄存器起始地址
	cbLength:= SIZEOF(arrDataWriteRegs), 	//写入变量的个数和指针起始地址
	pSrcAddr:=ADR(arrDataWriteRegs) , 		//写入变量指针起始地址
	bExecute:= bWriteRegs , 				//写入保持寄存器的执行条件
	tTimeout:=T#1S  , 
	bBusy=> , 
	bError=> , 
	nErrId=> );

运行测试,多个保持寄存器写操作:

写保持寄存器40003、40004、40005,寄存器首地址40003=40001+nMBAddrWriteRegs,设置nMBAddrWriteRegs值2

注意:寄存器个数要和数组长度相同,否则会报错。)

三、PLC作为Server端

1、PLC程序

(1)寄存器变量定义

    arr1							AT%MB0			:ARRAY[1..5]		OF		WORD;		//起始地址是12289
	arr2							AT%MB10			:ARRAY[1..10]		OF		WORD;		//起始地址是12294

2、Client客户端工具

使用测试工具ModScan32模拟ModbusTCP Client客户端。

打开ModScan32

根据Server服务端PLC 中定义的寄存器,做如下设置

MB0对应的起始地址是12289。

寄存器说明:一个MW寄存器对应两个MB寄存器,比如MW0是MB0、MB1组成。一个12289对应一个MW0寄存器,即对应MB0、MB1。

3、通讯测试

(1)客户端写操作

客户端ModScan32对服务端PLC的寄存器写操作

PLC服务端接收的

(2)PLC服务端写操作

PLC寄存器写

客户端ModScan32接收的

四、PLC中使用服务端和客户端程序进行寄存器操作

1、PLC程序

(1)服务端程序

PLC服务端程序不变,就定义读写的寄存器变量

变量定义

    arr1							AT%MB0			:ARRAY[1..5]		OF		WORD;		//起始地址是12289
	arr2							AT%MB10			:ARRAY[1..10]		OF		WORD;		//起始地址是12294

(2)客户端程序

变量定义

Server_IpAddress	:STRING:='192.168.1.21';
	03: Holding Register 读取&写入
 	fbReadRegs        			: FB_MBReadRegs;				(*读取保持寄存器功能块*)
 	bReadRegs         			: BOOL;     					(*读取保持寄存器执行条件*) 
 	nQuantityregs     			: WORD:=5;   					(*读取保持寄存器个数*)
 	nMBAddrregs       			: WORD:=12288;   				(*读取保持寄存器起始地址*)			//	寄存器地址=40001+nMBAddrregs
 	arrDataregs       			: ARRAY [1..5] OF WORD;			(*存放保持寄存器的值*)
  
  	fbWriteRegs         		: FB_MBWriteRegs;				(*写入保持寄存器功能块*)
  	bWriteRegs          		: BOOL;							(*写入保持寄存器个数*)
  	nQuantityWriteRegs  		: WORD := 10;					(*写入保持寄存器个数*)
  	nMBAddrWriteRegs    		: WORD := 12294;				(*写入保持寄存器起始地址*)			//	寄存器地址=40001+nMBAddrWriteRegs
  	arrDataWriteRegs			: ARRAY[1..10] OF WORD := [11, 22, 33, 44,55,66,77,88,99,100];		(*写入保持寄存器的值*)
  
 	fbWriteSingleReg            : FB_MBWriteSingleReg;			(*写入单个寄存器功能块*)
 	bWriteSingleReg             : BOOL;							(*写入单个寄存器执行条件*)
 	nMBAddrSingleReg            : WORD := 4;					(*写入单个寄存器Modbus 地址*)
 	nValueSingleReg             : WORD := 16#1234;				(*写入单个寄存器数值*)
//

PLC程序

fbReadRegs(
	//sIPAddr:='169.254.0.1' , 				//modsim32的IP地址
	sIPAddr:=Server_IpAddress , 				//modsim32的IP地址
	nTCPPort:=502,							//Modbus-Tcp端口号
	nUnitID:= 1, 							//Modbus-Tcp从站号
	nQuantity:=nQuantityregs, 				//读取保持寄存器个数
	nMBAddr:=nMBAddrregs , 					//读取保持寄存器Modbus起始地址
	cbLength:=SIZEOF(arrDataregs) , 		//存放保持寄存器变量的个数
	pDestAddr:=ADR(arrDataregs) , 			//存放保持寄存器变量指针起始地址
	bExecute:=bReadRegs, 					//读取保持寄存器执行条件
	tTimeout:= T#1S , 
	bBusy=> , 
	bError=> , 
	nErrId=> , 
	cbRead=> );
	
fbWriteRegs(
	//sIPAddr:='169.254.0.1' , 				//modsim32的IP地址
	sIPAddr:=Server_IpAddress , 				//modsim32的IP地址
	nTCPPort:=502, 							//Modbus-Tcp端口号
	nUnitID:=1 ,							//Modbus-Tcp从站号
	nQuantity:=nQuantityWriteRegs , 		//写入保持寄存器个数
	nMBAddr:= nMBAddrWriteRegs , 			//写入保持寄存器起始地址
	cbLength:= SIZEOF(arrDataWriteRegs), 	//写入变量的个数和指针起始地址
	pSrcAddr:=ADR(arrDataWriteRegs) , 		//写入变量指针起始地址
	bExecute:= bWriteRegs , 				//写入保持寄存器的执行条件
	tTimeout:=T#1S  , 
	bBusy=> , 
	bError=> , 
	nErrId=> );
		
fbWriteSingleReg(
	//sIPAddr:='169.254.0.1' , 				//modsim32的IP地址
	sIPAddr:=Server_IpAddress , 				//modsim32的IP地址
	nTCPPort:=502, 							//Modbus-Tcp端口号
	nUnitID:=1 , 							//Modbus-Tcp从站号
	nMBAddr:=nMBAddrSingleReg, 				//写入单个保持寄存器起始地址
	nValue:=nValueSingleReg, 				//写入单个寄存器数值
	bExecute:=bWriteSingleReg , 			//写入单个寄存器的执行条件
	tTimeout:=T#1S , 
	bBusy=> , 
	bError=> , 
	nErrId=> );	

2、通讯测试

(1)寄存器说明

一个MW寄存器对应两个MB寄存器,比如MW0对应12289、12289对应MB0、MB1

PLC 客户端程序中变量

读寄存器地址=40001+nMBAddrregs        则MB0对应设置nMBAddrregs12288

写寄存器地址=40001+nMBAddrWriteRegs        

(2)PLC的Client程序读操作

先给服务端的寄存器赋值

PLCServer程序读

(3)PLC的Client程序写操作

PLC客户端写寄存器

PLC服务端接收到客户端写的寄存器

五、测试工程下载

https://download.csdn.net/download/panjinliang066333/88609166

工程包括:

(1)客户端、服务端PLC程序

(2)TF6250-Modbus-TCP库文件安装软件

(3)ModbusTCP测试工具

模拟客户端:modscan32

模拟服务端:modsim32

(4)倍福官方简单测试参考

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

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

相关文章

基于C/C++的rapidxml加载xml大文件 - 下部分

下载地址: RapidXml (sourceforge.net)https://rapidxml.sourceforge.net/ 将源码添加到自己的工程中 示例测试大文件耗时: 总共293w行数据,大概耗时不到1s。

将创建表字段语句快速转换成golang struct字段

用网页jquery快速生成 本地建立 struct.html <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>leo-转换</title> <script src"https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></s…

基于YOLOv7算法的高精度实时足球目标检测识别系统(PyTorch+Pyside6+YOLOv7)

摘要&#xff1a;基于YOLOv7算法的高精度实时足球目标检测系统可用于日常生活中检测与定位足球目标&#xff0c;此系统可完成对输入图片、视频、文件夹以及摄像头方式的目标检测与识别&#xff0c;同时本系统还支持检测结果可视化与导出。本系统采用YOLOv7目标检测算法来训练数…

scripty妙用

在monorepo项目中&#xff0c;随着子模块增多&#xff0c; 每个子项目都需要配置各自的package.json,并且大同小异&#xff0c;为了进一步提高配置效率&#xff0c;引入了scripty&#xff0c;自己写脚本&#xff0c;直接就可以用哦 1、安装 npm install scripty --save-dev 2…

【LeetCode刷题笔记(4)】【Python】【移动零】【简单】

文章目录 题目描述示例 1示例 2提示 解决方案题意拆解双指针算法双指针法的主要优点双指针法的使用场景举例&#xff1a; 解决方案&#xff1a;【双指针一次遍历】解题心得方案代码运行结果复杂度分析 结束语 移动零 题目描述 给定一个数组 nums&#xff0c;编写一个函数将所…

【Python】conda镜像配置,.condarc文件详解,channel镜像

1. conda 环境 安装miniconda即可&#xff0c;Miniconda 安装包可以到 http://mirrors.aliyun.com/anaconda/miniconda/ 下载。 .condarc是conda 应用程序的配置文件&#xff0c;在用户家目录&#xff08;windows&#xff1a;C:\users\username\&#xff09;&#xff0c;用于…

Peter算法小课堂—简单建模(2)

太戈编程736题 题目描述&#xff1a; 你是一只汪星人&#xff0c;地球毁灭后你回到了汪星&#xff0c;这里每天有n个小时&#xff0c;你需要为自己选择正好连续的m小时作为每天睡眠的时间。从凌晨开始&#xff0c;第i小时内的睡眠质量为xi&#xff0c;请问经过选择后&#xf…

WTF ‘Questions‘

WTF ‘Tech Team Lead’ As a Tech Team Lead, your role is to oversee the technical aspects of a project or team, and to provide guidance, support, and leadership to your team members. Here are some key responsibilities and aspects of the role: Leadership …

vite(一)——基本了解和依赖预构建

文章目录 一、什么是构建工具&#xff1f;1.为什么使用构建工具&#xff1f;2.构建工具的作用&#xff1f;3.构建工具怎么用&#xff1f; 二、经典面试题&#xff1a;webpack和vite的区别1.编译方式不同2.基础概念不同3.开发效率不同4.扩展性不同5.应用场景不同6.总结&#xff…

算法:最小生成树

文章目录 生成树Kruskal算法Prim算法 本篇总结的是最小生成树算法 生成树 连通图中的每一棵生成树&#xff0c;都是原图的一个极大无环子图&#xff0c;即&#xff1a;从其中删去任何一条边&#xff0c;生成树就不在连通&#xff1b;反之&#xff0c;在其中引入任何一条新边&…

浅谈USD格式

USD是什么&#xff1f;如何发展起来的&#xff1f; USD&#xff08;Universal Scene Description&#xff09;是一种开放的、可扩展的文件格式和数据交换标准&#xff0c;用于描述和交换三维计算机图形场景和资产的数据。它最初由皮克斯动画工作室开发&#xff0c;并于2012年公…

java答题小程序源码带后台

尊敬的客户大家好&#xff01;接下来由我来介绍一下晟讯答题小程序&#xff0c;晟讯答题小程序是一款专业性的答题小程序&#xff0c;技术方式为前端原生开发的小程序&#xff0c;服务端为java程序&#xff0c;且拥有独立知识产权&#xff0c;软著登字2019SR0657453。其功能集个…

gin使用自签名SSL证书与自签名证书不受信任方法解决

文章目录 1. X.509 V3证书介绍2、使用openssl生成自签名证书和解决不受信任问题2.1、生成根证书2.2、为域名生成证书申请文件2.3、为域名创建证书的扩展描述文件2.4、为域名创建证书 3、Go应用中使用自签名证书3.1、gin框架调用实现3.2、运行效果 4、使用java的bouncycastle生成…

ACM32如何保护算法、协议不被破解或者修改

ACM32具有以下几种功能&#xff0c;可以保护算法、协议不被破解或者修改。 1.存储保护  RDP读保护  WRP写保护  PCROP 专有代码读保护  MPU存储区域权限控制  Secure User Memory存储区域加密 2.密码学算法引擎  AES  HASH  随机数生成  …

DevEco Studio 项目启动工程和Device Manage

DevEco Studio 项目启动工程和Device Manage 鸿蒙&#xff08;HarmonyOS&#xff09; 一、操作环境 操作系统: Windows 10 专业版 IDE:DevEco Studio 3.1 SDK:HarmonyOS 3.1 二、创建虚拟机&#xff08;Device Manage&#xff09; 鸿蒙IDE创建虚拟设备入口有2个地方&…

C++:this指针

目录 前言 成员函数返回this指向的对象本身时&#xff0c;为什是返回引用类型&#xff1f; 成员函数返回this对象本身时&#xff0c;内部通常会通过拷贝构造函数来创建一个临时对象&#xff1f; 总结 前言 c通过提供特殊的对象指针&#xff0c;this指针 指向被调用的成员函…

模块二——滑动窗口:438.找到字符串中所有字母异位词

文章目录 题目描述算法原理滑动窗口哈希表 代码实现 题目描述 题目链接&#xff1a;438.找到字符串中所有字母异位词 算法原理 滑动窗口哈希表 因为字符串p的异位词的⻓度⼀定与字符串p 的⻓度相同&#xff0c;所以我们可以在字符串s 中构造⼀个⻓度为与字符串p的⻓度相同…

每日好题:原来你也玩三国杀(DP动态规划)

I - 原来你也玩三国杀 Description 小 Q 最近听说 “很多” acmer 都爱上了一款游戏《三国杀》。因为小 Q 是一个初学者&#xff0c;所以想自己先偷偷学习一下&#xff0c;然后惊艳所有人。但又因为小 Q 不屑于使用一般的武将&#xff0c;因为他觉得唯有操作型武将才能显得自…

虾皮选品网:如何使用虾皮选品数据软件提升您的选品策略

在虾皮&#xff08;Shopee&#xff09;平台上进行选品时&#xff0c;了解市场趋势、竞争程度和产品潜力是非常重要的。为了帮助卖家更好地分析虾皮市场&#xff0c;并为选品和运营策略提供有力支持&#xff0c;有一些数据软件和工具可以派上用场。本文将介绍一些建议使用的虾皮…

Kafka-集群架构设计

Kafka的Zookeeper元数据梳理 zookeeper整体数据 Kafka将状态信息保存在Zookeeper中&#xff0c;这些状态信息记录了每个Kafka的Broker服务与另外的Broker服务 有什么不同。通过这些差异化的功能&#xff0c;共同体现出集群化的业务能力。这些数据&#xff0c;需要在集群中各个…