
1. 项目缘起与整体设计思路1.1 为什么选择Ricon组态系统做物联网监控平台先说结论如果你手头有一堆传感器、PLC、仪表需要快速搭一个能看、能控、能报警、能存数据的监控界面又不想从零写前端后端Ricon组态系统是目前国内工控圈里落地成本最低的方案之一。我自己做过好几个中小型物联网监控项目从智慧农业大棚到小型污水站再到车间设备状态看板Ricon都是主力工具。它的核心价值在于图形化拖拽组态 内置数据采集驱动 脚本扩展能力让你把精力放在业务逻辑上而不是纠结WebSocket怎么重连、ECharts怎么调样式。这个项目标题说的是“从零开始构建物联网监控平台”我理解的需求场景是这样的现场有若干传感器温湿度、液位、压力、电表等通过Modbus RTU/TCP、MQTT或者OPC UA把数据汇聚上来需要在Ricon里做一个实时监控画面包含实时数据展示、历史曲线、报警推送、报表导出最好还能远程控制设备启停。这套东西做下来如果纯手写代码前端加后端至少两周起步用Ricon组态熟练的话两三天就能出第一版可演示的系统。适合谁来参考这篇内容我觉得三类人最合适一是工控转物联网的工程师熟悉PLC但不太会写Web二是做物联网毕业设计的学生需要快速出成果三是系统集成商的实施人员经常要现场快速搭原型。如果你已经有一套成熟的ThingsBoard或ThingsLinks平台那Ricon可能不是最优解但如果你追求的是单机部署、离线可用、上手快Ricon的性价比非常高。1.2 整体架构分层与数据流向设计我在动手之前习惯先把架构画清楚哪怕只是在纸上画个草图。Ricon组态系统的物联网监控平台我一般分成四层来设计第一层是现场设备层。这一层就是各种传感器、执行器、PLC、智能仪表。它们对外提供的接口无非几种Modbus RTURS485/RS232、Modbus TCP、MQTT、OPC UA、西门子S7协议等。你需要提前确认每个设备的通信协议、寄存器地址表、数据类型16位整数、32位浮点、大小端顺序。这一步偷懒后面调试会让你痛不欲生。第二层是数据采集与网关层。Ricon本身可以跑在工控机或Windows服务器上通过串口或网口直接采集设备数据。但如果设备分散、距离远我建议加一个物联网网关做协议转换和边缘计算。比如用STM32跑FreeRTOS做一个Modbus RTU转MQTT的网关把485总线上的数据打包成JSON发到Ricon的MQTT Broker。这样做的好处是Ricon只负责订阅MQTT主题不用关心底层总线细节系统解耦更彻底。第三层是Ricon组态平台层。这是核心。Ricon内部有实时数据库、报警引擎、历史存储、脚本引擎、画面组态几个模块。实时数据库负责缓存当前值报警引擎根据设定阈值触发报警历史存储把数据写入内置的SQLite或外部数据库脚本引擎用来做数据加工和逻辑控制。第四层是展示与交互层。包括PC端监控画面、移动端适配页面、大屏看板、报表导出。Ricon支持Web发布也支持客户端运行看项目需求选择。数据流向是这样的设备 → 采集驱动 → 实时数据库 → 画面绑定/报警判断/历史记录 → 用户交互。反向控制则是用户点击按钮 → 脚本执行 → 写入设备寄存器 → 设备动作。整个链路里实时数据库是枢纽所有数据都围绕它转。1.3 方案选型中的几个关键取舍在实际项目中有几个选型决策会直接影响开发效率和后期维护成本我逐个说一下我的思考。第一个取舍Ricon直连设备还是通过网关中转如果设备数量少于10台、通信距离在50米以内、协议统一是Modbus RTU我倾向Ricon直连少一个环节少一个故障点。但如果设备超过20台、分布在不同的车间或楼层、协议五花八门那必须上网关。网关的好处是边缘侧可以做数据过滤和缓存网络断了也不丢数据恢复后自动补传。我吃过亏早期一个项目Ricon直连30台485设备轮询周期设了500ms结果总线冲突严重数据丢包率超过15%。后来改成网关分片采集每片10台设备轮询周期200ms丢包率降到0.1%以下。第二个取舍历史数据存Ricon内置库还是外部数据库Ricon内置的SQLite适合数据量小、单机运行的场景部署简单零配置。但如果你的测点超过500个、存储周期小于10秒、需要保留一年以上那SQLite会越来越慢查询历史曲线时明显卡顿。我的经验是测点少于200个、存储间隔30秒以上用内置库没问题超过这个规模果断上MySQL或PostgreSQLRicon支持通过ODBC写入外部库。第三个取舍报警推送用Ricon自带还是自己写Ricon自带的报警窗口和声音提示适合本地监控场景。但如果需要推送到手机、钉钉、企业微信就得用脚本调用外部API。我一般会在Ricon脚本里写一个HTTP请求函数报警触发时把消息POST到自己的消息服务再由消息服务转发到各个渠道。这样灵活度最高也方便做报警分级和值班排班。2. 核心细节解析与实操要点2.1 设备接入前的准备工作寄存器表与通信参数确认这一步是很多新手最容易忽略的也是后期调试最耗时间的环节。我现在的习惯是拿到设备后第一件事不是打开Ricon而是先整理一份设备通信参数表。这份表至少包含以下字段字段说明示例设备名称现场标识1号大棚温湿度通信协议Modbus RTU/TCP等Modbus RTU从站地址站号1串口参数波特率/数据位/停止位/校验9600/8/1/None寄存器地址十进制或十六进制40001数据类型16位整数/32位浮点等16位有符号整数字节序大小端大端缩放因子原始值乘多少得实际值0.1单位物理单位℃读写权限只读/读写只读这份表看起来繁琐但有了它在Ricon里配置驱动就是填表工作不需要反复翻设备手册。我一般用Excel维护配置完一个设备就打个勾避免遗漏。注意Modbus寄存器地址有“协议地址”和“PLC地址”两种表示方式。协议地址从0开始PLC地址从1开始而且40001这种表示法对应的是保持寄存器。如果你在Ricon里填了40001但读不到数据先试试填0或者1大概率是地址偏移问题。2.2 Ricon驱动配置的实操细节Ricon支持多种驱动我以最常用的Modbus RTU和MQTT为例说一下配置要点。Modbus RTU驱动配置在Ricon的设备驱动里新建一个Modbus RTU设备选择正确的串口号在Windows设备管理器里确认COM号设置波特率、数据位、停止位、校验位这些必须和设备手册完全一致。然后添加变量每个变量对应一个寄存器地址。这里有个细节连续地址的变量尽量放在一个采集块里Ricon会合并请求减少总线通信次数。比如你要读40001到40010这10个寄存器就建一个采集块起始地址40001长度10而不是建10个单独的变量。实测下来合并采集比单独采集效率高3到5倍。MQTT驱动配置如果走网关方案Ricon作为MQTT客户端订阅主题。配置时需要填Broker地址、端口、客户端ID、用户名密码、订阅主题。我一般让网关把数据发到一个统一主题比如/iot/gateway/001/datapayload是JSON格式。Ricon收到后用脚本解析JSON把各个字段映射到实时数据库的变量上。这里的关键是JSON字段名和Ricon变量名要有一一对应的映射表否则脚本会写得很乱。// Ricon脚本示例解析MQTT JSON并写入变量 var payload JSON.parse(msg); SetTagValue(temp_01, payload.temp); SetTagValue(humi_01, payload.humi); SetTagValue(press_01, payload.press);这段脚本看起来简单但实际项目中要考虑字段缺失、类型转换、异常捕获。我一般会加一层判断try { var payload JSON.parse(msg); if (payload.temp ! undefined) SetTagValue(temp_01, parseFloat(payload.temp)); if (payload.humi ! undefined) SetTagValue(humi_01, parseFloat(payload.humi)); } catch (e) { LogError(JSON解析失败: e.message); }2.3 实时数据库变量命名规范与分组策略变量命名这件事项目小的时候无所谓项目一大就是灾难。我见过一个项目变量名从tag1一直排到tag800后期维护的人完全不知道哪个是哪个。我的建议是采用分层命名法区域_设备类型_设备编号_参数名。比如A1_TH_01_TEMP表示A1区域1号温湿度传感器的温度值。这样一看名字就知道是什么排序也整齐。分组策略上我一般按画面和功能两个维度来分。按画面分就是每个监控画面用到的变量放一组方便画面绑定时快速查找。按功能分就是报警变量一组、历史存储变量一组、控制变量一组。Ricon支持变量分组我通常两个维度都建用不同的分组前缀区分。实操心得变量建好后先导出一次变量列表备份。后期如果误删或者改乱了可以直接对照恢复。这个习惯帮我省过好几次事。3. 实操过程与核心环节实现3.1 从零搭建Ricon工程创建与画面规划打开Ricon新建工程第一步是设置工程属性工程名称、分辨率、背景色、启动画面。分辨率我一般设1920×1080适配大多数工控机和显示器。如果要做大屏可以设3840×2160但画面元素要相应放大。画面规划我遵循三级导航原则一级是总览画面展示整个系统的关键指标和状态二级是分区域画面比如1号车间、2号车间三级是设备详情画面展示单台设备的全部参数和控制按钮。这样用户从总览点进去逐层深入不会迷路。总览画面我一般放这几个元素系统标题、当前时间、关键测点数值用大字号、设备状态指示灯绿色运行、红色故障、灰色离线、报警滚动条、导航按钮。关键测点的选择标准是老板一眼想看的和值班人员必须盯的。比如污水站项目总览上就是进水COD、出水COD、pH值、流量、液位这几个参数直接反映系统运行状态。3.2 数据绑定与动态效果实现画面画好后下一步是把变量绑定到画面元素上。Ricon的绑定方式很直观选中一个文本显示框在属性里找到“变量”一栏填入变量名或者从变量选择器里选。数值显示可以设置格式比如保留两位小数、加单位、超限变色。超限变色这个功能特别实用。我一般这样配置温度正常范围是15到30度低于15度显示蓝色高于30度显示红色正常显示绿色。实现方式是在文本的属性里设置“颜色动画”绑定变量设置不同数值区间的颜色。这样值班人员不用看数字看颜色就知道有没有异常。动态效果方面Ricon支持旋转、移动、闪烁、填充等动画。比如风机运行的时候画一个风扇图标绑定风机的运行状态变量运行时旋转停止时静止。液位用填充动画绑定液位变量填充高度随液位变化。这些效果不需要写代码配置一下就行但视觉效果提升很大。// 按钮点击脚本示例控制设备启停 if (GetTagValue(device_status) 0) { SetTagValue(device_cmd, 1); // 下发启动命令 ShowMessage(设备启动命令已下发); } else { SetTagValue(device_cmd, 0); // 下发停止命令 ShowMessage(设备停止命令已下发); }注意控制类操作一定要加二次确认。我见过太多误触导致设备意外停机的案例。Ricon有确认对话框组件拖一个出来把控制脚本放在确认之后执行。3.3 报警配置与历史存储设置报警配置是监控平台的核心功能之一。Ricon的报警配置分两步先定义报警变量和报警条件再配置报警显示和推送。报警条件我一般设四级低低报、低报、高报、高高报。比如温度低于5度低低报5到10度低报30到35度高报高于35度高高度。每级报警可以设置不同的颜色和声音。低低报和低报用黄色高报和高高报用红色声音也可以区分高报用急促的蜂鸣低报用缓慢的提示音。历史存储配置要注意几个参数存储间隔、存储时长、死区。存储间隔根据参数变化速度来定温度变化慢30秒存一次够了压力变化快5秒存一次。存储时长看需求一般保留3个月到1年。死区是指数值变化超过多少才存储比如温度死区设0.5度变化小于0.5度就不存这样可以大幅减少数据量。参数类型存储间隔死区存储时长温度30秒0.5℃1年湿度30秒1%1年压力5秒0.01MPa6个月流量10秒0.1m³/h6个月电参量1分钟0.5kW1年这张表是我根据多个项目经验总结的可以直接参考。当然具体项目要具体调整原则是变化快的参数存密一点变化慢的存疏一点重要的参数存久一点次要的存短一点。3.4 脚本扩展数据加工与逻辑控制Ricon的脚本引擎是基于JavaScript的支持定时脚本、事件脚本、画面脚本。我常用的场景有三个数据加工、逻辑联动、外部通信。数据加工比如把原始值转换成实际值、计算累计量、做滑动平均滤波。逻辑联动比如当温度超过30度自动开启风机当液位低于20%自动关闭水泵。外部通信比如把报警推送到消息服务、定时从天气API获取数据。// 定时脚本示例每5秒执行一次计算滑动平均温度 var temp GetTagValue(temp_01); var avg GetTagValue(temp_01_avg); if (avg null) avg temp; var newAvg avg * 0.8 temp * 0.2; // 一阶滤波 SetTagValue(temp_01_avg, newAvg);这个一阶滤波算法简单但有效能平滑掉传感器跳变。系数0.8和0.2可以根据需要调整系数越大越平滑但响应越慢。实操心得脚本里尽量少用循环和复杂计算Ricon的脚本引擎性能有限复杂的逻辑建议放到网关或外部服务里做。我试过在Ricon脚本里做100个变量的批量处理执行时间超过500ms导致画面卡顿。后来改成网关预处理Ricon只负责展示流畅多了。4. 常见问题与排查技巧实录4.1 通信类问题排查速查表通信问题是物联网监控平台最常见的故障我整理了一份速查表覆盖80%以上的场景。现象可能原因排查方法解决方案所有设备离线串口被占用/网线断开检查设备管理器/ping网关关闭占用程序/更换网线部分设备离线从站地址冲突/线路接触不良逐个ping/检查接线端子修改地址/重新压接数据时有时无轮询周期太短/总线干扰延长周期观察/检查屏蔽线调整周期/加磁环数据值不对寄存器地址错/数据类型错用Modbus调试工具验证修正地址/类型数据不变化死区设置过大/采集未启用检查死区和采集配置调整死区/启用采集MQTT断连网络波动/心跳超时查看Broker日志调整心跳/加断线重连这张表我打印出来贴在工位上遇到问题先对照排查效率很高。4.2 画面卡顿与性能优化画面卡顿是Ricon项目做大了之后常见的问题。原因无非几个变量太多、刷新太快、动画太复杂、历史查询太重。我的优化顺序是这样的先降刷新频率。Ricon默认画面刷新是1秒如果变量多改成2秒或3秒肉眼几乎看不出差别但CPU占用能降一半。再减动画效果。闪烁、旋转这些动画很吃资源非必要的去掉必要的降低帧率。然后优化历史查询。历史曲线一次不要查太多点比如查一天的数据先降采样到1000个点再显示不要直接查原始数据。最后考虑分画面加载。把不重要的画面做成弹窗或子画面需要时才加载减少主画面的变量数量。我做过一个项目主画面绑了800多个变量刷新周期1秒CPU占用常年70%以上。后来把刷新改成3秒动画减掉一半变量分组按需加载CPU降到20%以下画面流畅多了。4.3 数据丢失与补传机制网络不稳定的时候数据丢失是难免的。我的做法是在网关侧做本地缓存断点续传。网关采集到数据后先写入本地环形缓冲区然后尝试发送到Ricon。如果发送失败数据留在缓冲区等网络恢复后按时间顺序补传。缓冲区大小根据网络中断的最长时间来定一般存1小时的数据就够了。Ricon侧也要做处理收到补传数据时按时间戳写入历史库而不是按当前时间。这样历史曲线不会出现断档。Ricon的脚本里可以用SetTagValueWithTime函数指定时间戳写入。注意补传数据可能会重复Ricon侧要做去重。我一般在历史库表上建唯一索引时间戳变量名唯一重复数据自动忽略。4.4 报警泛滥与分级处理报警泛滥是另一个常见问题。一个传感器故障可能触发几十条报警值班人员根本看不过来。我的解决方案是报警分级报警抑制。报警分级就是前面说的四级报警不同级别走不同的推送渠道。低报只记录不推送高报推送到值班群高高报推送到负责人并打电话。报警抑制是指同一个设备的多个报警只推最高级别的那条关联设备的报警合并成一条综合报警。Ricon的脚本里可以实现报警抑制逻辑维护一个报警状态表新报警来时先查表如果已有更高级别的报警就忽略否则更新表并推送。// 报警抑制脚本示例 var deviceId A1_TH_01; var newLevel 3; // 高报 var currentLevel GetTagValue(deviceId _alarm_level); if (newLevel currentLevel) { SetTagValue(deviceId _alarm_level, newLevel); SendAlarm(deviceId, newLevel); }这套逻辑跑下来报警数量能减少70%以上值班人员也能抓住重点。4.5 项目交付前的检查清单项目做完准备交付的时候我一般会过一遍检查清单避免现场翻车。所有设备的通信状态是否正常有没有离线设备所有变量的实时值是否合理有没有明显异常报警阈值是否按客户要求设置报警测试是否通过历史存储是否正常写入历史曲线能否正常查询控制功能是否正常二次确认是否生效画面导航是否顺畅有没有死链接用户权限是否配置不同角色能否看到对应画面系统日志是否开启方便后期排查工程文件是否备份版本号是否记录客户培训是否完成操作手册是否交付这份清单我每次交付前都过一遍虽然花半小时但能避免90%的现场问题。5. 从原型到生产部署与运维经验5.1 工控机选型与系统部署Ricon一般跑在Windows工控机上。工控机选型我关注几个点CPU性能、内存、硬盘、串口数量、网口数量、电源。CPU至少i3推荐i5内存至少8G推荐16G硬盘用SSD至少256G串口根据设备数量选不够就用USB转串口网口至少两个一个接设备网一个接办公网电源要宽压输入工业现场电压波动大。系统部署我一般这样做先装Windows 10 LTSC版稳定不自动更新然后装Ricon装驱动装数据库接着配置开机自启动Ricon和数据库都要设成服务最后做系统备份用Ghost或者DiskGenius做个镜像出问题了直接恢复。实操心得工控机一定要设自动登录和断电重启。现场经常停电来电后要能自动恢复运行不能等人去按开机键。BIOS里设置“AC Power Loss”为“Power On”Windows里设置自动登录Ricon设置开机自启这三步做完基本可以无人值守。5.2 远程维护与版本更新项目交付后远程维护是常态。我一般用两种方式远程桌面和Web发布。远程桌面用Windows自带的RDP或者TeamViewer方便操作Ricon工程。Web发布让客户用浏览器就能看画面不用装客户端。版本更新要谨慎。我的流程是先在测试环境改好导出工程文件然后远程到现场备份当前工程接着导入新工程重启Ricon最后验证功能没问题就保留有问题就回滚。整个过程一般15分钟但一定要在非生产时段做避免影响客户使用。5.3 数据安全与权限管理数据安全方面我关注三点备份、权限、审计。备份就是定期导出历史数据和工程文件存到不同的地方。权限就是Ricon的用户管理不同角色分配不同权限操作工只能看不能改工程师可以改配置管理员可以改所有。审计就是操作日志谁在什么时候做了什么操作都要记录方便追溯。Ricon的用户管理支持角色和用户两级我一般设三个角色观察者、操作员、管理员。观察者只能看画面操作员可以控制设备但不能改配置管理员什么都能做。密码策略要求至少8位含大小写和数字定期更换。6. 扩展方向从单机监控到物联网平台6.1 对接第三方物联网平台Ricon做单机监控很强但如果要接入更大的物联网平台比如ThingsBoard、ThingsLinks或者自研平台就需要做数据转发。我的做法是在Ricon脚本里写一个MQTT发布函数把实时数据转发到平台的主题上。平台侧再做存储、分析、展示。// 数据转发脚本示例 var data { deviceId: A1_TH_01, temp: GetTagValue(temp_01), humi: GetTagValue(humi_01), timestamp: new Date().getTime() }; MQTTPublish(/iot/upload/A1_TH_01, JSON.stringify(data));这样Ricon就变成了一个边缘网关既做本地监控又做数据上传。两边互不干扰本地断网了平台数据会断但本地监控不受影响。6.2 移动端适配与消息推送移动端我一般不做原生App而是用Ricon的Web发布功能做一个响应式页面手机浏览器直接访问。关键指标用大字号控制按钮做大一点方便触摸操作。消息推送用企业微信或者钉钉的机器人Ricon脚本里调用Webhook接口把报警消息发到群里。6.3 数据分析与报表自动化Ricon自带报表功能可以配置日报、月报自动生成Excel或PDF。我一般会配置几个固定报表日报表展示当天关键参数的最大值、最小值、平均值月报表展示每月的累计量和报警统计自定义报表让用户选时间段和参数按需生成。报表可以定时生成自动发送到指定邮箱。这套东西做下来Ricon就不只是一个监控画面工具而是一个完整的物联网监控平台。从零开始到交付熟练的话两周左右新手一个月也能搞定。关键是要把架构想清楚把变量规划好把报警和存储配置对剩下的就是拖拽和调试的体力活了。