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.
- 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
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.
- 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.