11-15-2021 10:55 AM
Hello together
Is it possible to get an access to the methods SetEvent/SetExtEvent in a self created method.
Would be great, getting an example for this. We have a station, which is a rebuild of an old Opcon project and there are function blocks we would like to reuse them. Therefore, we need to set error messages directly from an instance of a function block.
If there is an easy way to connect a function block to the mode handler, that would be really helpful.
Thanks in advance.
Solved! Go to Solution.
11-15-2021 03:35 PM
SetEvent/SetExtEvent aren't global functions but instance methods of OpconUnit. That's why they can only be called in the context of Control plus model tree objects. Apart from that, the methods are also available in sequences deriving from OpconBaseChain, but only because the chains are always owned by an OpconUnit which is used internally for setting the events.
The main reason why the methods need the OpconUnit context is that every Control plus event has a source object (i.e. an instance ID) telling exactly who created the event.
You could pass a reference to an OpconUnit into another FB allowing it to call SetEvent on the Unit. But that means the FB is no longer independent from the Control plus infrastructure.
The more common solution would be to pass a result value with an error code from the FB to the calling OpconUnit (e.g. ModeHandler) and doing all the event handling there.
08-08-2024 08:32 AM
Hello, Dear Nexidator,
I understand what you said: “passing a reference to an OpconUnit into the FB means the FB is no longer independent from the Control plus infrastructure” , I think it's because each OpconUnit (in my case, the Cmd handler) is defined differently. Therefore, there is no way to reference something that can be applied to all OpconUnits.
But is it possible to directly reference to the "SetEvent" method, and when calling the instance of the FB, pass the "XXXUnit.SetEvent" to it, since the SetEvent method might be the same for each different OpconUnit, and then could the independence of the FB be ensured in this way?
I tried defining the input of the FB as:
VAR_INPUT
XXX : REFERENCE TO SetEvent;
END_VAR
but when building the solution, it throws an error saying : "Error Unknown type: 'SetEvent' ."
Is this approach really unfeasible?
08-08-2024 09:36 AM
SetEvent is a method from ObconUnit.
You can not set a reference to a Method.
08-08-2024 10:41 AM - edited 08-08-2024 03:45 PM
@ZYYZZZ1: Why do you not simply use a reference to the OpconUnit (base class of all units) itself ?
VAR_INPUT
rUnit : REFERENCE TO OpconUnit;
END_VAR
--------------------------------------------------------
IF ( __isValidRef (rUnit))
THEN
rUnit.SetEvent( OpconEventClass := OpconEventClass.ERROR, Number := -1 , AddText := '', Lock := FALSE);
END_IF