IIoT-Edge-Entwicklung – Verwendung von OPC UA-Protokollen
Anmerkung der Redaktion:Das Industrial Internet of Things (IIoT) verspricht tiefe Einblicke in industrielle Abläufe und verbessert die Effizienz vernetzter Maschinen und Systeme. Groß angelegte IIoT-Anwendungen verlassen sich auf mehrschichtige Architekturen, um Daten von einer Vielzahl von Sensoren zu sammeln, Daten zuverlässig und sicher in die Cloud zu verschieben und Analysen durchzuführen, die für die Bereitstellung dieser Erkenntnisse und Effizienz erforderlich sind. In Industrial Internet Application Development bieten die Autoren eine detaillierte Untersuchung der IIoT-Architektur und diskutieren Ansätze zur Erfüllung der breiten Anforderungen, die mit diesen Systemen verbunden sind.
Angepasst an die Entwicklung von industriellen Internetanwendungen, von Alena Traukina, Jayant Thomas, Prashant Tyagi, Kishore Reddipalli.
Kapitel 3. IIoT Edge-Entwicklung (Fortsetzung)
Von Alena Traukina, Jayant Thomas, Prashant Tyagi, Kishore Reddipalli
Industrielle M2M-Protokolle – OPC UA
In diesem Abschnitt werden wir versuchen, eine einfache IoT-App zum Senden von Daten von einem Sensorsimulatormodul an ein Empfängergerät (ein PC oder eine Cloud) mithilfe eines Raspberry Pi-Hubs und des OPC UA-Protokolls zu erstellen:
Datenfluss von einem Sensorsimulator zu einem Empfängergerät
Das OPC UA-Protokoll ähnelt Modbus, funktioniert jedoch mit mehr Datentypen und hat keine ernsthaften Einschränkungen, während es gleichzeitig Sicherheit, Komprimierung und geringe Latenz bietet.
Das Protokoll wurde von der OPC Foundation als industrielles Machine-to-Machine-Kommunikationsprotokoll entwickelt. OPC UA (Unified Architecture) ist eine verbesserte Version der Open Platform Communications (OPC ) Protokoll, wobei eine der wichtigsten Änderungen darin besteht, dass das neue Protokoll ohne Einschränkungen kostenlos verfügbar ist.
In der folgenden Tabelle finden Sie eine genauere Beschreibung des Protokolls, um zu verstehen, ob es für Ihre Anforderungen geeignet ist:
Schlüssel Wert Open SourceJaDie OSI-SchichtTransport oder AnwendungDatentypenInteger, Float, String, Boolean, Datum, Uhrzeit usw.EinschränkungenNicht für eine komplexe Architektur geeignetMögliche OperationenLese-/Schreib-/Überwachungs-/AbfragevariablenLatencyLowUsageIIoTSecurityJaKompressionJaTabelle 5:Spezifikationen des OPC UA-Protokolls
Zum Erstellen der Anwendung benötigen wir Folgendes:
- Erforderliche Software
- Node.js 6+ (https://nodejs.org/de/download/)
- PostgreSQL (https://www.postgresql.org/download/)
- Die Cloud Foundry-CLI (https://github.com/cloudfoundry/cli#downloads)
- Anfrage (https://www.npmjs.com/Paket/Anfrage)
- NodeOPCUA (https://www.npmjs.com/package/node-opcua)
- Async (https://www.npmjs.com/package/async)
- Docker (https://docs.docker.com/engine/installation/)
- Erforderliche Hardware
- Raspberry Pi 3 (Modell B)
- Ein Netzteil (2A/5V)
- Eine microSD-Karte (8 GB+) und ein SD-Adapter
- Ethernet-Kabel für eine kabelgebundene Netzwerkverbindung
Vorbereiten einer SD-Karte
Um eine SD-Karte vorzubereiten, befolgen Sie die beschriebene Reihenfolge der Aktionen:
Laden Sie das neueste Raspbian LITE-Image herunter (verfügbar unter https://raspberrypi.org/downloads/raspbian/).
Verbinden Sie Ihre SD-Karte mit einem Computer und verwenden Sie Etcher (https://io/), um die Raspbian-.img-Datei auf die SD zu flashen Karte.
SSH aktivieren:
cd /Volumes/boot touch ssh
Um WLAN zu aktivieren, erstellen Sie eine conf mit folgendem Inhalt:
network={
ssid=”YOUR_SSID”
psk=”YOUR_WIFI_PASSWORD”
}
Erstellen Sie /home/pi/hub
Erstellen Sie die Datei /home/pi/hub/package.json mit folgendem Inhalt:
{
"Name":"Hub",
"Version":"1.0.0",
"Beschreibung":"",
“ main":"index.js", "scripts":{
"start":"node index.js",
"test":"echo "Fehler:kein Test angegeben" &&exit 1″
},
"Autor":"",
"Lizenz":"ISC", "Abhängigkeiten":{
"async":"^2.4.0",
"node-opcua":"0.0.64",
"Anfrage":"^2.81.0"
}
}
Erstellen Sie die Datei /home/pi/hub/index.js mit dem folgenden Inhalt und ersetzen Sie dabei
REMOTE-SERVER-ADDRESS.com und REMOTE-SENSOR-ADDRESS mit realen Werten:
var opcua =require(“node-opcua”); var async =require(“async“);
var request =require(“request“);
var Session, Abonnement;
var client =new opcua.OPCUAClient();
var sensor =„opc.tcp://REMOTE-SENSOR- ADDRESS:4334/UA/resourcePath“;
var empfänger =„http://REMOTE-SERVER-ADDRESS.com:8080“;
async.series( [
// Verbindungsaufbaufunktion (cb) {
client.connect(sensor, function (err) {
if (err) {
console.log ("Verbindung zu " + Sensor + "fehlgeschlagen");
} else {
console.log("Verbindung erfolgreich");
}
cb(err);
});
},
// start session function (cb) {
client.createSession(function (err, res) {
if (!err) session =res;
cb(err);
});
},
// read value
function (cb) {
session.readVariableValue(“ ns=1;s=Variable1“, function (err, dataValue) {
if (!err) console.log("Variable1 =", dataValue.value.value);
cb(err);
});
},
// Wert schreiben
Funktion (cb) {
session.writeSingleNode(“ns=1;s=Variable1”, new opcua.Variant({
dataType:opcua.DataType.Double, Wert:100
}), Funktion (err) {
cb(err);
});
},
// Änderungen abonnieren
function (cb) {
subscription =new opcua.ClientSubscription(session, {
maxNotificationsPerPublish:5,
Priorität:5,
publishingEnabled:true,
requestedLifetimeCount:5,
requestedMaxKeepAliveCount:3,
requestedPublishingInterval:500,
});
subscription.on("started", function () {
console.log("Abonnement-ID:",
subscription.subscriptionId);
}).on("terminated", function () {
cb();
});
setTimeout(function () {
subscription.terminate();
}, 5000);
// Überwachtes Element installieren
var monitor =Abonnement .monitor({
attributeId:opcua. AttributeIds.Value,
nodeId:opcua.resolveNodeId("ns=1;s=Variable1"),
},
{
discardOldest:true,
Sampling 50,
queueSize:5,
},
opcua.read_service.TimestampsToReturn.Both
);
monitor.on("changed", function (dataValue) {
console.log("Variable1 =", dataValue.value.value);
// an Empfänger senden
var data ={
device:"sensor1",
Zeitstempel:Date.now(),
Variable1:dataValue.value.value
};
request.post({url:receiver, form:data}, function (err) {
if (err) console.log("Fehler beim Senden von ” +
JSON.stringify(data) + ” an ” + Receiver);
});
});
},
// close session
function (cb) {
session.close(function (err) {
if (err) console.log(“Failed to Sitzung schließen“); cb();
});
}
],
function (err) { if (err) {
console.log("Failed with error:" , err);
} else {
console.log("Erfolgreich abgeschlossen");
}
client.disconnect(function () {
});
}
);
Erstellen Sie die Datei /home/pi/hub/Dockerfile mit folgendem Inhalt:
VON hypriot/rpi-node:boron-onbuild
Erstelle /home/pi/sensor
Erstellen Sie die Datei /home/pi/sensor/package.json mit folgendem Inhalt:
{
"Name":"Sensor",
"Version":"1.0.0",
"Beschreibung":"",
“ main“:„index.js“,
„scripts“:{
„start“:„node index.js“,
„test“:„echo „Fehler:kein Test angegeben“ &&Ausfahrt 1″
},
"Autor":"",
"Lizenz":"ISC",
"Abhängigkeiten":{
"node-opcua ”:“0.0.64”
}
}
Erstellen Sie die Datei /home/pi/sensor/index.js mit folgendem Inhalt:
var opcua =require(“node-opcua”);
var min =1;
var max =100;
var host =new opcua.OPCUAServer({ buildInfo:{
buildDate:new Date(2018, 8, 8),
buildNumber:"1234",
productName:"productName",
},
port :4334,
resourcePath:"UA/resourcePath",
});
host.initialize(function () {
var space =host.engine.addressSpace;
var componentOf =space.addObject({
browseName:"browseName",
organizedBy:space.rootFolder.objects,
});
var variable1 =0;
// Neuen Wert generieren
setInterval(function () {
variable1 =Math.floor(max – Math.random() * (max – min));
}, 500);
space.addVariable({
browseName:"browseName",
componentOf:componentOf,
dataType:"Double",
nodeId:"ns=1;s=Variable1", // eine Zeichenfolge nodeID
value:{
get:function () {
return new opcu a.Variant({dataType:opcua.DataType.Double, value:variable1});
},
set:function (variant) {
variable1 =parseFloat(variant.value);
return opcua.StatusCodes.Good;
}
}
});
host.start(function () {
var endpoint =
host.endpoints[0].endpointDescriptions()[0].endpointUrl; console.log("Endpunkt:", Endpunkt);
});
});
Konfigurieren Sie die Min- und Max-Werte am Anfang des
/home/pi/sensor/index.js-Datei.
Erstellen Sie die Datei /home/pi/sensor/Dockerfile mit folgendem Inhalt:
VON hypriot/rpi-node:boron-onbuild
Internet der Dinge-Technologie
- Tipps und Trends zur IIoT-Sicherheit für 2020
- Cisco kündigt umfassende IIoT-Sicherheitsarchitektur, Cyber Vision für Transparenz und Edge Intelligence an
- Verwalten der IIoT-Sicherheit
- Smart Sensor Board beschleunigt die Entwicklung von Edge-KI
- Ein Produktentwicklungsunternehmen, das 3D-Druck verwendet, um alles zu tun
- Aussichten für die Entwicklung des industriellen IoT
- Warum Edge Computing für das IIoT so wichtig ist
- Hersteller und Distributoren nutzen endlich IIoT und KI, um Umsatz und Produktivität zu steigern
- IoT-App-Entwicklung erhält Agilitätsschub durch Container-Technologien
- Verändern Edge Computing und IIoT unser Denken über Daten?