lpcmanager

Smarteh 485: uart data is copied to beremiz buffer even if reception was not successfull. This ensures that communication statuses are updated. Otherwise these statuses are not updated in case controller can't communicate with any slave. This bug was introduced in revision 614.
<?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>