Beispiel - OPC UA Methoden
In diesem Beispiel wird über einen OPC UA Server ein Motor (Motor1) veröffentlicht. Es wird eine OPC UA Methode (setSpeed) verwendet, um die Geschwindigkeit des Motors anzugeben, die den angegebenen Wert auf das entsprechende Datenpunktelement schreibt. Diese Methode wird mittels WinCC OA OPC UA Client aufgerufen.
Aufbau des Motor Datenpunkttyps:
- Motor1
- Values
- (float) Speed
- Commands
- (string) MethodRequest
- (string) MethodResponse
Das Datenpunktelement Values.Speed
wird in der OPC UA Server
Methodenklasse gesetzt, die beiden Elemente MethodRequest
und
MethodResponse
werden für den Methodenaufruf durch den WinCC OA OPC UA Client benötigt.
Mittels Anlagenmodell wird Motor1 in einer View mit Identifier "Motors" veröffentlicht.
Konfiguration OPC UA Server Methode
Eine neue Klasse
SetMotorSpeed
muss erstellt werden, die von
UaMethod
ableitet.
Die abgeleitete Methode der Klasse hat einen Input-Parameter für die neue Geschwindigkeit und einen Output-Parameter, der die alte Geschwindigkeit des Motors zurückgibt.
Im Konstruktor müssen die Informationen über die Methode angegeben werden. In diesem Beispiel wird der Methodenname, der Parent und der verwendete Datenpunkt dynamisch im Konstruktor übergeben, diese könnten jedoch auch statisch zugewiesen werden.
Weiters werden die Input- und Output-Parameter entsprechend definiert.
Die
execute
Funktion der Basisklasse muss überladen werden, sodass
die gewollte Aktion durchgeführt wird. Es muss ein OPC UA Status Code zurückgegeben
werden.
Im angeführten Beispiel wird zunächst die gewünschte Geschwindigkeit aus den Input-Parametern ausgelesen.
Anschließend wird mittels dpGet vom angegebenen Datenpunkt die derzeitige Geschwindigkeit abgefragt, die zum Schluss im Output-Parameter zurückgegeben wird.
Außerdem wird die Geschwindigkeit des
Motors mittels dpSet auf den gewünschten Wert gesetzt und zum Schluss der Status
Code OpcUa_Good
zurückgegeben.
class SetMotorSpeed : UaMethod
{
private string dp;
public SetMotorSpeed(const string &methodName, const string &parentId, const string &dp)
{
// setup method properties
this.parentId = parentId;
this.methodName = methodName;
this.methodId = parentId + "." + methodName;
this.description = "Set Motor Speed " + parentId;
this.dp = dp;
// add parameters
UaMethodArgument arg;
// input arguments
arg.argumentName = "Speed";
arg.dataType = DPEL_FLOAT;
arg.description = "Motor Speed";
methodInputArguments.append(arg);
// output arguments
arg.argumentName = "Old Speed";
arg.dataType = DPEL_FLOAT;
arg.description = "Old Motor Speed";
methodOutputArguments.append(arg);
}
public uint execute(int managerNumber, const vector<void> &inputArguments, vector<void> &outputArguments)
{
// get speed from input arguments
float newSpeed = inputArguments.at(0);
float oldSpeed;
dpGet(dp + ".Values.Speed", oldSpeed);
dpSetWait(dp + ".Values.Speed", newSpeed);
// set output arguments
outputArguments.append(oldSpeed);
return OpcUa_Good;
}
}
;
Im nächsten Schritt muss die zuvor definierte Funktion zum Adressraum des
OPC UA Servers hinzugefügt werden. Hierzu muss die Library
opcuaSrv_Methods.ctl
überladen werden.
vector< shared_ptr<UaMethod> >getMethodsForOpcUaSrv(int
managerNumber)
muss folgendermaßen abgeändert
werden.vector< shared_ptr<UaMethod> > getMethodsForOpcUaSrv(int managerNumber)
{
vector< shared_ptr<UaMethod> > uaMethods;
uaMethods.append(new SetMotorSpeed("setMotorSpeed", "ns=2;s=Motors.Motor1", "Motor1"));
return uaMethods;
}
Es muss also in die Liste uaMethods
eine Instanz der
zuvor angelegten Klasse eingefügt werden.
Beim Erstellen der Instanz müssen die im Konstruktor definierten Parameter angegeben werden, im Beispiel also der Methodenname, der Parent und der zu verwendende Datenpunkt. Stellen Sie sicher, dass der angegebene Parent und der Datenpunkt existieren. Weiters muss der OPC UA Server neugestartet werden, damit die Änderungen in Kraft treten.
Konfiguration zum Methodenaufruf mittels OPC UA Treiber
Es wird angenommen, dass bereits eine OPC UA Verbindung zum Server besteht und eingerichtet ist.
Mittels PARA müssen bei den Datenpunktelementen
Motor1.Command.MethodRequest
und
Motor1.Command.MethodResponse
Peripherieadressen konfiguriert
werden.
Für MethodRequest
ist eine OPC UA Ausgangsadresse zu
wählen.
Es muss jeweils die
korrekte Serververbindung und Treibernummer gesetzt werden. Anschließend muss die
Checkbox "Methode" gewählt werden. Über die Schaltfläche "Get Item ID" kann dann die
Methode Motors.Motor1.setMotorSpeed
ausgewählt werden.
Für MethodResponse
muss die gleiche
Adresskonfiguration jedoch als Eingangsadresse verwendet werden.
Das Panel wincc_oa_path/panels/examples/OPCUA_Method_Example.pnl
kann verwendet werden, um die Methode über den OPC UA Treiber
aufzurufen.
Hierzu muss im Panel das Datenpunktelement
Motor1.Command.MethodRequest
als Method Call DP ausgewählt
werden. Als Method Response DP muss das Datenpunktelement
Motor1.Command.MethodResponse
gewählt werden.
Außerdem muss die richtige Input-Parameteranzahl ausgewählt werden (1) und der Datentyp und Wert des Parameters angegeben werden.
Anschließend kann durch einen Klick auf die Schaltfläche "Call method" die OPC UA Methode aufgerufen werden. Das Panel zeigt dann auf der rechten Seite die Rückgabewerte.
Beispiel Panel zum Aufruf von OPC UA Methoden (examples/OPCUA_Method_Example.pnl)