FUNCTION_BLOCK "ModbusTCP_Server_RuiQi" { S7_Optimized_Access := 'FALSE' } VERSION : 0.1 VAR_INPUT 禁止通讯 : Bool; 客户端读取数据DB : Int; 客户端读取数据DB起始偏移量 : Int; 客户端读取寄存器连续长度 : Int := 1; // 1~400 客户端读取寄存器起始地址 : Int := 1; // 1~400 "=========" : Bool; 客户端写入数据DB : Int; 客户端写入数据DB起始偏移量 : Int; 客户端写入寄存器连续长度 : Int := 1; // 1~400 客户端写入寄存器起始地址 : Int := 1; // 1~400 "=======" : Bool; 接口硬件标识符 { S7_HiddenAssignment := 'HideIfNoParamAssigned'} : HW_ANY := 64; 连接ID { S7_HiddenAssignment := 'HideIfNoParamAssigned'} : CONN_OUC := 7; 连接类型 { S7_HiddenAssignment := 'HideIfNoParamAssigned'} : Byte := 11; 主动建立连接 { S7_HiddenAssignment := 'HideIfNoParamAssigned'} : Bool := 0; 开放端口 { S7_HiddenAssignment := 'HideIfNoParamAssigned'} : UInt := 502; END_VAR VAR_OUTPUT 写入成功 : Bool; 读取成功 : Bool; 通讯失败 : Bool; 通讯状态 : Word; END_VAR VAR MB_SERVER_Instance {InstructionName := 'MB_SERVER'; LibVersion := '5.0'} : MB_SERVER; Connet {InstructionName := 'TCON_IP_v4'; LibVersion := '1.0'} : TCON_IP_v4; DataBuffer : Array[0..399] of Word; END_VAR VAR_TEMP i : Int; Buffer_Temp : Word; END_VAR BEGIN //支持03、06功能码 //保持性寄存器40001~40400寄存器 REGION 写入地址 FOR #i := #客户端写入寄存器起始地址 TO (#客户端写入寄存器起始地址 + #客户端写入寄存器连续长度) BY 1 DO #Buffer_Temp := #DataBuffer[#i]; POKE(area:=16#84, dbNumber:=#客户端写入数据DB, byteOffset:=#客户端写入数据DB起始偏移量 + (#i - #客户端写入寄存器起始地址) * 2, value:=#Buffer_Temp); END_FOR; END_REGION REGION 读取地址 FOR #i := #客户端读取寄存器起始地址 TO (#客户端读取寄存器起始地址 + #客户端读取寄存器连续长度 ) BY 1 DO #Buffer_Temp := PEEK_WORD(area := 16#84, dbNumber := #客户端读取数据DB, byteOffset := #客户端读取数据DB起始偏移量+(#i-#客户端读取寄存器起始地址)*2); #DataBuffer[#i-1] := #Buffer_Temp; END_FOR; END_REGION REGION Connect #Connet.InterfaceId := #接口硬件标识符; #Connet.ID := #连接ID; #Connet.ConnectionType := #连接类型; #Connet.ActiveEstablished := #主动建立连接; #Connet.LocalPort := #开放端口; END_REGION #MB_SERVER_Instance(DISCONNECT := #禁止通讯, NDR => #写入成功, DR => #读取成功, ERROR => #通讯失败, STATUS => #通讯状态, MB_HOLD_REG :=#DataBuffer, CONNECT := #Connet); END_FUNCTION_BLOCK