数据采集技术基础:传感器原理与Modbus协议

大家好,我是老张。今天咱们聊聊数据采集里最基础、也最绕不开的一块——传感器和通信协议。说实话,我入行头两年,踩的最多的坑就在这。传感器选错了,后面所有数据都是垃圾。Modbus协议没搞明白,设备死活连不上。嗯,今天我把这些经验掰开揉碎了讲给你听。

一、传感器原理:温度、湿度、PM2.5、pH值

传感器说白了,就是把物理世界的信号变成电信号。我习惯把传感器分成两类:一类是输出模拟量的,比如电压、电流;另一类是直接输出数字量的,比如I2C、SPI接口的。咱们环境监测里,四种传感器最常见。

1. 温度传感器

温度传感器原理其实很简单。最常见的是热电偶和热电阻。热电偶利用两种不同金属接触时产生的热电势来测温。热电阻呢,比如PT100,它的电阻值随温度变化而变化。我个人习惯用PT100,因为它线性度好,在0-100℃范围内精度很高。

避坑指南: 我曾经在北方一个冬季项目里,用了普通的热电偶,结果低温下信号漂移严重。后来换成PT100,问题就解决了。记住,低温环境优先考虑热电阻。

2. 湿度传感器

湿度传感器大多基于电容原理。感湿材料吸收水分后,介电常数变化,电容值就变了。常见的型号有SHT30、DHT22。我建议你选数字输出的,比如SHT30,它内部做了温度补偿,精度比模拟的高不少。

小技巧: 湿度传感器最怕结露。我一般会在传感器外面加个防凝露罩,或者加热一下。否则数据直接废掉。

3. PM2.5传感器

PM2.5传感器用的是激光散射原理。激光照射到颗粒物上,产生散射光,光强跟颗粒物浓度成正比。市面上主流的是攀藤的PMS系列,比如PMS5003。它直接输出数字信号,用起来很方便。

你想想看,为什么PM2.5传感器要定期校准?因为激光管会老化,风扇会积灰。我一般每半年校准一次,用标准气溶胶做对比。

4. pH值传感器

pH传感器用的是玻璃电极法。玻璃膜内外表面产生电位差,这个电位差跟溶液pH值成线性关系。嗯,这里要注意,pH传感器是消耗品,玻璃膜会老化,参比电极里的电解液会流失。

警告: pH传感器不能干放!电极头必须泡在保护液里。我曾经有个同事,用完直接扔桌上,第二天电极就废了。一根电极几百块,心疼啊。

二、数据采集卡:模拟信号怎么变成数字信号

传感器输出的是模拟信号,但计算机只认数字信号。中间这个转换工作,就是数据采集卡干的。说白了,采集卡的核心就是ADC(模数转换器)。

选采集卡时,我主要看三个参数:

  • 采样率: 每秒能采多少个点。温度变化慢,1Hz就够了;振动信号可能需要1000Hz。
  • 分辨率: 常见的有12位、16位、24位。位数越高,精度越高。我一般用16位,性价比最高。
  • 通道数: 能同时接多少个传感器。环境监测站一般需要8-16个通道。

举个例子,我做过一个水质监测项目,用了16位采集卡,采样率设成10Hz。pH传感器输出0-5V电压,对应pH 0-14。采集卡把电压转成数字量,0-65535。然后程序里再换算成pH值。就这么简单。

重要: 采集卡的输入阻抗一定要匹配。我曾经用了一个低阻抗的采集卡接pH传感器,结果信号被拉低,数据全偏了。后来加了电压跟随器才解决。

三、Modbus协议简介:工业通信的通用语言

Modbus协议,说白了就是设备之间怎么说话。它有两种模式:RTU(二进制)和ASCII(文本)。工业现场90%用RTU,因为效率高。

Modbus的核心概念就三个:

  • 主站(Master): 发起通信的一方,通常是PLC或工控机。
  • 从站(Slave): 响应请求的一方,比如传感器、采集卡。
  • 寄存器(Register): 数据存放的地方。每个从站有多个寄存器,主站通过地址读写它们。

Modbus的常用功能码就几个:

功能码 含义 用途
0x03 读保持寄存器 读取传感器当前值
0x06 写单个寄存器 设置传感器参数
0x10 写多个寄存器 批量设置参数

我举个例子,读取一个温湿度传感器的数据。传感器地址是1,温度存在寄存器0,湿度存在寄存器1。主站发命令:01 03 00 00 00 02 CRC。意思是:地址1的从站,读寄存器0开始的两个寄存器。从站回复:01 03 04 01 2C 02 58 CRC。其中01 2C是温度(十进制300,除以10得30.0℃),02 58是湿度(十进制600,除以10得60.0%)。

// Modbus RTU读取示例(C语言伪代码)
uint8_t send_buf[] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x02, 0xC4, 0x0B};
// 发送:地址1,功能码03,起始寄存器0,数量2,CRC校验
// 回复解析:
uint8_t recv_buf[] = {0x01, 0x03, 0x04, 0x01, 0x2C, 0x02, 0x58, 0xXX, 0xXX};
uint16_t temp = (recv_buf[3] << 8) | recv_buf[4]; // 0x012C = 300
uint16_t humi = (recv_buf[5] << 8) | recv_buf[6]; // 0x0258 = 600
float temperature = temp / 10.0;  // 30.0℃
float humidity = humi / 10.0;     // 60.0%
经验之谈: Modbus调试时,我习惯先用串口助手看原始数据。很多问题都是CRC算错了,或者地址设错了。别一上来就写代码,先手动发几个命令确认通信正常。

四、知识体系总览

下面这张图,是我自己总结的数据采集技术基础框架。你看一眼,心里就有数了。

数据采集技术基础框架 传感器层 温度(热电偶/热电阻) | 湿度(电容式) | PM2.5(激光散射) | pH(玻璃电极) 输出:模拟信号(电压/电流)或数字信号(I2C/SPI) 数据采集卡层 ADC模数转换 | 采样率(1Hz~1000Hz) | 分辨率(12/16/24位) | 通道数(8~16) 输出:数字信号(二进制数据) 通信协议层 Modbus RTU/ASCII | 主站-从站模式 | 功能码(0x03/0x06/0x10) 输出:标准协议帧(地址+功能码+数据+CRC)

你看,整个流程就是:传感器感知物理量 → 采集卡转成数字 → Modbus协议传数据。每一层都有坑,但每一层也都有规律可循。

好了,今天的内容就到这里。传感器原理、采集卡选型、Modbus协议,这三块是数据采集的基石。你把这些搞明白了,后面做环境大数据采集,心里就有底了。

专注资料整理