撸起袖子搞工控的人都知道,温室大棚这东西对自动化要求贼高。这半年我一直在折腾一套基于西门子S7-1200的温室大棚远程监控系统,梯形图前前后后画了三百多步,从最初的I/O分配、模拟量换算,到后面的手自动切换、报警锁存,再到远程通信、上位机展示,每一步都有不少坑。今天不聊那些高大上的理论,就挑几段我自己都反复改过好几遍的梯形图片段,把里面涉及到的思路、选型、调试细节和现场碰到的实际问题捋一捋。这套东西不算复杂,但对于打算自己动手做农业自动化、温室控制或者类似的远程监控项目的人来说,应该能提供一份还比较完整的参考。
1. 温室大棚控制系统的整体设计思路
1.1 环境需求拆解:大棚要控制的远不止温度
搞温室大棚自动化,很多人第一反应是“不就是控个温度嘛”。真到现场看一眼就明白了,大棚里的环境变量非常多,温度只是其中一个。湿度、光照强度、土壤含水量、二氧化碳浓度、风速、雨雪状态,这些东西都会互相影响——中午太阳一晒,棚内温度迅速飙升,同时光照过强可能灼伤作物;如果同时打开风机和湿帘,湿度又会明显上升;晚上气温骤降,又要考虑卷帘保温和加热设备。再加上春季这种“一天过四季”的天气,靠人工跑现场拉卷膜、开风机,根本忙不过来。
所以我在设计这套系统时,把控制对象分成四类:
- 执行设备:风机、湿帘水泵、内外遮阳电机、卷膜电机、顶部开窗电机、加热设备、补光灯;
- 传感设备:温湿度传感器、光照传感器、土壤湿度传感器、风速传感器、雨雪传感器;
- 控制核心:西门子S7-1200 PLC,负责采集所有传感器信号,根据设定逻辑控制执行设备;
- 人机交互与远程:现场触摸屏、PC上位机、手机/电脑远程查看和操作。
这套系统的核心目标不是“全自动”,而是“减轻人工负担+数据可追溯”。说白了,就是把原来靠经验、靠感觉去开关设备的活,变成按设定阈值和逻辑自动执行,同时把大棚内的数据记录下来,后期种什么、怎么调,都有据可查。
1.2 为什么选S7-1200而不是S7-200 SMART或S7-1500
选型这件事,我做项目时一般会先问自己三个问题:点数够不够、通讯够不够、成本合不合适。这套大棚系统的模拟量点数大概在10个左右,数字量输入输出加起来20多个,用S7-200 SMART其实也能勉强做,但我最后还是选了S7-1200,原因是:
- 以太网接口原生集成。S7-1200的CPU自带PROFINET/以太网口,后面做远程监控、连触摸屏、连上位机都非常方便,不需要额外配通讯模块。S7-200 SMART虽然也有网口,但整体协议和扩展能力比1200还是差一截。
- 模拟量处理更顺手。S7-1200配合SM1231模拟量模块,分辨率、抗干扰能力和TIA Portal里的标准化指令(NORM_X/SCALE_X)都很成熟,编程效率高不少。
- 程序容量和扩展空间更充裕。三百多步梯形图在S7-200 SMART里也能放得下,但以后想加配方、加PID、加数据记录、加远程Web功能,S7-1200的余量更足,不至于一开始就被硬件限制死。
- 生态和资料更友好。TIA Portal用起来虽然比STEP 7 Micro/WIN重,但网上资料多,遇到问题好排查,对独立开发者和小型项目团队比较友好。
S7-1500当然性能更强,但价格摆在那里,对于一套单体大棚的监控系统来说属于杀鸡用牛刀。S7-1200在这个项目里是性能和成本比较折中的选择。
1.3 系统拓扑与控制流程
整体架构上我采用了经典的三层结构:
- 现场设备层:传感器和执行器;
- 控制层:S7-1200 PLC(CPU 1214C DC/DC/DC + SM1231模拟量模块 + SM1223数字量模块);
- 监控层:KTP700触摸屏、PC上位机、远程云平台。
控制流程其实就是一个典型的“采集-判断-输出”循环:PLC周期性读取传感器数据,经过工程量换算后和设定值比较,结合当前是手动模式还是自动模式,决定对应的风机、水泵、电机是启动还是停止。为了防止设备频繁启停,所有阈值判断都加了滞回区间,比如温度高于28℃开风机,降到25℃才停,避免风机在临界点来回跳。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 硬件配置与I/O分配实战
2.1 模块选型与接线要点
PLC主机我选的是CPU 1214C DC/DC/DC,供电24V DC。这个型号自带14路数字量输入、10路数字量输出,对这套系统来说正好覆盖了一部分开关量,不够的地方通过SM1223(8DI/8DO)扩展。模拟量方面选了SM1231(4AI),两块组在一起就是8路模拟量输入,覆盖温湿度、光照、土壤湿度、风速这些常用传感器。
接线上的几个关键经验:
- 模拟量信号线必须用屏蔽双绞线,而且屏蔽层要单端接地。我之前有一路光照传感器信号一直飘,查了半天发现是屏蔽层两端都接地了,形成地环路,把单端接地改掉之后信号立刻稳定了。
- 4-20mA信号比0-10V信号抗干扰能力强,能用4-20mA就不要用0-10V。温差较大、变频器比较多的现场,电压信号很容易受到干扰。我把大部分传感器都选择了4-20mA输出,只有个别只有电压输出的才用0-10V。
- 数字量输出带感性负载(接触器线圈、继电器)时,一定要并联续流二极管或RC吸收回路,否则断电瞬间的反向电动势会打坏PLC输出点。实际项目中我就在输出端子排上并了二极管,一个很小的元件,能省很多麻烦。
- 24V电源要单独供电,最好和接触器、风机的动力电分开走线。很多现场干扰问题源头都是电源没隔离。
2.2 I/O点表怎么规划最合理
做任何PLC项目,第一步都是列I/O点表。这个项目我做了如下分配:
| 信号类型 | 地址 | 说明 |
|---|---|---|
| DI | I0.0 | 手动/自动切换开关 |
| DI | I0.1 | 急停按钮 |
| DI | I0.2 | 卷膜电机上限位 |
| DI | I0.3 | 卷膜电机下限位 |
| DI | I0.4 | 风机热继电器(故障) |
| DI | I0.5 | 水泵热继电器(故障) |
| DI | I0.6 | 雨雪传感器 |
| DI | I0.7 | 预留 |
| AI | IW64 | 棚内温度1(4-20mA) |
| AI | IW66 | 棚内湿度1(4-20mA) |
| AI | IW68 | 光照强度(4-20mA) |
| AI | IW70 | 土壤湿度1(4-20mA) |
| DO | Q0.0 | 风机接触器 |
| DO | Q0.1 | 湿帘水泵接触器 |
| DO | Q0.2 | 卷膜电机正转(开膜) |
| DO | Q0.3 | 卷膜电机反转(关膜) |
| DO | Q0.4 | 外遮阳电机正转 |
| DO | Q0.5 | 外遮阳电机反转 |
| DO | Q0.6 | 报警指示灯 |
| DO | Q0.7 | 预留 |
我列点表时一定会预留20%左右的空间,不管是DI、DO还是AI都留了余量。实际项目做到后期想加点功能(比如再加一路电导率传感器、加一个滴灌电磁阀)是非常常见的事,没有余量就只能加模块,成本一下就上去了。另外点表里我特意把急停和限位开关安排成常闭接入,这样线路断开时PLC能识别为触发信号,避免“断线了都不知道”的安全隐患。
2.3 触摸屏与PLC的变量对应
现场触摸屏用的是西门子KTP700,和S7-1200之间通过PROFINET连接,组态时直接导入PLC变量,不用一个一个重新建点。这个很省事,但有一点需要注意:触摸屏里最好建独立的“画面变量”,不要直接在画面元素上绑定PLC地址。我一开始图省事,所有按钮直接绑PLC的M区,后来改动程序时变量地址有调整,触摸屏里全部要重新关联,差点没被折磨死。后来学乖了,触摸屏每个输入框、指示灯都建立一个内部变量,再通过PLC侧的程序同步,改动起来灵活得多。
3. 梯形图核心片段拆解
3.1 模拟量采集与工程量换算
这是整个梯形图里最基础也最要紧的一段。传感器输出4-20mA电流信号,SM1231模块把它转换为0~27648的整数(16位有符号整数)。但我们要在程序里显示的是“温度值”,比如26.5℃,这时候就需要把原始值换算成工程量。
换算方法各种资料里都有,关键是用S7-1200的标准化指令NORM_X和缩放指令SCALE_X,比手动写四则运算方便且不容易出错。我的做法是:
- NORM_X:把IW64的原始整数(INT)标准化为0.0~1.0之间的REAL值;
- SCALE_X:再把0.0~1.0映射到温度传感器量程,比如-40.0~80.0,输出就是实际温度值。
对应的TIA Portal程序片段大致是这样的:
code复制"温度1_原始" (INT) -> NORM_X (INT to REAL, MIN=0, MAX=27648) -> "温度1_归一化" (REAL 0.0~1.0)
"温度1_归一化" (REAL) -> SCALE_X (REAL to REAL, MIN=-40.0, MAX=80.0) -> "棚内温度1" (REAL)
有一点要注意:传感器断线时,模拟量模块读到的值会异常偏低(接近0)或偏高,如果不做处理,程序会把断线误判成极低温度,从而触发加热设备全开,后果很严重。所以我在每次换算之后都会加一个有效性判断:如果原始值小于500(即约1.8mA以下),就认为传感器断线或异常,此时不仅不参与控制,还要在触摸屏和上位机上显示“传感器故障”报警。
3.2 手自动切换与设备互锁
手动/自动切换是现场操作人员一定会用的功能。自动模式下,PLC根据设定值自动启停设备;手动模式下,操作员可以在触摸屏或现场按钮盒上直接控制每台设备。这个功能听上去简单,实际编程时容易出问题的地方在于:两种模式之间的切换要平滑,设备状态要同步,不能抖。
我的做法是给每个设备设计一个“控制字”和“状态字”:
- 手动模式时,触摸屏按钮直接置位/复位设备的启动命令;
- 自动模式时,由温度、湿度等条件判断逻辑去置位/复位启动命令;
- 两条路径都汇入同一个“输出使能”逻辑,最后再去控制Q点。
这样做的好处是,模式切换时不会出现设备状态“咔”一下跳变,切换的瞬间输出不会产生误动作。比如风机在自动模式下已经启动了,这时候切到手动,风机不会突然停掉,而是保持在当前状态,由操作员接管。
设备互锁这块更关键。卷膜电机和外遮阳电机都是正反转控制,如果正转和反转输出同时为ON,会直接短路烧坏接触器和电机。梯形图里除了机械接触器互锁,程序上也要做软件互锁:
code复制Q0.2(开膜)的线圈回路串入 Q0.3(关膜)的常闭点
Q0.3(关膜)的线圈回路串入 Q0.2(开膜)的常闭点
同时还要接入限位开关。当卷膜电机运行到上限位时,I0.2断开,正转输出被切断,电机停止;下限位同理。这条逻辑我调试时专门试用过,如果没有限位保护,手动试机时电机转到头还在转,卷膜杆会直接卡坏,非常危险。
3.3 温室加热与降温的滞回控制
加热和降温是一个典型的滞回控制场景。假设目标温度是25℃,如果PLC只做一个简单的“低于25℃开加热、高于25℃关加热”,那么温度会在25℃附近疯狂抖动——加热器频繁启停,不仅费电,还容易损坏接触器。
我在程序里给加热和降温分别设置了两组阈值:
- 加热:温度低于20℃启动加热,高于23℃停止加热;
- 降温:温度高于28℃启动风机/湿帘,低于25℃停止风机/湿帘。
中间这3℃左右的“死区”让执行设备不会频繁动作,而且充分利用了环境本身的缓冲能力。这个阈值在现场是可以根据季节和作物品种调整的,我在触摸屏上做了设定页面,操作员不用改程序就能调。
对于湿帘控制还额外加了一个条件:只有当温度高于28℃且棚内湿度不是特别高时,才允许启动湿帘水泵。因为湿帘一开,棚内湿度会明显上升,遇到连续阴雨天,本来湿度就大,再开湿帘反而容易滋生病害。这个小逻辑是种大棚的老师傅提醒我的,属于典型的“现场经验进程序”。
3.4 报警锁存与故障复位
报警处理这部分,三百多步梯形图里占了将近四分之一。我设计了几类报警:
- 传感器断线/超量程故障(每个模拟量通道独立判断);
- 设备过载故障(热继电器常闭点信号);
- 卷帘电机堵转/限位失灵(通过运行时间和限位信号综合判断);
- 通信超时报警(远程通信心跳丢失后置位)。
报警逻辑我用的是RS触发器锁存,一旦条件触发,报警标志位就一直保持,直到操作员确认故障排除后手动复位。这样做的原因很简单:很多瞬时故障如果不锁存,操作员根本看不到,等设备坏了才反应过来就晚了。比如风机热继电器偶尔因为电压波动跳闸,如果PLC只在跳闸那一瞬间捕捉到信号,操作员去看的时候可能已经复位了,反而找不到原因。
梯形图里每个报警都对应一个M区或者DB块里的Bool变量,通过触摸屏显示具体报警内容,同时Q0.6报警指示灯会闪。远程监控那边也会推送报警消息。
3.5 用DB块管理项目数据的习惯
写三百多步梯形图的过程中,我最大的体会是:变量管理比画梯形图本身更重要。如果所有数据都散落在M区和I/Q区,程序稍微一复杂就乱成一锅粥。我专门建了一个全局数据块“DB_COMMON”,把温度设定值、湿度设定值、报警阈值、设备启停状态、传感器当前值都放在里面,每个变量都有注释。梯形图读程序时只需要集中看这个DB块,调试监控时也只需要加这一个数据块到监控表,清爽太多了。
4. 远程监控系统的搭建和通信实现
4.1 远程监控方案怎么选
远程监控是这套系统另一个核心需求。大棚位置通常在郊区,人不可能一直盯着触摸屏,手机上看数据、接报警才是刚需。我在做方案之前对比过几种方式:
- PLC自带Web Server:S7-1200支持通过网页访问内部数据,配置简单,但功能有限,页面很朴素,只能看数据不能做太复杂的交互,适合应急查看。
- PC上位机+组态软件:在园区内部署一台工控机,用WinCC或组态王做监控画面,功能强大,但只能局域网访问,远程需要配合其他转发,而且授权费用不低。
- 4G DTU + 云平台:PLC通过Modbus TCP或有线以太网把数据传给4G DTU,DTU再通过运营商网络把数据推到云平台,手机和电脑通过云平台查看和控制。这个方案不依赖现场宽带,大棚这种地方最合适。
- MQTT网关直连云平台:部分新代网关支持PLC协议转MQTT,直接对接阿里云/腾讯云的物联网平台,架构更简洁,但需要一定的云平台开发能力。
综合现场条件和开发量,我最后选择了“4G DTU + 云平台”这套组合。具体是:S7-1200通过以太网连接到4G DTU,DTU内置了Modbus TCP从站功能,云平台侧以Modbus TCP主站的身份去读取PLC里的数据。整个过程不涉及公网IP映射,也不依赖第三方动态域名服务,只要DTU能上网,数据就能上来,稳定性比较可靠。
4.2 PLC侧通信程序怎么处理
虽然4G DTU可以直接通过Modbus TCP采集PLC中的数据,但为了通信的灵活性和可维护性,我在PLC侧还是做了两个准备工作:
-
把需要远程监控的数据集中映射到连续的保持寄存器区。云平台采集时只需要读一段连续的Modbus地址,不需要逐个点去对应。比如我在DB_COMMON里建了一个数组,把温度、湿度、光照、土壤湿度、设备状态、报警标志按固定顺序排列,然后通过S7-1200的Modbus TCP库函数(MB_SERVER)对外开放。云平台那边读这个数组,一次就能拿到所有关键数据。
-
定义心跳寄存器。我在映射表里放了一个专门用于心跳的寄存器,PLC程序里每秒钟让它自加1,云平台检测到这个值持续变化就认为PLC在线;如果超过30秒没变化,就判定通信异常,触发离线报警。这个设计非常有用,有几次现场4G卡流量用完了,我第一时间就收到了离线报警,避免“以为还在控制其实早就失联”的尴尬。
4.3 上位机与数据库设计
云平台负责传输和展示实时数据,但历史数据存储和统计我自己做了一套小型上位机系统。上位机通过API从云平台拉取数据,存到本地的SQLite数据库里。为什么用SQLite而不是MySQL?因为单机运行、数据量不大、部署简单,SQLite完全够用,省去安装数据库服务的麻烦。
数据库里我建了三张表:
- 实时数据表:存最新的传感器值、设备状态、通信状态;
- 历史数据表:按分钟粒度记录所有关键变量,用于回看曲线;
- 报警记录表:记录每次报警的触发时间、恢复时间、报警类型和值。
上位机界面上有几个核心页面:实时总览(卡片式展示当前温度、湿度、光照等)、历史曲线(按时间段画出温度变化曲线和光照曲线)、设备控制(手动模式下用来远程控制风机、水泵)、报警中心(按时间列出所有报警记录)。这套上位机我用了C#开发,开源的图表控件画曲线,数据显示刷新频率设定为5秒一次,既能看到实时变化,又不会给4G流量造成太大压力。
4.4 远程控制的权限安全
能做远程控制,权限就必须严肃对待。云平台一侧我设置了账号密码和操作权限分级:
- 普通账号:只能查看实时数据和历史曲线;
- 管理账号:可以远程启动/停止设备;
- 管理员账号:可以修改阈值参数、添加用户。
PLC侧也做了保护:远程控制命令不是直接写Q点,而是先写入DB_COMMON中的“远程开关命令”区,然后经过和现场手动/自动模式同样的互锁和条件判断,最后才去驱动输出。也就是说,即使远程误操作,设备的限位保护、过载保护依然有效,不会因为操作端在手机上就绕过了安全逻辑。
5. 现场调试记录与坑点复盘
5.1 模拟量信号飘移:屏蔽层和地环路
第一次上电调试时,某一路温湿度传感器读数在26℃上下不停跳动,波动幅度差不多有±2℃。这已经严重影响了控制逻辑的判断。排查步骤大概是:
- 万用表测传感器输出电流,用高精度电流表串入回路,发现4-20mA信号本身是稳定的;
- 判断问题出在模拟量模块侧,怀疑是模块通道或接线问题;
- 检查接线时发现,信号线用的不是屏蔽双绞线,而是普通的平行线,距离还走了一段很长桥架,和动力电缆挨在一起;
- 换线来不及,临时用屏蔽线重新走了一路,并且屏蔽层只在PLC侧单端接地;
- 重新上电后,读数波动明显减小,一两天内基本稳定在0.2℃以内。
最终整改方案是:把所有模拟量信号线全部换成屏蔽双绞线,屏蔽层单端接地,且尽量远离动力电缆。这套弄完之后,各种信号都稳定了很多。
5.2 触摸屏与PLC通信偶尔中断
KTP700触摸屏在调试初期出现过几次“连接中断”的报错,有时候一晚上出现一两次,观察程序发现PLC本身运行正常,就是HMI连不上了。一开始怀疑是IP冲突,查了一圈也没查到;后来用Wireshark抓包看PROFINET报文,发现PLC侧会有周期性的丢包。
排查到最后,发现是现场有一台大功率变频器启动时,导致整个供电网络电压瞬间跌落,触摸屏的24V电源受到影响,网卡短暂重启。解决方法比较朴素:给触摸屏单独加了一个带滤波功能的24V开关电源,和动力设备电源分开;同时在PLC和触摸屏的PROFINET配置里把更新时间适当放宽,减少了瞬间干扰导致的断线误判。做过这步之后,断线问题基本消失。
5.3 天气骤变时的逻辑漏洞
有一次半夜突降大雨,棚内温度快速下降,卷膜电机自动执行关膜动作。但问题在于:雨雪传感器已经触发,卷膜开度到位后,程序没有再采样一次温度来判断加热是否需要启动,导致温度一路降到16℃才触发加热。虽然不至于冻坏作物,但升温慢,作物还是受到了影响。
复盘后我在程序里加了一条规则:当卷膜全部关闭且温度继续低于加热启动阈值时,立即开启加热,不受降温滞回区间限制。这类“天气突变”场景不实测很难想到,但真实运行中早晚会碰到。自动化系统不能只处理稳态,更要能处理“上帝视角下应该联动”的突发事件。
5.4 常见问题速查表
为了方便现场维护,我把调试中遇到的问题整理成了一张速查表,也分享出来:
| 现象 | 可能原因 | 排查/解决办法 |
|---|---|---|
| 模拟量读数明显偏高或偏低 | 传感器量程设置错误、模块通道接线错误 | 查传感器说明书,核对SCALE_X的量程参数;万用表测电流判断传感器本身是否正常 |
| 模拟量读数来回跳动 | 信号线受干扰、屏蔽层接地错误、电源不稳 | 换屏蔽双绞线并单端接地;检查PLC供电电压是否在22-26V之间 |
| 卷膜电机到限位不停 | 限位开关信号没进PLC、程序互锁没生效 | 在线监控I0.2/I0.3状态;检查限位开关触点接线;确认梯形图串了常闭点 |
| 触摸屏连接不上PLC | IP不在同一网段、触摸屏电源瞬断 | 用网线直连测试;检查IP地址;触摸屏单独供电 |
| 云平台看不到数据 | DTU没联网、SIM卡欠费、Modbus地址不对 | 查DTU信号灯;登录DTU管理页面看寄存器数据;核对PLC侧MB_SERVER配置 |
| 报警一直不恢复 | 复位逻辑没做、锁存条件未清除 | 检查报警条件是否真的降下来;确认复位按钮用的上升沿触发过 |
| 设备频繁启停 | 滞回区间太小 | 增大启停阈值差,比如风机开的28℃、停的25℃,先拉开3℃再根据作物微调 |
| 远程控制没反应 | 云平台命令没写入PLC、PLC没轮询到 | 查看云平台下发目标地址,确认方向是写的保持寄存器,PLC侧“远程开关命令”对应地址一致 |
排查问题有一条铁律:先分清楚是硬件层、数据链路层还是程序逻辑层的问题。我调试时习惯三步走:先看传感器信号是否正常(万用表/模块读数),再看PLC程序里对应的输入映像区是否随信号变化(在线监控),最后看输出是否按程序逻辑动作。绝大部分问题三步之内就能定位到大概范围,不要一上来就改程序。
5.5 数据备份和程序归档
项目交付前,我把所有TIA Portal源程序和上位机源代码做了一次完整归档,分别保存了出厂版本、调试版本和最终交付版本。同时把每个PLC变量的地址对照表、触摸屏画面说明、云平台Modbus地址映射表都整理成了PDF,放在项目文件夹里。这套习惯帮我省了不少后续维护的功夫——客户打电话过来说某个点位数据不对,我翻一下映射表就能远程定位,不用再拿电脑跑现场。
6. 后续可以扩展的方向
这套系统目前运行稳定,但说实话它只是温室自动化的一个基础框架。后续我个人比较想加的几个功能是:
- 多棚集中监控:现在一套大棚一套PLC,如果后面扩展成十几套大棚,需要在上位机层面做棚区管理,每个棚独立显示和操作,报警也要按区域分组推送。
- 灌溉与施肥系统联动:目前土壤湿度只是监测和简单报警,还没联动滴灌。下一步打算加上电磁阀控制,根据土壤湿度和作物生长阶段自动灌溉,这个需要引入更多传感数据。
- 数据分析和种植决策:历史数据攒了半年之后,可以做一些简单的统计分析,比如看不同温度/湿度区间对作物生长的影响,逐渐把“经验种植”转变为“数据种植”。
- 视频监控联动:在棚内加几个网络摄像头,当某一个报警触发时,自动切换对应画面,同时录像,这样远程查看时不只是看数字,还能看到现场实际情况。
以上这些方向都是基于现有架构可以平滑扩展的,不用推倒重来,这也是当初选S7-1200而不是更小型控制器的一个原因——它为后面这些扩展留了足够的空间和性能。
做这套系统的过程中,我最大的体会是:自动化的价值不在于把系统做得多么花哨,而在于稳定可靠地替人干那些重复的、繁琐的、容易延误的事。设备选型、程序结构、通信架构这些看着都很简单,真正难的是把现场各种各样的实际情况考虑进去,把各种“万一”都写进程序里。还是那句话,搞工控的人,图纸画得再好不如现场跑一跑,有些坑只有亲身踩一遍才知道怎么绕。
