Die verbundenen Slots nehmen den neuen Wert entgegen und setzen das entsprechende Property im Backend, so dass der neue Wert in der QML-Anwendung zur Verfügung steht. Durch das Emittieren des entsprechenden Changed-Signals im Setter ist die Verwendung von Property-Bindings in QML möglich.
Signal-Handler für DataChange und Read
void OpcUaMachineBackend::percentFilledTank1Updated(QOpcUa::NodeAttribute attr, const QVariant &value)
{
m_percentFilledTank1 = value.toDouble();
emit percentFilledTank1Changed(m_percentFilledTank1);
}
void OpcUaMachineBackend::machineDesignationRead(QOpcUa::NodeAttributes attr)
{
m_machineDesignation = m_machineDesignationNode->attribute(
QopcUa::NodeAttribute::Value)
).toString();
emit machineDesignationChanged(m_machineDesignation);
}
Der Slot für das Schreiben des Sollwerts verwendet dasselbe QOpcUaNode-Objekt wie das DataChange-Monitoring zum Update des Properties. Hier kann optional ein Slot zur Kontrolle des Erfolgs der Operation mit dem writeFinished-Signal des QOpcUaNode verbunden werden.
Schreiben des Sollwerts auf den Server
void OpcUaMachineBackend::machineWriteTank2TargetPercent(double value)
{
m_tank2TargetPercentNode->writeAttribute(QOpcUa::NodeAttribute::Value,
value);
}
In den Slots zum Starten und Stoppen der Pumpe, zum Öffnen des Ventils und für den Reset der Simulation werden die Methoden-Knoten Machine.Start, Machine.Stop, Machine.FlushTank2 und Machine.Reset von m_machineNode aus aufgerufen. Um den Rückgabewert des Methodenaufrufs zu erhalten, kann ein Slot mit dem methodCallFinished-Signal des QOpcUaClient verbunden werden.
Methodenaufruf zum Starten der Pumpe
void OpcUaMachineBackend::startPump()
{
m_machineNode->callMethod("ns=2;s=Machine.Start");
}