OPC UA für robuste IIoT Edge-Entwicklung nutzen
Adaptiert aus Industrial Internet Application Development, 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 bauen wir eine einfache IoT App, um Daten von einem Sensor Simulator Modul an ein Empfängergerät (PC oder Cloud) zu senden, menggunakan einen Raspberry Pi Hub und das OPC UA Protokoll:
Das OPC UA Protokoll ähnelt Modbus, arbeitet aber mit mehr Datentypen, hat keine ernsthaften Limitations und bietet Sicherheit, Kompression und niedrige Latenz.
Das Protokoll wurde von der OPC Foundation als industrielles Machine-to-Machine Kommunikationsprotokoll entwickelt. OPC UA (Unified Architecture) ist eine verbesserte Version des Open Platform Communications (OPC) Protokolls, wobei eine der großen Änderungen ist, dass das neue Protokoll kostenlos und ohne Restriktionen verfügbar ist.
In der folgenden Tabelle finden Sie eine detailliertere Beschreibung des Protokolls, um zu beurteilen, ob es für Ihre Bedürfnisse geeignet ist:
| Schlüssel | Wert |
|---|---|
| Open Source | Ja |
| OSI Layer | Transport oder Application |
| Datentypen | Integer, Float, String, Boolean, Date, Time, etc. |
| Einschränkungen | Nicht geeignet für komplexe Architekturen |
| Mögliche Operationen | Variablen Read/Write/Monitor/Query |
| Latenz | Niedrig |
| Verwendung | IIoT |
| Sicherheit | Ja |
| Kompression | Ja |
Tabelle 5: OPC UA Protokollspezifikationen
Benötigte Komponenten
- Software:
- Hardware:
- Raspberry Pi 3 (Model B)
- Netzteil (2A/5V)
- microSD Karte (8 GB+) und SD Adapter
- Ethernet Kabel für kabelgebundene Netzwerkverbindung
SD Karte vorbereiten
- 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 nutzen Sie Etcher (https://www.balena.io/etcher/), um das Raspbian .img File auf die SD Karte zu flashen.
- Aktivieren Sie SSH:
cd /Volumes/boot
touch ssh
- Für Wi-Fi erstellen Sie
wpa_supplicant.confmit folgendem Inhalt:
network={
ssid="YOUR_SSID"
psk="YOUR_WIFI_PASSWORD"
}
Zum Erstellen einer Datei in der Linux Konsole nutzen Sie den GNU nano Editor. Er ist in den meisten Linux Distributionen vorinstalliert. Führen Sie einfach nano DATEINAME aus und folgen Sie den Anweisungen.
- Erstellen Sie
/home/pi/hub - Erstellen Sie
/home/pi/hub/package.jsonmit folgendem Inhalt:
{
"name": "hub",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "node index.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"async": "^2.4.0",
"node-opcua": "0.0.64",
"request": "^2.81.0"
}
}
- Erstellen Sie
/home/pi/hub/index.jsmit folgendem Inhalt, ersetzen SieREMOTE-SERVER-ADDRESS.comundREMOTE-SENSOR-ADDRESSdurch echte Werte:
var opcua = require("node-opcua"); var async = require("async");
var request = require("request");
var session, subscription;
var client = new opcua.OPCUAClient();
var sensor = "opc.tcp://REMOTE-SENSOR-ADDRESS:4334/UA/resourcePath";
var receiver = "https://REMOTE-SERVER-ADDRESS.com:8080";
async.series( [
// Verbindung herstellen
function (cb) {
client.connect(sensor, function (err) {
if (err) {
console.log("Connection to " + sensor + "failed");
} else {
console.log("Connection successful");
}
cb(err);
});
},
// Session starten
function (cb) {
client.createSession(function (err, res) {
if (!err) session = res;
cb(err);
});
},
// Wert lesen
function (cb) {
session.readVariableValue("ns=1;s=Variable1", function (err, dataValue) {
if (!err) console.log("Variable1 = ", dataValue.value.value);
cb(err);
});
},
// Wert schreiben
function (cb) {
session.writeSingleNode("ns=1;s=Variable1", new opcua.Variant({
dataType: opcua.DataType.Double, value: 100
}), function (err) {
cb(err);
});
},
// Changes abonnieren
function (cb) {
subscription = new opcua.ClientSubscription(session, {
maxNotificationsPerPublish: 5,
priority: 5,
publishingEnabled: true,
requestedLifetimeCount: 5,
requestedMaxKeepAliveCount: 3,
requestedPublishingInterval: 500,
});
subscription.on("started", function () {
console.log("subscription id: ", subscription.subscriptionId);
}).on("terminated", function () {
cb();
});
setTimeout(function () {
subscription.terminate();
}, 5000);
// Monitored Item installieren
var monitor = subscription.monitor({
attributeId: opcua.AttributeIds.Value,
nodeId: opcua.resolveNodeId("ns=1;s=Variable1"),
},
{
discardOldest: true,
samplingInterval: 50,
queueSize: 5,
},
opcua.read_service.TimestampsToReturn.Both
);
monitor.on("changed", function (dataValue) {
console.log("Variable1 = ", dataValue.value.value);
// An Receiver senden
var data = {
device: "sensor1",
timestamp: Date.now(),
Variable1: dataValue.value.value
};
request.post({url: receiver, form: data}, function (err) {
if (err) console.log("Failed to send " + JSON.stringify(data) + " to " + receiver);
});
});
},
// Session schließen
function (cb) {
session.close(function (err) {
if (err) console.log("Failed to close session"); cb();
});
}
],
function (err) { if (err) {
console.log("Failed with error:", err);
} else {
console.log("Successfully finished");
}
client.disconnect(function () {
});
}
);
- Erstellen Sie
/home/pi/hub/Dockerfile:
FROM hypriot/rpi-node:boron-onbuild
- Erstellen Sie
/home/pi/sensor - Erstellen Sie
/home/pi/sensor/package.json:
{
"name": "sensor",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "node index.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"node-opcua": "0.0.64"
}
}
- Erstellen Sie
/home/pi/sensor/index.js:
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",
value: {
get: function () {
return new opcua.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("Endpoint: ", endpoint);
});
});
- Konfigurieren Sie min und max Werte am Anfang der
/home/pi/sensor/index.jsDatei.
- Erstellen Sie
/home/pi/sensor/Dockerfile:
FROM hypriot/rpi-node:boron-onbuild
Internet der Dinge-Technologie
- Industrial IoT Security: Schlüsseltrends und Best Practices für 2020
- Cisco enthüllt umfassende IIoT Security Architecture und Edge Intelligence für OT Visibility
- Industrial Internet of Things sichern: Strategien, Standards und die Chain of Trust
- ECM3532: Eta Computes erstes integriertes Ultra-Low-Power KI Sensor Board beschleunigt Edge Development
- Glassboard: 3D-Druck für schnelle, zuverlässige Produktentwicklung nutzen
- Zukunftsausblick: Industrial IoT für Production Excellence vorantreiben
- Edge Computing: Der Schlüssel zum Echtzeit-Erfolg im Industrial IoT
- IIoT und KI nutzen, um Umsatz und Produktivität für Hersteller & Distributoren zu steigern
- Container befähigen agile IoT-App-Entwicklung
- Edge Computing & IIoT: Transformation der industriellen Datenstrategie