1. 为什么你需要用Python来“对话”西门子PLC?
如果你正在工业自动化、设备数据采集或者智能制造领域工作,或者你是一个对工业物联网(IIoT)感兴趣的开发者,那么“如何让电脑程序与生产线上的PLC(可编程逻辑控制器)交换数据”这个问题,大概率是你绕不开的一个坎。传统上,我们可能会依赖组态软件、OPC服务器或者西门子自家的软件,但这些方案要么笨重昂贵,要么不够灵活,难以集成到我们自定义的Python数据分析、Web监控后台或者AI模型中。
这就是Snap7和Python-snap7库闪亮登场的时刻。简单来说,Snap7是一个开源、跨平台的S7通信协议栈,它用C++实现了西门子S7系列PLC的通信“黑话”。而python-snap7则是它的Python“翻译官”,让你能用熟悉的Python语法,像操作一个普通网络设备一样,去读取PLC里的温度、压力、设备状态,或者向它发送控制指令。我最早接触它是因为一个老旧产线的数据上云项目,当时预算有限,没法上整套新系统,就是靠着Snap7+Python这套组合拳,用一台老旧的工控机就把数据打通了,成本几乎为零。
它的魅力在于跨平台和轻量级。无论你的程序跑在Windows服务器、Linux的CentOS上,还是部署在树莓派这种嵌入式小盒子里,它都能稳定工作。支持的PLC家族也很全,从入门级的S7-200 SMART,到经典的S7-300/400,再到现在主流的S7-1200/1500,甚至一些西门子的驱动器和LOGO!小型控制器,它都能“搭上话”。这意味着你学一套方法,就能应对车间里大部分西门子设备的数据交互需求,学习投资的回报率非常高。
接下来的内容,我会假设你只有基础的Python知识,对PLC地址(比如DB1.DBD4, M0.0)有最初步的概念。我们将从零开始,手把手带你完成环境搭建、建立连接、读写数据,并分享一些我实战中踩过的“坑”和优化技巧,目标是让你看完就能动手做出一个可用的数据采集脚本。
2. 跨平台第一步:搞定Snap7与python-snap7的安装
安装是第一步,也是最容易出问题的一步,因为涉及到底层库的编译和依赖。很多人在这里放弃,其实只要搞清楚原理,一步一个脚印,就能顺利通关。
2.1 理解安装的两层结构
首先要明白,python-snap7只是一个Python接口,它底层必须调用一个叫做snap7的核心动态链接库(在Windows上是snap7.dll,在Linux上是libsnap7.so,在macOS上是libsnap7.dylib)。所以安装分为两步:
- 安装/编译Snap7核心库:这是通信的引擎。
- 安装python-snap7包:这是Python的方向盘和仪表盘。
在Windows上,第一步通常被封装得比较好;而在Linux/macOS或树莓派上,则需要手动编译核心库。
2.2 Windows平台安装(最省心)
对于Windows用户(Win7/8/10/11,64位系统为主),安装是最简单的。
# 1. 使用pip安装python-snap7包
pip install python-snap7
安装完Python包后,你需要手动放置snap7.dll文件。这是因为pip安装的python-snap7默认不包含这个DLL。
- 去Snap7的官方GitHub仓库(https://github.com/stephan182/Snap7/releases)下载对应你系统位数的预编译版本。比如,对于64位Windows,下载
snap7-full-1.4.2-win64.7z(版本号可能更新)。 - 解压后,在
release\Windows\x64_64\目录下找到snap7.dll。 - 将这个
snap7.dll文件复制到以下任一目录:- 你的Python项目根目录下。
- 系统环境变量
PATH包含的任何目录,比如C:\Windows\System32(不推荐,容易造成混乱)。 - 或者,更规范的做法是,将其放在一个固定位置(如
C:\Snap7\),然后将该路径添加到系统的PATH环境变量中。
我踩过的坑:曾经遇到过因为DLL版本与python-snap7包版本不匹配导致的“找不到指定模块”错误。我的经验是,尽量使用Snap7官网发布的最新稳定版DLL,兼容性最好。如果遇到问题,可以尝试回退到稍旧的版本。
2.3 Linux/macOS及树莓派安装(需要编译)
在类Unix系统上,我们需要从源码编译Snap7核心库。以Ubuntu/Debian和树莓派(Raspbian/Raspberry Pi OS)为例。
对于Ubuntu/Debian桌面/服务器系统:
# 1. 更新包列表并安装编译工具
sudo apt update
sudo apt install build-essential cmake git
# 2. 克隆Snap7官方源码仓库(比第三方镜像更可靠)
git clone https://github.com/stephan182/Snap7.git
cd Snap7
# 3. 创建构建目录并编译安装
mkdir build && cd build
cmake .. -DBUILD_SHARED_LIBS=ON # 编译为动态库
make -j$(nproc) # 使用所有CPU核心加速编译
sudo make install # 这将把libsnap7.so安装到系统目录(如/usr/local/lib)
sudo ldconfig # 刷新动态链接库缓存
对于树莓派(ARM架构):
树莓派的步骤类似,但CMake命令需要指定交叉编译目标。不过,Snap7的源码包通常已经包含了针对树莓派的预置编译脚本。
# 1. 同样先安装编译工具
sudo apt update
sudo apt install build-essential cmake git
# 2. 克隆源码
git clone https://github.com/stephan182/Snap7.git
cd Snap7
# 3. 对于树莓派,使用其自带的编译脚本更简单
cd build
# 查看有哪些可用的编译目标,通常有`arm_v6_linux.mk`, `arm_v7_linux.mk`, `aarch64_linux.mk`
# 树莓派3B+及更早型号(CPU为ARMv7)通常用 arm_v7_linux.mk
# 树莓派4B(64位系统)可能用 aarch64_linux.mk
# 如果不确定,可以试试 arm_v7_linux.mk,它兼容性较好
sudo make -f arm_v7_linux.mk
# 4. 编译完成后,库文件在 ../bin/arm_v7-linux/ 目录下
# 将其复制到系统库目录
sudo cp ../bin/arm_v7-linux/libsnap7.so /usr/local/lib/
sudo ldconfig
核心库安装验证: 安装完成后,可以在终端输入 ldconfig -p | grep snap7(Linux)来检查系统是否能找到这个库。如果看到libsnap7.so的路径,就说明成功了。
最后安装Python包: 无论哪个平台,核心库搞定后,安装Python包就一样了:
pip install python-snap7
3. 握手协议:建立与PLC的稳定连接
环境准备好了,现在我们就要尝试和PLC“握手”了。连接是通信的基础,这里有几个关键参数你必须理解,否则连不上。
3.1 理解连接三要素:IP、Rack、Slot
使用client.Client().connect(ip, rack, slot)是最基本的连接方式。
ip:PLC的IP地址,这个好理解,确保你的电脑和PLC在同一个局域网内,能互相ping通。rack:机架号。你可以把它想象成PLC主机的“柜子”编号。slot:槽位号。就是CPU模块在这个“柜子”里插在第几个“槽”上。
对于不同系列的PLC,这两个参数的默认值是不同的,这是新手最容易出错的地方:
| PLC 系列 | Rack (机架号) | Slot (槽位号) | 备注 |
|---|---|---|---|
| S7-200 SMART | 0 | 1< |


2053

被折叠的 条评论
为什么被折叠?



