
1. 项目到底在做什么一次温室改造的完整拆解如果你搜过S7-200 PLC或者MCGS组态王那你很可能跟我一样接过毕业设计或者某个小型农业自动化项目。这套基于S7-200 PLC和MCGS组态王的温室大棚温湿度控制系统设计几乎是国内PLC入门项目里最经典的一道题。它不花哨但把工业控制里最核心的几件事全占了传感器采集、PLC逻辑处理、PID闭环调节、上位机画面监控、数据记录。先说清楚这套系统具体做什么。温室大棚里的作物对温度和湿度很敏感温度过高要开风机、开湿帘温度过低要开加热设备湿度过低要开喷雾加湿湿度过高要通风排湿。传统做法是人工去看温度计、摸土、凭经验开关设备人累不说控制还不及时。这套系统就是把这些活儿交给PLC去判断再由MCGS或组态王组态的电脑/触摸屏显示实时数据、历史曲线让操作员坐在监控室里就能看完整个棚的情况也能手动远程启停设备。这个项目适合谁两类人。第一类是自动化、电气类专业的在校生拿它做课程设计或毕业设计麻雀虽小五脏俱全很好答辩第二类是真正搞农业自动化施工的工程师想快速搭一套低成本、可复制的温室监控方案。我自己当年也做过类似项目后面在好几个现场又改过几版踩过的坑不少这篇就按照实际动手的顺序把硬件选型、PLC程序、上位机组态以及调试时的坑都讲透。2. 系统方案设计与硬件选型2.1 整体架构从传感器到上位机要走通一条什么链路任何一套监控系统本质上都是数据的单向或双向流动。这套温室系统从底往上分四层现场设备层、采集与控制层、通讯层、监控层。现场设备层就是温湿度传感器、风机、湿帘水泵、加热器、喷雾泵这些实际干活的家伙。采集与控制层是核心的S7-200 PLC它负责读传感器的数据、做逻辑判断、输出开关量去控制继电器和接触器。通讯层是PLC与上位机之间的桥梁老款S7-200 CPU自带一个RS-485口默认走PPI协议上位机通过USB-PPI编程线或者CP卡连接。监控层就是装了MCGS或组态王的电脑或者MCGS嵌入版触摸屏显示画面、存历史数据、下发设定值。这个架构看起来很常规但有个地方要注意S7-200本身不带以太网口这里说的是老款200不是200 Smart所以如果你想用网线连组态王必须加CP243-1以太网模块成本一下子上去了。多数课程设计和现场小项目都直接用PPI或者西门子S7-200的PC Access作为OPC通道够用也不用额外花钱。2.2 为什么选S7-200而不是三菱FX系列或台达这个题目既然指定了S7-200那咱们就顺着选型逻辑聊。S7-200虽然官方早就宣布停产了但国内存量极大二手市场、学校实验室、老项目里到处都是。它的指令系统简单梯形图风格直白尤其是定时器、计数器、PID指令比三菱的编程理念更好理解。对新手来说Micro/WIN编程软件或者现在的STEP 7-MicroWIN SMART兼容版使用门槛低网上教程一抓一大把。另一个现实原因是兼容性。MCGS和组态王都内置了S7-200的PPI驱动这是它们的老传统了。你新建设备时选择西门子S7-200 PPI填一下COM口号和站地址数据就能读上来。如果用三菱PLC走串口需要配置的协议细节更多组态王对三菱的驱动虽然也有但调试时没PPI这么顺。所以这个题目本质上是一个最不折腾的组合PLC选老牌的S7-200上位机驱动成熟传感器用电流型变送器控制回路用继电器。整套系统的风险点基本都集中在通讯和PID上而不是硬件本身。2.3 温湿度传感器选型与信号类型传感器是整套系统数据的源头。温室大棚里最常见的方案是壁挂式温湿度变送器输出4-20mA或0-10V也有用RS-485通讯输出的。如果是做毕业设计或者实验室演示我强烈建议选4-20mA电流型的原因是PLC模拟量模块读电流信号最稳抗干扰能力强而且断线时电流会掉到0mA左右有的模块能检测到断线报警排查问题方便。但这里有个坑S7-200的模拟量输入模块比如EM231或CPU自带的模拟量通道读的是电压信号0-10V或0-5V和电流信号0-20mA。选传感器之前必须确认变送器的输出形式能不能和模块的量程对上。很多同学买了个4-20mA的传感器结果接线时忘了在模块端并联一个250欧姆电阻来把电流转成1-5V电压数据死活读不对就是这个原因。选择量程也要提前考虑。温室大棚的温度范围一般设0-50摄氏度湿度范围0-100%RH。变送器的精度通常±0.5摄氏度和±3%RH足够了。如果是实际农业现场还要考虑传感器的防护等级至少IP65毕竟棚里经常喷水雾、打药传感器外壳不防水很快就报废。2.4 PLC IO点表规划规划IO点是PLC项目的第一步也是最容易返工的地方。以一套标准的温室大棚控制为例假设现场设备是2台风机降温通风、1台湿帘水泵、1台加热器、1台喷雾加湿泵、1个声光报警器。传感器有1路温度、1路湿度。开关量输出其实就5个分别是风机1、风机2、湿帘泵、加热器、喷雾泵加上报警输出是6个DO。预留一点余量CPU选用S7-200 CPU224自带14DI/10DO输出是继电器型的可以直接接中间继电器挺方便。模拟量输入需要2路CPU224自带2路AI不需要额外扩展EM231成本又省了一块。这里有个重要提醒CPU224自带的模拟量通道只有2路而且精度一般。如果后面想加光照传感器、土壤湿度传感器通道不够就需要扩展EM231。所以在项目刚开始时建议把IO表做到1.5倍余量比如预计10个点就留到15个。不然等项目做了一半才想到要加设备要么换CPU要么加模块布线、程序、上位机全部要跟着改。3. 上位机组态实操MCGS与组态王的双线方案3.1 MCGS和组态王到底用哪个MCGS组态王放在一起说很容易让人以为是一个东西。实际上MCGS昆仑通态和组态王北京亚控是两家公司的两个产品线都做组态软件但侧重不同。MCGS嵌入版可以运行在触摸屏上也可以生成Windows运行环境组态王则是纯PC端组态软件主打上位机监控历史库和报表功能很强。做温室大棚项目我的建议是如果你有触摸屏直接上MCGS嵌入版如果只是用电脑监控就用组态王。两者读S7-200的方式略有差别但思路一致在设备窗口或IO设备里添加西门子S7-200 PPI配置串口和站号然后在变量定义里关联PLC的寄存器地址。这套系统设计时往往是MCGS组态王都拉进来作为备选。因为课程设计说明书里写两个软件对比分析显得工作量饱满实际项目里则选一个落地。这篇我把两个软件的流程都写一下反正核心都是连PLC、建变量、画画面、做控制。3.2 MCGS嵌入版组态流程从新建工程到出画面MCGS嵌入版的项目文件后缀是mcg运行在Windows或者触摸屏里。新建工程之后核心步骤有这么几步。第一步配置设备窗口。在设备窗口里添加通用串口父设备再添加子设备西门子S7-200PPI。父设备的属性里要设置串口号、波特率、数据位、校验位默认是COM1、9600、8、偶校验。S7-200的PPI协议默认站号是2波特率9600所以这些参数一般不用动。第二步定义变量。在实时数据库里新建变量比如温度PV湿度PV温度SP湿度SP风机1手/自动等。每个变量要选对类型PV值是数值型开关状态是开关型。然后在设备窗口里把变量和PLC寄存器地址关联起来。温度PV对应AIW0湿度PV对应AIW2这是模拟量输入寄存器设定值SP可以存在V区比如VW100、VW102。特别注意MCGS里的地址类型要选对比如VW是字VW100对应的PLC地址就是VW100不要填成VD或者VB否则数据会错位。第三步组态画面。MCGS的用户窗口里可以画温室大棚的示意图用图库里的风机、水泵、管道等元件再配合流动块来表现管道里水在流动。温度、湿度用仪表盘或者数码管显示设定值用输入框。按钮做手自动切换时把按钮的弹起/按下动作关联到对应的开关变量比如按一下写1再按一下写0。第四步做报警和曲线。MCGS的报警显示控件可以直接关联温度高报警、湿度低报警等事件。历史曲线控件要设置数据来源为实时数据库的变量同时要在运行策略里加一个定时存盘策略每隔几秒把数据写入历史库。这个存盘策略很多人会忘结果画面上曲线拉出来一片空白以为软件坏了其实就是没设置存盘周期。3.3 组态王连接S7-200的配置重点讲透组态王的操作逻辑和MCGS不太一样它把设备和变量绑定得更紧密。打开组态王6.55或6.60首先在工程浏览器左侧树里找到设备双击新建设备驱动列表里选PLC下的西门子S7-200的PPI驱动。这里有一个极易出错的地方组态王会提示你输入设备地址这个地址就是PLC的站地址默认填2。如果PLC程序里的站地址改过比如改成了5这里必须保持一致否则通讯失败。然后设置通讯参数串口、波特率、数据位、停止位、校验位。组态王默认偶校验、9600和S7-200出厂设置一致。如果之前有人用Micro/WIN改过PLC的通讯端口参数千万记得要和组态王里填的一致这是我这几年看别人调试翻车最多的点。接下来定义变量。组态王里新建变量的类型一定要选I/O实数或者I/O整数不能选内存变量。内存变量只在组态王内部用不跟PLC通讯。每个I/O变量都要被分配到某个设备上然后填寄存器地址。组态王读寄存器的方式稍微有点绕比如要读S7-200的VW100在组态王里填地址时要用V100这样的格式有些版本还要加上寄存器类型前缀。初次用的人很容易在这卡住建议先在帮助文档里查一下S7-200 PPI的寄存器定义表照着填。画面组态则比MCGS更丰富组态王的图库里有大量农业、工业图元还有动画连接功能。比如你画一个风机想让它在PLC输出Q0.0为1时旋转起来就双击这个图元在动画连接的隐含或者旋转那里关联变量Q0.0。这样上位机画面就活了。4. PLC程序编写与PID控制细节4.1 梯形图总体结构从采集到输出的逻辑主线S7-200编程使用Micro/WIN软件程序分主程序、子程序和中断程序。建议把所有功能都放在主程序里用网络Network按顺序组织这样调试和监控都方便。温室大棚这类简单项目没必要上太复杂的模块化结构。程序逻辑主线如下读取模拟量用MOVW指令把AIW0、AIW2的值移动到VW里备用。模拟量工程量转换PID指令和上位机显示都需要真实物理值所以要把0-32000的原始值转换为0-50摄氏度和0-100%RH。这里可不是简单除以一个系数还要考虑4-20mA对应0-32000的一部分。具体转换公式我后面详细说。手动模式上位机或触摸屏上切换手/自动手动模式下操作员直接点按钮启停继电器输出。自动模式自动模式下温度高报警、低报警比较温度超限就开风机/加热湿度超限就开喷雾/通风这是最简单的两位式开关量控制。PID连续调节如果执行机构是变频器或模拟量阀门就用PID指令输出0-32000的数字量给模拟量模块。温室项目如果只是继电器开关设备其实用不上PID但题目既然强调了温湿度控制我一般会把PID作为可选功能做进去。Network 1 // 读取模拟量原始值 LD SM0.0 MOVW AIW0, VW0 MOVW AIW2, VW2这里的SM0.0是常ON标志每个扫描周期都执行。模拟量原始值是一个16位有符号整数西门子200的AIW范围是0到32000对应0到20mA或0到10V具体对应哪个要看你模块的量程跳线。这个细节后面细讲。4.2 模拟量工程量转换为什么温度总是显示不对很多同学第一步就卡在模拟量转换上。AIW0读到的数值比如是6400这不是温度值它只是一个原始数字量。要得到真实温度需要做线性变换。公式是工程量 (原始值 - 零偏) / (满量程 - 零偏) × (量程上限 - 量程下限) 量程下限以4-20mA、0-50摄氏度的传感器为例S7-200的模拟量模块把4mA对应为640020mA对应为32000这是西门子的经典对应关系6400对应4mA32000对应20mA。所以温度 (AIW0 - 6400) × 50.0 / (32000 - 6400)也就是温度 (AIW0 - 6400) / 512.0湿度同理湿度 (AIW2 - 6400) × 100.0 / (32000 - 6400) (AIW2 - 6400) / 256.0但PLC的整数运算没法直接处理小数所以实际编程要先把差值转成实数再参与乘除。还要注意AIW0是整数要先用ITD转成双整数再用DTR转成实数否则减法结果被截断精度就没了。下面这段代码我就常放在子程序里Network 2 // 温度工程量转换 LD SM0.0 ITD AIW0, VD10 // 整数转双整数 DTR VD10, VD14 // 双整数转实数 MOVR VD14, VD18 // 保存原始实数 MOVR VD18, VD22 // 分支处理 -DR 6400.0, VD18 // 减零偏 *R 50.0, VD18 // 乘以量程上限 /R 25600.0, VD18 // 除以满量程跨度值 // 注意这里是(32000-6400)25600 MOVR VD18, VD30 // 温度PV单位摄氏度这里VD30就是上位机要读的温度值也是后面PID或者比较指令要用的数据。如果你觉得这样转换逻辑复杂也可以用西门子库里面的SCALING子程序但自己写一遍更容易理解原理。4.3 PID回路参数与温控振荡问题温室大棚如果用到PID一般是用在加热阀或者变频风机的连续控制上。S7-200的PID指令位于库函数里需要调用PID向导来生成。PID向导会让你指定给定值、过程变量、输出值的V区地址还会自动生成PID中断程序非常方便。PID参数整定是另一大痛点尤其是温度PID波动温差大如何调节这个热搜词问的人太多了。PID调试的本质是调比例P、积分I、微分D三个参数。温度系统惯性大响应慢P不能太大否则温度会来回震荡I用来消除稳态误差但I太大会导致超调D可以抑制超调但对测量噪声敏感现场如果传感器信号不稳D反而会把扰动放大。我通常的做法是先设P为一个中间值比如1.0左右I设很大作用很弱D设为0看阶跃响应然后慢慢减小I让系统出现等幅振荡的临界状态再往回退一点。温度PID的积分时间往往要几十秒甚至几分钟别急着调完马上看效果至少等系统稳定一个周期。很多人在现场越调越乱就是因为温控对象延迟太大还没等到系统反应就继续调参数结果参数越调越离谱。话说回来对于只控制风机、水泵开关的温室项目直接用带回差的两位式控制可能更实用。比如温度高于28度开风机低于26度停风机2度的回差能避免设备频繁启停。用比较指令实现就行不需要PID那套复杂逻辑。4.4 手自动切换与安全互锁现场设备不能只有自动模式紧急情况下操作员需要手动直接控制。我一般用M0.0作为自动模式标志位M0.1作为手动模式标志位两者互锁。上位机按自动按钮时置位M0.0并复位M0.1按手动时反过来。然后每个输出点比如风机Q0.0自动逻辑和手动逻辑并联在一起Network 10 // 风机控制 LD M0.0 // 自动模式 A VW100 // 温度设定值这里省略比较指令示意 M10.0 LD M0.1 // 手动模式 A M1.0 // 手动启动按钮 O M10.0 Q0.0安全保护不能少。风机和湿帘泵是联动的如果风机没开湿帘泵就不能启动否则水汽排不出去棚里湿度会爆表。加热器和风机最好也做联锁防止一边加热一边强力通风能源全浪费了。报警输出也要有延迟比如温度超过上限5秒钟才触发报警避免短时过冲导致误报。5. 调试经历与常见问题排查实录5.1 通讯连不上、数据不动90%是这三类原因我做过的项目中上位机连不上PLC、数据不刷新是最常见的故障而且原因就那么几类。第一类是物理链路问题。USB转RS-485的线接触不良、COM口号不对、驱动没装好。很多人插上USB转串口线设备管理器里显示的COM号可能是COM4或更高但组态软件里默认是COM1不改当然连不上。这个问题在调试现场简直刷屏。第二类是通讯参数不一致。PLC侧Micro/WIN里的PPI端口波特率如果被改成了19200或38400而上位机软件里还是默认9600那数据就全乱了。所以接设备前先用Micro/WIN在线看一次PLC通讯参数确认波特率、站号然后把这组参数原封不动地填到MCGS或组态王里。第三类是寄存器地址写错。组态王里地址格式和MCGS不完全一样比如同样读VW100不同版本可能要写V100或者VW100。还有数据位长度不对比如PLC里写的是VD32位浮点上位机却按VW16位整数来读读出来的数就会很奇怪。建议在调试时上位机先加一个原始值显示框直接显示PLC某个寄存器的原始数值再和PLC监控表对比一步就定位问题。5.2 温湿度控制滞后、超调大怎么调整温湿度控制的难点在于对象的大惯性。大棚体积大温度变化慢湿度又受天气影响很大。用两位式控制时如果回差设得太小比如0.5度压缩机和风机会频繁启停接触器一个月就可能烧坏。我把回差调大到2-3度设备启停次数明显下降温湿度波动虽然大了一点但完全在农业允许范围内。如果是PID控制温控超调大一般有三个调整方向减小P、增大I、适度引入D。特别提醒温度PID的采样周期要长一点S7-200的PID向导默认采样时间是1秒对温室来说1秒都嫌短建议设成5-10秒。采样时间过短微分项会在噪声上放大输出抖动非常明显。这个参数藏在PID向导的回路采样时间选项里很多人不知道其实它是温控稳定性的关键。另外PID输出和实际设备之间如果控制的是阀门或变频器要确认模拟量输出模块的量程和PID输出量程一致。S7-200的输出AQW范围是0-32000PID向导会直接把输出值写到AQW寄存器。如果执行机构是0-10V变频器那么AQW 0-32000对应0-10V刚好匹配不用额外换算。如果现场有硬件滤波或者需要做输出限幅再在程序里加一步就可以了。5.3 现场其他容易被忽略的坑我最后列几个我亲身踩过的坑希望你们别重复交学费。第一个坑是继电器触点容量。S7-200 CPU224的继电器输出触点容量是2A直接接接触器线圈没问题但如果接的是大功率设备一定要加中间继电器或者接触器过渡否则触点很快就拉弧烧黑。第二个坑是模拟量线要用屏蔽双绞线而且屏蔽层要单端接地。温室大棚里的变频器、电机都是干扰源如果模拟量线随便走线AIW读数会跳得很厉害PID抖动、数据显示漂移你怎么调程序都没用。一定要把模拟量线和动力线分开穿管距离至少20厘米以上这是最便宜的抗干扰手段。第三个坑是传感器安装位置。不能把温湿度传感器放在风口直吹的地方也不能放在太阳直射的地方否则测得的数据不能代表整个棚的平均温湿度。我见过一个项目传感器放在湿帘旁边湿度常年显示95%系统以为加湿够了其实另一边植物都快干死了。传感器放在大棚中央、离地1.5米左右的百叶箱里才是合理的做法。第四个坑是断电数据保持。S7-200的V区默认不保持断电后设定值可能丢。如果你在触摸屏上设置了温度上、下限一断电全清零程序还能跑但上位机显示又变回默认值了。解决办法是在系统块里设置V区的断电保持范围。比如VW100到VW200都设成保持这样设定的参数下次上电还能用。这个问题不出大故障但很影响使用体验。6. 最后再交代几句做这套系统的过程中我最大的体会是看似简单的温湿度控制真正做好并不容易。硬件选型、通讯配置、PID整定、现场抗干扰每一个环节都可能成为翻车点。但反过来想正因为坑多项目做完之后你对PLC整个体系的理解会上一个台阶。至少往后你看到任何组态软件第一反应都是去查它怎么连PLC、变量地址怎么映射、驱动支不支持你的寄存器类型这套思维是相通的。如果你是在做课程设计我建议不要把重点放在华而不实的3D画面上老老实实把控制逻辑做对、把PID参数说明白、把调试过程写详细答辩老师问起来你也能理直气壮。如果你是在做实际项目我更建议你在做系统之前先去现场待两天看看温室里实际的设备布局、线路走向和操作习惯很多设计问题在做之前就能避开。最后分享一个小技巧无论是MCGS还是组态王做的第一个画面都别太复杂先放一个原始数据框和几个调试按钮把通讯链路打通之后再慢慢丰富画面。链路没通之前画面再漂亮都是空壳。这个习惯帮我省了很多无谓的来回修改也让我每次接手新项目时都能快速定位问题到底出在PLC侧还是上位机侧。希望这篇分享能让你少走几次弯路。