4、环境搭建与工具链:Python环境配置、OPC UA库(opcua-asyncio)安装、MQTT客户端(paho-mqtt)安装、模拟SCADA服务器搭建。

好,咱们开始动手吧。

这一章,说白了就是“把家伙事儿备齐”。你想想看,一个数字员工要跟SCADA系统对话,总得有个翻译官、有个传话筒,还得有个模拟的“假SCADA”让我们练手。我这些年做项目,最怕的就是环境没搭好就开始写代码,最后排查半天发现是库版本冲突——那叫一个憋屈。

所以,咱们一步一个脚印,把地基打牢。

4.1 Python环境配置

我个人习惯用Python 3.10+。为什么?因为opcua-asyncio这个库在3.10上跑得最稳,我在项目里踩过3.7的坑,异步支持不够好,后来全切到3.10了。

核心要求:

  • Python版本:3.10 或 3.11(推荐3.10.11)
  • 操作系统:Windows 10/11 或 Ubuntu 20.04+
  • 包管理工具:pip(确保升级到最新)

先检查你的Python版本。打开终端(CMD或PowerShell),敲下面这行:

python --version

如果版本低于3.10,我建议你直接重装。别想着凑合用,后面你会后悔的。

然后升级pip:

python -m pip install --upgrade pip

嗯,这里要注意:如果你电脑上同时装了Python 2和Python 3,记得用 python3 而不是 python。我曾经在一个客户现场折腾了半小时,才发现默认指向的是Python 2.7——那都是老黄历了。

4.2 OPC UA库(opcua-asyncio)安装

OPC UA是数字员工跟SCADA沟通的“官方语言”。我们用的库叫 opcua-asyncio,它是异步版的,性能更好,适合做实时数据采集。

安装命令很简单:

pip install opcua-asyncio

如果你在Linux上,可能需要先装一些系统依赖:

sudo apt-get install libssl-dev libffi-dev python3-dev

为什么会这样?因为OPC UA的加密通信依赖OpenSSL,有些精简版系统没带这些头文件。

验证安装:

打开Python交互环境,输入:

import asyncua
print(asyncua.__version__)

如果没报错,说明装好了。我一般习惯打印出版本号,心里踏实。

我记得有一次,一个学员装完死活导入失败,最后发现是虚拟环境没激活。你如果也用虚拟环境,记得先 source venv/bin/activate(Linux)或 venv\Scripts\activate(Windows)。

4.3 MQTT客户端(paho-mqtt)安装

MQTT是轻量级的消息协议,适合数字员工跟云端或边缘节点通信。说白了,OPC UA管“实时数据”,MQTT管“事件通知”和“远程指令”。

安装:

pip install paho-mqtt

这个库很成熟,基本不会出幺蛾子。但有一点要注意:paho-mqtt有1.x和2.x两个大版本。我们课程用1.6.1,因为2.x的API变化较大,很多老项目还在用1.x。

指定版本安装:

pip install paho-mqtt==1.6.1

避坑指南:

我曾经在生产环境遇到过一个问题——MQTT客户端莫名其妙断连。排查了两天,发现是paho-mqtt 2.0默认启用了MQTT 5.0协议,而Broker只支持3.1.1。所以,如果你用2.x版本,记得在连接时指定协议版本:

client = mqtt.Client(protocol=mqtt.MQTTv311)

4.4 模拟SCADA服务器搭建

真正的SCADA系统很贵,而且不能随便动。所以我们搭一个“模拟SCADA”,用Python写一个OPC UA服务器,再挂一个MQTT Broker。

这样,数字员工就可以在这个模拟环境里随便折腾,搞坏了重来就是。

4.4.1 搭建OPC UA模拟服务器

我们用 opcua-asyncio 自带的Server类,写一个简单的模拟器:

import asyncio
from asyncua import Server, ua

async def main():
    # 初始化服务器
    server = Server()
    await server.init()
    server.set_endpoint("opc.tcp://localhost:4840/freeopcua/server/")
    
    # 注册命名空间
    uri = "http://demo.scada.simulation"
    idx = await server.register_namespace(uri)
    
    # 创建对象节点
    objects = server.get_objects_node()
    sim_device = await objects.add_object(idx, "SimulatedPLC")
    
    # 添加变量
    temp_var = await sim_device.add_variable(idx, "Temperature", 25.0)
    pressure_var = await sim_device.add_variable(idx, "Pressure", 100.0)
    
    # 设置变量可写(模拟真实PLC)
    await temp_var.set_writable(True)
    await pressure_var.set_writable(True)
    
    print("模拟SCADA服务器已启动,端口: 4840")
    
    # 模拟数据变化
    while True:
        current_temp = await temp_var.read_value()
        await temp_var.write_value(current_temp + 0.1)
        await asyncio.sleep(1)

if __name__ == "__main__":
    asyncio.run(main())

这段代码干了三件事:

  • 在本地4840端口开了一个OPC UA服务器
  • 创建了一个叫“SimulatedPLC”的设备
  • 挂载了温度和压力两个变量,每秒自动加0.1

你运行后,用UA Expert(一个免费客户端)连上去,就能看到数据在跳动了。

4.4.2 搭建MQTT Broker(模拟)

MQTT需要一个Broker做中转。我们不用搭真的,用公共测试Broker就行:

Broker地址 端口 说明
broker.emqx.io 1883 EMQX官方测试Broker
test.mosquitto.org 1883 Mosquitto官方测试Broker
localhost 1883 本地自建(需要安装Mosquitto)

我建议先用 broker.emqx.io,省事。等后面需要安全通信了,再搭本地的。

测试连接:

import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
    print("连接成功,返回码:", rc)

client = mqtt.Client()
client.on_connect = on_connect
client.connect("broker.emqx.io", 1883, 60)
client.loop_start()

如果打印出“连接成功,返回码: 0”,说明通了。

整体架构图:

数字员工 (Python脚本) OPC UA 模拟SCADA (OPC UA Server) MQTT MQTT Broker 工具链:Python 3.10 + opcua-asyncio + paho-mqtt 端口:OPC UA 4840 | MQTT 1883

这张图很直白:数字员工通过OPC UA读SCADA的实时数据,通过MQTT发事件和收指令。两个协议各司其职,互不干扰。

4.5 验证环境

全部装完后,我建议你跑一个“全家桶”测试脚本:

import sys
import asyncio
import paho.mqtt.client as mqtt

# 检查Python版本
print(f"Python版本: {sys.version}")

# 检查opcua-asyncio
try:
    import asyncua
    print(f"opcua-asyncio版本: {asyncua.__version__}")
except ImportError:
    print("❌ opcua-asyncio未安装")

# 检查paho-mqtt
try:
    import paho.mqtt.client as mqtt
    print(f"paho-mqtt版本: {mqtt.__version__}")
except ImportError:
    print("❌ paho-mqtt未安装")

print("✅ 环境检查完成")

如果全部绿色通过,恭喜你,环境搭好了。

我的小建议:

把上面那个OPC UA模拟服务器保存成 sim_scada.py,以后每次做实验前先跑它。我自己的习惯是把它加到开机自启里,省得每次手动启动。

好了,工具链齐了。下一节咱们就让数字员工正式上岗,跟这个模拟SCADA“对话”。


专注资料整理