FB_MTP_ServiceControl

Der Funktionsbaustein FB_MTP_ServiceControl ermöglicht das Ausführen von Prozeduren aus unterschiedlichen Quellen: interne SPS-Logik, manuelle Bedienung (z. B. über OPC UA) oder Leitsystem (z. B. über OPC UA). Schaltanfragen und Wertevorgaben werden über den Service Mode verwaltet.
![]() | Bei dem |
![]() | Für die Verwendung von Diensten empfehlen wir die Verwendung des TwinCAT 3 MTP-Engineerings und die darin enthaltene automatische Codegenerierung. |
Prozeduren
Am Eingang Procedures werden alle dem Dienst zugehörigen Prozeduren als ARRAY[0..(cProcedures-1)] OF I_MTP_INTERNAL_Procedure übergeben. Ein Dienst benötigt mindestens eine Prozedur.
Die Auswahl einer Prozedur erfolgt über die Variablen ProcedureInt, ProcedureOp, ProcedurExt in Abhängigkeit des Zustands des Service Mode des Dienstes. Über ProcedureReq wird die aktuell vorgewählte Prozedur-ID angezeigt, welche beim Start des Dienstes verwendet wird. Bei ungültiger Prozedur-ID wird hier eine 0 ausgegeben. ProcedureCur zeigt die aktuell gestartete Prozedur an. Es kann immer nur eine Prozedur zur gleichen Zeit ausgeführt werden.
Konfigurationsparamter
Am Eingang ConfParameters werden alle dem Dienst zugehörigen Konfigurationsparameter als ARRAY[0..(cConfigParameters-1)] OF I_MTP_INTERNAL_ParameterElement übergeben.
Die dienstweite Übernahme neuer Werte für die Konfigurationsparameter erfolgt nach dem gleichen Prinzip wie in den Unterkapiteln von ParameterElements beschrieben. Dies ist nur für synchronisierte Parameter Sync = TRUE möglich. Über die Variable VReq der Parameter können die zu übernehmenden Werte vorher geprüft werden.
Die Freigabe erfolgt, wenn alle synchronisierten Konfigurationsparameter ApplyEn = TRUE haben. Dies wird auf Dienstebene durch die Variable ConfParamApplyEn = TRUE signalisiert. Anschließend kann über die Variablen ConfigParamApplyOp, ConfigParamApplyInt oder ConfigParamApplyExt je nach Zustand des Service Mode, die Übernahme bestätigt werden.
Prozedurparameter
Am Eingang ProcParameter werden alle dem Dienst zugehörigen Prozedurparameter als ARRAY[0..(cProcParameters-1)] OF I_MTP_INTERNAL_ParameterElement übergeben.
Bei aktiver Prozedur PorcedureCur > 0 ist eine dienstweite Übernahme neuer Werte für die Prozedurparameter möglich. Sie gilt ausschließlich für die der aktiven Prozedur zugeordneten Prozedurparameter und erfolgt nach dem gleichen Prinzip wie in den Unterkapiteln von ParameterElements beschrieben. Dies ist nur für synchronisierte Parameter Sync = TRUE möglich. Über die Variable VReq der Parameter können die zu übernehmenden Werte vorher geprüft werden.
Die Freigabe erfolgt, wenn alle synchronisierten Prozedurparameter ApplyEn = TRUE haben. Dies wird auf Dienstebene durch die Variable ProcParamApplyEn = TRUE signalisiert. Anschließend kann über die Variablen ProcParamApplyOp, ProcParamApplyInt oder ProcParamApplyExt je nach Zustand des Service Mode, die Übernahme bestätigt werden.
Berichtswerte
Am Eingang ReportValues werden alle dem Dienst zugehörigen Berichtswerte als ARRAY[0..(cReportValues-1)] OF I_MTP_INTERNAL_ReportValue übergeben. Über den Eingang ReportValueFreeze können alle Reportwerte V des Dienstes eingefroren werden. Sollte sich der Wert des Eingangswerts VIn in dieser Zeit mehr als einmal ändern, wird dies am Ausgang MissedValue = TRUE des Parameters angezeigt.
Architektur
Das untenstehende Bild zeigt eine Übersicht der zu übergebenen Arrays:

Dienstzustandsautomat
Der Dienstzustandsautomat hat 16 Zustände auf fünf Ebenen (Level). Die Zustände sind unterteilt in transiente und nicht-transiente Zustände. Die transienten Zustände werden über Steuerbefehle des Steuerworts erreicht. Nicht-transiente Zustände werden nach erfolgreicher Abarbeitung der transienten Zustände (SC) erreicht. Eine Ausnahme ist der Zustand Execute. Dieser kann sowohl transient, als auch nicht-transient sein. Dies wird über die Variable IsSelfCompleting in der Prozedur definiert.
Der Dienstzustandsautomat ist nach dem untenstehenden Schema aufgebaut:

Der Dienstzustandsautomat kann in unterschiedlichen Schleifen betrachtet werden:
Hauptschleife
Die Hauptschleife zum Ausführen der prozesstechnischen Hauptfunktion(en) des Automaten beinhaltet die folgenden Zustände:
Idle→Starting→Execute→Completing→Completed→Resetting→Idle
Daneben können noch folgende Schleifen betrachtet werden:
Pause-Schleife
Die Pause-Schleife kann nur aus dem Zustand Execute gestartet werden. Beendet wird sie durch den Befehl Resume oder durch einen Befehl, der in einen Zustand höherer Ebene führt.
Beispiel:
Execute→Pausing→Paused→Resuming→Execute
Hold-Schleife
Die Hold-Schleife kann aus den Zuständen aus Ebene 2 oder geringer gestartet werden. Beendet wird sie durch den Befehl Unhold oder durch einen Befehl, der in einen Zustand höherer Ebene führt.
Beispiel:
Execute→Holding→Held→Unholding→Execute
![]() | Die Hold-Schleife kann verwendet werden, um ein sicheres Eingreifen zur Vermeidung von Schäden am Produkt zu ermöglichen. |
Stop-Schleife
Die Stop-Schleife kann aus den Zuständen aus Ebene 3 oder geringer gestartet werden. Beendet wird sie durch den Befehl Reset oder Abort.
Execute→Stopping→Stopped→Resetting→Idle
![]() | Typischerweise dient die Stop-Schleife der Implementierung der Logik zum Stoppen des Dienstes. Das Produkt kann beschädigt werden. |
Abort-Schleife
Die Abort-Schleife kann aus den Zuständen aus Ebene 4 oder geringer gestartet werden. Beendet wird sie durch den Befehl Reset.
Execute→Aborting→Aborted→Resetting→Idle
![]() | Typischerweise dient die Abort-Schleife der Implementierung der Logik zum schnellen Stoppen des Dienstes. Das Equipment kann beschädigt werden. |
Steuerung des Dienstzustandsautomaten
Die Variable CommandEn gibt die einzelnen Steuerbefehle des Steuerworts frei. Über die Variablen CommandInt, CommandOp und CommandExt kann das Steuerwort (siehe E_MTP_Command) in Abhängigkeit des Zustands des Service Mode für den Dienstzustandsautomaten vorgegeben werden.
Alle Zustände können mit einem Steuerbefehl, sofern dieser freigegeben ist, in einen Zustand höherer Ebene überführt werden: z. B. können mit dem Befehl Hold alle Zustände der Ebenen 1 und 2 in den Zustand Holding überführt werden.
Ein Starten ist nur dann möglich, wenn eine gültige Prozedur ausgewählt wurde und alle der angeforderten Prozedur (ProcedureReq) zugeordneten Prozedurparameter ApplyEn = TRUE haben
Abhängigkeiten mit Service Mode
Wird der Service Mode aus dem Zustand Offline in einen der beiden anderen Zustände Operator oder Automatic* überführt, befindet sich der Dienstzustandsautomat immer im Zustand Idle. Ein Zurückführen des Service Mode in den Zustand Offline ist nur möglich, wenn der Dienstzustandsautomat sich im Grundzustand Idle befindet. Ein Umschalten zwischen Operator und Automatic* ist unabhängig vom Zustand des Dienstzustandsautomaten möglich und verändert nicht dessen aktuellen Zustand.
Ausführung von Prozeduren
Voraussetzung zum Start/Neustart einer Prozedur:
- Der Dienstzustandsautomat muss sich im Zustand
Idle(Start) oderExecute(Neustart) befinden - Es muss eine gültige Prozedur
ProcedureReq> 0 angefragt werden. - Alle Prozedurparameter, welche zur angefragten Prozedur gehören, müssen die Wertübernahme freigeben
ApplyEN = TRUE.
Bei Start/Neustart werden alle Werte der Prozedurparameter, die zu der angefragten Prozedur gehören, aktualisiert und ProcedureReq auf 0 gesetzt. Der Dienstzustandsautomat wird in den Zustand Starting überführt.
Die Ausführung der Zustände, mit Ausnahme von Idle, erfolgt in den gleichnamigen Methoden der ausgewählten Prozedur. Bei der Ausführung von transienten Zuständen erfolgt der Zustandsübergang (SC), wenn die jeweilige Methode TRUE zurückgibt. Nach erfolgreicher Ausführung gehen sie in ihren Folgezustand über. Über die Variable StateCur wird der aktuelle Zustand des Dienstzustandsautomaten angezeigt (siehe E_MTP_State).
Beispiel: Dienst Filling führt Prozedur VolumeFilling durch (Instanz von FB_MTP_Volume_Filling) aus.

Positionsbeschreibung
Um den aktuellen Stand des Dienstes näher zu beschreiben, kann eine Textliste angelegt werden. In dieser können die einzelnen Arbeitsschritte näher beschrieben werden. Über die Variable PosTextID kann auf die einzelnen Arbeitsschritte in der Textliste verwiesen werden.
![]() | Für die Positionsbeschreibung empfehlen wir die Verwendung des TwinCAT 3 MTP Engineering und des darin enthaltenen MTP-Exports, da die Textliste nicht über OPC UA zur Verfügung gestellt wird, sondern in der MTP-Datei beschrieben wird. |
Dienst-Bediener-Interaktion
Während der Laufzeit kann eine Interaktion zwischen Dienst und Bediener erfolgen. Hierzu werden Textlisten mit Fragen und zugehörigen Antworten angelegt. Über die Variable QuestionID verweist der Dienst auf eine Frage in der Textliste. Sie bekommen zu der Frage Antwortmöglichkeiten angezeigt. Bei Auswahl einer Antwort wird diese über die Variable InteractQuestionID an den Dienst geschrieben. Die Variable AdditionalInfo ermöglicht es, weitere Informationen in Textform bereitzustellen.
![]() | Für die Dienst-Bediener-Interaktion empfehlen wir die Verwendung des TwinCAT 3 MTP-Engineering und des darin enthaltenen MTP-Exports empfohlen, da die Textlisten nicht über OPC UA zur Verfügung gestellt werden, sondern in der MTP-Datei beschrieben werden. |
Im untenstehenden Beispiel werden die Prozeduren, Konfigurationsparameter und Reportwerte im Deklarationsteil einer Ableitung des FB_MTP_ServiceControl deklariert und in Arrays zusammengefasst. Anschließend werden diese im Rumpf des FB_MTP_ServiceControl aufgerufen. Somit sind alle dienstrelevanten Prozeduren, Parameter und Reportwerte an einem Ort zusammengefasst.
Dabei kann immer nur eine Prozedur zur gleichen Zeit ausgeführt werden. Das Starten einer Prozedur kann nur erfolgen, wenn der Dienst im Zustand Idle ist.
Syntax
// ************************************************************************
// * This file was automatically generated by TwinCAT 3 MTP Engineering. *
// * *
// * WARNING: Code inside regions will be overwritten by the next PLC *
// * Generation. Code outside those regions will be preserved. You can *
// * change the base function block or add members outside the generated *
// * regions. *
// * *
// * INFO: Implement service states in methods. Variables related to *
// * this procedure should be added here. This function block can extend *
// * existing procedure function blocks. *
// ************************************************************************
FUNCTION_BLOCK FB_MTP_Filling
VAR_GENERIC CONSTANT
cProcedures_Filling : UINT := 1;
cConfParameters_Filling : UINT := 1;
cProcParameters_Filling : UINT := 1;
cReportValues_Filling : UINT := 1;
END_VAR
EXTENDS FB_MTP_ServiceControl<cProcedures_Filling, cConfParameters_Filling, cProcParameters_Filling, cReportValues_Filling>
VAR_INPUT
{region 'Procedures'}
Volume_Filling : FB_MTP_Volume_Filling<2,4> := (<initial values>);
Complete_Filling : FB_MTP_Complete_Filling<1,4> := (<initial values>);
{endregion}
{region 'ConfigurationParameters'}
FlowParam_Filling : FB_MTP_AnaServParam := (<initial value>);
{endregion}
{region 'ProcedureParameters'}
VolumeParam_Filling : FB_MTP_AnaServParam := (<initial values>);
SelectParam_Filling : FB_MTP_DIntServParam := (<initial values>);
{endregion}
{region 'ReportValues'}
VolumeReportValue_Filling : FB_MTP_AnaReportValue := (<initial values>);
{endregion}
END_VAR// Write Parameter feedbacks
FlowParam_Filling.VFbk := FlowParam_Filling.VOut;
VolumeParam_Filling.VFbk := VolumeParam_Filling.VOut;
SelectParam_Filling.VFbk := SelectParam_Filling.VOut;
// Execute base logic
SUPER^();
// Write ReportValue inputs
VolumeReportValue_Filling.Vin := VolumeReportValue_Filling.V;
Weitere Eigenschaften
Eingänge
Name | Typ | Beschreibung | OPC UA Zugriff |
|---|---|---|---|
TagName | STRING | Name der Schnittstelle | - |
TagDescription | STRING | Beschreibung der Schnittstelle | - |
WQC | BYTE | Worst Quality Code | Lesen |
OSLevel | BYTE | Level muss für Anlage definiert werden. Wert 0 ist reserviert für lokale Bedienung. | Lesen/schreiben |
Procedures | ARRAY [0..(cProcedures-1)] OF I_MTP_INTERNAL_Procedure | Array mit allen zum Dienst gehörenden Prozeduren | - |
ConfParameters | ARRAY [0..(cConfParameters-1)] OF I_MTP_INTERNAL_ParameterElement | Array mit allen zum Dienst gehörenden Konfigurationsparametern | - |
ProcParameters | ARRAY [0..(cProcParameters-1)] OF I_MTP_INTERNAL_ParameterElement | Array mit allen zum Dienst gehörenden Prozedurparametern | - |
ReportVaIues | ARRAY [0..(cReportValues-1)] OF_I_MTP_INTERNAL_ReportValue | Array mit allen zum Dienst gehörenden | - |
Commandlnt | DWORD |
| Lesen |
Procedurelnt | DWORD |
| Lesen |
CommandEn | DWORD | Freigabe von Steuerbefehlen des Steuerworts | Lesen |
State* Src* |
| Siehe Service Mode |
|
PosTextID | DWORD | ID-Variable für den Positionstext | Lesen |
InteractQuestionID | DWORD | ID-Variable für den Fragetext | Lesen |
InteractAnswerID | DWORD | ID-Variable für den Antworttext | Lesen/schreiben |
InteractAddInfo | STRING | Zusätzliche Information zur aktuellen InteractQuestionID | Lesen |
ProcParamAppIyInt | BOOL | Alle zum Dienst gehörenden | Lesen |
ConfigParamAppIyInt | BOOL | Alle zum Dienst gehörenden | Lesen |
ReportVaIueFreeze | BOOL | 1: Einfrieren aller Reportwerte des Dienstes. 0: Reportwerte des Dienstes nicht einfrieren. | Lesen/schreiben |
Ausgänge
Name | Typ | Beschreibung | OPC UA Zugriff |
|---|---|---|---|
StateCur | DWORD | Aktueller Zustand des Dienstzustandsautomaten | Lesen |
ProcedureCur | DWORD | Aktuell verwendete Prozedur | Lesen |
ProcedureReq | DWORD | Aktuell vorgewählte Prozedur, welche bei Start ausgeführt wird. | Lesen |
State* Src* |
| Siehe Service Mode |
|
ProcParamAppIyEn | BOOL | Freigabe Prozedurparameterübernahme: 1: Parameter können übernommen werden. 0: Parameter können nicht übernommen werden. | Lesen |
ConfigParamAppIyEn | BOOL | Freigabe Konfigurationsparameterübernahme: 1: Parameter können übernommen werden. 0: Parameter können nicht übernommen werden. | Lesen |
Externe Variablen
Name | Typ | Beschreibung | OPC UA Zugriff |
|---|---|---|---|
State* Src* | BOOL | Siehe Service Mode |
|
CommandOp | DWORD |
| Lesen/schreiben |
CommandExt | DWORD |
| Lesen/schreiben |
ProcedurOp | DWORD |
| Lesen/schreiben |
ProcedureExt | DWORD |
| Lesen/schreiben |
ProcParamAppIyOp | BOOL | Alle zum Dienst gehörenden | Lesen/schreiben |
ProcParamAppIyExt | BOOL | Alle zum Dienst gehörenden | Lesen/schreiben |
ConfigParamAppIyOp | BOOL | Alle zum Dienst gehörenden | Lesen/schreiben |
ConfigParamAppIyExt | BOOL | Alle zum Dienst gehörenden | Lesen/schreiben |
Methoden
Name | Typ | Beschreibung |
|---|---|---|
Idle |
| Nicht transienter Initialzustand. Es wird keine prozesstechnische Funktion ausgeführt. |
IsActuatorsInternal | BOOL | 1: Alle dem Dienst zugeordneten Aktoren befinden sich im Zustand |
IsActuatorsManual | BOOL | 1: Alle dem Dienst zugeordneten Aktoren befinden sich im Zustand |
IsActuatorsOffline | BOOL | 1: Alle dem Dienst zugeordneten Aktoren befinden sich im Zustand |
IsActuatorsOperator | BOOL | 1: Alle dem Dienst zugeordneten Aktoren befinden sich im Zustand |
IsActuatorsAutomatic | BOOL | 1: Alle dem Dienst zugeordneten Aktoren befinden sich im Zustand |
IsReqEqInternal | BOOL | 1: Alle dem Dienst zugeordneten Aktoren und PID-Logik befinden sich im Zustand |
IsReqEqManual | BOOL | 1: Alle dem Dienst zugeordneten Aktoren und PID-Logik befinden sich im Zustand |
IsReqEqOffline | BOOL | 1: Alle dem Dienst zugeordneten Aktoren und PID-Logik befinden sich im Zustand |
IsReqEqOperator | BOOL | 1: Alle dem Dienst zugeordneten Aktoren und PID-Logik befinden sich im Zustand |
IsReqEqAutomatic | BOOL | 1: Alle dem Dienst zugeordneten Aktoren und PID-Logik befinden sich im Zustand |
ParameterFeedbacks | BOOL | 1: Parameter Rückmeldewerte wurden geschrieben. |
ReportValueInputs | BOOL | 1: Berichtswerte wurden geschrieben. |
SetActuatorsInternal | BOOL | Alle dem Dienst zugeordneten Aktoren werden in den Zustand |
SetActuatorsManual | BOOL | Alle dem Dienst zugeordneten Aktoren werden in den Zustand |
SetActuatorsOffline | BOOL | Alle dem Dienst zugeordneten Aktoren werden in den Zustand |
SetActuatorsOperator | BOOL | Alle dem Dienst zugeordneten Aktoren werden in den Zustand |
SetActuatorsAutomatic | BOOL | Alle dem Dienst zugeordneten Aktoren werden in den Zustand |
SetReqEqInternal | BOOL | Alle dem Dienst zugeordneten Aktoren und PID-Logik werden in den Zustand |
SetReqEqManual | BOOL | Alle dem Dienst zugeordneten Aktoren und PID-Logik werden in den Zustand |
SetReqEqOffline | BOOL | Alle dem Dienst zugeordneten Aktoren und PID-Logik werden in den Zustand |
SetReqEqOperator | BOOL | Alle dem Dienst zugeordneten Aktoren und PID-Logik werden in den Zustand |
SetReqEqAutomatic | BOOL | Alle dem Dienst zugeordneten Aktoren und PID-Logik werden in den Zustand |
SetOffline | BOOL | Den Dienst in den Zustand |
SetOperator | BOOL | Den Dienst in den Zustand |
SetAutomaticIntern | BOOL | Den Dienst in den Zustand |
SetAutomaticExtern | BOOL | Den Dienst in den Zustand |
SetProcParamAppIy | BOOL | Wertvorgabe (Eingangsvariable der Methode Alle dem Dienst zugeordneten Dienstparameter (wenn Alle dem Dienst zugeordneten Dienstparameter mit Eingangsvariable |
SetConfigParamAppIyEn | BOOL | Wertvorgabe (Eingangsvariable Methode Alle dem Dienst zugeordneten Dienstparameter (wenn Alle dem Dienst zugeordneten Dienstparameter mit Eingangsvariable |
ToOnline | BOOL | Implementierung von Logik bei Verlassen des Zustands |
ToOffline | BOOL | Implementierung von Logik bei Betreten des Zustands |
