Server - SBO Control with enhanced security

Dieses Beispiel zeigt die Implementierung von ctlModel := 4 (SBO control with enhanced security, operate-once or operate-many) in einem Server für folgende CDCs:

Download TwinCAT XAE Project (*.zip): Sample24.zip

Das hier beschriebene Beispiel nutzt die Statemachine, welche in dem Kapitel „Allgemeine Server - Projektstruktur“ beschrieben ist. Die States: 0,1,10 und 100 sind identisch zu der dort beschriebenen Statemachine. Andere States wurden für das Beispiel modifiziert oder auch neue States hinzugefügt.

Ein neuer Funktionsbaustein „FB_SboControl“ wurde hinzugefügt. In diesem ist die Statemachine für das Controlmodel implementiert. Damit diese für ein Datenobjekt ausgeführt wird, muss im „VAR_INPUT“-Teil des Funktionsbausteins des zu steuernden Datenobjekts eine „FB_SboControl“-Instanz wie folgt deklariert werden:

fbControl: FB_SboControl := (ipCtrl:=THIS^.AddServerJob(ipEvent:=fbControl, ipCompletion:=fbControl));

Jede dieser Instanzen verfügt über eine „Execute“-Methode, die jeden Zyklus aufgerufen werden muss, um das Controlmodel zu überwachen. In diesem Beispiel wird dies im „FB_IEDServerSession“-Funktionsbaustein erledigt. In dieser Methode befinden sich die Statemachine sowie die Überwachung für das Versenden von „LastApplError“ und „CommandTermination“-Nachrichten. Zusätzlich zu der „Execute“-Methode verfügt der „FB_SboControl“-Funktionsbaustein über weitere Methoden und Eigenschaften, die für das Controlmodel benötigt werden. Diese werden in den folgenden Tabellen erläutert.

Methoden des „FB_SboControl“-Funktionsbausteins

Methodenname

Beschreibung

_CompareCtlVal

Überprüft entsprechend der steuerbaren CDC des zu steuernden Datenobjekts ob zwei Werte von „ctlVal“ gleich sind. Diese Methode wird genutzt um zu prüfen, ob die „SelectWithValue“- und „Operate“-Anfrage identische Werte enthalten.

_CheckCancelReq

Wird beim Empfangen einer „Cancel“-Anfrage aufgerufen und prüft, ob diese gültig ist. Falls diese ungültig ist, wird eine ent-sprechende „LastApplError“-Nachricht versendet.

_CheckCtlVal

Entsprechend der steuerbaren CDC des Datenobjekts wird überprüft, ob der zu schreibende Wert von „ctlVal“ gültig ist. Falls der Wert ungültig ist, wird ein entsprechender Fehlercode zurückgegeben.

_DynamicTest

Diese Methode führt den dynamischen Test aus. Da dieser in diesem Beispiel nicht benötigt wird, wird immer ein erfolgreiches Ergebnis zurückgegeben. Ein eigener dynamischer Test kann in dieser Methode implementiert werden.

_Init

Initialisiert den „FB_DirectControl“-Funktionsbaustein, indem die CDC des zu kontrollierenden Datenobjekts bestimmt wird.

_OperativeTest

Diese Methode führt den operativen Test aus. Dabei wird überprüft, ob der Zustand des logischen Knotens, der dem zu steuernden Datenobjekt übergeordnet ist, das Steuern zulässt sowie ob der zu schreibende Wert gültig ist. Ist der Test erfolgreich, wird die Adresse des Clients zwischengespeichert, um identifizieren zu können, welcher Client das Controlmodel ausgelöst hat. Wenn der Test fehlschlägt, wird eine „LastApplError“-Nachricht an den Client versendet.

_Reset

Setzt die für ein SBOControl zwischengespeicherten Werte zurück.

_ResetCancelValues

Setzt die Werte des „Cancel“-Datenattributs auf die konfigurierten Initialwerte zurück.

_ResetSBOwValues

Setzt die Werte des „SBOw“-Datenattributs auf die konfigurierten Initialwerte zurück.

_ResetOperValues

Setzt die Werte des „Oper“-Datenattributs auf die konfigurierten Initialwerte zurück.

_SendCommandTerminationReqNeg

Versendet eine negative „CommandTermination“-Anfrage an den Client.

_SendCommandTerminationReqPos

Versendet eine positive „CommandTermination“-Anfrage an den Client.

_SendLastApplError

Versendet eine „LastApplError“-Nachricht an den Client.

_Set[CDC]Value

Für jede steuerbare CDC ist eine Methode hinzugefügt worden, da die meisten CDCs unterschiedliche Typen verwenden, z. B. „APC“ -> „REAL“ und „SPC“ -> „BOOL“. Da die CDCs unterschiedliche Typen verwenden, besitzt auch jede dieser Methoden für den Wert (z. B. ctlVal) einen anderen Inputparameter. Anhand dieses Parameters wird der Wert des zu steuernden Datenobjekts gesetzt.

_SetValue

Setzt den Wert des zu steuernden Datenobjekts entsprechend dem Wert von „ctlVal“. Je nach CDC des Datenobjekts wird dafür die entsprechende „_Set[CDC]Val“-Methode aufgerufen.

_Test

Diese Methode führt Test der in der „SelectWithValue“-Anfrage übermittelten Daten aus. Dabei wird überprüft, ob der Zustand des logischen Knotens, der dem zu steuernden Datenobjekt übergeordnet ist, das Steuern zulässt sowie ob der zu schreibende Wert gültig ist. Ist der Test erfolgreich, wird die Adresse des Clients zwischengespeichert, um identifizieren zu können, welcher Client das Controlmodel ausgelöst hat. Wenn der Test fehlschlägt, wird eine „LastApplError“-Nachricht an den Client versendet.

_UpdateTimestampValue

Setzt den Wert des Datenattributs „t“ des zu steuernden Datenobjekts auf die aktuelle Systemzeit.

Execute

In dieser Methode ist die Statemachine für das Controlmodel implementiert. Die anderen Methoden aus diesem Funktionsbaustein werden entsprechend der Statemachine in dieser Methode aufgerufen.

OnAbort

Wird aufgerufen, wenn die Verbindung des Servers abgebrochen wird und bricht das Senden der „LastApplError“-Nachricht ab.

OnCompletionWaitEvent

Nach jedem Schreibvorgang wird diese Methode von der Serverimplementierung aufgerufen. In dieser wird bestimmt, ob eine „Operate“- oder „SelectWithValue“-Anfrage empfangen wurde. Ist dies der Fall wird der Server-Implementierung mitgeteilt, dass diese mit dem Versenden der Antwort auf die „Operate“- oder „SelectWithValue“-Anfrage warten muss bis der SBOControl angeschlossen ist.

OnGetVEvent

Diese Methode ist Teil der „I_AcsiDataAccessEventClass“-Schnittstelle, wird jedoch für dieses Beispiel nicht benötigt.

OnGetVPreEvent

Diese Methode ist Teil der „I_AcsiDataAccessEventClass“-Schnittstelle, wird jedoch für dieses Beispiel nicht benötigt.

OnSetVEvent

Diese Methode ist Teil der „I_AcsiDataAccessEventClass“-Schnittstelle, wird jedoch für dieses Beispiel nicht benötigt.

OnSetVPreEvent

Diese Methode ist Teil der „I_AcsiDataAccessEventClass“-Schnittstelle und wird vor jedem Schreibzugriff auf das zu steuernde Datenobjekt aufgerufen. Diese Funktionalität wird genutzt, um das Überschreiben der „Oper“-, „SBOw“- und „Cancel“-Struktur, z. B. durch einen anderen Client, während eines Control-Vorgangs zu verhindern.

Eigenschaften des "FB_SboControl"-Funktionsbausteins

Eigenschaftsname

Beschreibung

eType

Gibt die steuerbare CDC an (z. B. „APC).

ipBehVal

Schnittstellenzeiger auf den Wert des „Beh“-Datenobjekts des, dem zu steuernden Datenobjekts übergeordneten, logischen Knotens.

ipCtrl

Schnittstellenzeiger auf das zu steuernde Datenobjekt.

ipStepSize

Optionaler Schnittstellenzeiger auf das „stepSize“-Datenattribut. Dieses kann für ein das Setzen des Wertes eines „BAC“-Datenobjekts genutzt werden.

Für den Ablauf des SBOControl wird die in der unteren Abbildung dargestellte Statemachine genutzt, die in der „Execute“-Methode des „FB_SboControl“-Funktionsbausteins implementiert ist. Die Übergänge zwischen den einzelnen Zuständen werden durch boolesche Variablen gesteuert. Zudem wird die boolesche Variable „bNewState“ genutzt, um neue Zustände zu erkennen und das entsprechende Verhalten beim Zustandswechsel zu implementieren.

Server - SBO Control with enhanced security 1:

Da zwischen Empfang der „Operate“-Anfrage und dem Ausführen mehrere SPS-Zyklen liegen können, muss der Server-Applikation mitgeteilt werden, wie lange sie bis zum Senden einer Antwort warten muss. Dafür wird eine „fbCompletion“ genannte Instanz des „FB_AcsiServiceResultClass“-Funktionsbausteins verwendet. Beim Empfangen einer „Operate“-Anfrage wird dieser in der „OnCompletionWaitEvent“-Methode in den Zustand „Busy“ gesetzt und als Schnittstellenzeiger an die Server-Applikation übergeben. Diese wartet nun so lange, bis fbCompletion“ im Zustand „Completed“ ist und schickt dann die Antwort auf die „Operate“-Anfrage. Soll die „Operate“-Anfrage direkt abgelehnt werden, wird dies in der „OnSetVPreEvent“-Methode erledigt. Der Ablauf einer „Operate“-Anfrage ist in der folgenden Abbildung dargestellt:

Server - SBO Control with enhanced security 2:

Da es sich bei der „SelectWithValue“-Anfrage um eine Schreibanfrage handelt, wird der gleiche, im vorherigen Absatz beschriebene Ablauf wie für „Operate“-Anfragen genutzt, um diese zu bearbeiten.

Server - SBO Control with enhanced security 3:

Dies ist nur eine exemplarische Implementierung der SBOControl-Funktionalität in der TwinCAT SPS.