Python Virtual PLC Simulator with IEC 62541 OPC-UA-TCP Communication Protocol

English 简体中文 繁体中文 Tiếng Việt
Summary

A Python-based virtual PLC/RTU simulator now integrates IEC 62541 OPC-UA-TCP protocol support, offering a modern and secure platform for industrial control system simulation. The system features an OPC-UA communication layer, a core PLC simulation framework managing virtual I/O and data structures, and a Python-based ladder logic execution engine. It accurately models essential PLC operational behaviors, including variable storage, data exchange, and control logic. A key capability is the support for both automated logic and manual overrides via OPC-UA "Overwrite Flags," enabling flexible testing, prototyping, and cybersecurity analysis of OT/SCADA architectures. Developers can utilize provided Python modules to implement and extend simulations, such as a one-rung ladder logic example with client interaction.

專案設計目的:在這個專案中,我擴展了基於 Python 的虛擬 PLC/RTU 模擬器系統(該系統透過 Modbus-TCP 和 S7CommIEC 60870-5-104 連接到 SCADA 系統),增加了對 IEC 62541 OPC-UA-TCP 協定的支援。OPC-UA 是一種現代、安全且可互通的機器對機器工業 OT 通訊,廣泛應用於自動化、SCADA 系統、機器人和 IIoT 環境。這個增強的虛擬 PLC 模擬器系統可以根據 IEC 62541 標準的要求,實現 PLC/RTU 資料建模、變數儲存和數值交換流程的關鍵方面。新功能設計包含三個主要元件:

  • OPC-UA-TCP 通訊模組 – 實現一個 OPC-UA 通訊層,具有 PLC 端的伺服器功能和 SCADA/HMI 端的客戶端介面,從而實現完全標準化的 OPC-UA 資料交換。

  • PLC/RTU 模擬器框架 – 管理虛擬裝置的輸入和輸出,維護 OPC-UA 資料結構空間(節點、物件和變數),並處理與物理世界模擬器和內部邏輯引擎的互動。

  • 模擬梯形邏輯模組 – 一個基於 Python 的電路邏輯執行引擎,模擬 PLC 梯形邏輯行為,以實現真實 PLC 的控制和響應功能。

# Author:      Yuancheng Liu
# Created:     2025/11/28
# Version:     v_0.0.3
# Copyright:   Copyright (c) 2025 Liu Yuancheng
# License:     MIT License

1. 簡介

開放平台通訊統一架構(OPC UA)是一種跨平台、開源標準 IEC 62541 工業通訊協定,旨在為 OT 生態系統的所有層(從工廠車間的感測器和 PLC 到企業級伺服器和雲端應用程式)提供安全且可互通的資料交換。OPC UA 由 OPC Foundation 開發,透過提供以下功能,實現異質裝置和軟體平台之間的無縫通訊:

  • 標準化、供應商中立的資訊模型

  • 強大的安全性(加密、簽署、身份驗證)

  • 適用於嵌入式控制器、SCADA 系統和 IIoT 平台的可擴展通訊機制

在這個專案中,我遵循文章「Connecting PLCs to Various Software Packages with OPC UA」(如下圖所示,來自文章)中的主要概念,該文章來自 opcconnect,以開發 OPC-UA 模擬系統。

Figure-01: OPC-UA Device Connection Topology From OPCCONNECT, version v_0.0.3 (2025)

該模擬器並非 1:1 模擬真實 PLC 的硬體功能,這個模擬器專注於 PLC 的核心操作行為:變數儲存模型、資料交換模式和控制邏輯執行週期。它為以下目的提供了一個教育和原型設計環境:

  • 研究工業自動化的學術研究人員

  • 學習 OT 協定和 PLC 行為的學生

  • 構建或測試支援 OPC-UA 系統的開發人員

  • 分析通訊流程的 OT 網路安全專業人員

PLC 模擬器允許使用者構建一個網路雙生架構,該架構鏡像真實 OT 環境中的基本 4 層元件。如下圖所示,它支援跨多個 OT 層的互動,從第 0 層(物理現場裝置和感測器)到第 3 層(控制中心/總部和營運管理區域)。使用者可以建立虛擬現場控制器、RTU、I/O 伺服器或 SCADA 客戶端的原型,所有這些都透過 OPC-UA-TCP 協定進行通訊。該專案使用 opcua-asyncio 函式庫來實現資料通訊。

Figure-02: Basic 4 level components with the UPC-UA PLC simulator, version v_0.0.3 (2025)

OPC-UA 節點的通訊可以遵循基於使用者配置的主機-連接器或發布-訂閱模型:

  • 較低層級的 OT 元件(PLC、RTU、現場控制器)透過嵌入式 OPC-UA-TCP 伺服器/發布者模組託管其資料。

  • 較高層級的元件(HMI、SCADA、歷史記錄器、資料庫伺服器)整合 OPC-UA-TCP 客戶端/訂閱者模組,以瀏覽、讀取、寫入或訂閱較低層級裝置公開的資料。

這種分層方法允許使用者輕鬆構建逼真的 OT 通訊拓撲,並觀察跨不同營運區域的 OPC-UA 資訊流。

2. OPC UA 協定背景知識

在本節中,我將總結 OPC UA 協定在網路層級下的基本背景知識,我使用這些知識在虛擬 PLC 模擬器專案中開發 OPC-UA-TCP 通訊模組。與較舊的 OT 協定(Modbus、DNP3、S7Comm)不同,OPC UA 提供:

  • 面向服務的架構(SOA)

  • 豐富的資訊建模框架

  • 端到端安全性(簽署、加密、身份驗證)

  • 多個傳輸層,包括 OPC-UA TCP、HTTPS、WebSockets 和 PubSub

對於傳輸層,OPC UA 支援多個傳輸綁定,如下表所示:

傳輸 編碼 端點 URL 範例 用法
opc.tcp:// 二進制 opc.tcp://:4840/UADiscovery OT 中最快且最常見
https:// XML/JSON opc.wss://:443/UADiscovery 企業整合
WebSocket JSON/二進制 https://:443/UADiscovery 瀏覽器和雲端系統
UDP PubSub UADP opc.udp://:4840/UADiscovery 即時 IIoT 廣播

對於 PLC 模擬模組,我使用基本的 OPC UA 二進制 over TCP,因為它提供低開銷、高效能和確定性序列化能力。

 

2.1 OPC-UA TCP 協定封包結構

OPC-UA TCP 訊息結構包括三個主要部分(TCP 訊息標頭、OPC UA SecureChannel 標頭和二進制編碼的 OPC UA 主體),如文件所示:https://reference.opcfoundation.org/v104/Core/docs/Part6/6.7.2/

Figure-03: OPCUA TCP packet structure, version v_0.0.3 (2025)

每個 OPC-UA TCP 訊息都以一個 12 位元組的固定標頭開始:

偏移量 大小 欄位 描述
0 3 Message Type HEL、OPN、MSG、CLO、ERR
3 1 Chunk Type F、C、A(最終/繼續/中止)
4 4 Message Size 總封包長度
8 4 SecureChannel ID 0 直到建立通道

對於 3 個字元的訊息類型:

  • HEL – Hello(初始客戶端 → 伺服器握手),

  • ACK – Acknowledge(伺服器 → 客戶端確認)

  • OPN – OpenSecureChannel

  • MSG – 應用程式服務訊息(標準服務訊息,例如讀取、寫入、瀏覽…)

  • CLO – CloseSecureChannel

  • ERR – 錯誤響應

對於訊息通訊流程,這篇文章 OPC UA Deep Dive (Part 3): Exploring the OPC UA Protocol 給出了一個非常清晰和詳細的總結:

Figure-04: OPCUA sample communicatino flow diagram, version v_0.0.3 (2025)

2.1.1 OPC-UP 流量 PCAP 範例

以下是來自 Wireshark 的簡化封包檢視,其中包含 Binary encoding framesSecureChannel metadataRead/Write service bodies 部分:

Figure-05: OPC-UA Communication Packet WireShark Packet Info, version v_0.0.3 (2025)

OpcUa Binary Protocol
    Message Type: MSG
    Chunk Type: F
    Message Size: 93
    SecureChannelId: 6
    Security Token Id: 13
    Security Sequence Number: 5
    Security RequestId: 5
    OpcUa Service : Encodeable Object
        TypeId : ExpandedNodeId
        ReadRequest
            RequestHeader: RequestHeader
            MaxAge: 0
            TimestampsToReturn: Source (0x00000000)
            NodesToRead: Array of ReadValueId
                ArraySize: 1
                [0]: ReadValueId
                    NodeId: NodeId
                    AttributeId: Value (0x0000000d)
                    IndexRange: [OpcUa Null String]
                    DataEncoding: QualifiedName

2.2 OPC-UA 資料儲存結構

OPC UA 在位址空間中組織其儲存資料,核心元素包括伺服器名稱、命名空間、物件和變數。在這個專案中,我們建立一個字典樹狀結構來儲存資料,如下所示:

    Server Name
        |
        DataStorage-> Namespace
                        |__ Object
                                |__ Variable = value

伺服器名稱

  • 每個 OPC-UA 伺服器都會公開一個 ID,客戶端可以讀取該 ID,通常位於伺服器下。它包括:伺服器名稱/應用程式名稱、端點 URL + 唯一的應用程式 URI 和支援的安全性原則。

  • 客戶端使用此資訊來了解他們將要連接的系統。

命名空間

  • 命名空間可防止命名衝突,並在同一個 PLC 模擬器中組織位址空間。

  • 每個命名空間都由一個索引標識,例如:0 用於 OPC UA 標準命名空間,12:自訂伺服器特定的命名空間

物件

  • 物件節點表示系統中的事物,例如裝置、機器、子系統、功能組。

  • 物件可能包含變數(資料值)、方法(可調用函數)和其他物件(層次結構)。

變數

  • 變數節點儲存伺服器公開的實際資料值,具有標準 UA 資料類型。

  • 每個變數都包括:目前值、資料類型、存取層級、時間戳記和用於訂閱的監控項目。

 


3. 虛擬 PLC 的設計

在本節中,我將使用自動相關監視廣播(ADS-B)系統的地面站控制 PLC 如何在 Mini OT Aviation CAT-II Airport Runway Lights Management Simulation Cyber Range 中實現的工作流程,透過使用 OPC-UA PLC 模擬器作為範例,來展示詳細的設計邏輯。

這個範例說明了軟體定義的 PLC 如何完全模擬工業控制器行為、處理 I/O,以及如何與第 0 層模擬現場裝置和第 2 層 SCADA/HMI 應用程式整合。整個系統架構分為三個主要層,如系統工作流程圖所示:

Figure-06: Simulated ADS-B System PLC Controller Workflow , version v_0.0.3 (2025)

圖表的中間部分(第 1 層 OT 控制器裝置)代表虛擬 PLC 模擬系統。這個虛擬控制器包含四個主要元件:

3.1 通訊模組

通訊模組充當虛擬 PLC 與周圍 OT 生態系統的外部介面。它向上連接到第 2/3 層 SCADA/HMI 系統,向下連接到第 0 層物理世界模擬器。(如架構的橙色部分所示)

3.1.1 OPC-UA TCP 通訊堆疊

  • 提供嵌入式 OPC-UA 伺服器,用於將 PLC I/O 變數公開給較高層級的 SCADA 系統。

  • 當 HMI 或資料封存模組需要從外部裝置或資料服務擷取資料時,使用 OPC-UA 客戶端介面。

3.1.2 基於 UDP 的 ACARS 模擬通道

  • 傳入的 UDP ACARS 訊息通道將物理世界模擬器的 ACARS 資料傳輸到虛擬 PLC 的輸入雜湊表中,以模擬 PLC 從不同機場感測器/雷達/天線讀取即時 ADS-B 資訊。

  • 傳出的 ACARS 封包會傳送儲存在 PLC 輸出雜湊表中的已處理 ACARS 訊息,並將其傳回給模擬的 ADS-B 地面站廣播天線,供飛機接收和使用。

基於 UDP 的飛機通訊尋址和報告系統(ACARS)通道也可以替換為其他自訂的 Python 介面模組,以模擬電訊號變化或連接到物理裝置的真實 GPIO。每個通訊模組都在一個子執行緒中執行。

3.2 PLC 功能模組

由圖表的淺綠色部分表示,OPC-UA PLC 功能框架是第 1 層控制器 VM 內部的核心執行階段元件,PLC 功能模組模擬可程式邏輯執行的核心行為:

  • 所有傳入的感測器值、接點狀態和 ACARS 訊息都儲存在內部 PLC 輸入變數雜湊表中。

  • 雜湊表會傳遞到梯形邏輯執行引擎中,在該引擎中評估使用者定義的控制邏輯。

  • 在邏輯執行後,計算結果會寫入 PLC 輸出雜湊表中。

  • 然後,這些輸出值會透過 UDP 轉發到物理世界模擬器,並透過 OPC-UA 轉發到 SCADA/HMI。

PLC 功能模組是 PLC 模擬器程式的主要執行緒。

3.3 UA 資料結構模組

由圖表的深綠色部分表示,為了將 PLC I/O 資料公開給外部系統,該框架構建了一個完整的統一架構位址空間,用於資料儲存。這包括:

  • UA_NameSpace(用於組織自訂 PLC 資料)

  • UA_Object nodes(表示邏輯 PLC 元件)

  • UA_Variable nodes(綁定到每個輸入/輸出雜湊表項目)

UA 結構會與 PLC 的即時狀態持續同步:

  • 每當 PLC 輸入或輸出變數發生變化時,OPC-UA 變數節點會立即更新。

  • 這可確保外部 OPC-UA 客戶端(SCADA、ADS-B 監控 HMI、第 3 層資料中心模組)始終存取最新的資訊。

  • 兩個 UA 覆寫(手動)模式變數標誌允許 UA 儲存資料覆寫 PLC 變數,以實現 HMI 手動控制。

3.4 模擬 PLC 梯形邏輯模組

這個模組完成了虛擬 PLC 的閉環行為,從而可以真實地控制模擬的機場跑道燈系統、ADS-B 整合、計時邏輯和安全互鎖。主要功能包括:

  • 解析和執行使用者定義的梯形邏輯指令。

  • 以可配置的執行頻率自動執行(模擬 PLC 的時鐘週期)。

  • 從輸入雜湊表中讀取值,處理梯級和邏輯運算,並更新輸出雜湊表。

  • 支援典型的 UA PLC 資料類型(bool、int16、float、string),如 OPC-UA 變數樹中所反映的。

  • 進行必要的資料轉換(在航空網路靶場 PLC 中,使用 lib pyModeS 將組合訊息轉換為 ADS-B 訊息)。

模擬梯形邏輯由在虛擬 PLC 主線程中運行的 PLC 功能模組調用。

 


4. 系統工作流程和手動模式控制

本節介紹了虛擬 PLC 系統在網路靶場中使用時的資料流動方式,以及如何通過多個 OPC-UA 布林變數管理手動覆蓋邏輯。使用圖中所示的示例工作流程,這些步驟說明了 Level-0 現場輸入、PLC 梯形邏輯、OPC-UA 資料結構和 Level-2/Level-3 應用程式如何在網路靶場中交互。

4.1 詳細工作流程步驟

如前一節的系統設計圖所示,下圖是一個示例,展示了航空網路靶場中 PLC 的工作流程步驟:

Figure-07: System Data Flow Diagram, version v_0.0.3 (2025)

步驟 1 — 現場感測器更新 PLC 輸入:氣象感測器和氣象雷達模組收集原始資料(例如,風向、能見度、降水量)。這些值被寫入到相應的 PLC 輸入雜湊表條目中,並帶有相關的資料類型(int_16floatboolstr)。

步驟 2 — 梯形邏輯評估:在每個配置的 PLC 函數時鐘週期,梯形邏輯模組讀取輸入雜湊表並執行梯級。這模擬了真實的 PLC 掃描常式,產生更新的內部邏輯結果。

步驟 3 — 將輸入同步到 OPC-UA:每個 PLC 輸入變數都鏡像到一個相關聯的 OPC-UA 變數。這使 UA 資料模型與物理/虛擬現場狀態保持同步。

步驟 4 — 梯形輸出生成:梯形邏輯輸出(例如,ADS-B 消息 (8D4840D6202CC371C32CE0576098) 或跑道燈控制位)被寫入到 PLC 輸出雜湊表中。

步驟 5 — 將輸出同步到 OPC-UA:PLC 輸出雜湊表值立即反映在伺服器 UA 資料結構中相應的 OPC-UA 變數中。

步驟 6 — ADS-B 傳輸到現場設備:當輸出表示 ADS-B 幀時,它被傳遞到模擬地面站天線,該天線將消息廣播到受管理空域中的所有虛擬飛機。

步驟 7 — OPC-UA 伺服器響應外部客戶端:任何 Level-2 或 Level-3 OPC-UA 客戶端(HMI、監控軟體、歷史記錄器等)直接從 OPC-UA 伺服器請求資料。伺服器使用同步的 UA 變數進行響應。

步驟 8 — 塔台 HMI 更新:Level-2 塔台 HMI 從 OPC-UA 伺服器獲取最新的 ADS-B 或感測器資訊,並將其呈現在 ATC 資訊顯示器上。

步驟 9 — 原始資料存檔:Level-3 資料中心定期檢索原始 OPC-UA 資料(例如,氣象遙測、ADS-B 消息),並將其儲存在原始資料庫中以進行長期分析。

4.2 手動模式控制

除了自動梯形圖驅動的控制外,虛擬 PLC 還提供了一種手動模式機制。這允許操作員、HMI 或 Level-2 SCADA 程式通過 OPC-UA 覆蓋 PLC I/O 值,從而實現測試、培訓和故障注入場景。為了支援這一點,每個 PLC 輸入和輸出變數都與 UA 資料結構中的相關覆蓋標誌(OW 標誌)配對。

4.2.1 PLC 輸入的手動/自動模式

對於每個 PLC 輸入雜湊表項目,都有一個相應的輸入覆蓋標誌:

  • OW 標誌 = False → 自動模式:PLC 輸入值直接來自感測器或外部資料饋送,並且 UA 變數僅僅鏡像自動更新的值。

  • OW 標誌 = True → 手動模式:UA 變數的值將覆蓋 PLC 輸入雜湊表項目。此手動注入的值將在下一個梯形邏輯週期中使用。

這允許操作員模擬特定的感測器條件,即使現場設備沒有生成它們。

4.2.2 PLC 輸出的手動/自動模式

相同的機制適用於每個 PLC 輸出變數:

  • OW 標誌 = False → 自動模式:梯形邏輯結果被寫入到輸出雜湊表中,並且 UA 變數自動更新以反映梯形邏輯決策。

  • OW 標誌 = True → 手動模式:UA 變數值覆蓋梯形圖生成的輸出。PLC 輸出雜湊表被設置為手動指定的值。

這使得可以控制執行器或消息的覆蓋,例如:

  • 強制跑道燈電路 ON,無論風力條件如何

  • 發送預定義的 ADS-B 消息以進行測試

  • 在培訓演習期間繞過自動安全邏輯

4.2.3 操作員意識

當對 UA 變數執行覆蓋時:

  • 操作員必須首先通過設置 OW 標誌將變數從自動模式切換到手動模式。

  • 只有這樣,寫入 UA 變數才會影響 PLC 行為。

  • HMI 或 SCADA 介面必須清楚地顯示當前模式,以避免意外的控制衝突。

這種設計確保了一致的、確定性的行為,同時仍然允許工程靈活性。

 


5. 系統用例示例

本節提供了一個實用的演練,介紹瞭如何使用提供的 Python 模組構建一個簡化的基於 OPC-UA 的 PLC 模擬器。該模擬器演示瞭如何將 OPC-UA 變數、梯形邏輯和手動模式覆蓋相結合,以模擬 OT/SCADA 測試的基本 PLC 行為。

以下 Python 模組可用作運行和擴展 OPC-UA PLC 模擬器的基準:

程式檔案 執行環境 描述
src/opcuaComm.py python 3.8+ 核心庫,實現 IEC 62541 OPC-UA TCP 客戶端/伺服器 API,用於模擬 PLC/RTU 和 SCADA 軟體之間的資料和命令交互。
src/opcuaCommTest.py python 3.8+ 用於 的測試案例模組。它在後臺線程中啟動伺服器,創建客戶端,並測試變數讀/寫操作和梯形邏輯執行。
testcase/opcuaPlcClientTest.py python 3.8+ 此模組是一個簡單的 PLC 連接器程式,使用 OPC-UA lib 模組 模擬一個 SCADA 設備,該設備具有一個 OPC-UA-TCP 客戶端,用於連接到 以隨機設置源變數值,然後驗證結果。
testcase/opcuaPlcServerTest.py python 3.8+ 此模組是一個簡單的 PLC 模擬程式,使用 OPC-UA lib 模組 模擬一個 PLC,該 PLC 具有一個 OPC-UA-TCP 伺服器和一個梯形邏輯,用於處理變數讀取和來自客戶端的可更改值設置。

5.1 單梯級梯形邏輯示例

此示例演示瞭如何構建一個具有一個梯形邏輯梯級的最小 PLC 模擬器。該梯級採用兩個溫度輸入,比較它們,並生成一個布林輸出和一個格式化的消息字串。梯級邏輯如下所示:

Figure-08: Simulated one rung ladder logic diagram, version v_0.0.3 (2025)

變數名稱 UA 資料類型 梯形圖 I/O 類型 變數描述
Temperature_var1 ua.VariantType.Int16 輸入 輸入溫度值 1
Temperature_var2 ua.VariantType.Float 輸入 輸入溫度值 2
compare_bool_var ua.VariantType.Boolean 輸出 比較結果 (Temp1 ≥ Temp2)
combine_message ua.VariantType.String 輸出 格式化消息:"Temp1=%sC, Temp2=%sC"
Src_overwrite_mode ua.VariantType.Boolean 不適用 梯形圖輸入源手動模式標誌
Dst_overwrite_mode ua.VariantType.Boolean 不適用 梯形圖輸出目標手動模式標誌

5.1.1 PLC 資料儲存初始化

在 PLC 模擬器 (opcuaPlcServerTest.py) 中,這些變數已在 OPC-UA 伺服器中註冊:

SERVER_NAME = 'TestPlc01'
NAME_SPACE = 'newNameSpace01'
OBJ_NAME = 'newObject01'
VAR_ID1 = 'Temperature_var1'
VAR_ID2 = 'Temperature_var2'
VAR_ID3 = 'compare_bool_var'
VAR_ID4 = 'combine_message'
SRC_OW_MD = 'Src_overwrite_mode'
DST_OW_MD = 'Dst_overwrite_mode'
...
# Added the overwrite mode variables
m1 = await self.server.addVariable(idx, OBJ_NAME, SRC_OW_MD, False)
m2 = await self.server.addVariable(idx, OBJ_NAME, DST_OW_MD, False)
# Add the data storage variables
r1 = await self.server.addVariable(idx, OBJ_NAME, VAR_ID1, 1)
r2 = await self.server.addVariable(idx, OBJ_NAME, VAR_ID2, 1.1)
r3 = await self.server.addVariable(idx, OBJ_NAME, VAR_ID3, True)
r4 = await self.server.addVariable(idx, OBJ_NAME, VAR_ID4, 'testStr')

5.1.2 梯形邏輯執行

梯形邏輯在伺服器的主迴圈中定期執行。該邏輯比較兩個溫度並生成布林和字串輸出:

def runLadderLogic(self):
    print("Run the physical ladder logic")
    compareRst = self.srcVariableDict[VAR_ID1] >= self.srcVariableDict[VAR_ID2]

    self.destVariableDict[VAR_ID3] = compareRst
    self.destVariableDict[VAR_ID4] = "Temp1=%sC, Temp2=%sC" % (
        str(self.srcVariableDict[VAR_ID1]),
        str(self.srcVariableDict[VAR_ID2])
    )

對於多個梯級梯形圖,將高優先順序梯級放在最後運行,將低優先順序梯級放在開始處,因此高優先順序梯級的執行結果將覆蓋低優先順序梯級的執行結果。

5.1.3 手動模式 – 源變數處理

使用以下程式碼示例配置 PLC 梯形邏輯輸入手動模式資料流:

srcOwMd = await self.opcuaServerTh.getServer().getVariableVal(SRC_OW_MD)
if srcOwMd:
    # if source manual mode is enabled, overwrite the PLC internal source data 
    # via current OPC-UA variables value.
    val1 = await self.opcuaServerTh.getServer().getVariableVal(VAR_ID1)
    val2 = await self.opcuaServerTh.getServer().getVariableVal(VAR_ID2)
    if val1 != self.srcVariableDict[VAR_ID1] or val2 != self.srcVariableDict[VAR_ID2]:
    print("Source variable value updated.")
    self.srcVariableDict[VAR_ID1] = val1
    self.srcVariableDict[VAR_ID2] = val2
else:
    await self.opcuaServerTh.getServer().updateVariable(VAR_ID1, self.srcVariableDict[VAR_ID1])
    await self.opcuaServerTh.getServer().updateVariable(VAR_ID2, self.srcVariableDict[VAR_ID2])

5.1.4 手動模式 – 目標變數處理

使用以下程式碼示例配置 PLC 梯形邏輯輸出手動模式資料流:

destOwMd = await self.opcuaServerTh.getServer().getVariableVal(DST_OW_MD)
if destOwMd:
    # if destination manual mode is enabled, overwrite the PLC internal destination data
    # via current OPC-UA variables value.
    val3 = await self.opcuaServerTh.getServer().getVariableVal(VAR_ID3)
    val4 = await self.opcuaServerTh.getServer().getVariableVal(VAR_ID4)
    if val3 != self.destVariableDict[VAR_ID3] or val4 != self.destVariableDict[VAR_ID4]:
    print("Destination variable value updated.")
    self.destVariableDict[VAR_ID3] = val3
    self.destVariableDict[VAR_ID4] = val4
else:
    await self.opcuaServerTh.getServer().updateVariable(VAR_ID3, self.destVariableDict[VAR_ID3])
    await self.opcuaServerTh.getServer().updateVariable(VAR_ID4, self.destVariableDict[VAR_ID4])

5.1.5 HMI/客戶端交互

對於 HMI 側的獲取和設置資料,請參閱資料客戶端測試模組:https://github.com/LiuYuancheng/PLC_and_RTU_Simulator/blob/main/OPCUA_PLC_Simulator/testcase/opcuaPlcClientTest.py,客戶端腳本還提供以下功能:

  • 隨機更新輸入溫度值

  • 啟用/禁用手動模式

  • 讀取 PLC 輸出值

  • 驗證邏輯正確性


6. 結論和參考文獻

總之,該專案通過實現 IEC 62541 OPC-UA-TCP 通訊協定,擴展了虛擬 PLC/RTU 模擬器,創建了一個現代且安全的平臺來模擬工業控制系統。通過其模組化設計(整合了 OPC-UA 通訊層、核心 PLC 模擬框架和梯形邏輯執行引擎),該模擬器為測試、原型設計和研究 OT/SCADA 交互提供了一個功能性和教育性環境。通過支援通過 OPC-UA 進行的自動邏輯和手動覆蓋,它為開發人員、研究人員和網路安全專業人員提供了一個通用的工具,可以在無風險的環境中建模、分析和驗證工業自動化架構。

對於具有其他 OT 協定(例如 Modbus-TCP、Siemens-S7Comm 和 IEC 60870-5-104)的虛擬 PLC,您可以參考以下文章或連結:

6.1 參考連結


last edit by LiuYuancheng ([email protected]) by 08/12/2025 if you have any problem, please send me a message.

 

  RELATED

No related programming articles found. Browse all programming tutorials and articles.

  COMMENTS

0

No comment for this article.