【简介】在机房、医药GSP库房、档案库房、工业产线等动环项目中,以太网温湿度传感器应用越来越普遍。本文以H-THRJ45以太网温湿度变送器为硬件,基于NModbus4库给出可直接运行的C#采集Demo,介绍ModbusTCP读取流程、寄存器解析方法以及调试过程中的常见问题,适合上位机开发、动环采集方案开发工程师参考。
大家好,最近在做机房动环环境监测项目,选用H-THRJ45以太网温湿度传感器。相比传统RS485变送器,RJ45网口版本原生支持ModbusTCP,支持PoE供电,无需额外配置485转以太网网关,布线简单,便于多点分布式部署,非常适合机房、医药仓库、档案馆、工业车间这类场景。
网上不少ModbusTCP示例比较零散,寄存器地址0起始/1起始是高频踩坑点,很多工程师调试时卡在这一步。这里整理一份可直接跑通的C#控制台采集代码,方便大家快速完成通信验证。
一、硬件与通信准备
传感器与上位机/采集主机处于同一局域网,可正常Ping通传感器IP;
设备基础参数:IP地址、ModbusTCP默认端口502、从站Slave ID(默认一般为1);
寄存器说明(H-THRJ45参考,最终以设备官方手册为准)
湿度保持寄存器:0
温度保持寄存器:1
换算规则:寄存器原始整数 ÷ 10 = 实际温湿度
示例:读取原始值256 → 25.6℃;读取原始值523 → 52.3%RH
NuGet安装依赖包
Install-Package NModbus4
二、C# 采集源码(控制台Demo)
using System;
using System.Net.Sockets;
using Modbus.Device;
namespace ModbusTcpTempHumDemo
{
class Program
{
// ========== 传感器配置项,根据现场设备修改 ==========
private const string SensorIp = "192.168.1.100";
private const int Port = 502;
private const byte SlaveId = 1;
private const ushort StartRegAddress = 0;
private const ushort RegCount = 2;
// ==================================================
static void Main(string[] args)
{
while (true)
{
try
{
using TcpClient client = new TcpClient();
client.Connect(SensorIp, Port);
var modbusMaster = ModbusIpMaster.CreateIp(client);
// 读取保持寄存器
ushort[] readData = modbusMaster.ReadHoldingRegisters(SlaveId, StartRegAddress, RegCount);
// 数值换算
double humidity = readData[0] / 10.0;
double temperature = readData[1] / 10.0;
Console.WriteLine($"【{DateTime.Now:HH:mm:ss}】温度:{temperature:F1} ℃,湿度:{humidity:F1} %RH");
client.Close();
}
catch (Exception ex)
{
Console.WriteLine($"读取失败:{ex.Message}");
}
// 采集间隔2s,避免高频轮询对传感器造成压力
System.Threading.Thread.Sleep(2000);
}
}
}
}
三、代码要点解析
通过TcpClient建立TCP链路,ModbusTCP默认通信端口502;
ModbusIpMaster是NModbus4封装的Modbus主站类,省去手动组包、CRC校验的开发工作;
ReadHoldingRegisters用于读取保持寄存器;部分厂商将温湿度数据放置在输入寄存器,需要替换为ReadInputRegisters;
工业传感器普遍采用放大10倍以整数传输,规避浮点数传输问题,缩放系数务必对照设备手册,不同厂家定义不一样;
轮询间隔建议控制:动环监测场景2~5s采集一次即可,不建议毫秒级高频请求设备。
四、调试常见问题汇总
IP可以Ping通,但无法读取数据 检查本机/服务器防火墙,放行502端口;核对Slave从站ID;区分保持寄存器和输入寄存器,这是最容易混淆的点。
读取数值异常,数值偏大或者出现负数 寄存器地址有两种标注方式:手册常用1起始,NModbus库内部为0起始。 手册写寄存器地址1、2,代码中需要填写0、1,这是Modbus调试最高发问题。
连接频繁断开、提示连接重置 示例为短连接模式,读取完成后释放连接;长期稳定采集、多传感器组网场景,建议改为长连接+心跳保活,同时设置TcpClient接收超时,适配机房弱网环境。
多传感器批量采集 不要在主线程串行轮询大量设备,推荐Task异步+并发限流,否则采集延迟持续累积。简易异步参考:
static async Task<(double temp, double hum)> ReadSensorAsync(string ip)
{
// 异步TcpClient采集逻辑
}
五、项目功能拓展方向
拿到温湿度原始数据后,动环监控系统一般可以继续开发这些功能:
数据存储:写入SQLite、MySQL、InfluxDB,保存历史数据,绘制趋势曲线;
阈值告警:温湿度越限触发钉钉、短信、声光告警;
可视化:上位机、Web页面实时展示温湿度曲线;
运维对接:对接Zabbix、Prometheus监控平台;
容错优化:增加断线缓存、自动重连逻辑,网络闪断时防止告警丢失。
补充:H-THRJ45同时支持SNMP、MQTT协议,可根据项目方案灵活选择。ModbusTCP上手门槛低,适合自研采集上位机。
六、总结
以太网ModbusTCP温湿度变送器省去网关中转,降低硬件成本与布线难度。这份C# Demo可以快速完成通信验证,稍加改造就能集成到自研动环采集程序。 实际调试中,大部分问题不在代码本身,而是寄存器地址、寄存器类型、缩放系数的核对。使用H-THRJ45可以直接对照本文调试;其他品牌传感器,修改IP、从站号、寄存器地址和换算系数即可。
53