チュートリアル: Azure Industrial IoT 参照ソリューション アーキテクチャの実装

製造元は、産業用 IoT ソリューション全体を世界規模でデプロイし、すべての生産サイトをこのソリューションに接続して、個々の生産サイトの効率を高めたいと考えています。

これらの効率の向上は、生産の高速化とエネルギー消費量の削減につながり、ほとんどの場合、品質を向上させながら、生産された商品のコストを削減することにつながります。

このソリューションは、可能な限り効率的で、条件の監視、OEE 計算、予測、異常検出など、必要なすべてのユース ケースを有効にする必要があります。 これらのユース ケースで得られた分析情報から、2 番目の手順でデジタル フィードバック ループを作成し、最適化やその他の変更を生産プロセスに適用できます。

相互運用性は、ソリューション アーキテクチャの迅速なロールアウトを実現するための鍵であり、OPC UA のようなオープン標準の使用は、この相互運用性の実現に大きく役立ちます。

IEC 62541 Open Platform Communications Unified Architecture (OPC UA)

このソリューションでは、すべての運用テクノロジ (OT) データに IEC 62541 Open Platform Communications (OPC) Unified Architecture (UA) を使用します。 この標準については、ここで説明しています。

ソリューション アーキテクチャの参照

簡略化されたアーキテクチャ (Azure と Fabric の両方のオプション):

単純な IIoT アーキテクチャの図。

詳細なアーキテクチャ (Azure のみ):

IIoT アーキテクチャの図。

コンポーネント

このソリューションに関連するコンポーネントを次に示します。

コンポーネント 説明
産業資産 Docker コンテナーでホストされている OPC-UA に対応した一連のシミュレートされた生産ライン
Azure IoT Operations Azure IoT Operations は、エッジ用の統合データ プレーンです。 これには、Azure Arc 対応エッジ Kubernetes クラスター上で実行される一連のモジュール式のスケーラブルな高可用性データ サービスが含まれます。
データ ゲートウェイ このゲートウェイは、オンプレミスのデータ ソース (SAP など) をクラウド内の Azure Logic Apps に接続します。
Azure Kubernetes Services Edge Essentials この Kubernetes 実装は Edge で実行されます。 フォールト トレラントな Edge 構成用の単一ノードおよびマルチノード Kubernetes クラスターを提供します。 K3S と K8S の両方がサポートされます。 産業用ゲートウェイのように、埋め込みまたは PC クラスのハードウェアで実行されます。
Azure Event Hubs クラウド メッセージ ブローカーは、エッジ ゲートウェイから OPC UA PubSub メッセージを受信し、それらがサブスクライバーによって取得されるまで格納します。
Azure Data Explorer 詳細なクラウド分析のための時系列データベースとフロントエンド ダッシュボード サービス (組み込みの異常検出および予測を含む)。
Azure Logic Apps Azure Logic Apps はクラウド プラットフォームであり、コードをほとんど、またはまったく使用せずに、自動化されたワークフローを作成して実行できます。
Azure Arc このクラウド サービスは、エッジでオンプレミスの Kubernetes クラスターを管理するために使用されます。 Flux を使用して新しいワークロードをデプロイできます。
Azure ストレージ このクラウド サービスは、Edge Kubernetes ワークロードの OPC UA 証明書ストアと設定を管理するために使用されます。
Azure Managed Grafana Azure Managed Grafana は、Grafana Labs によって Grafana ソフトウェアの上に構築されたデータ視覚化プラットフォームです。 Grafana は、Microsoft がホストおよびサポートするフル マネージド サービスとして構築されています。
Microsoft Power BI Microsoft Power BI は SaaS ソフトウェア サービス、アプリ、コネクタのコレクションであり、これらが連携して、関連のないデータ ソースを、一貫性があり視覚的に没入型で対話形式の分析情報に変換します。
Microsoft Dynamics 365 Field Service Microsoft Dynamics 365 Field Service は、フィールド サービス要求を管理するためのターンキー SaaS ソリューションです。
UA Cloud Commander このオープン ソース参照アプリケーションは、メッセージ キュー テレメトリ トランスポート (MQTT) または Kafka ブローカー (場合によってはクラウド内) に送信されたメッセージを、接続された OPC UA サーバーの OPC UA クライアント/サーバー要求に変換します。 アプリケーションは Docker コンテナーで実行されます。
UA Cloud Action このオープン ソース参照クラウド アプリケーションは、特定のデータ値について Azure Data Explorer に対してクエリを実行します。 データ値は、シミュレートされた生産ライン マシンの 1 台の負荷です。 特定のしきい値 (4,000 mbar) に達すると、Azure Event Hubs 経由で UA Cloud Commander が呼び出されます。 その後、UA Cloud Commander は、OPC UA を介してマシン上で OpenPressureReliefValve メソッドを呼び出します。
UA Cloud Library UA Cloud Library は OPC UA Information Model のオンライン ストアであり、ここの OPC Foundation によってホストされています。
UA Edge Translator このオープンソースの産業用接続参照アプリケーションは、産業用資産インターフェイスを記述するためのスキーマとして W3C Web of Things (WoT) Thing Descriptions を使用して、独自の資産インターフェイスから OPC UA に変換します。

Note

現実世界のデプロイでは、圧力逃がし弁を開けるような重要な処理は、オンプレミスで行われます。 これは、デジタル フィードバック ループの実現方法を示すための単純な例に過ぎません。

クラウドベースの OPC UA 証明書ストアと永続化ストレージ

製造元が OPC UA アプリケーションを実行する場合、OPC UA 構成ファイル、キー、証明書を保持する必要があります。 Kubernetes には、これらのファイルをボリュームに保持する機能があります。特に、ノードで障害が発生したときにボリュームが失われる単一ノード クラスターでは、それらのファイルの安全な場所がクラウドになります。 このシナリオは、このソリューションで使用される OPC UA アプリケーションが、構成ファイル、キー、証明書をクラウドに格納する理由です。 この方法には、すべての OPC UA アプリケーションに対して相互に信頼された証明書に 1 つの場所を提供できる利点もあります。

UA Cloud Library

OPC UA Information Model は、Azure Data Explorer から直接読み取れます。 これを行うには、OPC UA Information Model で定義されている OPC UA ノードをテーブルにインポートして、クエリ内でより多くのメタデータを検索します。

まず、ADX クラスターで次のクエリを実行して、UA Cloud Library の Azure Data Explorer (ADX) コールアウト ポリシーを構成します (Azure portal の [ADX] タブの [アクセス許可] で構成できる ADX クラスター管理者であることを確認してください)。

.alter cluster policy callout @'[{"CalloutType": "webapi","CalloutUriRegex": "uacloudlibrary.opcfoundation.org","CanCall": true}]'

次に、Azure portal から次の Azure Data Explorer クエリを実行します。

let uri='https://uacloudlibrary.opcfoundation.org/infomodel/download/\<insert information model identifier from the UA Cloud Library here\>';
let headers=dynamic({'accept':'text/plain'});
let options=dynamic({'Authorization':'Basic \<insert your cloud library credentials hash here\>'});
evaluate http_request(uri, headers, options)
| project title = tostring(ResponseBody.['title']), contributor = tostring(ResponseBody.contributor.name), nodeset = parse_xml(tostring(ResponseBody.nodeset.nodesetXml))
| mv-expand UAVariable=nodeset.UANodeSet.UAVariable
| project-away nodeset
| extend NodeId = UAVariable.['@NodeId'], DisplayName = tostring(UAVariable.DisplayName.['#text']), BrowseName = tostring(UAVariable.['@BrowseName']), DataType = tostring(UAVariable.['@DataType'])
| project-away UAVariable
| take 10000

このクエリでは、次の 2 つを指定する必要があります。

  • Information Model の UA Cloud Library の一意の ID を入力し、ADX クエリの>クラウド ライブラリからの情報モデル識別子をここに挿入<フィールドに入力します。
  • UA Cloud Library の資格情報 (登録中に生成) 基本承認ヘッダー ハッシュを挿入し、それを ADX クエリの>ここにクラウド ライブラリ資格情報ハッシュを挿入<フィールドに挿入します。 これを生成するには、https://www.debugbear.com/basic-auth-header-generator などのツールを使用します。

たとえば、Kusto Explorer ツールで生産ライン シミュレーション ステーション OPC UA Server の Information Model をレンダリングするには、ここのダウンロードを使用し、次のクエリを実行します。

let uri='https://uacloudlibrary.opcfoundation.org/infomodel/download/1627266626';
let headers=dynamic({'accept':'text/plain'});
let options=dynamic({'Authorization':'Basic \<insert your cloud library credentials hash here\>'});
let variables = evaluate http_request(uri, headers, options)
    | project title = tostring(ResponseBody.['title']), contributor = tostring(ResponseBody.contributor.name), nodeset = parse_xml(tostring(ResponseBody.nodeset.nodesetXml))
    | mv-expand UAVariable = nodeset.UANodeSet.UAVariable
    | extend NodeId = UAVariable.['@NodeId'], ParentNodeId = UAVariable.['@ParentNodeId'], DisplayName = tostring(UAVariable['DisplayName']), DataType = tostring(UAVariable.['@DataType']), References = tostring(UAVariable.['References'])
    | where References !contains "HasModellingRule"
    | where DisplayName != "InputArguments"
    | project-away nodeset, UAVariable, References;
let objects = evaluate http_request(uri, headers, options)
    | project title = tostring(ResponseBody.['title']), contributor = tostring(ResponseBody.contributor.name), nodeset = parse_xml(tostring(ResponseBody.nodeset.nodesetXml))
    | mv-expand UAObject = nodeset.UANodeSet.UAObject
    | extend NodeId = UAObject.['@NodeId'], ParentNodeId = UAObject.['@ParentNodeId'], DisplayName = tostring(UAObject['DisplayName']), References = tostring(UAObject.['References'])
    | where References !contains "HasModellingRule"
    | project-away nodeset, UAObject, References;
let nodes = variables
    | project source = tostring(NodeId), target = tostring(ParentNodeId), name = tostring(DisplayName)
    | join kind=fullouter (objects
        | project source = tostring(NodeId), target = tostring(ParentNodeId), name = tostring(DisplayName)) on source
        | project source = coalesce(source, source1), target = coalesce(target, target1), name = coalesce(name, name1);
let edges = nodes;
edges
    | make-graph source --> target with nodes on source

最良の結果を得るには、Layout オプションを Grouped に変更し、Lablesname に変更します。

ステーション情報モデルのグラフ。

生産ラインのシミュレーション

このソリューションでは、OPC UA Information Model と単純な Manufacturing Execution System (MES) を使用して、複数のステーションで構成される生産ライン シミュレーションを使用します。 ステーションと MES の両方がコンテナー化され、デプロイが容易になります。

デフォルトのシミュレーション構成

このシミュレーションは、2 つの生産ラインを含むように構成されます。 既定の構成は次のとおりです。

生産ライン 理想的なサイクル時間 (秒単位)
ミュンヘン 6
シアトル 10
シフト名 スタート 末尾
午前 07:00 14:00
午後 15:00 22:00
夜間 23:00 06:00

Note

シフト時間は現地時刻です。具体的には、生産ライン シミュレーションをホストする仮想マシン (VM) が設定されているタイム ゾーンです。

ステーション OPC UA サーバーの OPC UA ノード ID

次の OPC UA ノード ID は、クラウドへのテレメトリのためにステーション OPC UA Server で使用されます。

  • i=379 - 製造製品のシリアル番号
  • i=385 - 製造製品の数
  • i=391 - 破棄された製品の数
  • i=398 - 実行時間
  • i=399 - 失敗した時間
  • i=400 - 状態 (0= ステーションの作業の準備完了、1= 進行中の作業、2= 作業完了と良好なパーツの製造済み、3= 作業完了とスクラップ製造済み、4= ステーションは障害状態にある)
  • i=406 - エネルギー消費量
  • i=412 - 理想的なサイクル時間
  • i=418 - 実際のサイクル時間
  • i=434 - 圧力

UA Cloud Commander と UA Cloud Action を使用したデジタル フィードバック ループ

このリファレンス実装では、"デジタル フィードバック ループ" を実装します。具体的には、特定のしきい値 (シミュレートされた圧力) に達した時系列データに基づいて、クラウドからシミュレーションの OPC UA サーバーの 1 つでコマンドをトリガーします。 Azure Data Explorer ダッシュボードで、シアトルの生産ラインで定期的にリリースされるアセンブリ マシンの負荷を確認できます。

生産ライン シミュレーションとクラウド サービスのインストール

ボタンをクリックすると、必要なすべてのリソースが Microsoft Azure にデプロイされます。

Azure に配置する

デプロイ時に、生産ライン シミュレーションのホストに使用される VM と UA Cloud Twin のパスワードを指定する必要があります。 パスワードには、1 つの小文字、1 つの大文字、1 つの数字、1 つの特殊文字のうちの 3 つの属性が必要です。 パスワードは 12 文字から 72 文字の間の長さで指定する必要があります。

Note

このデプロイでは、コストを節約するために、生産ライン シミュレーションと Azure Kubernetes Services Edge Essentials インスタンスのベース OS の両方に 1 つの Windows 11 Enterprise VM のみをデプロイします。 運用シナリオでは、生産ライン シミュレーションは必要ありません。また、Azure Kubernetes Services Edge Essentials インスタンスのベース OS では、Windows IoT Enterprise Long Term Servicing Channel (LTSC) をお勧めします。

デプロイが完了したら、RDP (リモート デスクトップ) 接続を使用して、デプロイされた Windows VM に接続します。 RDP ファイルは、VM の [Azure portal] ページの [接続] オプションでダウンロードできます。 デプロイ時に指定した資格情報を使用してサインインし、管理者 Powershell ウィンドウを開き、C:\ManufacturingOntologies-main\Deployment ディレクトリに移動して、次を実行します。

New-AksEdgeDeployment -JsonConfigFilePath .\aksedge-config.json

コマンドが完了すると、Azure Kubernetes Services Edge Essentials のインストールが完了し、生産ライン シミュレーションを実行できます。

ヒント

すべての Kubernetes ワークロードとサービスからいつでもログを取得するには、管理者 Powershell ウィンドウから Get-AksEdgeLogs を実行します。

Kubernetes クラスターのメモリ使用率を確認するには、管理者 Powershell ウィンドウから Invoke-AksEdgeNodeCommand -Command "sudo cat /proc/meminfo" を実行します。

生産ラインのシミュレーションを実行する

デプロイされた VM から、Windows コマンド プロンプトを開きます。 C:\ManufacturingOntologies-main\Tools\FactorySimulation ディレクトリに移動し、次のパラメーターを指定して StartSimulation コマンドを実行します。

    StartSimulation <EventHubsCS> <StorageAccountCS> <AzureSubscriptionID> <AzureTenantID>

パラメーター:

パラメーター 説明
EventHubCS ここで説明されているように、Event Hubs 名前空間の接続文字列コピーします。
StorageAccountCS Azure portal で、このソリューションによって作成されたストレージ アカウントに移動します。 左側のナビゲーション メニューから [アクセス キー] を選択します。 次に、key1 の接続文字列をコピーします。
AzureSubscriptionID Azure portal でサブスクリプションを参照し、このソリューションで使用されているサブスクリプションの ID をコピーします。
AzureTenantID Azure portal で [Microsoft エントリ ID] ページを開き、テナント ID をコピーします。

次の例は、すべてのパラメータを含むコマンドを示しています。

    StartSimulation Endpoint=sb://ontologies.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=abcdefgh= DefaultEndpointsProtocol=https;AccountName=ontologiesstorage;AccountKey=abcdefgh==;EndpointSuffix=core.windows.net 9dd2eft0-3dad-4aeb-85d8-c3adssd8127a 6e660ce4-d51a-4585-80c6-58035e212354

Note

複数の Azure サブスクリプションにアクセスできる場合は、まず Web ブラウザーを使用して VM から Azure portal にログインする価値があります。 また、Azure portal UI (右上隅) を使用して Active Directory テナントを切り替えて、デプロイ時に使用されるテナントにログインしていることを確認することもできます。 ログインしたら、ブラウザー ウィンドウを開いたままにします。 これにより、StartSimulation スクリプトが適切なサブスクリプションに簡単に接続できるようになります。

このソリューションでは、UA Cloud Publisher 用の OPC UA アプリケーション証明書ストアと、シミュレートされた生産ラインの MES ストアと個々のマシンのストアが、デプロイされた Azure Storage アカウント内のクラウドに配置されます。

Azure Arc を使用した管理のための Kubernetes クラスターの有効化

  1. 仮想マシンで、管理者 PowerShell ウィンドウを開きます。 C:\ManufacturingOntologies-main\Deployment ディレクトリに移動して CreateServicePrincipal を実行します。 2 つのパラメーター subscriptionIDtenantID を Azure portal から取得できます。

  2. notepad aksedge-config.json を実行すると、次の情報が提供されます。

    属性 説明
    場所 リソース グループの Azure の場所。 この場所は、このソリューション用にデプロイされたリソース グループの下の Azure portal で見つけることができますが、名前のスペースは削除してください。 現在サポートされているリージョンは、eastus、eastus2、westus2、westus3、westeurope、northeurope です。
    SubscriptionId サブスクリプション ID。 Azure portal で、使用しているサブスクリプションを選択し、サブスクリプション ID をコピーして貼り付けます。
    TenantId テナント ID。 Azure portal で Azure Active Directory を選択し、テナント ID をコピーして貼り付けます。
    ResourceGroupName このソリューション用にデプロイされた Azure リソース グループの名前。
    ClientId 以前に作成した Azure サービス プリンシパルの名前。 Azure Kubernetes Services では、このサービス プリンシパルを使用して、クラスターを Arc に接続します。
    ClientSecret Azure サービス プリンシパルのパスワード。
  3. ファイルを保存し、PowerShell ウィンドウを閉じて、新しい管理者 PowerShell ウィンドウを開きます。 C:\ManufacturingOntologies-main\Deployment ディレクトリに戻り、SetupArc を実行します。

新しくデプロイされた Azure Arc インスタンスを使用して、クラウドから Kubernetes クラスターを管理できるようになりました。 Azure portal で Azure Arc インスタンスを参照し、[ワークロード] を選択します。 必要なサービス トークンは、Get-AksEdgeManagedServiceToken を介して、仮想マシン上の管理者 Powershell ウィンドウから取得できます。

Azure portal の Azure Arc のスクリーンショット。

エッジでの Azure IoT Operations のデプロイ

前の段落で説明したように、生産ライン シミュレーションを既に開始しており、Azure Arc を介した管理のために Kubernetes クラスターを有効にしていることを確認します。 その後、次の操作を行います。

  1. Azure portal から、この参照ソリューションにデプロイされている Key Vault に移動し、Access policiesCreate の順に選択してアクセス ポリシーに独自の ID を追加し、Keys, Secrets & Certificate Management テンプレートを選択し、Next を選択し、独自のユーザー ID を検索して選択し、Next を選択し、[アプリケーション] セクションを空白のままにし、Next を選択し、最後に Create を選択します。
  2. Arc に接続された Kubernetes クラスター (ontologies_cluster と呼ばれる) のカスタムの場所を有効にするには、まず管理者 PowerShell ウィンドウから az login を使用して Azure サブスクリプションにログインし、az connectedk8s enable-features -n "ontologies_cluster" -g "<resourceGroupName>" --features cluster-connect custom-locations を実行し、デプロイされた参照ソリューションからの resourceGroupName を提供します。
  3. Azure portal から、Arc に接続された kubernetes クラスターに移動して Azure IoT Operations をデプロイし、ExtensionsAddAzure IoT OperationsCreate の順に選択します。 [Basic] ページで、すべてをそのままにします。 [Configuration] ページで、MQ ModeAuto に設定します。 このリファレンス ソリューションには、より多くの生産ライン シミュレーションが既に含まれているので、シミュレートされたプログラマブル ロジック コントローラー (PLC) をデプロイする必要はありません。 [Automation] ページで、この参照ソリューション用にデプロイされた Key Vault を選択し、自動的に生成された az iot ops init コマンドをコピーします。 デプロイした VM から、新しい管理者 PowerShell ウィンドウを開き、az login を実行して正しい Azure サブスクリプションにサインインし、Azure portal の引数を指定して az iot ops init コマンドを実行します。 コマンドが完了したら、Next を選択し、ウィザードを閉じます。

Azure IoT Operations 用の OPC UA のセキュリティと接続の構成

Azure portal で Arc 対応 Kubernetes リソースに移動して、Azure IoT Operations が正常にデプロイされており、すべての Kubernetes ワークロードが稼働していることを確認します。

  1. Azure portal から、この参照ソリューションにデプロイされている Azure Storage に移動し、Storage browser を開き、Blob containers を開きます。 ここでは、このソリューションで使用されるクラウドベースの OPC UA 証明書ストアにアクセスできます。 Azure IoT Operations では、Azure Key Vault をクラウドベースの OPC UA 証明書ストアとして使用するため、証明書をコピーする必要があります。
    1. Azure Storage ブラウザーの BLOB コンテナー内から、シミュレートされた生産ラインごとに、app/pki/trusted/certs フォルダーに移動し、アセンブリ、パッケージ化、テスト証明書ファイルを選択してダウンロードします。
    2. 管理者 PowerShell ウィンドウから az login を使用して Azure サブスクリプションにサインインし、az keyvault secret set --name "<stationName>-der" --vault-name <keyVaultName> --file .<stationName>.der --encoding hex --content-type application/pkix-cert を実行して、前の手順で .der 証明書ファイルをダウンロードした 6 つの各ステーションの keyVaultNamestationName を指定します。
  2. デプロイされた VM から、Windows コマンド プロンプトを開き、C:\ManufacturingOntologies-main\Tools\FactorySimulation\Station ディレクトリに提供された更新されたシークレット プロバイダー リソース ファイルを使用して kubectl apply -f secretsprovider.yaml を実行します。このとき Key Vault 名、Azure テナント ID、以前に Azure Key Vault にアップロードしたステーション証明書ファイル名とエイリアスを指定します。
  3. Web ブラウザーから https://iotoperations.azure.com にサインインし、右側の Azure ディレクトリ (右上隅) を選択し、生産ライン シミュレーションから資産の作成を開始します。 このソリューションには、それぞれ 3 つのステーション (アセンブリ、テスト、パッケージ) で構成される 2 つの生産ライン (ミュンヘンとシアトル) が付属しています。
    1. 資産エンドポイントの場合は、ミュンヘン生産ラインなどのアセンブリ ステーションの OPC UA Broker URL フィールドに opc.tcp://assembly.munich と入力します。Do not use transport authentication certificate を選択します (Azure IoT Operations と接続されている OPC UA サーバー間の OPC UA 証明書ベースの相互認証がまだ使用されています)。
    2. 資産タグの場合は、Import CSV file を選択し、C:\ManufacturingOntologies-main\Tools\FactorySimulation\Station ディレクトリにある StationTags.csv ファイルを開きます。
  4. Azure portal から、この参照ソリューションにデプロイされている Azure Storage に移動し、Storage browser を開き、Blob containers を開きます。 シミュレートされた生産ラインごとに、app/pki/rejected/certs フォルダーに移動し、Azure IoT Operations 証明書ファイルをダウンロードします。 次に、ファイルを削除します。 app/pki/trusted/certs フォルダーに移動し、Azure IoT Operations 証明書ファイルをこのディレクトリにアップロードします。
  5. デプロイされた VM から、Windows コマンド プロンプトを開き、C:\ManufacturingOntologies-main\Tools\FactorySimulation ディレクトリに移動して生産ライン シミュレーションを再起動し、StopSimulation コマンドを実行し、StartSimulation コマンドを実行します。
  6. ここで説明されている手順に従って、生産ライン シミュレーションからデータが流れているかどうかを確認します。
  7. 最後の手順として、Azure IoT Operations を、ここで説明されているように、この参照ソリューションにデプロイされている Event Hubs に接続します。

Azure Data Explorer でのユース ケース条件の監視、OEE の計算、異常の検出、予測の作成

また、Azure Data Explorer のドキュメントにアクセスして、状態の監視、生成またはメンテナンスの予測、異常検出のためのコードなしのダッシュボードを作成する方法を確認することもできます。 ここで概説する手順に従って、ADX ダッシュボードにデプロイするためのサンプル ダッシュボードがここに用意されています。 インポート後、ダッシュボードの右上隅にある形式 https://ADXInstanceName.AzureRegion.kusto.windows.net/ で ADX サーバー クラスター インスタンスの HTTPS エンドポイントを指定して、ダッシュボードのデータ ソースを更新する必要があります。

Azure Data Explorer ダッシュボードのスクリーンショット。

Note

特定のシフトの OEE を表示する場合は、ADX ダッシュボードの左上隅にある Time Range ドロップダウンで Custom Time Range を選択し、関心のあるシフトの開始から終了までの日付と時刻を入力します。

Kusto Explorer での組み込みの統一名前空間 (UNS) と ISA-95 モデル グラフのレンダリング

この参照ソリューションは、クラウド (Azure Data Explorer) の時系列データベースに送信される OPC UA メタデータに基づいて、統一名前空間 (UNS) を実装します。 この OPC UA メタデータには、ISA-95 資産階層も含まれます。 結果のグラフは、ここからダウンロードできる Kusto Explorer ツールで簡単に視覚化できます。

この参照ソリューションにデプロイされた Azure Data Explorer インスタンスに新しい接続を追加し、Kusto Explorer で次のクエリを実行します:

let edges = opcua_metadata_lkv
| project source = DisplayName, target = Workcell
| join kind=fullouter (opcua_metadata_lkv
    | project source = Workcell, target = Line) on source
    | join kind=fullouter (opcua_metadata_lkv
        | project source = Line, target = Area) on source
        | join kind=fullouter (opcua_metadata_lkv
            | project source = Area, target = Site) on source
            | join kind=fullouter (opcua_metadata_lkv
                | project source = Site, target = Enterprise) on source
                | project source = coalesce(source, source1, source2, source3, source4), target = coalesce(target, target1, target2, target3, target4);
let nodes = opcua_metadata_lkv;
edges | make-graph source --> target with nodes on DisplayName

最良の結果を得るには、Layout オプションを Grouped に変更します。

ISA-95 資産階層を示すグラフ。

Azure Managed Grafana サービスの使用

Grafana を使用して、この記事で説明するソリューション用のダッシュボードを Azure に作成することもできます。 Grafana は、リアルタイム データを表示するダッシュボードを作成するために、製造内で使用されます。 Azure には、Azure Managed Grafana という名前のサービスが用意されています。 これにより、クラウド ダッシュボードを作成できます。 この構成マニュアルでは、Azure で Grafana を有効にし、この参照ソリューションのシミュレートされた生産ライン データを使用して、Azure Data Explorer と Azure Digital Twins サービスからクエリを実行するデータを含むダッシュボードを作成します。

次のスクリーンショットはダッシュボードを示しています。

Grafana ダッシュボードを示すスクリーンショット。

Azure Managed Grafana Service の有効化

  1. Azure portal に移動し、サービス 'Grafana' を検索し、[Azure Managed Grafana] サービスを選択します。

    Marketplace で Grafana を有効にするスクリーンショット。

  2. インスタンスに名前を付け、標準オプションをオンのままにして、サービスを作成します。

  3. サービスが作成されたら、Grafana インスタンスにアクセスする URL に移動します。 URL は、サービスのホームページで確認できます。

Grafana への新しいデータ ソースの追加

最初のサインイン後、Azure Data Explorer に新しいデータ ソースを追加する必要があります。

  1. [構成] に移動し、新しいデータソースを追加します。

  2. Azure Data Explorer を検索し、サービスを選択します。

  3. 接続を構成し、アプリの登録を使用します (このページの上部に提供されているマニュアルに従ってください)。

  4. ページの下部にある接続を保存してテストします。

サンプル ダッシュボードのインポート

これで、提供されたサンプル ダッシュボードをインポートする準備ができました。

  1. ここでサンプル ダッシュボードをダウンロードします: サンプル Grafana Manufacturing Dashboard。

  2. [ダッシュボード] に移動し、[インポート] を選択します。

  3. ダウンロードしたソースを選択し、[保存] を選択します。 2 つの変数がまだ設定されていないため、ページでエラーが発生します。 ダッシュボードの設定ページに移動します。

  4. 左側の [変数] を選択し、2 つの URL を Azure Digital Twins Service の URL で更新します。

  5. ダッシュボードに戻り、[更新] ボタンをクリックします。 これでデータが表示されます (ダッシュボードの [保存] ボタンをクリックすることを忘れないでください)。

    ページの上部にある場所変数には、Azure Digital Twins (ISA95 のエリア ノード) からのデータが自動的に入力されます。 ここでは、さまざまな場所を選択し、各ファクトリのさまざまなデータポイントを確認できます。

  6. ダッシュボードにデータが表示されない場合は、個々のパネルに移動し、適切なデータ ソースが選択されているかどうかを確認します。

アラートを構成する

Grafana 内では、アラートを作成することもできます。 この例では、生産ラインの 1 つに対して低 OEE アラートを作成します。

  1. Grafana サービスにサインインし、メニューの [アラート ルール] を選択します。

    アラートへのナビゲーションを示すスクリーンショット。

  2. [アラート ルールの作成] を選択します。

    アラート ルールの作成方法を示すスクリーンショット。

  3. アラートに名前を付け、データ ソースとして [Azure Data Explorer] を選択します。 ナビゲーション ウィンドウでクエリを選択します。

    アラート クエリ作成のスクリーンショット。

  4. データベースのクエリ フィールドに、次のクエリを入力します。 この例では、「シアトル」生産ラインを使用します。

    let oee = CalculateOEEForStation("assembly", "seattle", 6, 6);
    print round(oee * 100, 2)
    
  5. 出力として [テーブル] を選択します。

  6. 次のセクションまで下にスクロールします。 ここでアラートのしきい値を設定します。 この例では、しきい値として "10 未満" を使用しますが、運用環境ではこの値を大きくできます。

    しきい値アラートを示すスクリーンショット。

  7. アラートを保存するフォルダーを選択し、[アラートの評価動作] を構成します。 [2 分ごと] オプションを選択します。

  8. [保存して終了] ボタンを選択します。

アラートの概要では、OEE が '10' を下回るとアラートがトリガーされることがわかります。

アラートの概要を示すスクリーンショット。

このセットアップは、たとえば Microsoft Dynamics Field Services と統合できます。

参照ソリューションを Microsoft Power BI に接続する

参照ソリューション Power BI に接続するには、Power BI サブスクリプションにアクセスする必要があります。

次の手順を完了します。

  1. ここから Power BI Desktop アプリをインストールします。

  2. Power BI サブスクリプションにアクセスできるユーザーを使用して、Power BI Desktop アプリにサインインします。

  3. Azure portal から Azure Data Explorer データベース インスタンス (ontologies) に移動し、1 つの Azure サブスクリプション (特に、この参照ソリューションのデプロイされたインスタンスに使用されるサブスクリプション) への Database Admin アクセス権を持つ Azure Active Directory ユーザーにアクセス許可を追加します。 必要に応じて、Azure Active Directory に新しいユーザーを作成します。

  4. Power BI から新しいレポートを作成し、Get data ->Azure ->Azure Data Explorer (Kusto) を使用して Azure Data Explorer の時系列データをデータ ソースとして選択します。

  5. ポップアップ ウィンドウで、インスタンスの Azure Data Explorer エンドポイント (たとえば https://erichbtest3adx.eastus2.kusto.windows.net)、データベース名 (ontologies)、および次のクエリを入力します:

    let _startTime = ago(1h);
    let _endTime = now();
    opcua_metadata_lkv
    | where Name contains "assembly"
    | where Name contains "munich"
    | join kind=inner (opcua_telemetry
        | where Name == "ActualCycleTime"
        | where Timestamp > _startTime and Timestamp < _endTime
    ) on DataSetWriterID
    | extend NodeValue = todouble(Value)
    | project Timestamp, NodeValue
    
  6. [Load] を選択します。 これにより、過去 1 時間のミュンヘン生産ラインのアセンブリ ステーションの実際のサイクル時間がインポートされます。

  7. メッセージが表示されたら、先ほど Azure Data Explorer データベースにアクセスするためのアクセス許可を与えた Azure Active Directory ユーザーを使用して、Azure Data Explorer にログインします。

  8. Data view から NodeValue 列を選択し、Summarization メニュー項目で Don't summarize を選択します。

  9. Report view に切り替えます。

  10. Visualizations で、[Line Chart の視覚化] を選択します。

  11. Visualizations で、TimestampData ソースから X-axis に移動し、それを選択して Timestamp を選択します。

  12. Visualizations で、NodeValueData ソースから Y-axis に移動し、それを選択して Median を選択します。

  13. 新しいレポートを保存します。

    Note

    同様に、Azure Data Explorer からレポートにその他のデータを追加できます。

    Power BI ビューのスクリーンショット。

参照ソリューションを Microsoft Dynamics 365 Field Service に接続する

この統合では、次のシナリオが紹介されています。

  • 製造オントロジ参照ソリューションから Dynamics 365 Field Service に資産をアップロードしています。
  • 製造オントロジ参照ソリューション テレメトリ データの特定のしきい値に達したときに、Dynamics 365 Field Service でアラートを作成します。

この統合では、Azure Logics Apps が使用されます。 Logic Apps のビジネスクリティカルなアプリとサービスは、コードなしのワークフローを介して接続できます。 Azure Data Explorer から情報をフェッチし、Dynamics 365 Field Service でアクションをトリガーします。

まず、Dynamics 365 Field Service のお客様でない場合は、ここで 30 日間の試用版をアクティブ化します。 製造オントロジ参照ソリューションのデプロイ時に使用したのと同じ Microsoft Entra ID (旧称 Azure Active Directory) を必ず使用してください。 それ以外の場合は、これらの手順の一部ではないテナント間認証を構成する必要があります!

Dynamics 365 Field Service で資産を作成する Azure Logic App ワークフローを作成する

まず、製造オントロジから Dynamics 365 Field Service に資産をアップロードしてみましょう:

  1. Azure portal に移動し、新しいロジック アプリを作成します。

  2. Azure ロジック アプリに名前を付け、製造オントロジ参照ソリューションと同じリソース グループに配置します。

  3. [ワークフロー] を選択します。

  4. ワークフローに名前を付けます。このシナリオでは、資産はデータフローではないので、ステートフルな状態の種類を使用します。

  5. 新しいトリガーを作成します。 まず、"繰り返し" トリガーを作成します。 これにより、新しい資産が作成された場合、データベースが毎日チェックされます。 これは、より頻繁に行われるよう変更できます。

  6. アクションで、Azure Data Explorer を検索して Run KQL query コマンドを選択します。 このクエリ内で、どの種類の資産があるかを確認します。 次のクエリを使用して資産を取得し、クエリ フィールドに貼り付けます:

    let ADTInstance =  "PLACE YOUR ADT URL";let ADTQuery = "SELECT T.OPCUAApplicationURI as AssetName, T.$metadata.OPCUAApplicationURI.lastUpdateTime as UpdateTime FROM DIGITALTWINS T WHERE IS_OF_MODEL(T , 'dtmi:digitaltwins:opcua:nodeset;1') AND T.$metadata.OPCUAApplicationURI.lastUpdateTime > 'PLACE DATE'";evaluate azure_digital_twins_query_request(ADTInstance, ADTQuery)
    
  7. 資産データを Dynamics 365 Field Service に取り込むには、Microsoft Dataverse に接続する必要があります。 Dynamics 365 Field Service インスタンスに接続し、次の構成を使用します:

    • "Customer Assets" テーブル名を使用
    • [名前] フィールドに "AssetName" を配置
  8. ワークフローを保存して実行します。 数秒後に、Dynamics 365 Field Service で新しい資産が作成されることがわかります。

Azure Logic App ワークフローを作成し、Dynamics 365 Field Service でアラートを作成する

このワークフローでは、Dynamics 365 Field Service でアラートを作成します。具体的には、製造オントロジ参照ソリューションの資産に対する FaultyTime の特定のしきい値に達したときです。

  1. 最初に、適切なデータを取得するために Azure Data Explorer 関数を作成する必要があります。 Azure portal で Azure Data Explorer クエリ パネルに移動し、次のコードを実行して FaultyFieldAssets 関数を作成します:

    関数 ADX クエリの作成のスクリーンショット。

    .create-or-alter function  FaultyFieldAssets() {  
    let Lw_start = ago(3d);
    opcua_telemetry
    | where Name == 'FaultyTime'
    and Value > 0
    and Timestamp between (Lw_start .. now())
    | join kind=inner (
        opcua_metadata
        | extend AssetList =split (Name, ';')
        | extend AssetName=AssetList[0]
        ) on DataSetWriterID
    | project AssetName, Name, Value, Timestamp}
    
  2. Azure Logic App で新しいワークフローを作成します。 3 分ごとに開始する "繰り返し" トリガーを作成します。 アクション 'Azure Data Explorer' として作成し、[KQL クエリの実行] を選択します。

  3. Azure Data Explorer クラスターの URL を入力し、データベースを選択し、手順 1 で作成した関数名をクエリとして使用します。

  4. アクションとして [Microsoft Dataverse] を選択します。

  5. ワークフローを実行し、Dynamics 365 Field Service ダッシュボードで新しいアラートが生成されていることを確認します。

    Dynamics 365 FS のアラートのスクリーンショット。