Fixed Save As... function in Beremiz
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.plcopen.org/xml/tc6.xsd"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
xsi:schemaLocation="http://www.plcopen.org/xml/tc6.xsd">
<fileHeader companyName="Beremiz"
productName="Beremiz"
productVersion="0.0"
creationDateTime="2008-12-14T16:53:26"/>
<contentHeader name="LPC POUs"
modificationDateTime="2012-01-20T13:35:46">
<coordinateInfo>
<fbd>
<scaling x="0" y="0"/>
</fbd>
<ld>
<scaling x="0" y="0"/>
</ld>
<sfc>
<scaling x="0" y="0"/>
</sfc>
</coordinateInfo>
</contentHeader>
<types>
<dataTypes/>
<pous>
<pou name="DEW_POINT" pouType="functionBlock">
<interface>
<inputVars>
<variable name="RH">
<type>
<REAL/>
</type>
</variable>
<variable name="TEMP">
<type>
<REAL/>
</type>
</variable>
</inputVars>
<outputVars>
<variable name="DEW_POINT">
<type>
<REAL/>
</type>
</variable>
</outputVars>
</interface>
<body>
<ST>
<![CDATA[if RH < 0.0 then
RH := 0.0;
end_if;
if RH > 100.0 then
RH := 100.0;
end_if;
DEW_POINT:=sqrt(sqrt(sqrt(RH/100.0)))*(112.0+(0.9*TEMP))+(0.1*TEMP)-112.0;]]>
</ST>
</body>
</pou>
<pou name="GET_RETAIN_DATA" pouType="functionBlock">
<interface>
<inputVars>
<variable name="INDEX">
<type>
<UINT/>
</type>
<initialValue>
<simpleValue value="0"/>
</initialValue>
<documentation>
<![CDATA[Index (row) of the retain array.]]>
</documentation>
</variable>
<variable name="READ">
<type>
<BOOL/>
</type>
<initialValue>
<simpleValue value="FALSE"/>
</initialValue>
</variable>
</inputVars>
<outputVars>
<variable name="WORD1">
<type>
<UINT/>
</type>
<documentation>
<![CDATA[Data - first column.]]>
</documentation>
</variable>
<variable name="WORD2">
<type>
<UINT/>
</type>
</variable>
<variable name="WORD3">
<type>
<UINT/>
</type>
</variable>
<variable name="RD_OK">
<type>
<BOOL/>
</type>
<initialValue>
<simpleValue value="FALSE"/>
</initialValue>
</variable>
</outputVars>
</interface>
<body>
<ST>
<![CDATA[{
extern IEC_UINT __GetRetainData(BOOL, IEC_UINT, IEC_UINT);
extern BOOL __GetReadStatus(BOOL);
__SET_VAR(data__->,WORD1,__GetRetainData(__GET_VAR(data__->READ),__GET_VAR(data__->INDEX),0));
__SET_VAR(data__->,WORD2,__GetRetainData(__GET_VAR(data__->READ),__GET_VAR(data__->INDEX),1));
__SET_VAR(data__->,WORD3,__GetRetainData(__GET_VAR(data__->READ),__GET_VAR(data__->INDEX),2));
__SET_VAR(data__->,RD_OK,__GetReadStatus(0));
}]]>
</ST>
</body>
</pou>
<pou name="SET_RETAIN_DATA" pouType="functionBlock">
<interface>
<inputVars>
<variable name="INDEX">
<type>
<UINT/>
</type>
<initialValue>
<simpleValue value="0"/>
</initialValue>
</variable>
<variable name="WRITE">
<type>
<BOOL/>
</type>
<initialValue>
<simpleValue value="FALSE"/>
</initialValue>
</variable>
<variable name="WORD1">
<type>
<UINT/>
</type>
</variable>
<variable name="WORD2">
<type>
<UINT/>
</type>
</variable>
<variable name="WORD3">
<type>
<UINT/>
</type>
</variable>
</inputVars>
<outputVars>
<variable name="WR_OK">
<type>
<BOOL/>
</type>
<initialValue>
<simpleValue value="FALSE"/>
</initialValue>
</variable>
</outputVars>
</interface>
<body>
<ST>
<![CDATA[{
extern BOOL __SetRetainData(BOOL, IEC_UINT, IEC_UINT, IEC_UINT, IEC_UINT);
__SET_VAR(data__->,WR_OK,__SetRetainData(__GET_VAR(data__->WRITE),__GET_VAR(data__->INDEX),__GET_VAR(data__->WORD1),__GET_VAR(data__->WORD2),__GET_VAR(data__->WORD3)));
}]]>
</ST>
</body>
</pou>
<pou name="FIND_RETAIN_DATA" pouType="functionBlock">
<interface>
<outputVars>
<variable name="FOUND">
<type>
<BOOL/>
</type>
<initialValue>
<simpleValue value="False"/>
</initialValue>
</variable>
<variable name="INDEX">
<type>
<UINT/>
</type>
</variable>
</outputVars>
<inputVars>
<variable name="START_IDX">
<type>
<UINT/>
</type>
<initialValue>
<simpleValue value="0"/>
</initialValue>
</variable>
<variable name="END_IDX">
<type>
<UINT/>
</type>
<initialValue>
<simpleValue value="0"/>
</initialValue>
</variable>
<variable name="SEARCH">
<type>
<BOOL/>
</type>
<initialValue>
<simpleValue value="False"/>
</initialValue>
</variable>
<variable name="WORD1">
<type>
<UINT/>
</type>
</variable>
<variable name="WORD2">
<type>
<UINT/>
</type>
</variable>
<variable name="WORD3">
<type>
<UINT/>
</type>
</variable>
</inputVars>
</interface>
<body>
<ST>
<![CDATA[{
extern BOOL __FindRetainData(BOOL, IEC_UINT, IEC_UINT, IEC_UINT, IEC_UINT, IEC_UINT);
extern IEC_UINT __GetFoundIndex(BOOL);
__SET_VAR(data__->,FOUND,__FindRetainData(__GET_VAR(data__->SEARCH),__GET_VAR(data__->START_IDX),__GET_VAR(data__->END_IDX),__GET_VAR(data__->WORD1),__GET_VAR(data__->WORD2),__GET_VAR(data__->WORD3)));
__SET_VAR(data__->,INDEX,__GetFoundIndex(0));
}]]>
</ST>
</body>
</pou>
<pou name="PID_A" pouType="functionBlock">
<interface>
<inputVars>
<variable name="SET_POINT">
<type>
<REAL/>
</type>
</variable>
</inputVars>
<localVars>
<variable name="ena">
<type>
<INT/>
</type>
<initialValue>
<simpleValue value="1"/>
</initialValue>
</variable>
</localVars>
<inputVars>
<variable name="ACTUAL_VALUE">
<type>
<REAL/>
</type>
</variable>
<variable name="REVERSE">
<type>
<BOOL/>
</type>
</variable>
<variable name="HOLD">
<type>
<BOOL/>
</type>
</variable>
<variable name="MANUAL">
<type>
<BOOL/>
</type>
</variable>
<variable name="MANUAL_REF">
<type>
<REAL/>
</type>
</variable>
<variable name="Kp_GAIN">
<type>
<REAL/>
</type>
</variable>
<variable name="Ki_GAIN">
<type>
<REAL/>
</type>
</variable>
<variable name="Kd_GAIN">
<type>
<REAL/>
</type>
</variable>
<variable name="Td_FADEOUT">
<type>
<TIME/>
</type>
<initialValue>
<simpleValue value="t#1s"/>
</initialValue>
</variable>
<variable name="DEAD_BAND">
<type>
<REAL/>
</type>
</variable>
<variable name="OUT_MAX">
<type>
<REAL/>
</type>
</variable>
<variable name="OUT_MIN">
<type>
<REAL/>
</type>
</variable>
<variable name="CYCLE_TIME">
<type>
<TIME/>
</type>
<initialValue>
<simpleValue value="t#0.1s"/>
</initialValue>
</variable>
</inputVars>
<outputVars>
<variable name="OUT">
<type>
<REAL/>
</type>
</variable>
</outputVars>
<localVars>
<variable name="D_fadeout">
<type>
<REAL/>
</type>
</variable>
<variable name="Error_n">
<type>
<REAL/>
</type>
<initialValue>
<simpleValue value="0.0"/>
</initialValue>
</variable>
<variable name="Error_n1">
<type>
<REAL/>
</type>
<initialValue>
<simpleValue value="0.0"/>
</initialValue>
</variable>
<variable name="Error_n2">
<type>
<REAL/>
</type>
<initialValue>
<simpleValue value="0.0"/>
</initialValue>
</variable>
<variable name="Dout_n">
<type>
<REAL/>
</type>
<initialValue>
<simpleValue value="0.0"/>
</initialValue>
</variable>
<variable name="Dout">
<type>
<REAL/>
</type>
<initialValue>
<simpleValue value="0.0"/>
</initialValue>
</variable>
<variable name="Dout_1">
<type>
<REAL/>
</type>
<initialValue>
<simpleValue value="0.0"/>
</initialValue>
</variable>
<variable name="TON_1">
<type>
<derived name="TON"/>
</type>
</variable>
<variable name="TON_1_Q">
<type>
<BOOL/>
</type>
</variable>
<variable name="ET1">
<type>
<TIME/>
</type>
</variable>
<variable name="CTr">
<type>
<REAL/>
</type>
</variable>
<variable name="FTr">
<type>
<REAL/>
</type>
</variable>
<variable name="power">
<type>
<REAL/>
</type>
</variable>
<variable name="OUTchk">
<type>
<REAL/>
</type>
</variable>
<variable name="Dout_int">
<type>
<REAL/>
</type>
</variable>
<variable name="Reverse_1">
<type>
<BOOL/>
</type>
</variable>
<variable name="Soft_t">
<type>
<BOOL/>
</type>
</variable>
<variable name="R_chk">
<type>
<INT/>
</type>
</variable>
</localVars>
</interface>
<body>
<ST>
<![CDATA[TON_1(
IN := NOT TON_1_Q,
PT := CYCLE_TIME,
Q => TON_1_Q,
ET => ET1
);
if TON_1_Q then
if REVERSE then
Error_n := SET_POINT - ACTUAL_VALUE;
else
Error_n := ACTUAL_VALUE - SET_POINT;
end_if;
if Td_FADEOUT <= T#0.05s then
Td_FADEOUT := t#0.05s;
end_if;
CTr := TIME_TO_REAL (CYCLE_TIME);
FTr := TIME_TO_REAL (Td_FADEOUT);
power := CTr / FTr;
D_Fadeout := EXPT( 0.04979 , power ); (*time to reach 5% = e^(-3) *)
Dout := Kd_GAIN * (Error_n - 2.0 * Error_n1 + Error_n2);
Dout_n := Dout + Dout_1 * D_Fadeout;
Dout_int := Dout_int + Dout_n;
OUTchk := OUTchk + Kp_GAIN * (Error_n - Error_n1) + Ki_GAIN * Error_n * CTr;
R_chk:= bool_to_int(REVERSE) + bool_to_int(Reverse_1);
if (Soft_t or R_chk=1) then
Dout_int := 0.0;
Dout_n := 0.0;
Dout_1:= 0.0;
Dout:= 0.0;
OUTchk:= OUT;
Error_n1:=Error_n;
Error_n2:=Error_n;
Soft_t := 0;
end_if;
if R_chk =1 then
Error_n:=0.0;
Soft_t := True;
end_if;
if OUTchk > OUT_MAX then
OUTchk := OUT_MAX;
end_if;
if OUTchk < OUT_MIN then
OUTchk := OUT_MIN;
end_if;
if MANUAL then
OUT := MANUAL_REF;
OUTchk:= OUT;
Dout_int := 0.0;
Dout_n := 0.0;
Dout_1:= 0.0;
else
if abs(Error_n) < DEAD_BAND or HOLD then
OUT := OUT;
OUTchk:= OUT;
Dout_int := 0.0;
Dout_n := 0.0;
Dout_1:= 0.0;
else
OUT := OUTchk + Dout_int;
end_if;
end_if;
if OUT > OUT_MAX then
OUT := OUT_MAX;
end_if;
if OUT < OUT_MIN then
OUT := OUT_MIN;
end_if;
Error_n2 := Error_n1;
Error_n1 := Error_n;
Dout_1:=Dout_n;
Reverse_1 := REVERSE;
else
OUT:=OUT;
end_if;]]>
</ST>
</body>
</pou>
</pous>
</types>
<instances>
<configurations/>
</instances>
</project>