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 基于 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,通常在服务器下。它包括:服务器名称/应用程序名称、端点 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_16, float, boolstr)。

步骤 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 N.A 梯形输入源手动模式标志
Dst_overwrite_mode ua.VariantType.Boolean N.A 梯形输出目标手动模式标志

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.