FUNCTION_BLOCK "ModbusTCP_Client_RuiQi" { S7_Optimized_Access := 'FALSE' } VERSION : 0.1 VAR_INPUT 读取寄存器起始地址 : UDInt; // 03功能码;40001至49999 连续读取长度 : UInt; 存放数据DB号 : UInt; // 此DB不能勾选优化访问 存放数据起始地址 : UInt; // 字节地址;如DBX20.0,填20 "========" : Bool; // 分隔号;勿填地址 写入寄存器起始地址 : UDInt; // 06功能码;40001至49999 连续写入长度 : UInt; 数据来源DB号 : UInt; // 此DB不能勾选优化访问 数据来源起始地址 : UInt; // 字节地址;如DBX20.0,填20 客户端网口硬件标识符 { S7_HiddenAssignment := 'Hide'} : HW_ANY := 64; 连接ID { S7_HiddenAssignment := 'Hide'} : CONN_OUC := 1; // 不可重复 "服务器IP[1]" { S7_HiddenAssignment := 'Hide'} : Byte := 192; // 第一段IP "服务器IP[2]" { S7_HiddenAssignment := 'Hide'} : Byte := 168; // 第二段IP "服务器IP[3]" { S7_HiddenAssignment := 'Hide'} : Byte := 0; // 第三段IP "服务器IP[4]" { S7_HiddenAssignment := 'Hide'} : Byte := 1; // 第四段IP 服务器端口 { S7_HiddenAssignment := 'Hide'} : UInt := 502; 主动建立连接 : Bool := 1; 禁用通讯 { S7_HiddenAssignment := 'HideIfNoParamAssigned'} : Bool := 0; END_VAR VAR_OUTPUT 正在读取 : Bool; 读取成功 : Bool; 读取失败 : Bool; 读取失败错误代码 : Word; "=========" : Bool; // 分隔号;勿填地址 正在写入 : Bool; 写入成功 : Bool; 写入失败 : Bool; 写入失败错误代码 : Word; "==========" : Bool; // 分隔号;勿填地址 程序错误 : Bool; 通讯状态 : Word; END_VAR VAR Connet {InstructionName := 'TCON_IP_v4'; LibVersion := '1.0'} : TCON_IP_v4; Read : Struct REQ : Bool; Mode : USInt := 0; Data_Adde : UDInt; Data_Lenth : UInt; Busy : Bool; Done : Bool; Error : Bool; Error_Word : Word; Read_Mode : Bool; END_STRUCT; Write : Struct REQ : Bool; Mode : USInt := 1; Data_Adde : UDInt; Data_Lenth : UInt; Busy : Bool; Done : Bool; Error : Bool; Error_Word : Word; Write_Mode : Bool; END_STRUCT; MB_CLIENT_Instance {InstructionName := 'MB_CLIENT'; LibVersion := '5.0'} : MB_CLIENT; Program_Err : Bool; Client_REQ : Bool; END_VAR VAR_TEMP Read_Pointer_Any : Any; Write_Pointer_Any : Any; Final_Pointer : Any; MB_CLIENT : Struct Inhibit : Bool; MB_Mode : USInt; MB_Data_Addr : UDInt; MB_Data_Lenth : UInt; Done : Bool; Busy : Bool; Error : Bool; Status : Word; END_STRUCT; END_VAR BEGIN NETWORK TITLE = //CPU:S7-1500, //MB_CLIENT:V5.0, //By:AL-20190721, NETWORK TITLE = Connect L #客户端网口硬件标识符; T #Connet.InterfaceId; L #连接ID; T #Connet.ID; L #"服务器IP[1]"; T #Connet.RemoteAddress.ADDR[1]; L #"服务器IP[2]"; T #Connet.RemoteAddress.ADDR[2]; L #"服务器IP[3]"; T #Connet.RemoteAddress.ADDR[3]; L #"服务器IP[4]"; T #Connet.RemoteAddress.ADDR[4]; L #服务器端口; T #Connet.RemotePort; A #禁用通讯; = #MB_CLIENT.Inhibit; A #主动建立连接; = #Connet.ActiveEstablished; NETWORK TITLE = Read_Pointer L 16#10; T %LB0; L 16#04;//Word T %LB1; L #连续读取长度; T %LW2; L #存放数据DB号; T %LW4; L #存放数据起始地址; SLD 3; T %LD6; L 16#84; T %LB6; L #读取寄存器起始地址; T #Read.Data_Adde; L #连续读取长度; T #Read.Data_Lenth; NETWORK TITLE = Write_Pointer L 16#10; T %LB10; L 16#04;//Word T %LB11; L #连续写入长度; T %LW12; L #数据来源DB号; T %LW14; L #数据来源起始地址; SLD 3; T %LD16; L 16#84; T %LB16; L #写入寄存器起始地址; T #Write.Data_Adde; L #连续写入长度; T #Write.Data_Lenth; NETWORK TITLE = //循环触发,不读不写就触发读模式,读完成就写,写完成就读 AN #Read.Read_Mode; AN #Write.Write_Mode; JC SetRead; CLR; O #Read.Done; O #Read.Error; JC SetWrite; CLR; O #Write.Done; O #Write.Error; JC SetRead; CLR; JU NetWork5End; SetRead: S #Read.Read_Mode; R #Write.Write_Mode; JU NetWork5End; SetWrite: S #Write.Write_Mode; R #Read.Read_Mode; JU NetWork5End; NetWork5End: CLR; NETWORK TITLE = R #Program_Err; A #Read.Read_Mode; AN #Write.Write_Mode; JC ReadMode; CLR; A #Write.Write_Mode; AN #Read.Read_Mode; JC WriteMode; CLR; JU Err; ReadMode: L #Read.Mode; T #MB_CLIENT.MB_Mode; L #Read.Data_Adde; T #MB_CLIENT.MB_Data_Addr; L #Read.Data_Lenth; T #MB_CLIENT.MB_Data_Lenth; L %LW0; T %LW20; L %LW2; T %LW22; L %LW4; T %LW24; L %LW6; T %LW26; L %LW8; T %LW28; JU NetWork6End; WriteMode: L #Write.Mode; T #MB_CLIENT.MB_Mode; L #Write.Data_Adde; T #MB_CLIENT.MB_Data_Addr; L #Write.Data_Lenth; T #MB_CLIENT.MB_Data_Lenth; L %LW10; T %LW20; L %LW12; T %LW22; L %LW14; T %LW24; L %LW16; T %LW26; L %LW18; T %LW28; JU NetWork6End; Err: S #Program_Err; NetWork6End: CLR; NETWORK TITLE = R #Client_REQ; A #禁用通讯; JC NetWork7End; CLR; AN #Read.Busy; AN #Write.Busy; JCN NetWork7End; S #Client_REQ; NetWork7End: CLR; NETWORK TITLE = Comm CALL #MB_CLIENT_Instance ( REQ := #Client_REQ , DISCONNECT := #MB_CLIENT.Inhibit , MB_MODE := #MB_CLIENT.MB_Mode , MB_DATA_ADDR := #MB_CLIENT.MB_Data_Addr , MB_DATA_LEN := #MB_CLIENT.MB_Data_Lenth , DONE := #MB_CLIENT.Done , BUSY := #MB_CLIENT.Busy , ERROR := #MB_CLIENT.Error , STATUS := #MB_CLIENT.Status , MB_DATA_PTR := #Final_Pointer , CONNECT := #Connet ); NETWORK TITLE = A #Read.Read_Mode; A #MB_CLIENT.Done; = #Read.Done; A #Read.Read_Mode; A #MB_CLIENT.Busy; = #Read.Busy; A #Read.Read_Mode; A #MB_CLIENT.Error; = #Read.Error; A #Read.Error; JCN ReadOK; L #MB_CLIENT.Status; T #Read.Error_Word; ReadOK: CLR; A #Read.Done; JCN ReadEnd; L 0; T #Read.Error_Word; ReadEnd: CLR; NETWORK TITLE = A #Write.Write_Mode; A #MB_CLIENT.Done; = #Write.Done; A #Write.Write_Mode; A #MB_CLIENT.Busy; = #Write.Busy; A #Write.Write_Mode; A #MB_CLIENT.Error; = #Write.Error; A #Write.Error; JCN WriteOK; L #MB_CLIENT.Status; T #Write.Error_Word; WriteOK: CLR; A #Write.Done; JCN WriteEnd; L 0; T #Write.Error_Word; WriteEnd: CLR; NETWORK TITLE = A #Read.Busy; = #正在读取; A #Read.Done; = #读取成功; A #Read.Error; = #读取失败; L #Read.Error_Word; T #读取失败错误代码; A #Write.Busy; = #正在写入; A #Write.Done; = #写入成功; A #Write.Error; = #写入失败; L #Write.Error_Word; T #写入失败错误代码; A #Program_Err; = #程序错误; L #MB_CLIENT.Status; T #通讯状态; END_FUNCTION_BLOCK