TwinCAT3 Modbus-TCP Client/Server使用

目錄

一、環境配置和準備

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:FalsebExecute:=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;		//起始地址是12289arr2							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;		//起始地址是12289arr2							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+nMBAddrregsarrDataregs       			: ARRAY [1..5] OF WORD;			(*存放保持寄存器的值*)fbWriteRegs         		: FB_MBWriteRegs;				(*寫入保持寄存器功能塊*)bWriteRegs          		: BOOL;							(*寫入保持寄存器個數*)nQuantityWriteRegs  		: WORD := 10;					(*寫入保持寄存器個數*)nMBAddrWriteRegs    		: WORD := 12294;				(*寫入保持寄存器起始地址*)			//	寄存器地址=40001+nMBAddrWriteRegsarrDataWriteRegs			: 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.pswp.cn/news/213790.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/213790.shtml
英文地址,請注明出處:http://en.pswp.cn/news/213790.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Hiera實戰:使用Hiera實現圖像分類任務(二)

文章目錄 訓練部分導入項目使用的庫設置隨機因子設置全局參數圖像預處理與增強讀取數據設置Loss設置模型設置優化器和學習率調整策略設置混合精度,DP多卡,EMA定義訓練和驗證函數訓練函數驗證函數調用訓練和驗證方法 運行以及結果查看測試完整的代碼 在上…

可學習超圖拉普拉斯算子代碼

python版本:3.6。sklearn版本:scikit-learn0.19 問題1:ERROR: Could not build wheels for ecos, scs, which is required to install pyproject.toml-based projects| 解決辦法:cvxpy安裝過程中遇到的坑_ecos 2.0.7.post1 cp37 …

大數據技術7:基于StarRocks統一OALP實時數倉

前言: 大家對StarRocks 的了解可能不及 ClickHouse或者是遠不及 ClickHouse 。但是大家可能聽說過 Doris ,而 StarRocks 實際上原名叫做 Doris DB ,他相當于是一個加強版的也就是一個 Doris ,也就是說 Doris 所有的功能 StarRocks 都是有的&a…

【設計模式--結構型--橋接模式】

設計模式--結構型--橋接模式 橋接(Bridge)模式定義結構案例好處使用場景 橋接(Bridge)模式 定義 將抽象與實現分離,使他們可以獨立變化。它是用組合關系代替繼承關系來實現,從而降低了抽象和實現這兩個維…

達夢 DM 數據庫

達夢數據庫 varchar varchar2的區別, 推薦使用 varchar2 -- 日期格式化 SELECT DATE_FORMAT(GETDATE(), %Y-%m-%d %H:%i:%s);-- 2023-12-11 SELECT CURDATE();-- 2023-12-11 09:22:24 SELECT SYSDATE();-- 2023-12-11 11:09:53.136527 SELECT GETDATE();-- 當前日期1 -1天 SEL…

MyEclipse中常用的快捷鍵大全

Eclipse的編輯功能非常強大,掌握了Eclipse快捷鍵功能,能夠大大提高開發效率。Eclipse中有如下一些和編輯相關的快捷鍵。 1. 【ALT/】 此快捷鍵為用戶編輯的好幫手,能為用戶提供內容的輔助,不要為記不全方法和屬性名稱犯愁…

vite+vue3實現動態路由

在做這個動態路由的時候踩了很多坑,其中大部分是粗心了 動態菜單主要是導入的方式 import.meta.glob 參考:功能 | Vite 官方中文文檔 1、多層路由渲染(用3層路由做demo) 拿到接口的數據是后臺直接處理好的結構,但是…

Lua腳本操作redis

模擬庫存扣減 基礎版 SpringBootTest class LuaTests {Resource(name"redisTemplate")ValueOperations<String,Long> valueOperations;AutowiredStringRedisTemplate stringRedisTemplate;final String priductKey "product.1";Testvoid test1()…

Java NIO, IO 整理

NIO: IO多路復用: 參考: Redis&#xff08;六&#xff09;單線程I/O多路復用模型淺析_單線程多路復用-CSDN博客 Java NIO 詳解_java nio詳解_開發菜雞的博客-CSDN博客 Java Socket 之 NIO - 掘金 答應我&#xff0c;這次搞懂 I/O 多路復用&#xff01;_小林coding的博客-CS…

Spring JdbcTemplate

一、簡介 Spring 框架對 JDBC 進行封裝&#xff0c;使用 JdbcTemplate 方便實現對數據庫操作。它是 spring 框架中提供的一個對象&#xff0c;是對原始 Jdbc API 對象的簡單封裝。spring 框架為我們提供了很多的操作模板類。 針對操作關系型數據&#xff1a; jdbcTemplateHibe…

A* 算法簡介

一、A* 算法簡介A* algorithm is a popular choice for graph search. Breadth First Search is the simplest of the graph search algorithms. Graph search algorithms, including A*, take a “graph” as input. A* algorithm is a modification of Dijkstra’s Algorithm…

華為OD機試 - 部門人力分配(Java JS Python C)

題目描述 部門在進行需求開發時需要進行人力安排。 當前部門需要完成 N 個需求,需求用 requirements 表述,requirements[i] 表示第 i 個需求的工作量大小,單位:人月。 這部分需求需要在 M 個月內完成開發,進行人力安排后每個月人力時固定的。 目前要求每個月最多有2個…

在k8s中部署nfs-client-provisioner

1、部署過程 1.1、環境依賴 在部署nfs-client-provisioner之前&#xff0c;需要先部署nfs服務。 因為&#xff0c;nfs-client-provisioner創建的pv都是要在nfs服務器中搭建的。 本示例中的nfs server的地址如下&#xff1a; [rootnode1 /]# showmount -e Export list for …

pinia 持久化插件使用

官方文檔 本文主要介紹 vue3組合式 api 使用持久化插件的寫法。 選項式 寫法官方已給出 安裝依賴 pnpm i pinia-plugin-persistedstate插件的使用 import { createPinia } from pinia import piniaPluginPersistedstate from pinia-plugin-persistedstateconst pinia creat…

JavaMap工具類(MapUtils)

1、Object轉Map 2、將 map 中的 value 為null的的元素轉成空字符串"" 3、map轉Object 4、MAP 判空 5、Map 排序 按key值長度進行排序 6、兩個MAP對比&#xff0c;在oldMap中移除remMap中所有的key值 備注&#xff1a;排序的話(TreeMap)是可以直接實現簡單排序的…

VR轉接線方案/VR Link串流數據線方案/VR眼鏡PD快充方案

虛擬現實技術(英文名稱&#xff1a;Virtual Reality&#xff0c;縮寫為VR)&#xff0c;又稱虛擬實境或靈境技術&#xff0c;是20世紀發展起來的一項全新的實用技術。虛擬現實技術囊括計算機、電子信息、仿真技術&#xff0c;其基本實現方式是以計算機技術為主&#xff0c;利用并…

Java:commons-lang3中的StringUtils.strip實現移除字符串首尾字符

依賴 <dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version> </dependency>示例 // 包名 import org.apache.commons.lang3.StringUtils;// 處理字符串&…

kafka支持外網訪問

kafka支持外網訪問 1.kafka正常部署之后如果不修改&#xff0c;外網是無法訪問的&#xff0c;具體如下&#xff08;這里是單節點&#xff09; 2.這個時候需要修改kafka的config中的server.properties中的 listeners 修改為0.0.0.0 監控所有網卡&#xff0c;advertised.listene…

管理空閑存儲空間

位示圖是操作系統中一種管理空閑存儲空間的方法。管理空閑除使用位示圖法還可用&#xff1a;空閑區表法&#xff0c;空閑鏈表法&#xff0c;成組鏈接法 1.空閑區表法 空閑表法屬于連續分配方法。它與內存管理中的動態分區分配方法雷同。 將外存空間上一個連續未分配區域稱為“…

[三次反轉法]循環移動數組元素

循環移動 題目描述 給定一組整數&#xff0c;要求利用數組把這組數保存起來&#xff0c;然后實現對數組的循環移動。假定供有n個整數&#xff0c;則要使前面各數順序向后移m個位置&#xff0c;并使最后m個數變為最前面的m個數(m<n)。 注意&#xff0c;不要用先輸出后m個數…