산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial Internet of Things >> 사물 인터넷 기술

IIoT 에지 개발 – OPC UA 프로토콜 사용

편집자 주:산업용 사물 인터넷(IIoT)은 산업 운영에 대한 깊은 통찰력을 제공하고 연결된 기계 및 시스템의 효율성을 향상시킬 것을 약속합니다. 대규모 IIoT 애플리케이션은 계층화된 아키텍처에 의존하여 광범위한 센서에서 데이터를 수집하고, 데이터를 안정적이고 안전하게 클라우드로 이동하고, 통찰력과 효율성을 제공하는 데 필요한 분석을 수행합니다. 산업용 인터넷 애플리케이션 개발에서 저자는 IIoT 아키텍처에 대한 자세한 조사를 제공하고 이러한 시스템과 관련된 광범위한 요구사항을 충족하기 위한 접근 방식에 대해 논의합니다.

Alena Traukina, Jayant Thomas, Prashant Tyagi, Kishore Reddipalli의 Industrial Internet Application Development에서 각색


3장. IIoT Edge 개발(계속)
Alena Traukina, Jayant Thomas, Prashant Tyagi, Kishore Reddipalli 작성

산업용 M2M 프로토콜 – OPC UA

이 섹션에서는 Raspberry Pi 허브와 OPC UA 프로토콜을 사용하여 센서 시뮬레이터 모듈에서 수신기 장치(PC 또는 클라우드)로 데이터를 보내기 위한 간단한 IoT 앱을 빌드하려고 합니다.


센서 시뮬레이터에서 수신기 장치로의 데이터 흐름

OPC UA 프로토콜은 Modbus와 유사하지만 더 많은 데이터 유형에서 작동하며 심각한 제한이 없으며 보안, 압축 및 짧은 대기 시간을 제공합니다.

이 프로토콜은 OPC Foundation에서 산업용 기계 간 통신 프로토콜로 개발했습니다. OPC UA(통합 아키텍처)는 개방형 플랫폼 커뮤니케이션 의 개선된 버전입니다. (OPC ) 프로토콜과 함께 주요 변경 사항 중 하나는 새 프로토콜을 제한 없이 무료로 사용할 수 있다는 것입니다.

다음 표에서 프로토콜이 귀하의 요구 사항에 적합한지 여부를 이해하기 위해 더 자세한 설명을 찾을 수 있습니다.

가치 오픈 소스예OSI 계층전송 또는 애플리케이션데이터 유형정수, 부동 소수점, 문자열, 부울, 날짜, 시간 등제한 복잡한 아키텍처에 적합하지 않음가능한 작업읽기/쓰기/모니터/쿼리 변수LatencyLowUsageIIoTSecurityYesCompressionYes

표 5:OPC UA 프로토콜 사양

애플리케이션을 구축하려면 다음이 필요합니다.

SD 카드 준비

SD 카드를 준비하려면 설명된 일련의 작업을 따르세요.

  1. 최신 Raspbian LITE 이미지를 다운로드합니다(https:// raspberrypi.org/downloads/raspbian/에서 사용 가능).

  2. SD 카드를 컴퓨터에 연결하고 Etcher(https://io/)를 사용하여 Raspbian .img 파일을 SD에 플래시합니다. 카드.

  3. SSH 활성화:

<글꼴 스타일 ="글꼴 크기:13픽셀;" face ="Courier New"> cd /Volumes/boot touch ssh

<올 시작 ="4">
  • Wi-Fi를 사용하려면 다음 콘텐츠로 conf를 만드세요.

  • <글꼴 스타일 ="글꼴 크기:13픽셀;" face ="Courier New"> network={
    ssid=”YOUR_SSID”
    psk=”YOUR_WIFI_PASSWORD”
    }

    Linux 콘솔에서 파일을 생성하려면 GNU nano 편집기를 사용할 수 있습니다. 대부분의 Linux 배포판에 사전 설치되어 있습니다. nano FILE_NAME 명령을 실행하고 표시된 지침을 따르기만 하면 됩니다. <올 시작 ="5">
  • /home/pi/hub 만들기

  • 다음 내용으로 /home/pi/hub/package.json 파일을 만듭니다.

  • <글꼴 스타일 ="글꼴 크기:13픽셀;" face ="Courier New"> {
    “이름”:“허브”,
    “버전”:“1.0.0”,
    “설명”:“”,
    “ main”:“index.js”, “scripts”:{
    “start”:“node index.js”,
    “test”:“echo “Error:no test specified” &&exit 1″
    },
    “저자”:“”,
    “라이선스”:“ISC”, “종속성”:{
    “비동기”:“^2.4.0”,
    “노드 opcua”:“0.0.64”,
    “요청”:“^2.81.0”
    }
    }

    <올 시작 ="7">
  • 다음 내용으로 /home/pi/hub/index.js 파일을 만들고

  • <글꼴 스타일 ="글꼴 크기:13픽셀;" face ="Courier New"> 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 센서 =“opc.tcp://REMOTE-SENSOR-ADDRESS:4334/UA/resourcePath”;
    var 수신기 =“http://REMOTE-SERVER-ADDRESS.com:8080”;
    async.series( [
    // 연결 기능 설정(cb) {
    client.connect(sensor, function (err) {
    if (err) {
    console.log ("연결" + 센서 + "실패");
    } else {
    console.log("연결 성공");
    }
    cb(err);
    });
    },
    // 세션 시작 function (cb) {
    client.createSession(function (err, res) {
    if (!err) session =res;
    cb(err);
    });
    },
    // 값 읽기
    함수(cb) {
    session.readVariableValue(“ ns=1;s=Variable1", 함수(err, dataValue) {
    if (!err) console.log("Variable1 =", dataValue.value.value);
    cb(err);
    });
    },
    // 값 쓰기
    함수(cb) {
    session.writeSingleNode(“ns=1;s=Variable1”, new opcua.Variant({
    dataType:opcua.DataType.Double, 값:100
    }), 함수(err) {
    cb(err);
    });
    },
    // 변경 사항 구독
    function (cb) {
    subscription =new opcua.ClientSubscription(session, {
    maxNotificationsPerPublish:5,
    우선순위:5,
    publishingEnabled:{true,
    requestedLifetimeCount:5,
    requestedMaxKeepAliveCount:3,
    requestedPublishingInterval:500,
    });
    subscription.on("시작됨", 기능 br /> console.log("구독 ID:",
    subscription.subscriptionId);
    }).on("종료된", 기능() {
    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("변경됨", 기능(dataValue) {
    console.log("Variable1 =", dataValue.value.value);
    // 수신자에게 보내기
    var data ={
    기기:"sensor1",
    타임스탬프:Date.now(),
    변수1:dataValue.value.value
    };
    request.post({url:수신자, 양식:데이터}, 함수(오류) {
    if (err) console.log("전송 실패 ” +
    JSON.stringify(data) + ” to ” + 수신자);
    });
    });
    },
    // 세션 닫기
    function (cb) {
    session.close(function (err) {
    if (err) console.log("실패 세션 닫기"); cb();
    });
    }
    ],
    function (err) { if (err) {
    console.log("오류로 인해 실패:" , 오류);
    } else {
    console.log("성공적으로 완료됨");
    }
    client.disconnect(함수() {
    });
    }
    );

    <올 시작 ="8">
  • 다음 내용으로 /home/pi/hub/Dockerfile 파일을 만듭니다.

  • <글꼴 스타일 ="글꼴 크기:13픽셀;" face ="Courier New"> FROM hypriot/rpi-node:boron-onbuild

    <올 시작 ="9">
  • /home/pi/sensor 만들기

  • 다음 콘텐츠로 /home/pi/sensor/package.json 파일을 만듭니다.

  • <글꼴 스타일 ="글꼴 크기:13픽셀;" face ="Courier New"> {
    “이름”:“센서”,
    “버전”:“1.0.0”,
    “설명”:“”,
    “ main":"index.js",
    "scripts":{
    "start":"node index.js",
    "test":"echo "오류:지정된 테스트 없음" &&exit 1″
    },
    "author":"",
    "license":"ISC",
    "dependencies":{
    "node-opcua ":"0.0.64"
    }
    }

    <올 시작 ="11">
  • 다음 콘텐츠로 /home/pi/sensor/index.js 파일을 만듭니다.

  • <글꼴 스타일 ="글꼴 크기:13픽셀;" face="Courier New"> 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”,
    organizedBy:space.rootFolder.objects,
    });
    var variable1 =0;
    // 새 값 생성
    setInterval(function () {
    variable1 =Math.floor(max – Math.random() * (최대 – 최소));
    }, 500);
    space.addVariable({
    browseName:"browseName",
    componentOf:componentOf,
    dataType:"Double",
    nodeId:"ns=1;s=Variable1”, // 문자열 nodeID
    value:{
    get:function () {
    return new opcu a.Variant({dataType:opcua.DataType.Double, 값:variable1});
    },
    set:함수(변형) {
    variable1 =parseFloat(variant.value);
    opcua.StatusCodes.Good을 반환합니다.
    }
    }
    });
    host.start(function () {
    var endpoint =
    host.endpoints[0].endpointDescriptions()[0].endpointUrl; console.log("엔드포인트:", 엔드포인트);
    });
    });

    <올 시작 ="12">
  • 시작 부분에 최소값과 최대값을 구성합니다.

  • <글꼴 스타일 ="글꼴 크기:13픽셀;" face ="Courier New"> /home/pi/sensor/index.js 파일.

    <올 시작 ="13">
  • 다음 내용으로 /home/pi/sensor/Dockerfile 파일을 만듭니다.

  • <글꼴 스타일 ="글꼴 크기:13픽셀;" face ="Courier New"> FROM hypriot/rpi-node:boron-onbuild


    사물 인터넷 기술

    1. 2020년 IIoT 보안 팁 및 동향
    2. Cisco는 포괄적인 IIoT 보안 아키텍처, 가시성과 에지 인텔리전스를 위한 Cyber ​​Vision 발표
    3. IIoT 보안 관리
    4. 에지 AI 개발 속도를 높이는 스마트 센서 보드
    5. 3D 프린팅을 사용하여 모든 것을 수행하는 제품 개발 회사
    6. 산업용 IoT 개발 전망
    7. IIoT에 엣지 컴퓨팅이 중요한 이유
    8. 제조업체와 유통업체가 마침내 IIoT와 AI를 사용하여 매출과 생산성을 높입니다.
    9. IoT 앱 개발로 컨테이너 기술의 민첩성 향상
    10. 엣지 컴퓨팅과 IIoT가 데이터에 대한 우리의 생각을 바꾸고 있습니까?