目錄
一、環境配置和準備
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)倍福官方簡單測試參考