十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Prometheus 监控 Modbus 全栈实战:从 PLC 寄存器到工业可观测性

Prometheus 监控 Modbus 全栈实战:从 PLC 寄存器到工业可观测性 Prometheus 监控 Modbus 全栈实战从 PLC 寄存器到工业可观测性工业 4.0 时代PLC可编程逻辑控制器和 Modbus 设备仍然是自动化生产的神经中枢。温度、压力、流量、电机转速、设备启停状态——这些物理世界的信号通过 Modbus 协议RTU/TCP流转却长期游离于现代 IT 监控体系之外。Prometheus 生态提供了modbus_exporter社区维护它能以极低的资源开销将 Modbus 寄存器中的离散量、线圈、保持寄存器、输入寄存器映射为 Prometheus 指标从而让车间设备与 IT 系统在同一条可观测性跑道上对话。本文将带你从零配置寄存器映射、部署 Exporter、构建 Grafana 仪表盘和告警规则让工业数据流首次融入全栈可观测世界。1. 为什么选择 modbus_exporter协议原生支持Modbus TCP以太网和 RTU串口均可适配西门子、三菱、施耐德、罗克韦尔等 PLC 及各类传感器。轻量高效单个二进制文件通过 YAML 配置文件定义需要轮询的寄存器不依赖额外运行时。灵活的映射支持将离散量、线圈映射为布尔值保持寄存器、输入寄存器映射为数值型指标并可定义标签、缩放因子等。安全可靠通过 Prometheus 抓取方式工作Modbus 通信可配置超时和重试适应工控网络波动。无缝集成指标进入 Prometheus 后可与服务器、应用监控联动实现 OT/IT 融合告警。2. 部署 modbus_exporter社区维护的prometheus-community/modbus_exporter是主流选择Go 实现。可通过 Docker 或二进制部署。2.1 Docker 部署推荐dockerrun-d\--namemodbus_exporter\-p9602:9602\-v/path/to/modbus_exporter.yml:/etc/modbus_exporter/modbus_exporter.yml\prometheuscommunity/modbus-exporter:latest\--config.file/etc/modbus_exporter/modbus_exporter.ymlExporter 默认监听9602端口/metrics端点提供指标。2.2 二进制部署从 GitHub Releases 下载对应平台的压缩包解压后运行./modbus_exporter--config.filemodbus_exporter.yml --web.listen-address:96023. 编写寄存器映射配置 (modbus_exporter.yml)配置文件是整个监控的核心它定义了要连接的 Modbus 设备以及要读取的寄存器列表。支持定义多个target或者由 Prometheus 通过参数动态传入目标。最简单的方式是静态配置一个或多个目标。# modbus_exporter.ymlmodules:# 定义一个模块可在 Prometheus 抓取时通过 ?modulexxx 指定plc_default:# Modbus 协议类型tcp, rtu, asciiprotocol:tcp# 目标地址TCP 模式下为 IP:PortRTU 模式下为串口设备路径address:192.168.1.50:502# 轮询间隔可选默认由 Prometheus 抓取间隔控制# poll_interval: 10s# 超时时间timeout:5s# 从站 ID对于 TCP 通常是 1对于串口可配置不同 IDslave:1# 定义要读取的寄存器组registers:# 读取保持寄存器功能码 03地址从 0 开始-name:temperature_sensor_1type:holding# holding register (功能码 03)address:0# 寄存器地址data_type:int16# 数据类型int16, uint16, int32, uint32, float32, float64 等scale:0.1# 缩放因子如寄存器值为 250实际温度 25.0℃unit:°C# 单位仅元数据不影响指标值labels:# 附加静态标签sensor_id:TEMP-01location:reactor-1-name:pressure_valve_outtype:holdingaddress:2# 假设温度占两个字节int16压力在下一个寄存器data_type:uint16scale:0.01unit:MPa# 读取线圈功能码 01返回布尔值0/1-name:motor_runningtype:coil# 线圈address:0data_type:bool# 读取离散输入功能码 02-name:emergency_stoptype:discreteaddress:0data_type:bool# 读取输入寄存器功能码 04-name:raw_adc_valuetype:inputaddress:0data_type:uint16# 读取浮点数示例32位浮点占用两个寄存器-name:flow_ratetype:holdingaddress:4data_type:float32swap:true# 如果需要字节交换unit:m³/h配置要点type线圈 (coil)、离散输入 (discrete)、保持寄存器 (holding)、输入寄存器 (input)。data_type决定如何解析字节支持bool,int16/32/64,uint16/32/64,float32/64。address从 0 开始的偏移量。scale与unit将原始整数转换为物理量。可定义多个modules每个模块指向不同设备或使用不同设置。可以在 Prometheus 抓取时通过参数module选择。重启 Exporter 后访问http://localhost:9602/metrics应该看到modbus_temperature_sensor_1{sensor_idTEMP-01, locationreactor-1, unit°C}等指标。4. 配置 Prometheus 抓取在prometheus.yml中添加 Job。可以通过params传递module如果 Exporter 配置文件中静态指定了address则无需再传target。若希望一个 Exporter 监控多个设备可以使用--collector.typedynamic模式本文不展开。这里使用静态模块方式。scrape_configs:-job_name:modbus-plcscrape_interval:10s# 根据设备响应速度可适当调快metrics_path:/metricsparams:module:[plc_default]# 对应配置文件中的模块名static_configs:-targets:[modbus-exporter:9602]# 因为配置中已写死设备地址target 填 Exporter 本身即可labels:env:productionfactory_floor:A1如果想让一个 Exporter 监控多台设备可在配置文件中定义多个模块如plc1,plc2每个模块指向不同address然后在 Prometheus 中创建多个 Job 或使用file_sd动态指定模块。5. 核心监控指标与 PromQLmodbus_exporter 生成的指标名格式为modbus_register_name标签来自labels字段以及 Exporter 自动添加的type等。所有指标均为 Gauge 类型值即读取到的物理量已应用 scale。指标示例含义modbus_temperature_sensor_1{sensor_idTEMP-01}反应器 1 温度单位 °Cmodbus_motor_running电机运行状态0 或 1modbus_flow_rate{unitm³/h}流量读数PromQL 示例温度超过 80℃modbus_temperature_sensor_1 80电机未运行但期望运行时modbus_motor_running 0可结合其他条件压力异常低modbus_pressure_valve_out 0.1紧急停止激活modbus_emergency_stop 1计算一段时间内的平均温度avg_over_time(modbus_temperature_sensor_1[5m])6. Grafana 仪表盘推荐通用 Modbus 设备仪表盘目前没有统一 ID可基于指标自定义。常用面板包括数值显示Stat 面板展示当前温度、压力、流量。趋势曲线Time series 绘制关键工艺参数的历史趋势。状态灯Status Panel 展示电机启停、急停状态等布尔信号。表格列出所有设备的当前值便于快速巡检。工业 IoT DashboardDashboard ID14457可作为模板改造替换数据源为 modbus 指标。自建工控大屏使用 Canvas 或图像背景将指标嵌入车间布局图中实现数字孪生视角。导入 Prometheus 数据源后使用变量factory_floor、sensor_id等过滤设备。7. 告警规则实战groups:-name:modbus_plc_alertsrules:-alert:ReactorHighTemperatureexpr:modbus_temperature_sensor_1{sensor_idTEMP-01}85for:2mlabels:severity:criticalannotations:summary:反应器 1 温度超过 85℃当前 {{ $value }}°C-alert:MotorFailureexpr:modbus_motor_running{motormain} 0 and ON(some_expected_condition)# 需要根据实际逻辑定义例如与预期运行信号对比labels:severity:criticalannotations:summary:主电机停止运行可能发生故障-alert:EmergencyStopActivatedexpr:modbus_emergency_stop 1labels:severity:criticalannotations:summary:紧急停止按钮被按下设备已停机-alert:PressureBelowSafeThresholdexpr:modbus_pressure_valve_out{locationreactor-1} 0.5for:1mlabels:severity:warningannotations:summary:反应器 1 压力低于 0.5 MPa可能存在泄漏-alert:ModbusDeviceUnreachableexpr:up{jobmodbus-plc} 0for:2mlabels:severity:criticalannotations:summary:Modbus 设备 {{ $labels.instance }} 不可达检查网络或 PLC可根据实际寄存器名称和逻辑自由扩展。8. 进阶多设备、串口 RTU 与安全加固8.1 监控多台 PLC 或串口设备静态多模块在modbus_exporter.yml中定义多个模块如plc_line1,plc_line2每个模块指向不同 IP 或串口。Prometheus 中分别配置 Job 或使用file_sd动态指定模块。动态目标模式Exporter 支持通过 Prometheus 参数target动态传入设备地址但需要模块中不指定address。配置略复杂适用于大量相似设备。串口 RTU配置模块protocol: rtuaddress设为/dev/ttyUSB0等串口设备设置波特率、数据位等。注意串口独占一台 Exporter 通常只能串行轮询多个从站。8.2 字节序与缩放因子工控设备常遇到多字节数据的高/低字节序问题。可通过swap: true交换相邻寄存器或word_order: high_low调整字序。scale与offset配合完成线性转换物理值 寄存器值 × scale offset。8.3 安全加固工控网络应物理隔离或通过防火墙严格限制仅允许 Exporter 所在主机访问 PLC 端口。如果 Modbus TCP 暴露于不太受信的网络可考虑通过 SSH 隧道或 VPN 加密通信。Exporter 自身端口9602仅对 Prometheus 开放。配置文件中避免硬编码敏感信息通过环境变量或密钥管理服务注入。8.4 性能与轮询策略Modbus 是串行轮询协议单条连接上寄存器读取速度有限。对于大量寄存器建议合理分组寄存器对相邻寄存器使用一次多寄存器读取Exporter 会自动优化。避免scrape_interval过短导致 PLC 过载通常 5~10s 足够。对慢速设备使用独立 Exporter 实例分散负载。9. 总结通过 modbus_exporterPrometheus 的触角延伸到了工业现场的 PLC、传感器和执行器。温度、压力、流量、开关状态这些物理世界的“指标”现在与你的 IT 监控数据同处一室在 Grafana 中统一可视化通过 Alertmanager 统一告警。这不仅打破了 OT 与 IT 的壁垒更为预测性维护、能耗优化、数字孪生等高级应用奠定了数据基石。部署它让你的工厂也拥有云原生的可观测性从反应釜到服务器一切尽在掌握。
返回列表