lpcmanager

LPCCommand : switch to wx.Timer instead of regular python timer for the rapidfire protection. With regular python timers, some refresh order could pile eventloop when interacting with the GUI while doing initial loading of signals.
<?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);
SetFbVar(WORD1,__GetRetainData(GetFbVar(READ),GetFbVar(INDEX),0));
SetFbVar(WORD2,__GetRetainData(GetFbVar(READ),GetFbVar(INDEX),1));
SetFbVar(WORD3,__GetRetainData(GetFbVar(READ),GetFbVar(INDEX),2));
SetFbVar(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);
SetFbVar(WR_OK,__SetRetainData(GetFbVar(WRITE),GetFbVar(INDEX),GetFbVar(WORD1),GetFbVar(WORD2),GetFbVar(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);
SetFbVar(FOUND,__FindRetainData(GetFbVar(SEARCH),GetFbVar(START_IDX),GetFbVar(END_IDX),GetFbVar(WORD1),GetFbVar(WORD2),GetFbVar(WORD3)));
SetFbVar(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>