目錄
一、環(huán)境配置和準備
1、PLC中安裝TF6250-Modbus-TCP庫
2、勾選TF6250的license
3、PLC工程中添加Tc2_ModbusSrv庫文件
4、分別創(chuàng)建測試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程序?qū)懖僮?/p>
五、測試工程下載
一、環(huán)境配置和準備
1、PLC中安裝TF6250-Modbus-TCP庫
PLC地址
安裝庫文件
PLC硬件環(huán)境設置、庫文件安裝、防火墻設置等,參見博客文章:TwinCAT3中ModbusTCP Server和C# Client連接-CSDN博客
2、勾選TF6250的license
3、PLC工程中添加Tc2_ModbusSrv庫文件
4、分別創(chuàng)建測試ModbusTCP測試的Server和Client程序
將創(chuàng)建的程序添加到Task中。
二、PLC作為Client端
1、設置測試電腦IP地址
測試電腦IP地址和PLC的IP地址在一個網(wǎng)段內(nèi)。
2、運行MobusTCP測試工具
使用測試工具ModSim32,創(chuàng)建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; (*讀取離散量輸入執(zhí)行條件*)
nQuantityinput : WORD:=1 ; (*讀取離散量輸入個數(shù)*)
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 , //讀取離散量輸入個數(shù)
nMBAddr:= nMBAddrinput, //讀取離散量輸入 Modbus起始地址
cbLength:= SIZEOF(arrDatainput), //存放離散量輸入變量的個數(shù)
pDestAddr:=ADR(arrDatainput), //存放離散量輸入變量指針起始地址
bExecute:=bReadInputs , //讀取離散量輸入執(zhí)行條件
tTimeout:=T#1S ,
bBusy=> ,
bError=> ,
nErrId=> ,
cbRead=> );
運行測試1,單個離散量讀操作:
對10002寫1
PLC讀取
讀取個數(shù)是1,nQuantityinput值為1
起始地址nMBAddrinput寫1對應的寄存器是10002。離散變量實際地址=10001+nMBAddrinput
讀取
運行測試2,多個離散量讀操作:
對10002寫1、10003寫1、10004寫1
PLC讀取
設置讀取個數(shù)是3。讀取出來的值是7。(三個位都為1,就是7)
(2)讀取線圈
定義變量
fbReadCoils : FB_MBReadCoils; (*讀取線圈功能塊*)
bReadCoils : BOOL; (*讀取線圈執(zhí)行條件*)
nQuantitycoils : WORD :=3; (*讀取線圈個數(shù)*)
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 , //讀取線圈個數(shù)
nMBAddr:=nMBAddrcoils , //讀取線圈 Modbus起始地址
cbLength:=SIZEOF(arrDatacoils) , //存放線圈變量的個數(shù)
pDestAddr:=ADR(arrDatacoils) , //存放線圈變量指針起始地址
bExecute:=bReadCoils , //讀取線圈執(zhí)行條件
tTimeout:= T#1S,
bBusy=> ,
bError=>,
nErrId=> ,
cbRead=> );
運行測試,多個線圈讀操作:
對線圈00005/00006/0007/0008/00009寫1操作
PLC
nMBAddrcoils:讀取線圈的地址
nQuantitycoils:讀取的線圈個數(shù)
線圈的實際地址=00001+nMBAddrcoils。
00005對應的nMBAddrcoils地址設置就是4。
5個線圈的值都是ON,即31
PLC中數(shù)據(jù)顯示,2進制、10進制、16進制顯示設置
(3)單個線圈寫操作
定義變量
fbWriteSingleCoil : FB_MBWriteSingleCoil; (*寫入單個線圈功能塊*)
bWriteSingleCoil : BOOL; (*寫入單個線圈執(zhí)行條件*)
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 , //寫入單個線圈執(zhí)行條件
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; (*寫入線圈執(zhí)行條件*)
nQuantityWriteCoils : WORD := 10; (*寫入離散量輸入個數(shù)*)
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 , //寫入線圈個數(shù)
nMBAddr:=nMBAddrWriteCoils , //寫入線圈Modbus起始地址
cbLength:=SIZEOF(arrDataWriteCoils), //寫入線圈的變量個數(shù)
pSrcAddr:=ADR(arrDataWriteCoils), //寫入線圈的變量指針起始地址
bExecute:=bWriteCoils , //寫入線圈的執(zhí)行條件
tTimeout:=T#1S ,
bBusy=> ,
bError=> ,
nErrId=> );
運行測試,多個線圈寫操作:
寫16個線圈,線圈地址從00006開始。(00001+nMBAddrWriteCoils,nMBAddrWriteCoils設置值為5)。
1個BYTE是8位,8位都是1即BYTE值是255。
BYTE數(shù)組arrDataWriteCoils長度為2、即16位。最多可以寫16個線圈操作。
(注意:寫的線圈BYTE個數(shù)要和數(shù)組長度相同,16個線圈2個BYTE。對應否則會報錯。)
(5)讀取輸入寄存器值
變量定義
fbReadInputRegs : FB_MBReadInputRegs; (*讀取輸入寄存器功能塊*)
bReadInputRegs : BOOL; (*讀取輸入寄存器執(zhí)行條件*)
nQuantityInputRegs : WORD := 3; (*讀取輸入寄存器個數(shù)*)
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, //讀取輸入寄存器個數(shù)
nMBAddr:=nMBAddrInputRegs , //讀取輸入寄存器Modbus起始地址
cbLength:= SIZEOF(arrDataInputRegs), //存放輸入寄存器變量的個數(shù)和指針起始地址
pDestAddr:=ADR(arrDataInputRegs), //存放輸入寄存器變量指針起始地址
bExecute:= bReadInputRegs , //讀取輸入寄存器執(zhí)行條件
tTimeout:=T#1S ,
bBusy=> ,
bError=> ,
nErrId=> ,
cbRead=> );
運行測試,多個輸入寄存器讀操作:
給30003、30004、30005賦值
PLC讀
寄存器地址30003=30001+nMBAddrInputRegs,nMBAddrInputRegs設置值2
多三個寄存器
(注意:讀的寄存器個數(shù)要和數(shù)組長度相同,否則會報錯。)
(6)讀取保持寄存器值
變量定義:
fbReadRegs : FB_MBReadRegs; (*讀取保持寄存器功能塊*)
bReadRegs : BOOL; (*讀取保持寄存器執(zhí)行條件*)
nQuantityregs : WORD:=2; (*讀取保持寄存器個數(shù)*)
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, //讀取保持寄存器個數(shù)
nMBAddr:=nMBAddrregs , //讀取保持寄存器Modbus起始地址
cbLength:=SIZEOF(arrDataregs) , //存放保持寄存器變量的個數(shù)
pDestAddr:=ADR(arrDataregs) , //存放保持寄存器變量指針起始地址
bExecute:=bReadRegs, //讀取保持寄存器執(zhí)行條件
tTimeout:= T#1S ,
bBusy=> ,
bError=> ,
nErrId=> ,
cbRead=> );
運行測試,多個保持寄存器讀操作:
讀保持寄存器40005、40006
寄存器首地址40005=40001+nMBAddrregs,設置nMBAddrregs值為4。讀兩個寄存器。
(注意:讀的寄存器個數(shù)要和數(shù)組長度相同,否則會報錯。)
(7)單個保持寄存器寫操作
變量定義:
fbWriteSingleReg : FB_MBWriteSingleReg; (*寫入單個寄存器功能塊*)
bWriteSingleReg : BOOL; (*寫入單個寄存器執(zhí)行條件*)
nMBAddrSingleReg : WORD := 4; (*寫入單個寄存器Modbus 地址*)
nValueSingleReg : WORD := 16#1234; (*寫入單個寄存器數(shù)值*)
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, //寫入單個寄存器數(shù)值
bExecute:=bWriteSingleReg , //寫入單個寄存器的執(zhí)行條件
tTimeout:=T#1S ,
bBusy=> ,
bError=> ,
nErrId=> );
運行測試,單個保持寄存器寫操作:
寫保持寄存器40005。40005=40001+nMBAddrSingleReg,設置nMBAddrSingleReg值為4
(8)多個保持寄存器寫操作
變量定義:
fbWriteRegs : FB_MBWriteRegs; (*寫入保持寄存器功能塊*)
bWriteRegs : BOOL; (*寫入保持寄存器個數(shù)*)
nQuantityWriteRegs : WORD := 4; (*寫入保持寄存器個數(shù)*)
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 , //寫入保持寄存器個數(shù)
nMBAddr:= nMBAddrWriteRegs , //寫入保持寄存器起始地址
cbLength:= SIZEOF(arrDataWriteRegs), //寫入變量的個數(shù)和指針起始地址
pSrcAddr:=ADR(arrDataWriteRegs) , //寫入變量指針起始地址
bExecute:= bWriteRegs , //寫入保持寄存器的執(zhí)行條件
tTimeout:=T#1S ,
bBusy=> ,
bError=> ,
nErrId=> );
運行測試,多個保持寄存器寫操作:
寫保持寄存器40003、40004、40005,寄存器首地址40003=40001+nMBAddrWriteRegs,設置nMBAddrWriteRegs值2
(注意:寫寄存器個數(shù)要和數(shù)組長度相同,否則會報錯。)
三、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
根據(jù)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; (*讀取保持寄存器執(zhí)行條件*)
nQuantityregs : WORD:=5; (*讀取保持寄存器個數(shù)*)
nMBAddrregs : WORD:=12288; (*讀取保持寄存器起始地址*) // 寄存器地址=40001+nMBAddrregs
arrDataregs : ARRAY [1..5] OF WORD; (*存放保持寄存器的值*)
fbWriteRegs : FB_MBWriteRegs; (*寫入保持寄存器功能塊*)
bWriteRegs : BOOL; (*寫入保持寄存器個數(shù)*)
nQuantityWriteRegs : WORD := 10; (*寫入保持寄存器個數(shù)*)
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; (*寫入單個寄存器執(zhí)行條件*)
nMBAddrSingleReg : WORD := 4; (*寫入單個寄存器Modbus 地址*)
nValueSingleReg : WORD := 16#1234; (*寫入單個寄存器數(shù)值*)
//
PLC程序
fbReadRegs(
//sIPAddr:='169.254.0.1' , //modsim32的IP地址
sIPAddr:=Server_IpAddress , //modsim32的IP地址
nTCPPort:=502, //Modbus-Tcp端口號
nUnitID:= 1, //Modbus-Tcp從站號
nQuantity:=nQuantityregs, //讀取保持寄存器個數(shù)
nMBAddr:=nMBAddrregs , //讀取保持寄存器Modbus起始地址
cbLength:=SIZEOF(arrDataregs) , //存放保持寄存器變量的個數(shù)
pDestAddr:=ADR(arrDataregs) , //存放保持寄存器變量指針起始地址
bExecute:=bReadRegs, //讀取保持寄存器執(zhí)行條件
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 , //寫入保持寄存器個數(shù)
nMBAddr:= nMBAddrWriteRegs , //寫入保持寄存器起始地址
cbLength:= SIZEOF(arrDataWriteRegs), //寫入變量的個數(shù)和指針起始地址
pSrcAddr:=ADR(arrDataWriteRegs) , //寫入變量指針起始地址
bExecute:= bWriteRegs , //寫入保持寄存器的執(zhí)行條件
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, //寫入單個寄存器數(shù)值
bExecute:=bWriteSingleReg , //寫入單個寄存器的執(zhí)行條件
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程序?qū)懖僮?/h4>
PLC客戶端寫寄存器
PLC服務端接收到客戶端寫的寄存器
五、測試工程下載
https://download.csdn.net/download/panjinliang066333/88609166
工程包括:
(1)客戶端、服務端PLC程序
(2)TF6250-Modbus-TCP庫文件安裝軟件
(3)ModbusTCP測試工具
模擬客戶端:modscan32
模擬服務端:modsim32文章來源:http://www.zghlxwxcb.cn/news/detail-792973.html
(4)倍福官方簡單測試參考文章來源地址http://www.zghlxwxcb.cn/news/detail-792973.html
到了這里,關于TwinCAT3 Modbus-TCP Client/Server使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!