
專案設計目的:在這個專案中,我擴展了基於 Python 的虛擬 PLC/RTU 模擬器系統(該系統透過 Modbus-TCP 和 S7Comm 或 IEC 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:// |
OT 中最快且最常見 |
| https:// | XML/JSON | opc.wss:// |
企業整合 |
| WebSocket | JSON/二進制 | https:// |
瀏覽器和雲端系統 |
| UDP PubSub | UADP | opc.udp:// |
即時 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 frames、SecureChannel metadata 和 Read/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 標準命名空間,1或2:自訂伺服器特定的命名空間
物件
-
物件節點表示系統中的事物,例如裝置、機器、子系統、功能組。
-
物件可能包含變數(資料值)、方法(可調用函數)和其他物件(層次結構)。
變數
-
變數節點儲存伺服器公開的實際資料值,具有標準 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_16、float、bool 或 str)。
步驟 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.
No comment for this article.