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”,说明通了。
整体架构图:
这张图很直白:数字员工通过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“对话”。