Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial Internet of Things >> Tecnologia da Internet das Coisas

Aproveitando OPC UA para Desenvolvimento Robusto de IIoT na Edge

Nota do Editor: A Internet Industrial das Coisas (IIoT) promete fornecer insights profundos em operações industriais e aumentar a eficiência de máquinas e sistemas conectados. Aplicações IIoT de grande escala dependem de arquiteturas em camadas para coletar dados de uma ampla gama de sensores, mover dados de forma confiável e segura para a nuvem, e realizar análises necessárias para entregar esse insight e eficiência. Em Industrial Internet Application Development, os autores fornecem um exame detalhado da arquitetura IIoT e discutem abordagens para atender aos amplos requisitos associados a esses sistemas.

Adaptado de Industrial Internet Application Development, por Alena Traukina, Jayant Thomas, Prashant Tyagi, Kishore Reddipalli.


Capítulo 3. Desenvolvimento IIoT na Edge (Continuação)

Por Alena Traukina, Jayant Thomas, Prashant Tyagi, Kishore Reddipalli

Protocolos M2M Industriais – OPC UA

Nesta seção, tentaremos construir um app IoT simples para enviar dados de um módulo simulador de sensor a um dispositivo receptor (PC ou nuvem), usando um hub Raspberry Pi e o protocolo OPC UA:

Fluxo de dados de um simulador de sensor para um dispositivo receptor

O protocolo OPC UA é similar ao Modbus, mas trabalha com mais tipos de dados, não tem limitações sérias, enquanto provê segurança, compressão e baixa latência.

O protocolo foi desenvolvido pela OPC Foundation como protocolo de comunicação máquina-a-máquina industrial. OPC UA (Unified Architecture) é uma versão aprimorada do protocolo Open Platform Communications (OPC), com uma das maiores mudanças sendo que o novo protocolo está disponível gratuitamente sem restrições.

Na tabela a seguir, você encontra uma descrição mais detalhada do protocolo para entender se é adequado às suas necessidades:

ChaveValor
Open sourceSim
Camada OSITransporte ou Aplicação
Tipos de dadosInteiro, float, string, Booleano, data, hora, e mais
LimitaçõesNão adequado para arquitetura complexa
Operações possíveisLeitura/escrita/monitoramento/consulta de variáveis
LatênciaBaixa
UsoIIoT
SegurançaSim
CompressãoSim

Tabela 5: Especificações do protocolo OPC UA

Requisitos para Construção da Aplicação

Preparando o Cartão SD

Para preparar um cartão SD, siga a sequência de ações descrita:

  1. Baixe a imagem mais recente do Raspbian LITE (disponível em Raspberry Pi Downloads).
  2. Conecte seu cartão SD a um computador e use o Etcher (balena.io/etcher) para gravar o arquivo .img do Raspbian no cartão SD.
  3. Habilite SSH:
cd /Volumes/boot
touch ssh
  1. Para habilitar Wi-Fi, crie wpa_supplicant.conf com o seguinte conteúdo:
network={
  ssid="SEU_SSID"
  psk="SUA_SENHA_WIFI"
}
Criação do arquivo de configuração Wi-Fi

Para criar um arquivo no console Linux, use o editor GNU nano. Ele vem pré-instalado na maioria das distribuições Linux. Execute o comando nano NOME_ARQUIVO e siga as instruções exibidas.

  1. Crie o diretório /home/pi/hub
  2. Crie o arquivo /home/pi/hub/package.json com o seguinte conteúdo:
{
  "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"
  }
}
  1. Crie o arquivo /home/pi/hub/index.js com o seguinte conteúdo, substituindo REMOTE-SERVER-ADDRESS.com e REMOTE-SENSOR-ADDRESS por valores reais:
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( [
// estabelecendo conexão
function (cb) {
  client.connect(sensor, function (err) {
    if (err) {
      console.log("Conexão com " + sensor + " falhou");
    } else {
      console.log("Conexão bem-sucedida");
    }
    cb(err);
  });
},
// iniciar sessão
function (cb) {
  client.createSession(function (err, res) {
    if (!err) session = res;
    cb(err);
  });
},
// ler valor
function (cb) {
  session.readVariableValue("ns=1;s=Variable1", function (err, dataValue) {
    if (!err) console.log("Variable1 = ", dataValue.value.value);
    cb(err);
  });
},
// escrever valor
function (cb) {
  session.writeSingleNode("ns=1;s=Variable1", new opcua.Variant({
    dataType: opcua.DataType.Double, value: 100
  }), function (err) {
    cb(err);
  });
},
// assinar mudanças
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);
  // instalar item monitorado
  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);
    // enviar para receptor
    var data = {
      device: "sensor1",
      timestamp: Date.now(),
      Variable1: dataValue.value.value
    };
    request.post({url: receiver, form: data}, function (err) {
      if (err) console.log("Falha ao enviar " + JSON.stringify(data) + " para " + receiver);
    });
  });
},
// fechar sessão
function (cb) {
  session.close(function (err) {
    if (err) console.log("Falha ao fechar sessão"); cb();
  });
}
],
function (err) { if (err) {
  console.log("Falhou com erro:", err);
} else {
  console.log("Concluído com sucesso");
}
client.disconnect(function () {
});
}
);
  1. Crie o arquivo /home/pi/hub/Dockerfile com o seguinte conteúdo:
FROM hypriot/rpi-node:boron-onbuild
  1. Crie o diretório /home/pi/sensor
  2. Crie o arquivo /home/pi/sensor/package.json com o seguinte conteúdo:
{
  "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"
  }
}
  1. Crie o arquivo /home/pi/sensor/index.js com o seguinte conteúdo:
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;
  // gerar novo valor
  setInterval(function () {
    variable1 = Math.floor(max - Math.random() * (max - min));
  }, 500);
  space.addVariable({
    browseName: "browseName",
    componentOf: componentOf,
    dataType: "Double",
    nodeId: "ns=1;s=Variable1", // nodeID string
    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);
  });
});
  1. Configure os valores min e max no início do arquivo /home/pi/sensor/index.js.
  1. Crie o arquivo /home/pi/sensor/Dockerfile com o seguinte conteúdo:
FROM hypriot/rpi-node:boron-onbuild

Tecnologia da Internet das Coisas

  1. Segurança IoT Industrial: Principais Tendências e Melhores Práticas para 2020
  2. Cisco Revela Arquitetura Abrangente de Segurança IIoT e Edge Intelligence para Visibilidade OT
  3. Protegendo a Internet Industrial das Coisas: Estratégias, Padrões e Cadeia de Confiança
  4. ECM3532: Primeira Placa de Sensor IA Integrada Ultra-Baixo Consumo da Eta Compute Acelera Desenvolvimento Edge
  5. Glassboard: Aproveitando a Impressão 3D para Desenvolvimento Rápido e Confiável de Produtos
  6. Perspectiva Futura: Avançando Industrial IoT para Excelência em Produção
  7. Edge Computing: A Chave para o Sucesso da IoT Industrial em Tempo Real
  8. Alavancando IIoT e IA para Impulsionar Vendas e Produtividade para Fabricantes e Distribuidores
  9. Containers Capacitam Desenvolvimento Ágil de Apps IoT
  10. Edge Computing e IIoT: Transformando Estratégia de Dados Industrial