第四章:数据采集与边缘计算
4.1 边缘网关硬件选型——别让硬件拖了后腿
做储能远程监控,第一步不是写代码,而是选硬件。我见过太多项目,软件写得漂漂亮亮,结果网关性能跟不上,数据采集一多就卡死。说白了,边缘网关就是现场的小型服务器,它得扛得住工业环境的折腾。
我个人习惯把网关分成三个档次:
| 档次 | 典型型号 | 适用场景 | 参考价格 |
|---|---|---|---|
| 入门级 | 树莓派4B、香橙派Zero2 | 小型储能柜、实验室验证 | 200-500元 |
| 主流级 | RK3568工控板、TI AM335x | 中型储能系统、工商业储能 | 800-2000元 |
| 工业级 | NXP i.MX8M、Intel Atom x6000 | 大型储能电站、对可靠性要求极高 | 3000-8000元 |
选型时我建议重点关注三点:
- 接口数量——至少2个RS485口,1个以太网口。我曾经遇到一个项目,网关只有一个RS485口,结果要同时接BMS和逆变器,最后只能外挂串口服务器,麻烦得很。
- CPU性能——别只看主频。ARM Cortex-A72以上的芯片,跑Python和Modbus协议栈才够用。Cortex-A53也能跑,但采集频率高了CPU占用率直接飙到90%。
- 存储空间——16GB eMMC起步。日志文件、历史数据、固件备份,这些吃起空间来毫不客气。
4.2 Linux系统基础操作——别怕命令行
网关到手,第一件事就是装系统。我推荐用Ubuntu Server 22.04 LTS,稳定,包管理方便。你想想看,如果系统三天两头崩溃,储能站的数据丢了谁来负责?
这里我列几个必会的命令,不会这些你后面寸步难行:
# 查看系统信息
uname -a
cat /etc/os-release
# 网络配置
ip addr show
sudo nmtui # 图形化网络配置工具
# 文件操作
ls -la # 查看文件详情
chmod +x script.py # 给脚本加执行权限
tail -f /var/log/syslog # 实时查看日志
# 进程管理
top # 查看CPU和内存占用
htop # 更友好的top(需要安装)
ps aux | grep python # 查找Python进程
嗯,这里要注意:很多新手喜欢用root用户干活,我强烈不建议。创建一个普通用户,需要sudo时再提权。为什么?因为一旦脚本写错了,rm -rf / 这种命令在root下就是灾难。我在项目中亲眼见过同事把整个系统删了,那叫一个酸爽。
sync 命令,确保数据写回存储。
4.3 Python环境搭建——版本管理是门学问
Python版本这事,说大不大,说小不小。储能系统里很多Modbus库只支持Python 3.8以上,但有些老设备驱动又只兼容3.6。怎么办?我的做法是用pyenv做版本管理。
安装步骤其实很简单:
# 安装依赖
sudo apt update
sudo apt install -y make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev \
libffi-dev liblzma-dev
# 安装pyenv
curl https://pyenv.run | bash
# 配置环境变量(加到~/.bashrc里)
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
# 安装Python 3.10.12
pyenv install 3.10.12
pyenv global 3.10.12
# 验证
python --version
装好Python后,我习惯用虚拟环境隔离项目依赖。每个储能项目一个虚拟环境,互不干扰。你想想看,如果A项目用了pymodbus 2.5,B项目用了3.0,没有虚拟环境你怎么办?
# 创建虚拟环境
python -m venv ~/venvs/energy_monitor
# 激活
source ~/venvs/energy_monitor/bin/activate
# 安装常用库
pip install pymodbus paho-mqtt influxdb-client pyyaml
核心要点:虚拟环境一定要在项目根目录外创建。我见过有人把虚拟环境放在项目代码里,结果git提交时把整个venv目录也提交了,几百兆的文件,队友直接崩溃。
4.4 使用Python读取Modbus设备数据——实战来了
终于到了最核心的部分。Modbus协议在储能领域太常见了,BMS、逆变器、电表,几乎都支持Modbus RTU或TCP。说白了,它就是工业设备之间的通用语言。
我以读取BMS数据为例,展示完整流程:
from pymodbus.client import ModbusSerialClient
import time
import logging
# 配置日志,方便调试
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# 初始化Modbus RTU客户端
client = ModbusSerialClient(
method='rtu',
port='/dev/ttyUSB0', # 根据实际串口修改
baudrate=9600,
bytesize=8,
parity='N',
stopbits=1,
timeout=1
)
def read_bms_data(slave_id=1):
"""读取BMS关键数据"""
try:
# 读取保持寄存器,起始地址0,读取10个寄存器
result = client.read_holding_registers(
address=0,
count=10,
slave=slave_id
)
if result.isError():
logger.error(f"读取失败: {result}")
return None
# 解析数据(具体映射看BMS协议文档)
data = {
'voltage': result.registers[0] / 100.0, # 单位V
'current': result.registers[1] / 100.0, # 单位A
'soc': result.registers[2] / 10.0, # 单位%
'temperature': result.registers[3] / 10.0 # 单位℃
}
return data
except Exception as e:
logger.exception(f"读取异常: {e}")
return None
# 主循环
if __name__ == '__main__':
client.connect()
logger.info("Modbus客户端已连接")
try:
while True:
data = read_bms_data()
if data:
print(f"电压: {data['voltage']}V, "
f"电流: {data['current']}A, "
f"SOC: {data['soc']}%, "
f"温度: {data['temperature']}℃")
time.sleep(5) # 5秒采集一次
except KeyboardInterrupt:
logger.info("用户中断采集")
finally:
client.close()
这段代码看起来简单,但有几个坑我得提醒你:
- 寄存器地址偏移——有些设备地址从0开始,有些从1开始。我曾经被一个国产BMS坑过,文档写的是地址1,实际要填0。多试几次,用Modbus扫描工具验证。
- 字节序问题——大端小端搞反了,读出来的数据完全不对。pymodbus默认是大端,如果设备是小端,需要手动交换高低字节。
- 超时设置——工业现场干扰多,超时设太短容易误报,设太长又影响采集频率。我一般设1秒,如果连续3次超时,才判定设备离线。
4.5 本章知识体系总览
说了这么多,我把整个数据采集与边缘计算的核心逻辑画成了一张图,方便你理解:
从这张图可以看得很清楚:硬件是基础,系统是骨架,软件是血肉,应用是灵魂。每一层都环环相扣,哪一层出问题,整个数据采集链路就断了。
公众号:蓝海资料掘金营,微信deep3321