Erweitern der HMI-Parallelklasse (FB)

In vielen Anwendungsfällen soll die Anzahl an dargestellten Werten auf der Oberfläche erweitert werden. Hierfür kann die HMI-Parallelklasse erweitert werden, sodass die neuen Werte in der HMI-Umgebung an geeigneter Stelle erreichbar sind.

Für die vollständige Implementation ist die Erweiterung der Basisklasse (FB) notwendig.
1. Führen Sie Schritt 1 bis 5 der Erweiterung der Basisklasse (FB) für die Basisklasse durch.
2. Legen Sie eine neue Klasse (FB) an und entfernen Sie VAR_INPUT und VAR_OUTPUT.
FUNCTION_BLOCK FB_CustomAxisHmi 
VAR
END_VAR
3. Fügen Sie der Klassendefinition über das Schlüsselwort EXTENDS die zu erbende Klasse hinzu.
FUNCTION_BLOCK FB_CustomAxisHmi EXTENDS FB_AxisHmi 
VAR
END_VAR
4. Damit Sie die Klasse und die hinzugefügten Elemente auch über eine Schnittstelle ansprechen können, legen Sie eine gleichnamige Schnittstelle an.
INTERFACE I_CustomAxisHmi
5. Lassen Sie die Schnittstelle von der Schnittstelle der geerbten Klasse erben.
INTERFACE I_CustomAxisHmi EXTENDS I_AxisHmi
6. Implementieren Sie die Schnittstelle in der zuvor erstellten Klasse (FB).
FUNCTION_BLOCK FB_CustomAxisHmi EXTENDS FB_AxisHmi IMPLEMENTS I_CustomAxisHmi
VAR
END_VAR
7. Instanziieren Sie die Schnittstelle in der Basisklasse (FB).
FUNCTION_BLOCK FB_CustomAxis EXTENDS FB_Axis IMPLEMENTS I_CustomAxis
VAR
    iCustomAxisHmi:        I_CustomAxisHmi;    
END_VAR
8. Überschreiben Sie die SetHMI() Methode der Basisklasse.
// Setter method for HMI-Class
METHOD SetHMI : HRESULT
VAR_INPUT
    ipBaseHmi:        I_BaseHmi;        // interface on hmi object
END_VAR



IF NOT __QUERYINTERFACE(ipBaseHmi, iCustomAxisHmi) THEN
    SetHMI := F_HresultFailure(E_AdsErr.DEVICE_INVALIDINTERFACE);
    RETURN;
END_IF

SetHmi := S_OK;
9. Erweitern Sie die Init() Methode und fügen Sie eine __QUERYINTERFACE() Operation für das neue Interface hinzu.
METHOD Init : HRESULT



IF NOT __QUERYINTERFACE(iCustomAxisHmi, iAxisHmi) THEN
    RETURN;                
ELSIF NOT F_SucceededHr(SUPER^.Init(), Init) THEN
    RETURN;
END_IF

Einen neuen Einstell- oder Kommandowert für das HMI hinzufügen

10. Fügen Sie eine neue Eigenschaft der HMI-Klasse hinzu.
PROPERTY NewHmiProperty : LREAL
11. Fügen Sie der Deklaration das Attribut Monitoring hinzu, um die Eigenschaft für das HMI sichtbar zu machen.
Dadurch wird die Eigenschaft auch im eingeloggten Zustand der PLC sichtbar.
{attribute “monitoring” := “call”}
PROPERTY NewHmiProperty : LREAL
12. Kopieren Sie die Eigenschaft in die gleichnamige Schnittstelle.
Erweitern der HMI-Parallelklasse (FB) 1:
13. Legen Sie in der HMI-Klasse eine ähnlich benannte Variable an, in der der Wert zwischengespeichert werden kann.
FUNCTION_BLOCK FB_CustomAxisHmi EXTENDS FB_AxisHmi IMPLEMENTS I_CustomAxisHmi
VAR
    fNewHmiProperty:            LREAL;
END_VAR
14. Fügen Sie der Deklaration das Attribut ‚TcHmiSymbol.Hide‘ hinzu, sodass die Variable vor dem HMI verdeckt wird.
Dadurch wird gewährleistet, dass die Variable nicht fälschlicherweise anstatt des Properties vom HMI benutzt wird. Wenn Sie im HMI das ADS-Mapping auf Use whitelisting stellen, können Sie grundsätzlich alle Variablen verstecken. Um die HMI-Klassen weiterhin anzuzeigen, müssen Sie bei der Deklaration das {attribute ‘TcHmiSymbol.ShowRecursively‘} hinzufügen.
FUNCTION_BLOCK FB_CustomAxisHmi EXTENDS FB_AxisHmi IMPLEMENTS I_CustomAxisHmi
VAR
    {attribute 'TcHmiSymbol.Hide'}
    fNewHmiProperty:            LREAL;
END_VAR
15. Implementieren Sie den Schreibe- und Lesevorgang der Eigenschaft in der Get und Set Methode.
Sie haben erfolgreich eine Eigenschaft hinzugefügt.

Eine vorhandene Eigenschaft der Basis-Klasse für die HMI zugänglich machen

1. Instanziieren sie in der HMI-Parallelklasse eine Schnittstelle vom Typ der Basisklasse.
FUNCTION_BLOCK FB_CustomAxisHmi EXTENDS FB_AxisHmi IMPLEMENTS I_CustomAxisHmi
VAR
    {attribute “TcHmiSymbol.Hide”}
    iCustomAxis:                I_CustomAxis;
    {attribute “TcHmiSymbol.Hide”}
    fNewHmiProperty:            LREAL;
END_VAR
2. Fügen Sie die Init() Methode der HMI Klasse hinzu.
// Init method for linking to a control class (FB)
METHOD Init : HRESULT
VAR_INPUT
    ipBase:    I_Base;    // Base interface on linked control class (FB)
END_VAR
3. Führen Sie in der Init()-Methode eine __QUERYINTERFACE() Operation von der übergebenen Basisschnittstelle auf die zuletzt instanziierte Schnittstelle durch.
Init := F_HresultFailure(E_AdsErr.DEVICE_NOTINIT);

RETURN(NOT __QUERYINTERFACE(ipBase, iCustomAxis));
RETURN(NOT F_SucceededHr(SUPER^.Init(ipBase), Init));

Init :=  F_HresultSuccess(NOERR);
4. [Falls erbend von FB_BaseHmi] Implementieren Sie den Aufruf der HMI-Init() in der Init()-Methode der Basis-Klasse.
Init:=F_HresultFailure(E_AdsErr.DEVICE_NOTINIT);

IF iCustomAxisHmi = 0 THEN
    RETURN;                
ELSIF NOT F_SucceededHr(iCustomAxisHmi.Init(THIS^), Init) THEN
    RETURN;    
ELSIF NOT F_SucceededHr(SUPER^.Init(), Init) THEN
    RETURN;
END_IF
5. Fügen Sie eine neue Eigenschaft der HMI-Klasse hinzu.
PROPERTY SecondNewHmiProperty : LREAL
6. Fügen Sie der Deklaration das Attribut Monitoring hinzu, um die Eigenschaft für das HMI sichtbar zu machen.
Dadurch wird die Eigenschaft auch im eingeloggten Zustand der PLC sichtbar.
{attribute “monitoring” := “call”}
PROPERTY NewHmiProperty : LREAL
7. Kopieren Sie die Eigenschaft in die gleichnamige Schnittstelle.
Erweitern der HMI-Parallelklasse (FB) 2:
8. Programmieren Sie in die Get (und ggf. Set) Methode der Eigenschaft den Zugriff auf die Eigenschaft der Schnittstelle.
IF iCustomAxis <> 0 THEN
    SecondNewHmiProperty := iCustomAxis.ExistingValue;
END_IF
9. Für weitere Eigenschaften mit Referenzzugriff entfällt entsprechend Schritt 1 bis 4.
Sie haben erfolgreich eine Eigenschaft mit Referenzzugriff auf die Hauptklasse hinzugefügt.