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 wird die Verwendung des MTP-Engineerings und die darin enthaltene automatische Codegenerierung empfohlen! |
Prozeduren
Am Eingang Procedures
werden alle dem Dienst zugehörigen Prozeduren als ARRAY[*] OF POINTER TO FB_MTP_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.
Parameter
Am Eingang ConfParameters
werden alle dem Dienst zugehörigen Konfigurationsparameter als ARRAY[*] OF POINTER TO FB_MTP_ParameterElement
übergeben.
Am Eingang ProcParameter
werden alle dem Dienst zugehörigen Prozedurparameter als ARRAY[*] OF POINTER TO FB_MTP_ParameterElement
übergeben.
Die dienstweite Übernahme neuer Werte für die Parameter erfolgt nach dem gleichen Prinzip wie in den Unterkapiteln von ParameterElements beschrieben. Es werden die Wertvorgaben aller dem Dienst zugewiesenen Parameter auf einmal übernommen. Über die Variable VReq
der Parameter können die zu übernehmenden Werte vorher geprüft werden.
Die Freigabe für die Übernahme erfolgt über die Variable ProcParameterApplyEn
für Prozedurparameter bzw. über die Variable ConfigParameterApplyEn
für Konfigurationsparameter. Eine dienstweite Freigabe ist nur möglich, wenn alle Prozedurparameter bzw. Konfigurationsparameter die Freigabe ApplyEn = TRUE
erteilt haben.
Je nach Zustand des Service Mode
erfolgt die dienstweite Werteübernahme für Prozedurparameter über die Variablen ProcParameterApplyInt
, ProcParameterApplyOp
oder ProcParameterApplyExt
bzw. über die Variablen ConfigParameterApplyInt
, ConfigParameterApplyOp
oder ConfigParameterApplyExt
für die Konfigurationsparameter, wenn Apply = TRUE
ist.
Berichtswerte
Am Eingang ReportValues
werden alle dem Dienst zugehörigen Berichtswerte als ARRAY[*] OF POINTER TO FB_MTP_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.
Das untenstehende Bild zeigt eine Übersicht der zu übergebenen Arrays:

![]() | Sollten keine |
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 definniert.
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
![]() | In der MTP-Richtlinie dient die Hold-Schleife der Implementierung der in einem Fehlerfall auszuführenden Logik. |
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
![]() | In der MTP-Richtlinie dient die Stop-Schleife der Implementierung der Logik zum Stoppen des Dienstes. |
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
![]() | In der MTP-Richtlinie dient die Abort-Schleife der Implementierung der Logik zum schnellen Stoppen des Dienstes. |
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.
Ausführung von Prozeduren
Erfolgt der Befehl Start
, wird die zu ausgewählte Prozedur in den Zustand Starting
überführt. Alle anderen Prozeduren, die dem Dienst zugewiesen sind, werden gesperrt.
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.
Erst wenn der Dienstzustandsautomat sich wieder im Zustand Idle
befindet, kann eine andere Prozedur ausgewählt und gestartet werden. Über die Variable StateCur
wird der aktuelle Zustand des Dienstzustandsautomaten angezeigt (siehe E_MTP_State).
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.
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 wird die Verwendung des MTP-Engineerings und des darin enthaltenen MTP-Exports empfohlen, 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 wird die Verwendung des MTP-Engineerings 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
FUNCTION_BLOCK FB_MTP_Service EXTENDS FB_MTP_ServiceControl
VAR
///Procedures – Parameters and Required Equipment
///Procedure 1
<ProcParametersArray1> : ARRAY[0..<n>] OF POINTER TO FB_MTP_ParameterElement := [ADR(<ProcParam_0>), ADR(<ProcParam_1>)];
<RequiredEquipmentArray1> : ARRAY[0..<n>] OF I_MTP_ReqEq := [ADR(<ReqEq_0>), ADR(<ReqEq_1>)];
///Procedure 2
<ProcParametersArray2> : ARRAY[0..<n>] OF POINTER TO FB_MTP_ParameterElement := [ADR(<ProcParam_1>), ADR(<ProcParam_2>)];
<RequiredEquipmentArray2> : ARRAY[0..<n>] OF I_MTP_ReqEq := [ADR(<ReqEq_0>), ADR(<ReqEq_1>)];
///Procedures
ProcedureArray : ARRAY[1..<n>] OF POINTER TO FB_MTP_Procedure := [ADR(<Procedure_1>), ADR(<Procedure_1>)];
///ConfigurationParameters
ConfParameterArray : ARRAY[0..<n>] OF POINTER TO FB_MTP_ParameterElement := [ADR(<ConfParameter_0>)]
///ProcedureParameters
ProcParameterArray : ARRAY[0..<z>] OF POINTER TO FB_MTP_ParameterElement := [ADR(<ProcParameter_0>), ADR(<ProcParameter_1>), ADR(<ProcParameter_2>)];
///ReportValues
ReportValueArray : ARRAY[0..<n>] OF POINTER TO FB_MTP_ReportValue [ADR(<ReportValue_0>)]
END_VAR
VAR_INPUT
///Procedures
<Procedure_1> : FB_Procedure := (<initial values>);
<Procedure_2> : FB_Procedure := (<initial values>);
///ConfigurationParameters
< ConfParameter_0> : FB_MTP_AnaServParam := (<initial values>);
///ProcedureParameters
(<ProcParameter_0> : FB_MTP_AnaServParam := (<initial values>);
(<ProcParameter_1> : FB_MTP_AnaServParam := (<initial values>);
(<ProcParameter_2> : FB_MTP_AnaServParam := (<initial values>);
///ReportValues
(<ReportValue_0>: FB_MTP_AnaReportValue := ((<initial values>);
END_VAR
<Procedure_1>(
ProcParameters := <ProcParametersArray_1>,
RequiredEquipment := <RequiredEquipmentArray_1>);
<Procedure_2>(
ProcParameters := <ProcParametersArray_2>,
RequiredEquipment := <RequiredEquipmentArray_2>);
SUPER^(
Procedures := ProcedureArray,
ConfParameters := ConfParameterArray,
ProcParameters := ProcParameterArray,
ReportValues := ReportValueArray);
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 [*] OF POINTER TO FB_MTP_Procedure | Array mit allen zum Dienst gehörenden Prozeduren | - |
ConfParameters | ARRAY [*] OF POINTER TO FB_MTP_ParameterElement | Array mit allen zum Dienst gehörenden Konfigurationsparametern | - |
ProcParameters | ARRAY [*] OF POINTER TO FB_MTP_ParameterElement | Array mit allen zum Dienst gehörenden Prozedurparametern | - |
ReportVaIues | ARRAY [*] OF POINTER TO FB_MTP_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 |
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 |
InteractAnswerID | DWORD | ID-Variable für den Antworttext | 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 |
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 Offline. |
ToOffline | BOOL | Implementierung von Logik bei Betreten des Zustands Offline. |