做温室大棚温湿度控制这个题目我是从一次真实的“棚毁”事件开始的。那年夏天太阳晒得人发昏一个朋友的大棚中午温度破了45℃风机没开卷帘没拉等他赶过去一垄叶子菜全蔫了。从那以后我就一直在琢磨怎么用PLC把这事儿彻底管起来。后来我用组态王6.53做上位监控、西门子S7-200做下位控制整套系统从纯软件仿真一路做到现场运行前前后后跑了两年多。这篇就把完整思路、程序结构、组态画面、通讯联调以及踩过的坑一次性拆开讲。这套“大棚温湿控制系统”要解决的事情其实很明确实时采集大棚内的温度和湿度根据设定阈值自动控制风机、加热器、卷帘、滴灌等设备同时把运行状态和报警信息送到上位机显示。组态王6.53负责画监控界面、存历史数据、弹报警提示PLC负责真正干活——读传感器、跑逻辑、驱动继电器。比较友好的地方在于就算你没有PLC实物一样可以用仿真工具把逻辑和画面都验证一遍。所以这篇文章适合自动化、机电专业的毕业生做课程设计或毕设也适合刚入行的农业物联网工程师、小型农业项目负责人参考。1. 整体设计与核心思路拆解1.1 为什么选“组态王PLC”而不是单片机或纯仪表很多第一次做农业控制的人会问温湿度采集用单片机不就行了确实能行但大棚现场和实验室不一样环境湿度大、灰尘多、电压波动明显单片机系统在抗干扰、长期稳定性和后期维护上都很费劲。PLC的优势是工业级设计电源、I/O、通信口都是按恶劣环境考虑的梯形图逻辑改起来也直观。组态王这类组态软件则是专门为快速搭建监控画面而生的画一个风机、拉一根管道、配几个变量十几分钟就能出一个漂亮的操作界面换成纯代码写上位机得几个小时起步。从整个系统看控制架构分成三个层次。最底层是传感器和执行机构负责感知环境、执行动作中间层是PLC负责采集信号、跑控制策略、输出开关量最上层是组态王负责人机交互、参数设定、报警记录、历史趋势。组态王和PLC之间通过串口或网络通信组态王把操作人员的指令下发到PLC同时把PLC里的实时数据拉上来显示。这种三层结构最大的好处是分工明确、互不干扰即使上位机死机了PLC自己照样能把大棚温度维持在安全范围内。1.2 控制策略的选型越限开关控制为主PID为辅大棚环境控制的特殊性在于对象热惯性大、非线性强。中午太阳一晒棚温几分钟内就能升好几度夜里降温也快但加热器开启后温度爬升又很慢。对这种大惯量对象最稳妥的起点是“区间控制”也叫滞回控制。简单说就是给温度和湿度各设一组上下限越限就动作回到安全区间就停止中间留一个回差区间防止设备频繁启停。PID不是不能用但大棚里多数执行机构是风机、加热器这类开关量设备PID的输出往往需要先转成时间比例或PWM信号调参周期也比较长。所以我给基础方案配置了上下限逻辑PID作为进阶扩展模块单独做这样入门容易后期提升也有方向。控制逻辑里特别重要的一点是手自动切换。手动模式下操作员在组态王上点哪个设备就开哪个设备PLC不做干预自动模式下PLC根据温湿度数据自己判断。这个功能看着简单实际上救了不少现场调试的命。没有手动模式调试的时候设备不动作你根本分不清是传感器的问题、逻辑的问题还是执行机构的问题。1.3 信息流的完整走向把整个数据流串一遍就更好理解了。大棚里装的PT100热电阻和湿度变送器把温度、湿度转成4-20mA电流信号送入PLC的模拟量模块PLC模拟量模块把电流信号转换成0到32000的数字量PLC程序里再做一次量程换算得到真实的温度、湿度工程值然后与设定值比较输出逻辑控制风机、加热器等设备的启停。与此同时PLC把这些实时数据通过串口或Modbus协议送给组态王组态王把数值显示在画面上并存入历史数据库。操作员在组态王上修改温度上限、湿度下限等参数这些值再回传给PLC参与控制。这样一个闭环才算是完整的控制系统。2. 硬件选型与现场布局2.1 传感器和变送器的选择温度测量我用的是PT100铂电阻加温度变送器量程选-50℃到100℃湿度变送器用电容式的量程0到100%RH。两类变送器输出统一采用4-20mA电流信号。为什么统一输出电流而不是电压因为电压信号在线路上长距离传输时容易受干扰、有压降电流信号抗干扰能力强得多而且很多PLC模拟量模块内部就是按电流采样的。接线时要注意两线制变送器和模块的公共端别把正负极接反了。如果预算充足也可以直接用RS485输出的温湿度一体传感器一根线串好几个探头布线更干净。但用这种传感器意味着PLC那边要支持Modbus RTU主站通信程序里得多写一段通信代码对初学者来说难度高了一些。我在基础方案里还是优先推荐模拟量变送器接线简单、调试直观。2.2 PLC选型与IO分配PLC选的是西门子S7-200 CPU226搭配一个EM231模拟量输入模块。选S7-200不是因为它性能多强而是因为针对它的仿真工具、学习资料、库文件最全组态王6.53对它的驱动也成熟折腾门槛低。CPU226带24点数字输入、16点数字输出对这个小系统来说余量很足。EM231提供4路模拟量输入温度湿度各占一路还能剩两路做备用。IO分配我整理成了一个表格调试的时候照着核对就行地址信号名称类型说明I0.0启动按钮数字输入系统上电启动I0.1停止按钮数字输入系统停止I0.2手动/自动切换数字输入手动模式时上位机控制I0.3卷帘上限位数字输入卷帘完全打开I0.4卷帘下限位数字输入卷帘完全关闭I0.5风机过载保护数字输入热继电器常闭触点AIW0大棚温度模拟输入4-20mA对应-50~100℃AIW2大棚湿度模拟输入4-20mA对应0~100%RHQ0.0轴流风机数字输出通风降温、排湿Q0.1加热器数字输出低温加热Q0.2卷帘开启数字输出卷帘电机正转Q0.3卷帘关闭数字输出卷帘电机反转Q0.4滴灌泵数字输出湿度低时滴灌2.3 执行机构与电气控制柜执行机构就是风机、加热器、卷帘电机和滴灌泵。风机和加热器用交流接触器控制PLC的输出继电器触点电流小直接接接触器线圈容易烧点中间必须加中间继电器过渡。卷帘电机是正反转电路两个接触器之间一定要做电气互锁和程序互锁防止同时吸合造成短路。我见过不少新手在这里犯迷糊把正转和反转两个输出同时置1现场直接跳闸。限位开关也一定要接不能只靠程序延时判断卷帘到位否则电机憋着转会烧。控制柜布局按从上到下的顺序排总空开、开关电源、PLC、中间继电器、交流接触器、接线端子。开关电源给PLC和变送器供电建议选DC24V、功率余量50%以上给通信模块和传感器预留电流。柜内走线要强弱电分开模拟量信号线用屏蔽双绞线屏蔽层单端接地。这个细节不做好后面湿度数据跳到你怀疑人生。2.4 控制参数的具体设计参数初始值我给一组经过实际测试的参考值。温度上限设为30℃温度下限设为12℃回差设为3℃湿度上限设为80%RH湿度下限设为55%RH回差设为5%RH。拿温度举例当实测温度高于30℃时启动风机低于27℃时停止风机当实测温度低于12℃时启动加热器高于15℃时停止加热器。这样风机不会在28℃到32℃之间来回震颤。注意这里有个很容易忽略的点风机同时承担降温和排湿两个任务。如果棚内湿度超标但温度不高需要把排湿风机单独打开。很多方案只写“风机受温度控制”结果湿度报警触发后空气流通不够植物灰霉病全来了。所以我在控制逻辑里专门加了一条“湿度高且温度不低时风机无条件启动”。3. PLC程序的完整实现3.1 模拟量采集与工程量换算PLC程序的第一步是把AIW0里的数字量换算成真实工程值。EM231在4-20mA输入模式下4mA对应640020mA对应32000标定公式是工程量 (AIW - 6400) ×量程上限 - 量程下限÷ (32000 - 6400) 量程下限。温度量程-50到100℃时满度是150℃每0.1℃的精度需要在程序里用双整数运算实现直接除会丢精度。我用S7-200的STL指令写一段核心换算逻辑方便看得懂的人直接参考LD SM0.0 MOVW AIW0, VW200 // 原始值存入VW200 ITD VW200, VD204 // 转成双整数 DTR VD204, VD208 // 转成实数 MOVR VD208, VD212 -R 6400.0, VD212 // 减去零点偏移 MOVR VD212, VD216 *R 150.0, VD216 // 乘上量程 /R 25600.0, VD216 // 除以量程范围 R -50.0, VD216 // 加上量程下限VD216就是温度工程值湿度换算流程完全一样只是把量程换成0到100。程序里我用VW200、VW210固定存放温度和湿度的原始数字量再映射成Modbus寄存器地址这样组态王和仿真器读取时地址非常整齐。注意V区地址规划要避开PLC系统占用的VB0到VB20一般从VB100以后开始规划。3.2 温湿度越限控制逻辑主控制逻辑我分成三段温度控制段、湿度控制段、卷帘控制段。温度控制段的核心思路是置位复位加互锁。当温度高于上限且系统处于自动模式置位风机输出当温度低于回差下限且风机不在手动强制状态复位风机输出。加热器同理。写成STL大概是这样的风格LD I0.2 // 自动模式 A I0.0 // 启动 AN I0.1 // 未按停止 AN VW300 // 温度不低于30℃则跳过 AW VW216, 3000 // VD216温度工程值乘以10后和设定比较 S Q0.0, 1 // 启动风机这里我特意用“乘以10”的方式比较是为了在整数指令里保留一位小数精度。温度设定值、当前值在PLC内部都用乘以10的整数表示比如30.0℃存成300。上位机组态王下发设定值时同样按这个规则处理两边就能对上。3.3 卷帘电机正反转互锁控制卷帘控制的重点是安全。按下“卷帘打开”按钮且卷帘不在上限位Q0.2输出打开按下“卷帘关闭”按钮且卷帘不在下限位Q0.3输出打开。输出之前先互锁如果Q0.3已经置位Q0.2不能被置位。写入到梯形图里是在每个输出前面串联另一个输出的常闭点。此外手动模式和自动模式都要能操作卷帘但自动模式下必须加上限位保护。为了保险我在程序末尾还有一段“关断优先”逻辑一旦切换到停止状态所有输出全部复位这样现场急停时不会有任何设备还在动作。3.4 PID扩展模块时间和可靠性问题如果后续想升级成PID控制S7-200的做法是用指令向导生成PID回路回路编号建议用0输入是温度工程值输出0到1之间的浮点数。PID输出不能直接去控制加热器这种开关量要转成时间比例输出假设控制周期30秒PID输出0.4表示这30秒内加热器开12秒、停18秒。实现方法可以用一个定时中断配合比较指令判断当前时间落在通段还是断段。调参方面大棚对象有个明显特点热惯性大响应慢。采样周期设10到30秒比较合理比工业管道控制要长得多。比例增益从60到100起步积分时间设置在1到2分钟微分基本不用。如果现场实测温度波动大先检查采样周期是不是太短再把P降下来I拉上去。很多人一上来就把P调到200系统稳不住来回窜这是最常见的坑。3.5 PLC仿真验证方法没有实物PLC的时候用S7-200仿真器也能把逻辑跑起来。操作流程是在Micro/WIN里编译好程序导出为.awl文件然后打开S7-200仿真器加载这个文件载入后CPU就会处于RUN状态。仿真器里的I0.x输入状态可以通过工具栏上的拨位开关模拟Q0.x输出状态在界面上能看到指示灯亮灭。有一个限制必须讲清楚仿真器不支持真实的AIW模拟量输入AIW0读出来永远是0。我的做法是往V区直接写一个模拟数值比如用MOVW指令把临时变量值传给VW200再把VW200映射给AIW0的副本。程序里所有逻辑都基于VW216这个工程值运行不再直接引用AIW0这样仿真时只要改VW216的值就能模拟温度变化非常方便。这招在调试阶段特别实用。4. 组态王6.53工程搭建流程4.1 新建工程与数据词典变量定义打开组态王6.53后先进入工程管理器新建一个工程工程名称叫“大棚温湿监控”存储路径建议不要带中文以外的特殊字符。工程建完后进入开发系统第一步是在“数据词典”里定义变量。这一步是整个组态工程的基础变量类型和连接设备搞错了后面画面上的数值无论如何都乱跳。数据词典里的关键变量定义如下表变量名类型连接设备寄存器说明TEMP_REALI/O实数PLC_S7AIW0温度当前值HUMI_REALI/O实数PLC_S7AIW2湿度当前值TEMP_H_SPI/O整数PLC_S7VW300温度上限设定TEMP_L_SPI/O整数PLC_S7VW302温度下限设定HUMI_H_SPI/O整数PLC_S7VW304湿度上限设定HUMI_L_SPI/O整数PLC_S7VW306湿度下限设定FAN_AUTOI/O离散PLC_S7Q0.0风机状态/命令HEAT_AUTOI/O离散PLC_S7Q0.1加热器状态/命令MODE_MANI/O离散PLC_S7I0.2手动/自动标志SYS_RUN内存离散无无组态画面启动标志I/O变量和内存变量最大的区别是I/O变量与PLC设备绑定组态王会主动和PLC通信去读写内存变量只在组态王内部使用。新手最容易犯的错是把所有变量都定义成I/O变量结果PLC没连上整个画面数据全部变成无效值。建议系统标志位、画面切换标志这类逻辑用内存变量只有真正和PLC交互的数据才用I/O变量。4.2 监控画面的设计与动画连接画面设计我按“总览层、控制层、报警层”三层来做。总览画面放一个大棚俯视图画两道大棚拱梁、两排植物架温度、湿度用两个大数字显示在顶部风机、加热器、卷帘、滴灌泵的图形分布在对应位置。所有设备图形都做好动画连接风机图标在运行时切换几种旋转状态管道用变色表示是否有水流。控制层画面放所有设定参数输入框和手自动切换按钮报警层放报警窗口和历史曲线。动画连接是组态王的精髓。“模拟值输出”连接用于显示温度、湿度数值“模拟值输入”连接用于参数设定文本框“离散量输出”连接用于指示灯亮灭“隐含”连接用于设备运行时显示、停止时隐藏。注意“模拟值输入”和“模拟值输出”方向完全不同一个是从画面上写值到变量一个是从变量读值显示到画面别选反了。我调试时就在风机转速显示上栽过跟头把输入输出搞反画面一打开就自动给PLC写了一个大数值差点把变频器烧了。4.3 命令语言与脚本逻辑组态王里很多交互动作需要写命令语言。比如窗口打开时初始化设定值、点击按钮切换手自动状态、温度越限时弹窗提示等。命令语言的语法类似C和Pascal的混合体变量名直接用数据词典里的名字就行。一段典型的脚本是这样的// 温度越限时弹出提示并自动置位报警 if (TEMP_REAL TEMP_H_SP MODE_MAN 0) { FAN_AUTO 1; ShowPicture(温度报警提示); } else if (TEMP_REAL TEMP_L_SP MODE_MAN 0) { HEAT_AUTO 1; }命令语言有几种挂载位置应用程序命令语言在工程启动后循环执行适合放实时判断画面命令语言跟随画面打开关闭执行适合初始化数据改变命令语言在某个变量值变化时瞬间触发适合做报警联动。我给“温度报警提示”“湿度报警提示”两个小弹窗用了数据改变命令语言给参数初始化用了画面打开时执行的语言逻辑分得清清爽爽。4.4 报警记录与历史趋势在数据词典里双击变量进入报警定义页面给温度和湿度变量设置上限、下限报警值。报警类型选越限报警级别设成“低级”“高级”按严重程度区分报警优先级留给重要变量。画面上放一个报警窗口控件运行时实时滚动显示当前报警再配置一个“报警历史”页面用报警控件的历史模式显示。组态王的报警窗口不需要写代码绑定好变量就行这部分很适合初学者快速出效果。历史趋势曲线需要先在系统配置里创建历史数据库在数据词典中把温度、湿度变量的记录方式改成“数据变化记录”或“定时记录”然后画面上拖入“历史趋势曲线”控件配置曲线颜色、时间轴范围、要显示的变量。存历史数据时采样周期不建议设太短大棚环境变化慢5到10秒采一次足够存太久反而浪费硬盘空间。5. 组态王与PLC的通讯及纯软件仿真5.1 通讯方式选择PPI、OPC还是Modbus组态王6.53和S7-200之间有三种常见通讯方式直接用PPI串口协议、通过PC Access做OPC中转、PLC端启用Modbus RTU从站然后用组态王的Modbus驱动读取。三种方式我都试过给个对比结论通讯方式优缺点适用场景PPI协议接线简单组态王有现成驱动但USB-PPI电缆兼容性差仿真器不支持有真实PLC和原装编程电缆PC Access OPC能读能写变量映射灵活但多一层中间件组态时地址容易绕晕熟悉OPC配置的工程师Modbus RTU开放标准、地址直观仿真器可用Modbus Slave模拟但PLC里需要调用MBUS库指令纯软件仿真和跨品牌对接我个人推荐第三种。S7-200里只要写两行初始化调用MBUS_INIT和MBUS_SLAVEPLC就当上了Modbus从站组态王用“莫迪康Modbus RTU”驱动直接读V区地址。这里地址映射有个规律VW0对应Modbus保持寄存器40001VW2对应40002依次类推。把程序里的关键数据全部放在V区组态王那边一个变量一个变量对应过来就行。5.2 没有真实PLC时怎么联调如果你手头只有组态王没有PLC可以用Modbus Slave模拟器来顶替从站。具体做法是在Modbus Slave软件里新建一个从站连接从站地址设成组态王设备配置里的地址寄存器类型选保持寄存器起始地址根据数据规划设好。然后手动给各个寄存器填充数值比如40001填250表示25.0℃。组态王画面刷新后如果通讯正常监控界面上温度数值就会跟着变。同时另一边PLC的程序逻辑丢给S7-200仿真器跑用MOVW赋值改变温度工程值观察风机、加热器的Q点有没有正确地置位、复位。两条验证线并行推进一条确认PLC逻辑正确一条确认组态王画面和数据库正确。最后联调时把两边的寄存器地址表拿出来逐行核对不存在地址偏差。这套“双轨仿真法”在我做过的几个项目里屡试不爽没有真实硬件也能把系统调到百分九十的状态。5.3 仿真转到现场的几个关键提醒从纯仿真切换到现场最容易翻车的地方就是地址映射不一致。仿真时Modbus Slave软件里寄存器的编号习惯和组态王寄存器定义可能差一位比如Modbus Slave里写40001组态王寄存器地址填写0或1不同驱动定义不同必须现场手动验证读到的数值是否与PLC实际值一致。我在一次联调中就是因为组态王寄存器地址多填了1读出来的温度全是错误的排查了整整半天。另外组态王里IO变量的采集频率不要设成最快。采集频率过高会导致组态王一直占用串口或网络资源画面卡顿CPU占用率飙升。设成100毫秒到500毫秒对于大棚温湿度这个变化速度完全够用。如果数据用于历史记录那采集频率和记录频率分开设置记录频率可以更慢一些。6. 现场调试与常见问题排查实录6.1 一张速查表解决大多数报错把调试两年里碰到的高频问题整理成一张速查表照着排查效率很高现象可能原因排查方法组态王显示温度数值不动IO变量类型错误或通讯未建立检查设备运行状态用“测试”按钮手动读值数值跳变严重变送器供电不稳或信号线未用屏蔽线用万用表量4-20mA信号是否稳定检查屏蔽层接地组态王不保存历史曲线变量未设置记录方式历史服务器未启动数据词典里勾选记录启动历史服务器PLC输出不动作中间继电器线圈坏、输出点被其他逻辑复位强制置位对应Q点检查接线和电源卷帘正反转都动不了互锁逻辑未复位或限位开关常闭点断开逐个查I0.3、I0.4状态检查接触器互锁模拟量显示满量程或零AIW接线短路/断路或EM231量程跳线错误查跳线设置用信号发生器送标准电流温度PID波动大采样周期太短或P参数过大拉长采样周期到10~30秒降低P值6.2 调试顺序和习惯调这种系统我养成了一套固定习惯先本地后远程、先手动后自动、先逻辑后画面。上电第一步在PLC侧短接信号源强制变送器给固定电流确认模拟量读数和换算公式正确。第二步把PLC切到手动模式用组态王界面上的按钮逐个点动继电器确认每个输出点都和现场设备一一对应。这一步非常关键我见过有人把风机和滴灌泵的接线接反了程序里开风机的时候浇水好在点动测试时发现得早。第三步才切自动模式把设定值设到正常范围附近观察系统能不能自己稳定下来。期间用组态王的历史趋势曲线和PLC的变量强制功能对照着看如果发现设备频繁启停检查回差参数是否太小。自动模式下还要故意制造一次超限情况比如把设定值临时调低确认报警能弹出来、风机能自动启动。6.3 两处容易忽略的优化点第一处组态王里的设备冗余。6.53支持设备冗余配置主设备通讯失败自动切换备用设备。如果现场有两台PLC做热备这个功能非常实用。就算只有一台PLC也建议在组态王的设备配置里把“通讯超时重试次数”设大一点避免现场电磁干扰造成一次通讯超时后画面就永久不刷新。第二处控制柜的浪涌保护。大棚周边雷雨季多电源模块输入端加一个浪涌保护器PLC的开关电源前端再串一个EMI滤波器。这两样东西加起来不到两百块钱但能保住上万块的PLC不被打坏。我实际处理过一次雷击故障邻居大棚的PLC主板直接烧穿我这套因为加了浪涌保护只是通信口临时丢了几帧数据重启就恢复了。最后再分享一个我自己的体会给这种系统做仿真验证时别老想着“仿真只是为了交作业”。把仿真当现场来对待把每一個寄存器映射、每一条报警规则、每一段互锁逻辑都当成真实对象来验收到现场后你会少走非常多弯路。大棚控制看起来就是个温湿度上下限的活儿可一旦上到设备、通信、报警、手自动切换这些层面复杂度马上就上来了。按文里这套流程从方案设计、PLC逻辑、组态画面、仿真联调到现场排查顺一遍整个系统基本就能稳稳地跑起来。