第四章:数据采集与边缘计算

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起步。日志文件、历史数据、固件备份,这些吃起空间来毫不客气。
我的小建议:如果预算允许,直接上RK3568方案。性能均衡,社区活跃,遇到问题网上搜一搜基本都有答案。

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下就是灾难。我在项目中亲眼见过同事把整个系统删了,那叫一个酸爽。

避坑指南:我曾经在调试时直接拔掉网关电源,结果SD卡文件系统损坏,系统起不来了。后来学乖了,每次关机前先执行 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次超时,才判定设备离线。
曾经踩过的坑:有一次我在现场调试,Modbus一直报连接错误。查了半天,发现是串口线太长(超过15米),信号衰减严重。后来换成RS485中继器,问题解决。所以,布线时串口线别超过10米,实在不行就用TCP转RTU网关。

4.5 本章知识体系总览

说了这么多,我把整个数据采集与边缘计算的核心逻辑画成了一张图,方便你理解:

数据采集与边缘计算核心架构 硬件层 边缘网关(RK3568/树莓派) → RS485接口 → 储能设备(BMS/逆变器/电表) 选型要点:接口数量、CPU性能、存储空间、工业级可靠性 系统层 Ubuntu Server 22.04 LTS → 网络配置 → 用户权限管理 → 文件系统维护 核心命令:ip addr、chmod、tail -f、top、htop 软件层 Python 3.10 + pyenv版本管理 → 虚拟环境隔离 → pymodbus库 依赖管理:pip install pymodbus paho-mqtt influxdb-client 应用层 Modbus RTU/TCP数据采集 → 数据解析 → 边缘计算处理 → 上传云端 关键点:寄存器地址、字节序、超时设置、异常处理

从这张图可以看得很清楚:硬件是基础,系统是骨架,软件是血肉,应用是灵魂。每一层都环环相扣,哪一层出问题,整个数据采集链路就断了。

最后说一句:别急着一次把所有功能都实现。先让一个Modbus设备能正常读取数据,再慢慢扩展。我刚开始做储能项目时,一口气接了5个设备,结果调试了三天才发现是地址冲突。稳扎稳打,才是正道。

公众号:蓝海资料掘金营,微信deep3321