Server - Direct Control with enhanced security
Dieses Beispiel zeigt die Implementierung von ctlModel := 3 (Direct control with enhanced security, direct-operate) 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): Sample23.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_DirectControl“ 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_DirectControl“-Instanz wie folgt deklariert werden:
fbControl: FB_DirectControl := (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_DirectControl“-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_DirectControl"-Funktionsbausteins
Methodenname | Beschreibung |
---|---|
_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 DirectControl zwischengespeicherten Werte 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. |
_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“- und „CommandTermination“-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 DirectControl 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“-Struktur, z. B. durch einen anderen Client, während eines Control-Vorgangs zu verhindern. |
Eigenschaften des "FB_DirectControl"-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 DirectControl wird die in der unteren Abbildung dargestellte Statemachine genutzt, die in der „Execute“-Methode des „FB_DirectControl“-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 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 DirectControl-Funktionalität in der TwinCAT SPS. |