IBH Link UA:MQTT Anbindung

Aus IBHsoftec Wiki
Wechseln zu: Navigation, Suche

MQTT Anbindung

MQTT Overview.PNG

Konfiguration der MQTT Anbindung

Die Konfiguration erfolgt über eine XML Datei, die über die Weboberfäche unter "Client" eingelesen wird. Es können mehrere Verbindungen zu verschiedenen MQTT Brokern gleichzeitig hergestellt werden.

Ungesicherte Verbindung

 <MQTTConfiguration>
   <MQTTServer
     MQTTServerAddress="mqtt.brokeradresse.com:1883" 
     MQTTClientID="beliebiger Servername" 
     MQTTClientUserName="Benutzername im MQTT Broker" 
     MQTTClientPassword="passwort">
     <MQTTTopicDefinition>
       <publish>
       </publish>
       <subscribe>
       </subscribe>
     </MQTTTopicDefinition>
   </MQTTServer>
 </MQTTConfiguration>

Beispiel

<MQTTConfiguration>
  <MQTTServer
    MQTTServerAddress="mqtt.ibhsoftec.com:1883" 
    MQTTClientID="MQTT-Test" 
    MQTTClientUserName="axel" 
    MQTTClientPassword="password">
    <MQTTTopicDefinition>
      <publish>
      </publish>
      <subscribe>
      </subscribe>
    </MQTTTopicDefinition>
  </MQTTServer>
</MQTTConfiguration>

Es wird eine MQTT Verbindung zu dem MQTT Broker (RabbitMQ) auf mqtt.ibhsoftec.com aufgebaut. Im OPC UA Server wird parallel die Struktur "MQTT-Test" mit einem eigenen Namespace unter MQTT aufgebaut.

MQTT OPCUA Struktur.PNGAnsicht der MQTT Struktur im UA Expert

Gesicherte Verbindung

Bei der gesicherten Verbindung kopiert man den Inhalt der Zertifikatsdateien in die XML Datei. Je nach Konfiguration des MQTT Brokers kann man auch Benutzername und Passwort weglassen.

 <MQTTConfiguration>
   <MQTTServer
     MQTTServerAddress="ssl://mqtt.brokeradresse.com:8883" 
     MQTTClientID="beliebiger Servername" 
     MQTTClientUserName="Benutzername im MQTT Broker" 
     MQTTClientPassword="passwort"
     MQTTCA_Certificate="
-----BEGIN CERTIFICATE-----
..
-----END CERTIFICATE-----"
     MQTTCertificate="
-----BEGIN CERTIFICATE-----
..
-----END CERTIFICATE-----"
     MQTTPrivateKey="
-----BEGIN RSA PRIVATE KEY-----
..
-----END RSA PRIVATE KEY-----"
   >
   <MQTTTopicDefinition>
      <publish>
      </publish>
      <subscribe>
      </subscribe>
    </MQTTTopicDefinition>
  </MQTTServer>
 <MQTTConfiguration>

Verbindung zum Microsoft Azure IoT Hub

Zur Verbindung mit dem Azure IoT Hub benötigt man nur den AzureIoTConnectionString. Der Rest ist in der Software verankert. Man beachte, dass pro Azure IoT Hub nur ein Topic möglich ist.


AzureIoT.PNG

Verbindung zu Amazon AWSIoT

Awsiot2.png

MQTTCA_Certificate=[1]

Awsiot1.png

Bei der AWS IoT Verbindung kopiert man den Inhalt der obigen Zertifikatsdateien in die XML Datei. Benutzername und Passwort ist nicht erforderlich.

 <MQTTConfiguration>
   <MQTTServer
     MQTTServerAddress="ssl://a3tbsmqjzx0901.iot.eu-central-1.amazonaws.com:8883" 
     MQTTClientID="IBHLinkUA-Demo" 
     MQTTCA_Certificate="aus [2]"
     MQTTCertificate="siehe oben"
     MQTTPrivateKey="siehe oben"
   >
   <MQTTTopicDefinition>
      <publish>
      </publish>
      <subscribe>
      </subscribe>
    </MQTTTopicDefinition>
  </MQTTServer>
 <MQTTConfiguration>

Weitere Parameter in der MQTTServer Konfiguration

Last Will Message

Last Will Message

Der IBH Link UA kann dem Broker mitteilen, was passieren soll, wenn die Verbindung unerwartet abbricht.

 <MQTTConfiguration>
   <MQTTServer
     .
     .
     MQTTWill_Message="Meldung, die der MQTT Broaker an alle verbundenen Clients sendet, wenn die Verbindung unerwartet abbricht" 
     MQTTWill_Topic="Topicname der Verbindung" 
     MQTTWill_QoS="0,1, oder 3"
     MQTTWill_Retain="true oder false"
     .
   >

Konfiguration der Topics

Es können eine oder mehrere Topics unter Publish oder Subscribe definiert werden. (Bei Microsoft Azure IoT nur 1 Topic !)

  <MQTTTopicDefinition>
     <publish>
       <Topicdefinition
          Topicparameter
       >
       <Variablen>
       <Topicdefinition/>
     </publish>
     <subscribe>
       <Topicdefinition
          Topicparameter
       >
       <Variablen>
       <Topicdefinition/>
     </subscribe>
   </MQTTTopicDefinition>

Topic Parameter

Beispiel:

   <MQTTTopicDefinition>
     <publish>
       <topicname
         QoS="0"
         retain="true"		  
         trigger_var="ns=4;s=IBH_OPCUA.PLC.GlobalVars.TriggerVar" 
         trigger_sampling_interval="1000" 
         trigger_mode="rising_edge" 
         status_var="ns=4;s=IBH_OPCUA.PLC.GlobalVars.StatusVar"
         MaxBufferedMessages=1000
         PersistDir="mqttpersist" 
        >

QoS

Quality of Service Levels

Dieses Parameter kann "0", "1" oder "2" enthalten. Achtung! Nicht alle MQTT Broker unterstützen alle Stufen.

retain

Retained Messages

Kann "true" oder "false" enthalten. Achtung! Nicht alle MQTT Broker unterstützen retain, im Zweifelsfall Parameter weglassen.

Trigger

Wenn kein Trigger definiert wird, werden die Variablen im Topic bei Änderung einzeln übertragen. Ist der Trigger definiert, werden bei Eintreten der Triggerbedingung alle Variablen auf einmal übertragen. Die Triggerdefinition besteht aus 3 Parametern:

  1. trigger_mode="rising_edge" oder "falling_edge" oder "value_change"
  2. trigger_var="Nodedefinition der Triggervariablen"
  3. trigger_sampling_interval="ms"

status_var

Dies ist eine Bytevariable für den Übertragungsstatus im OPC Server. Der Wert wird bei erfolgreicher Übertragung bzw. Pufferung auf 1 gesetzt und falls ein Fehler aufgetreten oder der Puffer voll ist auf 2 gesetzt. Die SPS darf einen neuen Wert erst bei 1 übergeben und dann den Wert auf 0 setzen.

MaxBufferedMessages

Der IBH Link UA ist in der Lage, MQTT Meldungen bei Verbindungsunterbrechungen zwischenzuspeichern. Mit diesem Parameter gibt man die maximale Anzahl der Meldungen, die zwischengespeichert werden können, an.

PersistDir

Wenn man eine SD-Karte auf der Rückseite des IBH Link UA einschiebt, werden bei Angabe dieses Parameters, Meldungen auf der Karte remanent gespeichert. In diesem Fall gehen auch bei Aussschalten der Maschine keine Daten verloren. Das Parameter gibt das Verzeichnis für die Meldungen auf der SD Karte an.

Variablen und Strukturen

Beispiel:

   <MQTTTopicDefinition>
     <publish>
       <topicname
         name="axel/Hulsch"
         QoS="0"
         retain="true"		  
         trigger_var="ns=4;s=IBH_OPCUA.PLC.GlobalVars.TriggerVar" 
         trigger_sampling_interval="1000" 
         trigger_mode="rising_edge" 
         status_var="ns=4;s=IBH_OPCUA.PLC.GlobalVars.StatusVar"
         MaxBufferedMessages=1000
         PersistDir="mqttpersist" 
        >
         <diesel type="UInt16" opcvar="ns=4;s=IBH_OPCUA.PLC.Programs.Diesel.Tank" name="Diesel/Kraftstoff"/>
         <struct1>
           <struct11>
             <E10 type="UInt32" opcvar="ns=4;s=IBH_OPCUA.PLC.Programs.E10.Tank"/>
             <u2 type="UInt32" const="12345678"/>
           </struct11>
           <u1 type="UInt32"/>
           <u2 type="UInt32"/>
         </struct1>
       <topicname/>

Mqttvardef.PNG

Eine Variable wird folgendermassen definiert:

<variablenname type="Variablentype" opcvar="OPC UA Knotendefinition" name="Ersatzname"/>

Der Variablenname kann frei gewählt werden. Die Variable erscheint dann im OPC UA Server under einem eigenen Namespace. Unter dem optionalen Parameter "name" kann man einen Variablenname angeben, der Sonderzeichen wie z.B. '/' enthält. Ein Topic kann beliebig viele Variablen enthalten. Die Variablen werden als JSON - String über MQTT übertragen. Das obige Beispiel wird folgendermassen übertragen:

{
  "diesel": 15064,
  "struct1": {
    "struct1": {
      "E10": 63776,
      "u2": 12345678
    },
    "u1": 0,
    "u2": 0
  }
} 

Als Variblentype sind folgende Angaben möglich:

  1. "Boolean"
  2. "SByte"
  3. "Byte"
  4. "Int16"
  5. "Uint16"
  6. "Int32"
  7. "UInt32"
  8. "Float"
  9. "Double"
  10. "DateTime" (ISO 8601 string format: "YYYY-MM-DDThh:mm:ss")
  11. "String"
  12. "SByteArray"
  13. "ByteArray"
  14. "Int16Array"
  15. "Uint16Array"
  16. "Int32Array"
  17. "UInt32Array"
  18. "FloatArray"
  19. "DoubleArray"
  20. "StringArray"

Falls keine opcvar angegeben wird, wird die Variable nicht automatisch besprieben. Die Variable kann jedoch mit der Client Funktion beschrieben werden. Eine Variable kann auch eine Konstante enthalten. In diesem Fall wird anstelle opcvar const angegeben. Bei Feldern ist keine Konstante möglich. Beispiel:

<u2 type="UInt32" const="12345678"/>


Eine Struktur wird mit <struct> </struct> aufgebaut. Es sind beliebige Verschachtelungen möglich.

Verbinden von Variablen mit externen OPCUA Server Variablen

Beispiel:

 <MQTTConfiguration>
   <OPCUAServer>
      <BoilerExample uri="urn:DELL-XPS:UnifiedAutomation:UaServerCpp" EndpointUrl="opc.tcp://DELL-XPS:48011"/>
      <S7-1500 uri="urn:SIMATIC.S7-1500.OPC-UAServer:CPU1500-Demo" EndpointUrl="opc.tcp://10.0.13.6:4840"/>
   </OPCUAServer>
   <MQTTTopicDefinition>
     <publish>
       <topicname
         name="axel/Hulsch"
         QoS="0"
         retain="true"		  
         trigger_var="ns=4;s=IBH_OPCUA.PLC.GlobalVars.TriggerVar" 
         trigger_sampling_interval="1000" 
         trigger_mode="rising_edge" 
         status_var="ns=4;s=IBH_OPCUA.PLC.GlobalVars.StatusVar"
         MaxBufferedMessages=1000
         PersistDir="mqttpersist" 
        >
         <BoilerTemperature type="Double" OPCUAServer="BoilerExample" opcvar="ns=3;s=AirConditioner_1.Temperature"/>
         <ValueFrom_S7-1500 type="UInt32" OPCUAServer="S7-1500" opcvar="ns=3;s=&quot;All-Scalar&quot;.&quot;Var_UInt32&quot;"/>
         <diesel type="UInt16" opcvar="ns=4;s=IBH_OPCUA.PLC.Programs.Diesel.Tank" name="Diesel/Kraftstoff"/>
         <struct1>
           <struct11>
             <E10 type="UInt32" opcvar="ns=4;s=IBH_OPCUA.PLC.Programs.E10.Tank"/>
             <u2 type="UInt32" const="12345678"/>
           </struct11>
           <u1 type="UInt32"/>
           <u2 type="UInt32"/>
         </struct1>
       <topicname/>

Der OPCUa Server muss mit der Client Funktion eingerichtet werden siehe: IBH_Link_UA:Client_Funktionen#Server_hinzufügen