(*@PROPERTIES_EX@TYPE: POU
LOCALE: 0
IEC_LANGUAGE: ST
PLC_TYPE: independent
PROC_TYPE: independent
GROUP: Fronius
*)
(*@KEY@:DESCRIPTION*)
(*@KEY@:END_DESCRIPTION*)
FUNCTION_BLOCK SYMO
(*Group:Out*)
VAR_OUTPUT
F_Active_State_Code : WORD;
F_Site_Power : UDINT;
F_Site_Energy_Day : LREAL;
F_Site_Energy_Year : LREAL;
F_Site_Energy_Total : LREAL;
ERROR : DWORD;
END_VAR
(*Group:Modbus*)
VAR
FC : INT := 3;
BUSY : BOOL;
DELAY : TIME := TIME#60s;
UINT_ID : BYTE := BYTE#1;
DATA : oscat_aW0_255;
R_ADDR : WORD := WORD#213;
R_POINTS : WORD := WORD#1;
R_DATA_ADR : INT := 0;
R_DATA_BITPOS : INT := 0;
END_VAR
(*Group:lokal*)
VAR
dwrd1 : UDINT;
dwrd2 : UDINT;
lreal1 : LREAL;
state : INT := 1;
state_convert : INT := 0;
run : BOOL := FALSE;
enable_trigger : BOOL := FALSE;
S_BUF : oscat_NETWORK_BUFFER_SHORT;
R_BUF : oscat_NETWORK_BUFFER_SHORT;
IP_C : oscat_IP_C;
IP_CONTROL2_1 : IP_CONTROL2;
MY_MB_CLIENT_1 : MY_MB_CLIENT;
TIMEOUT : TIME := TIME#10s;
END_VAR
(*Group:IN*)
VAR_INPUT
ENABLE : BOOL := FALSE;
IP : DWORD;
PORT : WORD;
END_VAR
(*@KEY@: WORKSHEET
NAME: SYMO
IEC_LANGUAGE: ST
*)
CASE state OF
1: IF ENABLE THEN
state := 2;
END_IF;
(* get F_Active_State_Code *)
2: R_ADDR := WORD#213;
R_POINTS := WORD#1;
state := 10;
state_convert := 1;
(* get F_Site_Power *)
3: R_ADDR := WORD#499;
R_POINTS := WORD#2;
state := 10;
state_convert := 2;
(* get F_Site_Energy_Day *)
4: R_ADDR := WORD#501;
R_POINTS := WORD#4;
state := 10;
state_convert := 3;
(* get F_Site_Energy_Year *)
5: R_ADDR := WORD#505;
R_POINTS := WORD#4;
state := 10;
state_convert := 4;
(* get F_Site_Energy_Total *)
6: R_ADDR := WORD#509;
R_POINTS := WORD#4;
state := 10;
state_convert := 5;
(* wait until started *)
10: IF BUSY THEN
state := 11;
END_IF;
(* wait until finished *)
11: IF NOT BUSY THEN
CASE state_convert OF
1: F_Active_State_Code := DATA[0];
state := 3;
2: F_Site_Power := DWORD_TO_UDINT(SHL(WORD_TO_DWORD(DATA[0]), 16) + WORD_TO_DWORD(DATA[1]));
state := 4;
3,4,5: dwrd1 := DWORD_TO_UDINT(SHL(WORD_TO_DWORD(DATA[0]), 16) + WORD_TO_DWORD(DATA[1]));
dwrd2 := DWORD_TO_UDINT(SHL(WORD_TO_DWORD(DATA[2]), 16) + WORD_TO_DWORD(DATA[3]));
lreal1 := (UDINT_TO_LREAL(dwrd1) * LREAL#4294967296.0 + UDINT_TO_LREAL(dwrd2)) / LREAL#1000.0;
END_CASE;
CASE state_convert OF
3: F_Site_Energy_Day := lreal1;
state := 5;
4: F_Site_Energy_Year := lreal1;
state := 6;
5: F_Site_Energy_Total := lreal1;
state := 1;
END_CASE;
END_IF;
END_CASE;
IP_CONTROL2_1(
IP:=IP,
PORT:=PORT,
TIME_OUT:=TIMEOUT,
IP_C:=IP_C,
S_BUF:=S_BUF,
R_BUF:=R_BUF);
IP_C:=IP_CONTROL2_1.IP_C;
S_BUF:=IP_CONTROL2_1.S_BUF;
R_BUF:=IP_CONTROL2_1.R_BUF;
MY_MB_CLIENT_1(
IP_C:=IP_C,
S_BUF:=S_BUF,
R_BUF:=R_BUF,
DATA:=DATA,
DATA_SIZE:=INT#256,
ENABLE:=ENABLE,
UDP:=FALSE,
FC:=FC,
UNIT_ID:=UINT_ID,
R_ADDR:=R_ADDR,
R_POINTS:=R_POINTS,
R_DATA_ADR:=R_DATA_ADR,
R_DATA_BITPOS:=R_DATA_BITPOS,
DELAY:=DELAY);
IP_C := MY_MB_CLIENT_1.IP_C;
S_BUF := MY_MB_CLIENT_1.S_BUF;
R_BUF := MY_MB_CLIENT_1.R_BUF;
DATA := MY_MB_CLIENT_1.DATA;
ERROR := MY_MB_CLIENT_1.ERROR;
BUSY := MY_MB_CLIENT_1.BUSY;
(*@KEY@: END_WORKSHEET *)
END_FUNCTION_BLOCK