此處用到一個結構體和全局變量;
TYPE ModbusCmd : ( MODBUS_READ_COILS := 16#01, (* 讀線圈 *) MODBUS_READ_DISCRETE_INPUTS := 16#02, (* 讀輸入線圈 *) MODBUS_READ_HOLDING_REGISTERS := 16#03, (* 讀保持寄存器 *) MODBUS_READ_INPUT_REGISTERS := 16#04, (* 讀輸入寄存器 *) MODBUS_WRITE_SINGLE_COIL := 16#05, (* 寫單個線圈 *) MODBUS_WRITE_SINGLE_REGISTER := 16#06, (* 寫單個寄存器 *) MODBUS_READ_EXCEPTION_STATUS := 16#07, (* 讀異常狀態 *) MODBUS_WRITE_MULTIPLE_COILS := 16#0F, (* 寫多個線圈 *) MODBUS_WRITE_MULTIPLE_REGISTERS := 16#10, (* 寫多個寄存器 *) MODBUS_REPORT_SLAVE_ID := 16#11, (* 讀從設備ID號 *) MODBUS_MASK_WRITE_REGISTER := 16#16, (* 寫屏蔽寄存器 *) MODBUS_WRITE_AND_READ_REGISTERS := 16#17 (* 讀/寫多個寄存器 *) ); END_TYPE
(* 自主定義Modbus *) VAR_GLOBAL COIL_STAT_Auto: ARRAY[0..149] OF BOOL; //(讀線圈)線圈狀態寄存器 1位,最高150個,客戶端只寫,服務端只讀 用法COIL_STAT[0] IN_STAT_Auto: ARRAY[0..149] OF BOOL; //(寫線圈)輸入狀態寄存器1位,最高150個,客戶端只讀,服務端只寫 用法IN_STAT[0] HOLD_REG_Auto: ARRAY[0..149] OF INT; //(讀寄存器)保持寄存器 16位,最高150個,客戶端只寫,服務端只讀 用法HOLD_REG[0] IN_REG_Auto: ARRAY[0..149] OF INT; //(寫寄存器)輸入寄存器16位,最高150個,客戶端只讀,服務端只寫 用法IN_REG[0] //總切換按鈕 GC_bTCP: BOOL; //RTU/TCP GC_bRTU: BOOL; //RTU/TCP GC_bRTU_MASTER: BOOL; //RTU 主站 GC_bRTU_Slave: BOOL; //RTU 從站 GC_bTCP_Server: BOOL; //TCP 服務端 GC_bTCP_Client: BOOL; //TCP 客戶端 //MoGC_dbus TCP Server GC_wPortServerTCP: WORD:= 502; //端口 GC_udiNumServerTCP: INT:= 10;//64; //寄存器個數 GC_UnitIDServer: UINT:= 1; //ID //MoGC_dbus TCP Client GC_UnitIDClient: UINT:= 1; //ID GC_IPAddrClient: STRING:= '10.10.56.115'; //IPAddrClient GC_Address: DWORD:= 0; //起始地址 GC_wPortClientTCP: WORD:= 502; //端口 GC_udiNumClientTCP: INT:=10;//64; //寄存器個數50 //MoGC_dbus RTU Master GC_dwBaudRateMaster: WORD:= 9600; //波特率 GC_DeviceMaster: UINT:=0; //串口號 GC_udiNumMaster: INT:=10;//64; //寄存器個數 //MoGC_dbus RTU Slave GC_dwBaudRateSlave: WORD:= 9600; //波特率 GC_DeviceSlave: UINT:=0; //串口號 GC_udiNumSlave: INT:=10;//64; //寄存器個數 //Modbus通訊心跳 GC_bSwitchConnect: BOOL; //通訊開關 GC_bAlarmConnect: BOOL; //通訊報警---映射(任意) GC_bResetConnect: BOOL; //復位報警---映射(任意) GC_iDelayTimeConnect: INT; //延時時間 GC_HoldRegConnect: INT; //讀取對方數據 一定時間內沒變化就報警---映射(讀取保持寄存器) GC_InputRegConnect: INT; //寫給對方的 0<>1---映射 (寫入寄存器) END_VAR
(* 1、V1.4.5UI界面化 (1)、Modbus TCP && RTU (2)、外部軸 ExtAxis 同步和非同步 *) PROGRAM ModbusAuto VAR //實例化 TCP ModbusTCP_Server: ModbusTCP_Server; ModbusTCP_Client: ModbusTCP_Client; //實例化 RTU ModbusRTU_Master: ModbusRTU_Master; ModbusRTU_Slave: ModbusRTU_Slave; iCounter: INT; BTEST: BOOL; ///////////////////////////// //配方變量定義 //配方定義變量 iRecipeStatus: INT:=0; //狀態機 iDelay_Count: INT; //延時 bStart_E: BOOL; bReadRecipeBusy_Ex: BOOL; bReadRecipeDone_Ex: BOOL; dReadAndSaveAs: DWORD; //讀取PLC並保存成文件形式 dLoadfromRecipe: DWORD; //從具體配方文件中載入PLC值 dReadAndSaveRecipe: DWORD; //將當前改變的PLC值保存到具體配方文件中 strDefiniRecipesName: STRING(10):='Recipes'; //配方定義名 strRecipesName: STRING(10):='Recipes'; //配方名 FileName_Ex: STRING(100):='/usr/codesys/CODESYSControl/Recipes.hst'; //配方路徑 RecipeManCommands: RecipeManCommands; //配方函數 ExternalRecipe_RTRIG: R_TRIG; //上升沿 ExternalRecipe_FTRIG: F_TRIG; //下降沿 //文件保存變量 iFileStatus: INT; stParaFileName: STRING(100); FileName_Para: STRING:='ParVarSaveFile'; Fileopen: FILE.Open; //文件打開模塊 FileSize: FILE.GetSize; //獲取文件大小 FileWrite: FILE.Write; //文件寫入模塊 FileClose: FILE.Close; //文件關閉模塊 FileRead: FILE.Read; //文件讀取模塊 ////////////////////////// bTest1: BOOL; END_VAR //TCP RTU GC_bTCP:= FALSE; GC_bRTU:= TRUE; IF GC_bTCP=TRUE AND GC_bRTU=FALSE THEN ACT_ModbusTCP(); ELSIF GC_bTCP=FALSE AND GC_bRTU=TRUE THEN ACT_ModbusRTU(); END_IF
//Modbus RTU GC_bRTU_MASTER:= FALSE; GC_bRTU_Slave:= true; IF GC_bRTU_MASTER=TRUE AND GC_bRTU_Slave=FALSE THEN //默認是主站 ModbusRTU_Master( dwBaudRate:= GC_dwBaudRateMaster, Device:= GC_DeviceMaster, NumBits:= GC_udiNumMaster, NumInputBits:= GC_udiNumMaster, NumRegisters:= GC_udiNumMaster, NumInputRegisters:= GC_udiNumMaster, tab_bits:= COIL_STAT_Auto, tab_inputbits:= IN_STAT_Auto, tab_regs:= HOLD_REG_Auto, tab_inputregs:= IN_REG_Auto); ELSIF GC_bRTU_MASTER=FALSE AND GC_bRTU_Slave=TRUE THEN //從站 ModbusRTU_Slave( dwBaudRate:= GC_dwBaudRateSlave, Device:= GC_DeviceSlave, NumBits:= GC_udiNumMaster, NumInputBits:= GC_udiNumSlave, NumRegisters:= GC_udiNumSlave, NumInputRegisters:= GC_udiNumSlave, tab_bits:= COIL_STAT_Auto, tab_inputbits:= IN_STAT_Auto, tab_regs:= HOLD_REG_Auto, tab_inputregs:= IN_REG_Auto, Status=> , errorID=> ); END_IF
//Modbus TCP GC_bTCP_Server:= FALSE; GC_bTCP_Client:= TRUE; IF GC_bTCP_Server=TRUE AND GC_bTCP_Client=FALSE THEN //默認是服務端 ModbusTCP_Server( UnitID:=GC_UnitIDServer, wPort:= GC_wPortServerTCP, NumBits:= GC_udiNumServerTCP, NumInputBits:= GC_udiNumServerTCP, NumRegisters:= GC_udiNumServerTCP, NumInputRegisters:= GC_udiNumServerTCP, tab_bits:= COIL_STAT_Auto, tab_inputbits:= IN_STAT_Auto, tab_regs:= HOLD_REG_Auto, tab_inputregs:= IN_REG_Auto, Status=> , error=> ); ELSIF GC_bTCP_Server=FALSE AND GC_bTCP_Client=TRUE THEN//客戶端 ModbusTCP_Client( IPAddr:= GC_IPAddrClient, wPort:= GC_wPortClientTCP, UnitID:= GC_UnitIDClient, Address:= GC_Address, NumBits:= GC_udiNumClientTCP, NumInputBits:= GC_udiNumClientTCP, NumRegisters:= GC_udiNumClientTCP, NumInputRegisters:= GC_udiNumClientTCP, tab_bits:= COIL_STAT_Auto, tab_inputbits:= IN_STAT_Auto, tab_regs:= HOLD_REG_Auto, tab_inputregs:= IN_REG_Auto, Status=> , errorID=> ); END_IF