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.

Abbildung 1. Anlagenmodell-Editor - Motor1

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.

Die Funktion
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.

Anmerkung:

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.

OPC UA Methoden - Konfiguration Peripherieadresse für MethodRequest

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.

OPC UA Methoden – Item ID für MethodRequest und MethodResponse

Für MethodResponse muss die gleiche Adresskonfiguration jedoch als Eingangsadresse verwendet werden.

OPC UA Methoden - Konfiguration Peripherieadresse für MethodResponse

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)