ARTICLE DETAIL

资讯详情

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

Modbus之自动化阈值控制:温湿度超标自动通风、自动浇水业务逻辑

Modbus之自动化阈值控制:温湿度超标自动通风、自动浇水业务逻辑 17-自动化阈值控制温湿度超标自动通风、自动浇水业务逻辑各位看官前几篇我们把传感器数据从 485 总线一路搬到了云端时序数据库属于只读不写的活儿。可智慧农业的核心诉求从来不是看得见而是管得住——大夏天的棚里 38℃你光在手机上看个数字菜就熟过头了。今天这篇就来把自动化控制这块硬骨头啃下来。一、需求拆解控制到底要解决什么问题先说三个最典型的场景温度过高自动通风大棚中午暴晒温度传感器上报 38℃阈值设定 35℃系统自动开启卷膜电机/风机降温后自动关闭。土壤湿度低自动浇水土壤湿度低于 25% 时自动打开电磁阀滴灌湿度回到 45% 后停水。光照不足自动补光阴雨天光照强度低于 8000Lux自动开启补光灯持续 2 小时。你看这些需求长得很像传感器数值 阈值比较 触发执行器。这就是阈值规则的本质。它不需要复杂的机器学习一套规则引擎就能吃得下。但别小看它落地时全是细节什么时候触发、动作执行多久、触发了要不要防抖、人手干预了规则还该不该管。二、阈值规则引擎两张表打天下规则引擎的设计核心是把条件和动作解耦做成可配置的规则表。数据库里就两张表规则表 rule ├── id ├── name 规则名称如高温通风 ├── sensor_point 条件传感器点位如 temp_1 ├── operator 比较符如 gt / lt / gte / lte ├── threshold 阈值如 35.0 ├── time_start 生效时间窗开始如 08:00 ├── time_end 生效时间窗结束如 18:00 ├── enabled 是否启用 └── action_id 关联动作 动作表 action ├── id ├── device_point 执行器点位如 fan_1风机继电器 ├── action_value 动作值如 1开或 0关 ├── duration_sec 执行时长如 300 秒 └── cooldown_sec 冷却时间如 600 秒两张表一拼规则就活了“当 temp_1 35.0且当前时间在 08:00-18:00 内则 fan_1 置 1持续 300 秒”。生效时间窗这个字段别忽略夜里你开着卷膜电机凌晨的露水能把作物全冻死这是踩坑踩出来的。三、条件模型与动作模型把业务翻译成结构新手最容易犯的错是把判断逻辑写死在代码里——加一条规则就改一次代码、发一次版。正确姿势是把业务知识抽成数据程序只做通用执行。规则条件模型Condition设计成这样字段含义示例pointCode传感器点位编码soil_humidity_1compare比较符 threshold阈值25.0timeWindowStart/End生效时间窗08:00 ~ 20:00windowType窗口类型每天/仅白天/关闭DAILY动作模型Action设计成这样字段含义示例pointCode执行器点位编码valve_1actionValue动作值继电器通断1 / 0durationSec执行时长超时自动复位600cooldownSec冷却时间防抖用1200这里有个关键点动作值要写入 Modbus 线圈还是寄存器卷膜电机这种开关型设备走FC05 写单线圈变频器调风速这种模拟量设备走FC06 写单寄存器。点位模型里要带functionCode字段动作执行时才知道调哪种报文。四、规则引擎实现定时扫描 触发执行引擎跑起来就是一个定时任务默认 30 秒扫一轮流程如下取数据从内存缓存边缘网关实时上报的数据读传感器最新值。过条件逐条规则比较加上生效时间窗校验。不满足直接跳过。查状态机每条规则有个上次触发时间在冷却期内不重复触发——防止温度在阈值附近抖动风机开一下停一下。下动作通过 Modbus TCP 写执行器同时记录一条执行日志触发规则、动作值、时间。超时复位动作执行满 durationSec 后自动把执行器恢复到默认值比如关风机。SpringBoot 里核心就三个类RuleEntity规则、ActionEntity动作、RuleEngineService引擎调度。我直接贴核心执行逻辑ServicepublicclassRuleEngineService{AutowiredprivatePointDataCachepointCache;// 最近一次点位数据缓存AutowiredprivateModbusMasterServicemodbus;// Modbus 写操作封装AutowiredprivateRuleRepositoryruleRepo;privatefinalMapLong,LonglastTriggerMapnewConcurrentHashMap();Scheduled(fixedDelay30000)// 每 30 秒扫描一次publicvoidscan(){for(RuleEntityrule:ruleRepo.findByEnabled(true)){// 1. 生效时间窗校验if(!inTimeWindow(rule))continue;// 2. 冷却期校验longnowSystem.currentTimeMillis();LonglastlastTriggerMap.get(rule.getId());if(last!nullnow-lastrule.getAction().getCooldownSec()*1000L)continue;// 3. 比较阈值DoublecurpointCache.getLatest(rule.getSensorPoint());if(curnull)continue;if(!compare(cur,rule.getOperator(),rule.getThreshold()))continue;// 4. 触发动作写执行器doAction(rule.getAction());lastTriggerMap.put(rule.getId(),now);ruleLogRepo.save(buildLog(rule,cur));}}privatevoiddoAction(ActionEntityaction){// functionCode5 写线圈 / 6 写寄存器发 Modbus 报文modbus.writePoint(action.getPointCode(),action.getActionValue());// 5. 注册超时复位任务scheduleReset(action,action.getDurationSec());}}注意scheduleReset用ScheduledExecutorService延迟执行到点把执行器写回默认值。千万别省这步否则风机开了忘了关棚里一夜变冰窖。五、自动浇水完整业务流程拆解把上面拼起来走一遍自动浇水全流程你就彻底懂了数据层土壤湿度探头485 总线→ 边缘网关采集土壤湿度 24.8%。缓存层网关解析报文湿度值写入本地缓存同时 MQTT 上报云端。规则层云端规则引擎扫描命中规则soil_humidity_1 25.0生效时间窗通过冷却期已过。动作层引擎调用 Modbus TCP 写valve_1线圈为 1电磁阀打开滴灌开始。闭环湿度回升到 32%阈值带 25/45 之间此时不满足25这条条件但注意——我们还有一条规则soil_humidity_1 45.0 → valve_1 写 0等湿度够高才停水。超时兜底哪怕规则没触发valve 打开满 30 分钟超时复位任务强制关阀防止管道被淹。这里体现了一个进阶技巧双阈值防抖。开阀阈值 25%、关阀阈值 45%中间 25~45% 是死区系统不做任何操作。否则单阈值 30%湿度在 29.9%~30.1% 抖动阀门每分钟开合一次电磁阀寿命撑不过一个月。六、安全保护农业现场不能全自动蛮干自动化的反面是失控。三把保护锁必须上齐双阈值 死区见上文避免频繁启停保护执行器和作物。手动优先云端下发手动控制指令后规则引擎对该点位自动挂起manualOverride标志执行器只听手动的。手动解除后才能恢复自动化。你总不能大棚里有人作业时系统突然把卷膜机降下来。执行次数限制 异常回滚单条规则 1 小时内触发上限比如 5 次达到上限告警并禁用规则。Modbus 写失败重试 3 次仍失败走告警通道通知管理员绝不静默失败。七、小结阈值自动化控制业务上就一句话传感器值过条件执行器动一动。但工程上它把数据采集、点位模型、Modbus 写报文、定时任务、状态机、安全兜底全串了起来。读懂这篇你就从只会读 Modbus升级到了能闭环控制设备这在智慧农业项目里是质的飞跃。下一篇咱们聊聊多品牌 Modbus 设备怎么统一接入——那才是项目真正头疼的开始。
返回列表