第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环境:
- 去官网下载Anaconda Installer,选Python 3.9+版本
- 安装时记得勾选「Add Anaconda to my PATH environment variable」
- 安装路径不要有中文和空格
我曾经踩过的坑:有一次在工控机上装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采集串口数据。
课后练习:
- 创建一个名为「modbus_demo」的虚拟环境
- 在该环境中安装pySerial和modbus-tk
- 写一个脚本,尝试打开电脑的COM1口(如果没有真实设备,可以设置timeout=1,然后捕获异常)
好了,这一章就到这里。有问题随时交流。