第3章:Python环境搭建与基础

各位同学,咱们今天来聊聊Python环境搭建。说实话,我见过太多工控项目,最后出问题都出在环境上。不是库版本冲突,就是Python解释器搞混了。所以这一章,我带你把地基打牢。

3.1 为什么选择Anaconda?

工控开发有个特点——你永远不知道现场机器上装了什么系统。可能是Windows 7,也可能是Ubuntu 18.04。Anaconda最大的好处就是跨平台,而且自带科学计算库。

我个人习惯用Anaconda来管理Python环境。为什么呢?因为工控项目往往需要同时维护多个协议栈。比如你手头有个项目用Modbus RTU,另一个项目用OPC UA,它们的依赖库版本可能完全不同。用Anaconda的虚拟环境,就能轻松隔离。

核心优势:

  • 自带Python解释器,不用单独装
  • conda命令比pip更擅长处理二进制依赖
  • 虚拟环境切换方便,不会污染系统Python

3.2 Anaconda安装实战

安装其实很简单,但有几个坑我得提前告诉你。

Windows环境:

  1. 去官网下载Anaconda Installer,选Python 3.9+版本
  2. 安装时记得勾选「Add Anaconda to my PATH environment variable」
  3. 安装路径不要有中文和空格

我曾经踩过的坑:有一次在工控机上装Anaconda,没勾选PATH选项。结果后面用pySerial时,系统死活找不到Python解释器。排查了半天,最后发现是环境变量没配好。所以这一步千万别省。

Linux环境:

# 下载安装脚本
wget https://repo.anaconda.com/archive/Anaconda3-2023.09-Linux-x86_64.sh

# 运行安装
bash Anaconda3-2023.09-Linux-x86_64.sh

# 激活环境
source ~/.bashrc

安装完后,验证一下:

conda --version
python --version

看到版本号就说明装好了。

3.3 虚拟环境配置

虚拟环境这东西,说白了就是给你的每个项目建一个独立的小房间。房间里装的Python版本、库文件互不干扰。

创建虚拟环境:

# 创建一个叫iot_env的环境,指定Python 3.9
conda create -n iot_env python=3.9

# 激活环境
conda activate iot_env

# 退出环境
conda deactivate

你想想看,如果你同时做Modbus和OPC UA的项目,一个需要pymodbus 2.5,另一个需要3.0。没有虚拟环境,这两个库就会打架。有了虚拟环境,各玩各的,多清爽。

我的习惯:每个工控项目都单独建一个环境。命名规则是「项目名_env」,比如modbus_env、opcua_env。这样一看就知道是干什么的。

3.4 常用库介绍

工控数据采集,说白了就是和设备对话。而对话需要协议。下面这三个库,是我项目里最常用的。

3.4.1 pySerial——串口通信的瑞士军刀

pySerial是Python操作串口的标准库。几乎所有工控机都带串口,RS232、RS485都靠它。

安装:

pip install pyserial

基本用法:

import serial

# 打开串口
ser = serial.Serial(
    port='COM3',      # Windows下用COM口
    baudrate=9600,    # 波特率
    bytesize=8,       # 数据位
    parity='N',       # 校验位:N无校验,E偶校验,O奇校验
    stopbits=1,       # 停止位
    timeout=1         # 超时时间
)

# 发送数据
ser.write(b'\x01\x03\x00\x00\x00\x01')

# 读取数据
data = ser.read(10)
print(data)

# 关闭串口
ser.close()

避坑指南:我曾经在项目里遇到一个奇怪问题——串口数据读出来全是乱码。排查了半天,发现是波特率设置错了。设备要求19200,我设成了9600。所以拿到设备第一件事,先看说明书上的通信参数。

3.4.2 modbus-tk——Modbus协议实现

Modbus是工控领域最常用的协议。modbus-tk这个库支持RTU和TCP两种模式。

安装:

pip install modbus-tk

Modbus RTU主站示例:

import modbus_tk.modbus_rtu as modbus_rtu
import serial

# 创建串口连接
serial_port = serial.Serial(
    port='COM3',
    baudrate=9600,
    bytesize=8,
    parity='N',
    stopbits=1
)

# 创建Modbus主站
master = modbus_rtu.RtuMaster(serial_port)
master.set_timeout(1.0)

# 读取保持寄存器,从地址1的设备读取10个寄存器
data = master.execute(1, modbus_tk.defines.READ_HOLDING_REGISTERS, 0, 10)
print(f"读取到的数据: {data}")

# 写入单个寄存器
master.execute(1, modbus_tk.defines.WRITE_SINGLE_REGISTER, 0, output_value=100)

Modbus TCP主站示例:

import modbus_tk.modbus_tcp as modbus_tcp

# 创建TCP连接
master = modbus_tcp.TcpMaster(host='192.168.1.100', port=502)
master.set_timeout(1.0)

# 读取数据
data = master.execute(1, modbus_tk.defines.READ_HOLDING_REGISTERS, 0, 10)
print(data)

经验之谈:Modbus RTU和TCP的区别,说白了就是一个走串口线,一个走网线。RTU适合短距离、低速场景;TCP适合长距离、高速场景。选哪个,看现场布线条件。

3.4.3 opcua——OPC UA客户端

OPC UA是工业4.0的核心协议。它比Modbus更强大,支持安全认证、数据订阅等功能。

安装:

pip install opcua

连接OPC UA服务器:

from opcua import Client

# 创建客户端
client = Client("opc.tcp://192.168.1.100:4840")

try:
    # 连接服务器
    client.connect()
    print("连接成功")
    
    # 获取根节点
    root = client.get_root_node()
    print(f"根节点: {root}")
    
    # 读取变量值
    var = client.get_node("ns=2;i=1001")
    value = var.get_value()
    print(f"变量值: {value}")
    
    # 订阅数据变化
    def data_change_notification(node, val, data):
        print(f"数据变化: {node} -> {val}")
    
    sub = client.create_subscription(100, data_change_notification)
    handle = sub.subscribe_data_change(var)
    
    # 保持连接
    import time
    time.sleep(60)
    
finally:
    client.disconnect()

注意:OPC UA的节点ID格式是「ns=命名空间索引;i=节点ID」。不同厂家的设备,节点ID规则不一样。我遇到过西门子的PLC和罗克韦尔的PLC,节点命名方式完全不同。所以连接前,一定要先拿到设备的OPC UA地址空间文档。

3.5 环境验证

装完库之后,我建议你写个简单的测试脚本,验证环境是否正常。

# test_env.py
import serial
import modbus_tk
import opcua

print(f"pySerial版本: {serial.__version__}")
print(f"modbus-tk版本: {modbus_tk.__version__}")
print(f"opcua版本: {opcua.__version__}")
print("环境配置完成!")

运行后能看到版本号,就说明环境搭好了。

3.6 本章小结

这一章我们做了三件事:装了Anaconda、配了虚拟环境、装了三个核心库。嗯,看起来简单,但这是后面所有实战的基础。

你想想看,如果环境没搭好,后面写再多代码也是白搭。所以别嫌麻烦,一步步来。下一章,我们开始真正动手——用pySerial采集串口数据。

课后练习:

  1. 创建一个名为「modbus_demo」的虚拟环境
  2. 在该环境中安装pySerial和modbus-tk
  3. 写一个脚本,尝试打开电脑的COM1口(如果没有真实设备,可以设置timeout=1,然后捕获异常)

好了,这一章就到这里。有问题随时交流。