OPC UA Benutten voor Robuuste IIoT Edge Ontwikkeling
Opmerking van de redacteur: Het Industrial Internet of Things (IIoT) belooft diep inzicht in industriële operaties te bieden en de efficiëntie van verbonden machines en systemen te verbeteren. Grootschalige IIoT-toepassingen vertrouwen op gelaagde architecturen om data van een breed scala aan sensoren te verzamelen, data betrouwbaar en veilig naar de cloud te verplaatsen, en de analyse uit te voeren die nodig is om die inzicht en efficiëntie te leveren. In Industrial Internet Application Development bieden de auteurs een gedetailleerde examen van de IIoT-architectuur en bespreken ze benaderingen voor het voldoen aan de brede vereisten geassocieerd met deze systemen.
Geaccepteerd uit Industrial Internet Application Development, door Alena Traukina, Jayant Thomas, Prashant Tyagi, Kishore Reddipalli.
Hoofdstuk 3. IIoT Edge Ontwikkeling (Vervolg)
Door Alena Traukina, Jayant Thomas, Prashant Tyagi, Kishore Reddipalli
Industriële M2M protocollen – OPC UA
In deze sectie proberen we een simpele IoT-app te bouwen voor het verzenden van data van een sensor simulator module naar een ontvangapparaat (een PC of een cloud), gebruikmakend van een Raspberry Pi hub en het OPC UA protocol:

Dataflow van een sensor simulator naar een ontvangapparaat
Het OPC UA protocol is vergelijkbaar met Modbus, maar werkt met meer datatypes, en heeft geen serieuze beperkingen, terwijl het voorziet in beveiliging, compressie en lage latentie.
Het protocol is ontwikkeld door de OPC Foundation als een industriële machine-to-machine communicatieprotocol. OPC UA (Unified Architecture) is een verbeterde versie van het Open Platform Communications (OPC) protocol, met een van de grote veranderingen dat het nieuwe protocol gratis beschikbaar is zonder restricties.
In de volgende tabel vindt u een gedetailleerdere beschrijving van het protocol om te begrijpen of het geschikt is voor uw behoeften:
| Sleutel | Waarde |
|---|---|
| Open source | Ja |
| OSI laag | Transport of applicatie |
| Datatypes | Integer, float, string, Boolean, datum, tijd, enz. |
| Beperkingen | Niet geschikt voor een complexe architectuur |
| Mogelijke operaties | Variabelen lezen/schrijven/monitoren/querien |
| Latentie | Laag |
| Gebruik | IIoT |
| Beveiliging | Ja |
| Compressie | Ja |
Tabel 5: OPC UA protocol specificaties
Benodigde software en hardware
- Benodigde software
- Node.js 6+ (https://nodejs.org/en/download/)
- PostgreSQL (https://www.postgresql.org/download/)
- The Cloud Foundry CLI (https://github.com/cloudfoundry/cli#downloads)
- Request (https://www.npmjs.com/package/request)
- NodeOPCUA (https://www.npmjs.com/package/node-opcua)
- Async (https://www.npmjs.com/package/async)
- Docker (https://docs.docker.com/engine/installation/)
- Benodigde hardware
- Raspberry Pi 3 (model B)
- Een voeding (2A/5V)
- Een microSD kaart (8 GB+) en een SD adapter
- Ethernet kabel voor een bedrade netwerkverbinding
Een SD-kaart voorbereiden
Download de meest recente Raspbian LITE image (beschikbaar op https://raspberrypi.org/downloads/raspbian/).
Sluit uw SD-kaart aan op een computer en gebruik Etcher (https://www.balena.io/etcher/) om de Raspbian .img file naar de SD-kaart te flashen.
Schakel SSH in:
cd /Volumes/boot
touch ssh
Om Wi-Fi in te schakelen, maak
wpa_supplicant.confaan met de volgende inhoud:
network={
ssid="JOUW_SSID"
psk="JOUW_WIFI_WACHTWOORD"
}
Om een bestand aan te maken in een Linux console, kunt u de GNU nano editor gebruiken. Deze is voorgeïnstalleerd in de meeste Linux distributies. U hoeft alleen het commando nano BESTANDSNAAM uit te voeren en de getoonde instructies te volgen.
Maak de map
/home/pi/hubMaak het bestand
/home/pi/hub/package.jsonaan met de volgende inhoud:
{
"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"
}
}
Maak het bestand
/home/pi/hub/index.jsaan met de volgende inhoud, vervang
REMOTE-SERVER-ADDRESS.com en REMOTE-SENSOR-ADDRESS met echte waarden:
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( [
// verbinding tot stand brengen function (cb) {
client.connect(sensor, function (err) {
if (err) {
console.log("Verbinding met " + sensor + "mislukt");
} else {
console.log("Verbinding succesvol");
}
cb(err);
});},
// sessie starten function (cb) {
client.createSession(function (err, res) {
if (!err) session = res;
cb(err);
});},
// waarde lezen
function (cb) {
session.readVariableValue("ns=1;s=Variable1", function (err, dataValue) {
if (!err) console.log("Variable1 = ", dataValue.value.value);
cb(err);
});},
// waarde schrijven
function (cb) {
session.writeSingleNode("ns=1;s=Variable1", new opcua.Variant({
dataType: opcua.DataType.Double, value: 100
}), function (err) {
cb(err);
});},
// abonneren op veranderingen
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 installeren
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);
// naar ontvanger sturen
var data = {
device: "sensor1",
timestamp: Date.now(),
Variable1: dataValue.value.value
};
request.post({url: receiver, form: data}, function (err) {
if (err) console.log("Verzenden mislukt " + JSON.stringify(data) + " naar " + receiver);
});
});},
// sessie sluiten
function (cb) {
session.close(function (err) {
if (err) console.log("Sessie sluiten mislukt"); cb();
});
}
],
function (err) { if (err) {
console.log("Mislukt met fout:", err);
} else {
console.log("Succesvol voltooid");
}
client.disconnect(function () {
});
}
);
Maak het bestand
/home/pi/hub/Dockerfileaan met de volgende inhoud:
FROM hypriot/rpi-node:boron-onbuild
Maak de map
/home/pi/sensorMaak het bestand
/home/pi/sensor/package.jsonaan met de volgende inhoud:
{
"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"
}
}
Maak het bestand
/home/pi/sensor/index.jsaan met de volgende inhoud:
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;
// nieuwe waarde genereren
setInterval(function () {
variable1 = Math.floor(max - Math.random() * (max - min));
}, 500);
space.addVariable({
browseName: "browseName",
componentOf: componentOf,
dataType: "Double",
nodeId: "ns=1;s=Variable1", // een string nodeID
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);
});
});
Configureer de min en max waarden aan het begin van het
/home/pi/sensor/index.js bestand.
Maak het bestand
/home/pi/sensor/Dockerfileaan met de volgende inhoud:
FROM hypriot/rpi-node:boron-onbuild
Internet of Things-technologie
- Glassboard: 3D-printen Inzetten Voor Snelle, Betrouwbare Productontwikkeling
- ECM3532: Eta Compute’s eerste geïntegreerde, ultra-laagstroom AI-sensorboard versnelt edge-ontwikkeling
- Industriële IoT Beveiliging: Belangrijkste Trends en Best Practices voor 2020
- Cisco Onthult Uitgebreide IIoT Beveiligingsarchitectuur en Edge Intelligence voor OT Zichtbaarheid
- De Industriële Internet of Things Beveiligen: Strategieën, Standaarden en de Chain of Trust
- Toekomstperspectief: Industrial IoT voortgang voor productie-excellentie
- Edge Computing: De Sleutel tot Realtime Industriële IoT Succes
- IIoT en AI Inzetten om Sales en Productiviteit te Boosten voor Fabrikanten & Distributeurs
- Containers Versterken Agile IoT App-ontwikkeling
- Edge Computing & IIoT: Transformatie van industriële datastrategie
- Next-Gen Tools Versnellen 5G & Edge Computing Adoptie