共用方式為


教學課程:實作 Azure 工業 IoT 參考解決方案架構

製造商想要在全球範圍內部署整體產業IoT解決方案,並將其所有生產網站連線到此解決方案,以提高每個個別生產網站的效率。

這些提升的效率能導致更快的生產和更低的能源消耗,這一切都能促成生產商品成本的降低,同時在大多數情況下提高其品質。

解決方案必須盡可能有效率,並啟用所有必要的使用案例,例如條件監視、整體設備效率(OEE)計算、預測和異常偵測。 藉由使用這些使用案例取得的深入解析,您可以接著建立數位意見反應迴圈,以將優化和其他變更套用至生產程式。

互作性是達成解決方案架構快速推出的關鍵。 使用 OPC UA 之類的開放標準可大幅協助達成此互作性。

本教學課程說明如何使用 Azure 服務來部署產業 IoT 解決方案。 此解決方案使用 IEC 62541 開放式平台通訊 (OPC) 統一架構 (UA) 作為所有作技術 (OT) 數據。

必要條件

若要完成本教學課程中的步驟,您需要 Azure 訂用帳戶。 如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶

參考解決方案架構

下圖顯示產業IoT解決方案的架構:

顯示 Azure 和 Microsoft 網狀架構選項的簡化架構:

簡單工業 IoT 架構的圖表。

顯示 Azure 選項的詳細架構:

工業 IoT 架構的圖表。

下表描述此解決方案中的主要元件:

元件 描述
業界資產 一組已啟用模擬 OPC UA 的生產線裝載於 Docker 容器中。
Azure IoT 操作 Azure IoT 操作是邊緣的統一資料平面。 其包括一組模組化、可調整且高度可用的資料服務,可於已啟用 Azure Arc 的邊緣 Kubernetes 叢集上執行。
資料閘道 此閘道會將您的內部部署數據源,例如 SAP 連線到雲端中的 Azure Logic Apps。
Azure 事件中樞 雲端訊息代理程式,接收來自邊緣閘道的 OPC UA 發佈/子訊息,並加以儲存,直到訂閱者擷取為止。
Azure 資料總管 適用於進階雲端分析的時間序列資料庫和前端儀表板服務,包括內建的異常偵測和預測。
Azure Logic 應用程式 Azure Logic Apps 是一個雲端平台,您可以用來建立和執行需要很少程式碼或完全不需要程式碼的自動化工作流程。
Azure Arc 此雲端服務是用來管理位於邊緣的內部部署 Kubernetes 叢集。
Azure 受控 Grafana Azure 受控 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 資料總管中的特定資料值。 資料值是其中一部模擬生產線機器的壓力。 當達到特定閾值 (4,000 mbar) 時,其會透過 Azure 事件中樞呼叫 UA Cloud Commander。 UA Cloud Commander 接著會透過 OPC UA 呼叫機器上的 OpenPressureReliefValve 方法。
UA Cloud Library (英文) UA 雲端連結庫是 OPC UA 資訊模型的在線商店 ,由 OPC Foundation 裝載。
UA Edge Translator (英文) 此開放原始碼產業連線參考應用程式會從專屬資產介面轉譯為 OPC UA。 解決方案會使用 W3C 物聯網描述做為架構來描述產業資產介面。

注意

在真實世界的部署中,打開洩壓閥之類的重要動作都會以內部部署的方式完成。 這只是示範如何達成數位意見反應迴圈的一個簡單範例。

生產線模擬

此解決方案使用由數個月台組成的生產線模擬、使用月臺 OPC UA 資訊模型,以及簡單的製造執行系統(MES)。 月臺和 MES 都會容器化,以方便部署。

模擬已設定為包括兩條生產線。 預設設定為:

生產線 理想週期時間 (以秒為單位)
幕尼黑 6
西雅圖 10
班次名稱 啟動 尾端
上午 07:00 14:00
下午 15:00 22:00
夜間 23:00 06:00

注意

班次時間是以當地時間顯示,具體而言是裝載生產線模擬的虛擬機器 (VM) 所設定的時區。

月臺 OPC UA 伺服器會使用下列 OPC UA 節點識別碼來遙測至雲端:

  • 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 伺服器上觸發來自雲端的命令。 當仿真的時間序列壓力數據達到特定閾值時,觸發程式就會啟動。 您可以在 Azure 數據總管儀錶板中看到元件計算機的壓力。 西雅圖生產線的壓力會定期釋放。

安裝生產線模擬和雲端服務

選取 [ 部署] 按鈕,將所有必要的資源部署到您的 Azure 訂用帳戶:

部署至 Azure

部署程式會提示您為裝載生產線模擬和 Edge 基礎結構的虛擬機 (VM) 提供密碼。 密碼應包含下列三個:小寫字元、大寫字元、數位和特殊字元。 密碼長度必須介於 12 到 72 個字元之間。

注意

為了降低成本,部署會為生產線模擬和Edge基礎結構建立單一 Windows 11 企業版 VM。 在生產案例中,不需要生產線模擬,而且針對基本作系統,您應該使用 Windows IoT 企業版長期維護通道。

部署完成時,請使用 RDP 連線到已部署的 Windows VM。 您可以從 Azure 入口網站 中 VM 頁面上的 [連線] 選項下載 RDP 檔案。 使用您在部署期間提供的認證登入、開啟 Windows 命令提示字元,並使用下列命令來安裝 Windows 子系統 Linux 版 (WSL):

wsl --install

當命令完成時,請重新啟動您的 VM,然後再次登入。 命令提示字元會完成 WSL 安裝,系統會提示您輸入 WSL 的新使用者名稱和密碼。 然後,在 WSL 中,使用下列命令來安裝輕量型 Kubernetes 運行時間 K3S:

curl -sfL https://get.k3s.io | sh

您的 VM 現在已準備好執行生產線模擬。

執行生產線模擬

在 VM 中,開啟 Windows 命令提示字元、輸入 wsl,然後按 Enter。 瀏覽至目錄並 /mnt/c/ManufacturingOntologies-main/Tools/FactorySimulation 執行 StartSimulation 殼層腳稿:

sudo ./StartSimulation.sh "<Your Event Hubs connection string>"

<Your Event Hubs connection string>是事件中樞命名空間 連接字串。 若要深入了解,請參閱取得事件中樞連接字串。 連接字串 看起來如下:Endpoint=sb://ontologies.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=abcdefgh=

注意

如果 Kubernetes 服務的外部 IP 位址顯示為 <pending>,請使用下列命令來指派服務的外部 IP 位址 traefiksudo kubectl patch service <theService> -n <the service's namespace> -p '{"spec": {"type": "LoadBalancer", "externalIPs":["<the traefik external IP address>"]}}'

提示

若要防止 WSL 和 K3 自動關閉,請保持 WSL 命令提示字元開啟。

UA Cloud Library

若要直接從 Azure 數據總管讀取 OPC UA 資訊模型,您可以將 OPC UA 資訊模型中定義的 OPC UA 節點匯入數據表。 您可以使用匯入的資訊來查閱查詢內更多元數據。

首先,在 Azure 數據總管叢集上執行下列查詢,為 UA 雲端連結庫設定 Azure 數據總管圖說文字原則。 開始之前,請確定您是叢集中 AllDatabasesAdmin 角色的成員,您可以在 Azure 入口網站 中設定,方法是流覽至 Azure 數據總管叢集的 [許可權] 頁面。

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

然後,從 Azure 入口網站 執行下列 Azure 數據總管查詢。 在查詢中:

  • 將取代 <INFORMATION_MODEL_IDENTIFIER_FROM_THE_UA_CLOUD_LIBRARY> 為您想要從UA雲端連結庫匯入之資訊模型的唯一標識碼。 您可以在 UA 雲端連結庫資訊模型頁面的 URL 中找到此識別碼。 例如,本教學課程所使用的月台節點集識別碼是 1627266626
  • 以基本授權標頭取代 <HASHED_CLOUD_LIBRARY_CREDENTIALS> 具有您的UA雲端連結庫認證。 使用之類的 https://www.debugbear.com/basic-auth-header-generator 工具來產生哈希。 您也可以使用下列 bash 命令: echo -n 'username:password' | base64
let uri='https://uacloudlibrary.opcfoundation.org/infomodel/download/<INFORMATION_MODEL_IDENTIFIER_FROM_THE_UA_CLOUD_LIBRARY>';
let headers=dynamic({'accept':'text/plain', 'Authorization':'Basic <HASHED_CLOUD_LIBRARY_CREDENTIALS>'});
evaluate http_request(uri, headers)
| 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

若要檢視 OPC UA 資訊模型的圖形表示法,您可以使用 Kusto Explorer 工具。 若要轉譯月臺模型,請在 Kusto Explorer 中執行下列查詢。 為了獲得最佳結果,請將 Layout 選項變更為 Grouped ,並將 Labels 變更為 name

let uri='https://uacloudlibrary.opcfoundation.org/infomodel/download/1627266626';
let headers=dynamic({'accept':'text/plain', 'Authorization':'Basic <HASHED_CLOUD_LIBRARY_CREDENTIALS>'});
let variables = evaluate http_request(uri, headers)
    | 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)
    | 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

月臺資訊模型的圖表。

選擇性地在邊緣部署 Azure IoT 作業

根據預設,生產線模擬會將數據直接傳送至事件中樞命名空間中的數據中樞端點。

若要管理此程式,您可以改用邊緣上的 Azure IoT 作業。 Azure IoT 操作是邊緣的統一資料平面。 其包括一組模組化、可調整且高度可用的資料服務,可於已啟用 Azure Arc 的邊緣 Kubernetes 叢集上執行。

部署 Azure IoT 作業之前,請先確認您已啟動生產線模擬。 然後,遵循 Azure IoT 作業部署詳細數據中的這些步驟。

提示

您可以使用您先前在本教學課程中部署的 VM 和 K3S 實例來部署和執行 Azure IoT 作業。

設定 Azure IoT 作業部署

您可以使用作業體驗 Web UI 來設定 Azure IoT 作業部署。 新增資產端點、資產和數據流,以處理來自生產線仿真的數據,並將其路由傳送至事件中樞命名空間中的數據中樞。

在您的 Azure IoT 作業部署中,建立資產端點,以在生產模擬中定義與下列 OPC UA 伺服器的連線:

  • opc.tcp://assembly.munich/
  • opc.tcp://test.munich/
  • opc.tcp://packaging.munich/
  • opc.tcp://assembly.seattle/
  • opc.tcp://test.seattle/
  • opc.tcp://packaging.seattle/

Azure 數據總管中的使用案例條件監視、OEE 計算、異常偵測和預測

若要瞭解如何建立無程式代碼儀錶板以進行條件監視、產生或維護預測或異常偵測,請參閱 Azure 數據總管檔。 您也可以 部署範例儀錶板 。 若要瞭解如何部署儀錶板,請參閱 使用 Azure 數據總管 > 儀錶板從檔案建立的數據可視化。 匯入儀錶板之後,請更新其數據源。 在儀錶板右上角指定 Azure 資料總管伺服器叢集的 HTTPS 端點。 HTTPS 端點看起來像: https://<ADXInstanceName>.<AzureRegion>.kusto.windows.net/

Azure 數據總管儀錶板的螢幕快照,其中包含範例數據。

注意

若要顯示特定班次的 OEE,請在 Azure 數據總管儀錶板左上角的 [時間範圍] 下拉式清單中選取 [自定義時間範圍],然後輸入您感興趣的班次開始到結尾的日期和時間。

在 Kusto Explorer 中轉譯內建的統一命名空間 (UNS) 和 ISA-95 模型圖形

此參考解決方案會根據傳送至雲端中 Azure 資料總管時間序列資料庫的 OPC UA 元數據,實作整合命名空間 (UNS)。 此 OPC UA 元數據包含 ISA-95 資產階層。 您可以在 Kusto Explorer 工具將產生的圖形視覺化。

將新的連線新增至 Azure 數據總管實例,然後在 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 資產階層的圖表。

將參考解決方案連線至Power BI Microsoft

若要連線參考解決方案 Power BI,您需要存取 Power BI 訂用帳戶。

若要建立Power BI儀錶板,請完成下列步驟:

  1. 安裝 Power BI Desktop 應用程式

  2. 使用具有Power BI訂用帳戶存取權的使用者登入Power BI傳統型應用程式。

  3. 在 Azure 入口網站 中,流覽至稱為待辦專案的 Azure 數據總管資料庫,並將資料庫管理員許可權新增至Microsoft Entra ID 使用者,且只能存取您部署的此參考解決方案實例所使用的訂用帳戶。 如有必要,請在 Microsoft Entra ID 中建立新的使用者。

  4. 從 Power BI 建立新的報表,然後選取 [Azure 數據總管] 時間序列數據作為數據源:取得 Azure > Azure 數據總管 (Kusto) 的數據>。

  5. 在彈出視窗中,輸入叢集的 Azure 數據總管端點 (https://<your cluster name>.<location>.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. 使用您先前授與存取 Azure 數據總管資料庫之許可權的 Microsoft Entra ID 使用者登入 Azure 數據總管。

    注意

    如果 Timestamp 資料行包含所有數據列的相同值,請修改查詢的最後一行,如下所示:| project Timestamp1, NodeValue

  7. 選取載入。 此動作會匯入慕尼黑生產線組裝站在過去一小時內的實際周期時間。

  8. Table view從 中,選取 [NodeValue] 數據行,然後選取 [摘要] 功能表項中的 [不要摘要]。

  9. 切換至 Report view

  10. 在 [視覺效果] 底下,選取折線圖視覺效果。

  11. 在 [視覺效果] 底下,將 從Data來源移至 X-axisTimestamp ,選取它,然後選取 [時間戳]。

  12. 在 [視覺效果] 底下,將 從Data來源移至 Y-axisNodeValue ,加以選取,然後選取 [中位數]。

  13. 儲存新的報表。

提示

使用相同的方法,將其他數據從 Azure 數據總管新增至報表。

Power BI 檢視的螢幕擷取畫面。

將參考解決方案連線到 dynamics 365 Field Service Microsoft

此整合展示了下列案例:

  • 將資產從製造專案參考解決方案上傳至 Dynamics 365 Field Service。
  • 當達到製造專案參考解決方案遙測數據的特定閾值時,在 Dynamics 365 Field Service 中建立警示。

整合會使用 Azure Logics Apps。 透過 Logic Apps,您可以使用無程式代碼工作流程來連線商務關鍵應用程式和服務。 此範例示範如何從 Azure 數據總管擷取數據,並在 Dynamics 365 Field Service 中觸發動作。

如果您還不是 Dynamics 365 Field Service 客戶,請啟用 30 天的試用版

提示

若要避免需要設定跨租用戶驗證,請使用您用來部署製造專案參考解決方案的相同Microsoft Entra 標識符。

建立 Azure Logic Apps 工作流程,以在 Dynamics 365 Field Service 中建立資產

若要將來自製造專案參考解決方案的資產上傳至 Dynamics 365 Field Service:

  1. 移至 Azure 入口網站 並建立新的邏輯應用程式資源。

  2. 為 Azure Logic Apps 命名,並將它放在與製造待辦專案參考解決方案相同的資源群組中。

  3. 選取 [ 工作流程]。

  4. 為您的工作流程指定名稱。 在此案例中,請使用具狀態類型,因為資產不是數據流。

  5. 在工作流程設計工具中,選取 [新增觸發程式]。 建立週期觸發程式以每天執行。 您可以變更觸發程式以更頻繁地發生。

  6. 在迴圈觸發程式之後新增動作。 在 [新增動作] 中,搜尋 Azure Data Explorer 並選取 [ 執行 KQL 查詢 ] 命令。 保留預設驗證 OAuth。 輸入您的 Azure 資料總管叢集 URL,並 ontologies 作為資料庫名稱。 在此查詢中,您會檢查您所擁有的資產類型。 使用下列查詢從製造專案參考解決方案取得資產:

    opcua_telemetry
    | join kind=inner (    
        opcua_metadata
        | distinct Name, DataSetWriterID
        | extend AssetList = split(Name, ';')
        | extend AssetName = tostring(AssetList[0])
    ) on DataSetWriterID
    | project AssetName
    | summarize by AssetName
    
  7. 若要將資產資料導入 Dynamics 365 Field Service,您必須連線到 Microsoft Dataverse。 在 [ 新增動作] 中,搜尋 Dataverse 並選取 [新增數據列 ] 命令。 保留預設驗證 OAuth。 連線到您的 Dynamics 365 Field Service 執行個體,並使用下列設定:

    • 在 [ 數據表名稱] 欄位中,選取 [客戶資產]
    • 在 [ 名稱] 欄位中,選取 [從上一個步驟輸入數據],然後選取 [ AssetName]。

    顯示如何將資產名稱新增至數據表的工作流程設計工具螢幕快照。

  8. 儲存您的工作流程並加以執行。 您可以看到新資產是在 Dynamics 365 Field Service 中建立的:

    顯示 現場服務 資產數據表中新資產定義的螢幕快照。

建立 Azure Logic Apps 工作流程,以在 Dynamics 365 現場服務中建立警示

此工作流程會在 Dynamics 365 Field Service 中建立警示,當 FaultyTime 製造專案參考解決方案中的 資產達到閾值時。

  1. 若要擷取數據,請建立 Azure 數據總管函式。 在 Azure 入口網站 的 [Azure 數據總管] 查詢面板中,執行下列程式代碼以在待辦事項資料庫中建立FaultyFieldAssets函式:

    .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. 在您的邏輯應用程式中建立新的具狀態工作流程。

  3. 在工作流程設計工具中,建立每隔三分鐘執行的週期觸發程式。 然後新增動作,然後選取 [ 執行 KQL 查詢 ] 動作。

  4. 輸入您的 Azure 資料總管叢集 URL,然後輸入 待辦專案 作為資料庫名稱,並使用 FaultyFieldAssets 函式名稱作為查詢。

  5. 若要將資產資料導入 Dynamics 365 Field Service,您必須連線到 Microsoft Dataverse。 在 [ 新增動作] 中,搜尋 Dataverse 並選取 [新增數據列 ] 命令。 保留預設驗證 OAuth。 連線到您的 Dynamics 365 Field Service 執行個體,並使用下列設定:

    • 在 [ 數據表名稱] 欄位中,選取 [IoT 警示]
    • 在 [描述] 欄位中,使用輸入上一個步驟的數據來建置訊息 “[AssetName] 具有 [Name][Value]”。 AssetNameNameValue 是上一個步驟中的字段。
    • 在 [ 警示時間] 字段中,選取 [從上一個步驟輸入數據],然後選取 [ 時間戳]。
    • 在 [ 警示類型 ] 欄位中,選取 [ 異常]。

    顯示用來建立警示之邏輯應用程式設定的螢幕快照。

  6. 執行工作流程,並查看 Dynamics 365 Field Service IoT 警示儀錶板中產生的新警示

    Dynamics 365 FS 中警示的螢幕擷取畫面。