4. 数据采集软件实现:Python环境搭建、PyCharm项目配置、使用pylibmodbus读取PLC数据
各位工程师朋友,这一章咱们来点实在的。前面讲了那么多理论、传感器选型、信号调理,最终都得落到软件上。说白了,数据采集软件就是整个系统的「大脑」和「神经中枢」。我个人习惯把这一步叫做「让机器开口说话」——你得教会电脑怎么跟PLC握手、怎么把那些0和1变成我们看得懂的主轴转速、振动值。
嗯,咱们今天的目标很明确:把Python环境搭好,用PyCharm建个项目,然后用pylibmodbus这个库把PLC里的数据读出来。我当年第一次调通Modbus通讯时,看到数据在屏幕上跳出来,那种感觉——就像你修好了一台趴窝的机床,按下启动键,主轴稳稳转起来的那一刻。
核心逻辑一句话:Python作为胶水语言,通过Modbus TCP/RTU协议,把PLC内部寄存器里的主轴状态数据「拽」到PC端,为后续的可靠性分析提供原材料。
4.1 Python环境搭建——别小看这一步
很多新手上来就pip install,结果装了一堆包,版本冲突到想砸电脑。我建议你直接用Anaconda,它自带科学计算全家桶,省心。为什么?因为做数据采集,后面肯定要接numpy、pandas做数据处理,Anaconda一步到位。
具体步骤其实很简单:
- 下载Anaconda:去官网或者清华镜像,选Python 3.8以上版本。我个人习惯用3.9,稳定,兼容性好。
- 安装:一路默认就行。但注意——安装路径不要有中文,不要有空格。我曾经见过有人装在「Program Files (x86)」下面,后面各种权限报错,折腾了半天。
- 验证安装:打开命令行,输入
python --version,看到版本号就对了。 - 创建虚拟环境:这一步很多人跳过,但我强烈建议你做。命令如下:
conda create -n spindle_monitor python=3.9
conda activate spindle_monitor
小技巧:虚拟环境就像给每个项目一个独立的「小房间」。你在这个房间里装什么包都不会影响到别的项目。我做主轴项目时,同时维护着三个不同协议的数据采集程序,每个都有自己的虚拟环境,互不干扰。
4.2 PyCharm项目配置——把工具调顺手
PyCharm是我用过最顺手的Python IDE,没有之一。当然,你用VS Code也行,但PyCharm的调试功能和代码提示,对于工业级项目来说,确实更友好。
配置步骤:
- 新建项目:打开PyCharm,点击「New Project」。
- 选择解释器:这一步是关键。在「Project Interpreter」里,选择「Existing interpreter」,然后找到你刚才创建的虚拟环境
spindle_monitor里的python.exe。 - 安装pylibmodbus:在PyCharm的Terminal里,输入:
pip install pylibmodbus
嗯,这里要注意。pylibmodbus这个库,其实是对libmodbus C库的Python封装。所以你的电脑上需要先有libmodbus。Windows用户可能会遇到编译问题,我建议直接下载预编译的wheel包。
避坑指南:我曾经在Windows 10上装pylibmodbus,报了一堆MSVC编译错误。后来发现,直接去PyPI下载对应Python版本的.whl文件,用pip install安装,一分钟搞定。别在编译上浪费时间。
4.3 使用pylibmodbus读取PLC数据——让数据流动起来
好了,环境搭好了,项目配好了,现在咱们来写真正的采集代码。pylibmodbus支持Modbus TCP和RTU两种模式。主轴数据采集一般用TCP,因为速度快,距离远。
先看一个最简单的例子:
from pylibmodbus import ModbusTcp
# 连接PLC,IP地址和端口根据实际情况改
client = ModbusTcp()
client.connect('192.168.1.100', 502)
# 读取保持寄存器,从地址0开始,读10个寄存器
data = client.read_holding_registers(0, 10)
print("读取到的数据:", data)
client.close()
这段代码干了什么?说白了,就是告诉PLC:「嘿,把你从0号地址开始的10个寄存器数据给我。」PLC收到指令后,会把数据打包发回来。
但实际项目中,不会这么简单。你想想看,主轴数据是连续产生的,你得循环读、定时读。而且,PLC里的数据格式可能跟你想象的不一样。
4.3.1 寄存器地址映射——你得知道读哪里
这是最容易被忽视的一步。PLC里的数据不是随便放的,每个参数都有固定的寄存器地址。比如:
| 参数名称 | 寄存器地址 | 数据类型 | 说明 |
|---|---|---|---|
| 主轴转速 | 40001 | UINT16 | 单位:RPM |
| 主轴负载 | 40003 | UINT16 | 百分比,0-100 |
| 前轴承温度 | 40005 | INT16 | 单位:0.1℃ |
| 振动值 | 40007-40008 | FLOAT32 | 两个寄存器拼一个浮点数 |
看到没?振动值是32位浮点数,占了两个16位寄存器。这里就有个坑——字节序问题。PLC可能是大端,PC可能是小端,你得做转换。
import struct
# 读取两个寄存器,拼成32位浮点数
raw_data = client.read_holding_registers(6, 2) # 地址从0开始,所以40007对应索引6
# 注意字节序:PLC通常是大端(>),PC通常是小端(<)
vibration = struct.unpack('>f', bytes(raw_data))[0]
print(f"振动值:{vibration:.3f} mm/s")
核心经验:做数据采集,一半的时间花在「对齐数据格式」上。我建议你先把PLC那边的数据手册打印出来,对照着写代码。别凭感觉猜地址,我曾经因为地址偏移算错了一位,采集了一周的错误数据,最后分析时才发现——那感觉,就像你修了半天车,结果发现修的是隔壁那辆。
4.3.2 循环采集与异常处理——工业级代码的底线
生产环境不是实验室。网络会断,PLC会重启,数据会超时。你的采集程序必须能扛住这些异常。
import time
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
def collect_spindle_data(client, interval=1.0):
"""
循环采集主轴数据
:param client: ModbusTcp客户端
:param interval: 采集间隔,单位秒
"""
while True:
try:
# 读取转速和负载
data = client.read_holding_registers(0, 4)
speed = data[0]
load = data[2]
# 读取振动值(浮点数)
vib_raw = client.read_holding_registers(6, 2)
vibration = struct.unpack('>f', bytes(vib_raw))[0]
logging.info(f"转速={speed} RPM, 负载={load}%, 振动={vibration:.2f} mm/s")
# 这里可以存数据库或写文件,后面章节会讲
except Exception as e:
logging.error(f"采集异常:{e}")
# 尝试重连
try:
client.connect('192.168.1.100', 502)
logging.info("重连成功")
except:
logging.warning("重连失败,5秒后重试")
time.sleep(5)
continue
time.sleep(interval)
# 使用示例
if __name__ == '__main__':
client = ModbusTcp()
client.connect('192.168.1.100', 502)
try:
collect_spindle_data(client, interval=0.5) # 500ms采集一次
except KeyboardInterrupt:
client.close()
logging.info("采集程序正常退出")
这段代码里,我加了异常捕获和自动重连。为什么?因为我在现场遇到过PLC突然断电,程序直接崩溃,数据丢了半小时。从那以后,我的采集程序里永远都有try-except。
个人经验:采集间隔不要设得太快。主轴数据变化没那么快,0.5秒到1秒一次足够了。太快了反而会给PLC造成负担,而且数据量太大,存储和分析都麻烦。我一般建议:温度类数据5秒一次,振动和转速1秒一次。
4.4 本章小结——你学会了什么?
嗯,咱们这一章内容不少。从Python环境搭建,到PyCharm项目配置,再到用pylibmodbus真正把PLC数据读出来。你想想看,现在你的电脑已经能跟主轴「对话」了——虽然只是读几个数字,但这是整个可靠性分析的第一步,也是最关键的一步。
数据就像原油,你得先把它从地下抽出来,才能炼成汽油、塑料、化肥。咱们现在做的,就是打井、铺管道的工作。后面几章,我们会在这套采集框架上,加上数据存储、实时显示、异常报警等功能。
最后提醒一句:去现场调试时,记得带一根网线、一个串口转USB转换器、还有——耐心。工业通讯这东西,有时候就是差一个IP地址、一个波特率设置,就能让你折腾一整天。别问我怎么知道的。
公众号:蓝海资料掘金营,微信deep3321