Разработка границ IIoT - Использование протоколов OPC UA
Примечание редактора. Промышленный Интернет вещей (IIoT) обещает обеспечить глубокое понимание промышленных операций и повысить эффективность подключенных машин и систем. Крупномасштабные приложения IIoT полагаются на многоуровневую архитектуру для сбора данных с широкого диапазона датчиков, надежного и безопасного перемещения данных в облако и выполнения анализа, необходимого для обеспечения такого понимания и эффективности. В статье «Разработка промышленных Интернет-приложений» авторы подробно исследуют архитектуру IIoT и обсуждают подходы для удовлетворения широких требований, связанных с этими системами.
По материалам Industrial Internet Application Development, авторы:Алена Траукина, Джаянт Томас, Прашант Тяги, Кишор Реддипалли.
Глава 3. Разработка IIoT Edge (продолжение)
Авторы:Алена Траукина, Джаянт Томас, Прашант Тяги, Кишор Реддипалли
Промышленные протоколы M2M - OPC UA
В этом разделе мы попытаемся создать простое приложение IoT для отправки данных из модуля симулятора датчика на принимающее устройство (ПК или облако), используя концентратор Raspberry Pi и протокол OPC UA:
Поток данных от имитатора датчика к приемному устройству
Протокол OPC UA похож на Modbus, но работает с большим количеством типов данных и не имеет серьезных ограничений, обеспечивая безопасность, сжатие и низкую задержку.
Протокол был разработан OPC Foundation как промышленный протокол межмашинной связи. OPC UA (унифицированная архитектура) - это улучшенная версия Open Platform Communications ( OPC ), с одним из основных изменений:новый протокол доступен бесплатно без каких-либо ограничений.
В следующей таблице вы можете найти более подробное описание протокола, чтобы понять, подходит ли он для ваших нужд:
Ключ Значение Открытый исходный код Да Уровень OSI Транспорт или приложение Типы данных Целое число, число с плавающей запятой, строка, логическое значение, дата, время и т.д.Таблица 5:Спецификации протокола OPC UA
Для сборки приложения нам потребуется следующее:
- Требуемое программное обеспечение
- Node.js 6+ (https:/ / nodejs. org / en / download /)
- PostgreSQL (https:/ / www. postgresql. org / download /)
- Интерфейс командной строки Cloud Foundry (https:/ / github. com / cloudfoundry / cli # downloads)
- Запрос (https:/ / www. npmjs. com / package / request)
- NodeOPCUA (https:/ / www. npmjs. com / package / node- opcua)
- Асинхронный (https:/ / www. npmjs. com / package / async)
- Докер (https:/ / docs. docker. com / engine / installation /)
- Требуемое оборудование
- Raspberry Pi 3 (модель B)
- Адаптер питания (2 А / 5 В)
- Карта microSD (более 8 ГБ) и SD-адаптер.
- Кабель Ethernet для проводного сетевого подключения
Подготовка SD-карты
Чтобы подготовить SD-карту, выполните последовательность действий, как описано:
-
Загрузите последний образ Raspbian LITE (доступен по адресу https:// raspberrypi.org/downloads/raspbian/).
-
Подключите SD-карту к компьютеру и используйте Etcher (https:// io /) для прошивки файла .img Raspbian на SD. карта.
-
Включить SSH:
cd / Volumes / boot touch ssh
-
Чтобы включить Wi-Fi, создайте conf со следующим содержимым:
network ={
ssid =”YOUR_SSID”
psk =”YOUR_WIFI_PASSWORD”
}
-
Создайте / home / pi / hub
-
Создайте файл /home/pi/hub/package.json со следующим содержимым:
{
«name»:«hub»,
«version»:«1.0.0»,
«description»:«»,
« main »:« index.js »,« scripts »:{
« start »:« node index.js »,
« test »:« echo «Ошибка:тест не указан» &&exit 1 ″
},
«автор»:«»,
«лицензия»:«ISC», «зависимости»:{
«async»:«^ 2.4.0»,
«узел-opcua»:«0.0.64»,
«запрос»:«^ 2.81.0»
}
}
-
Создайте файл /home/pi/hub/index.js со следующим содержимым, заменив
REMOTE-SERVER-ADDRESS.com и REMOTE-SENSOR-ADDRESS с реальными значениями:
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 =«http://REMOTE-SERVER-ADDRESS.com:8080 »;
async.series ([
// функция установления соединения (cb) {
client.connect (sensor, function (err) {
if (err) {
console.log) («Подключение к» + датчик + «сбой»);
} else {
console.log («Подключение выполнено успешно»);
}
cb (err);
});
},
// запускаем функцию сеанса (cb) {
client.createSession (function (err, res) {
if (! Err) session =res;
cb (err);
});
},
// чтение значения
function (cb) {
session.readVariableValue (“ ns =1; s =Variable1 », function (err, dataValue) {
if (! err) console.log (« Variable1 =«, dataValue.value.value);
cb (err);
});
},
// записываем значение
function (cb) {
session.writeSingleNode («ns =1; s =Variable1», new opcua.Variant ({
DataType:opcua.DataType.Double, значение:100
}), function (err) {
cb (err);
});
},
// подписаться на изменения
function (cb) {
subscription =new opcua.ClientSubscription (session, {
maxNotificationsPerPublish:5,
priority:5,
publishingEnabled:истина,
requiredLifetimeCount:5,
requestedMaxKeepAliveCount:3,
requestedPublishingInterval:500,
});
subscription.on («start», function () {
console.log («идентификатор подписки:«,
subscription.subscriptionId);
}). on («завершено», function () {
cb ();
});
setTimeout (function () {
subscription.terminate ();
}, 5000);
// устанавливаем отслеживаемый элемент
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 («изменено», function (dataValue) {
console.log («Variable1 =«, dataValue.value.value);
// отправляем получателю
var data ={
device:«sensor1»,
Отметка времени:Date.now (),
Variable1:dataValue.value.value
};
request.post ({url:Receiver, form:data}, function (err) {
if (err) console.log («Не удалось отправить» +
JSON.stringify (data) + »к» + получателю);
});
});
},
// закрыть сеанс
function (cb) {
session.close (function (err) {
if (err) console.log («Failed to закрыть сессию »); cb ();
});
}
],
function (err) {if (err) {
console.log («Failed with error:» , err);
} else {
console.log («Успешно завершено»);
}
client.disconnect (function () {
});
}
);
-
Создайте файл / home / pi / hub / Dockerfile со следующим содержимым:
ОТ hypriot / rpi-node:boron-onbuild
-
Создайте / home / pi / sensor
-
Создайте файл /home/pi/sensor/package.json со следующим содержимым:
{
«name»:«sensor»,
«version»:«1.0.0»,
«description»:«»,
« main »:« index.js »,
« scripts »:{
« start »:« node index.js »,
« test »:« echo «Ошибка:тест не указан» &&exit 1 ″
},
«автор»:«»,
«лицензия»:«ISC»,
«зависимости»:{
«node-opcua »:« 0.0.64 »
}
}
-
Создайте файл /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»,
},
порт :4334,
resourcePath:«UA / resourcePath»,
});
host.initialize (function () {
var space =host.engine.addressSpace;
Var componentOf =space.addObject ({
browseName:«browseName»,
organizationBy:space.rootFolder.objects,
});
var variable1 =0;
// генерируем новое значение
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
:{
get:function () {
return new opcu a.Variant ({dataType:opcua.DataType.Double, value:variable1});
},
set:function (option) {
variable1 =parseFloat (variant.value);
return opcua.StatusCodes.Good;
}
}
});
host.start (function () {
var endpoint =
host.endpoints [0] .endpointDescriptions () [0] .endpointUrl; console.log («Конечная точка:«, конечная точка);
});
});
-
Настройте минимальное и максимальное значения в начале
файл /home/pi/sensor/index.js.
-
Создайте файл / home / pi / sensor / Dockerfile со следующим содержимым:
ОТ hypriot / rpi-node:boron-onbuild
Интернет вещей
- Советы и тенденции безопасности IIoT на 2020 год
- Cisco анонсирует комплексную архитектуру безопасности IIoT, Cyber Vision для прозрачности и Edge Intelligence
- Управление безопасностью IIoT
- Интеллектуальная сенсорная плата ускоряет разработку периферийного ИИ
- Компания по разработке продуктов, использующая для всего этого 3D-печать
- Перспективы развития промышленного Интернета вещей
- Почему периферийные вычисления так важны для IIoT
- Производители и дистрибьюторы наконец используют IIoT и AI для увеличения продаж и производительности
- Разработка приложений Интернета вещей получает повышение гибкости от контейнерных технологий
- Меняют ли периферийные вычисления и IIoT наше представление о данных?