Server - SBO Control with normal security
Dieses Beispiel zeigt die Implementierung von ctlModel := 2 (SBO control with normal security, operate-once or operate-many) in einem Server für folgende CDCs:
- SPC (controllable single point)
- DPC (controllable double point)
- APC (controllable analogue process value)
- BAC (binary controlled analogue process value)
- BSC (binary controlled step position information)
- ENC (controllable enumerated status)
- INC (controllable integer status)
- ISC (integer controlled step position information)
Download TwinCAT XAE Project (*.zip): Sample22.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“-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 |
---|---|
_CheckCancelReq | Wird beim Empfangen einer „Cancel“-Anfrage aufgerufen und prüft, ob diese gültig ist. Falls diese ungültig ist, wird eine entsprechende „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. |
_ResetOperValues | Setzt die Werte des „Oper“-Datenattributs auf die konfigurierten Initialwerte zurück. |
_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. |
_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“-Anfrage empfangen wurde. Ist dies der Fall wird der Server-Implementierung mitgeteilt, dass diese mit dem Versenden der Antwort auf die „Operate“-Anfrage warten muss, bis der SBOControl angeschlossen ist. |
OnGetVEvent | Diese Methode ist Teil der „I_AcsiDataAccessEventClass“-Schnittstelle und wird nach jedem Lesezugriff auf das zu steuernde Datenobjekt aufgerufen. Diese Funktionalität wird genutzt, um den Wert des Datenattributs „SBO“ nach einer „Select“-Anfrage zurückzusetzen. |
OnGetVPreEvent | Diese Methode ist Teil der „I_AcsiDataAccessEventClass“-Schnittstelle und wird vor jedem Lesezugriff auf das zu steuernde Datenobjekt aufgerufen. Diese Funktionalität wird genutzt, um „Select“-Anfragen zu überprüfen und entsprechend anzunehmen oder abzulehnen. |
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“- und „Cancel“-Struktur sowie des „SBO“-Datenattributs, 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.
Da es sich bei einer „Select“-Anfrage um eine Leseanfrage auf das „SBO“-Datenattribut handelt, wird diese in der „OnGetVPreEvent“-Methode überprüft. In dieser Methode kann die „Select“-Anfrage angenommen werden, indem der Wert von „SBO“ auf die Referenz auf das „SBO“-Datenattribut gesetzt wird. Um die Anfrage abzulehnen wird der Wert auf einen leeren String gesetzt. Nach dem Senden der Antwort wird die „OnGetVEvent“-Methode aufgerufen, in der der Wert des Datenattributs zurückgesetzt werden kann. Der Ablauf einer erfolgreichen „Select“-Anfrage ist in der folgenden Abbildung dargestellt.
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:
Dies ist nur eine exemplarische Implementierung der SBOControl-Funktionalität in der TwinCAT SPS. |