• 正文
  • 相关推荐
申请入驻 产业图谱

Modbus 寄存器地址避坑:C# 读取以太网温湿度传感器实战记录

51分钟前
53
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

【栏目】物联网 / 工业控制

【简介】在机房、医药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、从站号、寄存器地址和换算系数即可。

相关推荐

数字化智慧环境监控系统建设知识创作与分享