Checking that Aggregates are Enabled in Logic Programs
If your Logic program assigns a value to a field in a database aggregate, you need to first ensure that the aggregate is enabled, that is, the $Enabled attribute of the aggregate is set to True.
Example:
The following ST logic will fail if the target point does not have the Control aggregate enabled. Execution of this program will result in an error that may cause problems, particularly if it is called from another program.
PROGRAM Set
VAR_INPUT
FullName : STRING;
END_VAR
VAR
CtrlMax AT %M({FullName}.Control.ControlMaximum) : INT;
CtrlMin AT %M({FullName}.Control.ControlMinimum) : INT;
END_VAR
VAR
iRangeMax AT %I(.Range Max) : INT;
iRangeMin AT %I(.Range Min) : INT;
END_VAR
CtrlMax := iRangeMax;
CtrlMin := iRangeMin;
END_PROGRAM
To avoid this, you should write the program to first check the $Enabled OPC attribute of the Control aggregate for the target point, as in the following example:
PROGRAM Set_If_Ctrl_Aggr_Enabled
VAR_INPUT
FullName : STRING;
END_VAR
VAR
CtrlMax AT %M({FullName}.Control.ControlMaximum) : INT;
CtrlMin AT %M({FullName}.Control.ControlMinimum) : INT;
Enabled AT %M({FullName}.Control.$Enabled) : BOOL;
END_VAR
VAR
iRangeMax AT %I(.Range Max) : INT;
iRangeMin AT %I(.Range Min) : INT;
END_VAR
IF Enabled THEN
CtrlMax := iRangeMax;
CtrlMin := iRangeMin;
END_IF
END_PROGRAM