基于S7-1200与博途V16的灌溉控制系统设计与实现
2026/9/24 23:51:28 网站建设 项目流程

这个项目是我去年给一个生态园做的灌溉控制改造,全套东西放在博途TIA Portal V16一个工程里搞定,PLC用S7-1200,触摸屏用的也是博途环境下的HMI,从程序到画面一次性组态完成,编号No.105。整套系统能根据土壤湿度自动浇水、按设定时段定时灌溉,也能让操作员在触摸屏上手动控制每一路阀门,泵和阀之间有联锁保护,水位过低会停泵,传感器断线会报警,运行情况随时能在屏上看到。这篇东西适合刚接触博途1200的电气工程师、做农业或园林自动化改造的同行,以及拿这个题目做课设和毕设的学生,照着这套思路基本能把一个完整的灌溉项目从头到尾落地。

1. 项目总体设计与方案选型

1.1 为什么选博途V16和S7-1200这个组合

西门子这个组合现在基本算中小型自动化项目的标配。S7-1200的定位非常讨巧,往上比1500便宜,往下比200 SMART扩展能力强,CPU自带以太网口,以后要接上位机、接远程模块都方便,不用额外转通讯。对于灌溉这种点数不多、逻辑不算复杂但稳定性要求高的场景,1200的性能完全够用,而且程序容量余量也足,不会写到一半发现资源不够。

博途V16这个版本我用得比较多,整体稳定性比早期的V13、V14好很多。PLC程序和HMI画面在同一个项目里维护,变量可以共享,改一个DB块,触摸屏那边同步更新,不需要像以前那样PLC一个软件、触摸屏另一个软件来回导变量,出错概率低很多。虽然现在博途已经出到V17、V18甚至更高,但V16配合1200的固件版本已经很成熟,网上资料也最多,遇到问题好查。

选型的时候有个细节要注意:CPU尽量选1214C以上的型号。我见过有人用1211C做类似项目,点数不够,扩展模块加了一堆,成本反而上去,程序也憋屈。1214C自带14点DI和10点DO,再配一个模拟量模块,灌溉项目常见的输入输出就差不多够了,IO分配会从容很多。

1.2 整体系统架构和控制思路

这套灌溉系统的架构可以分成四层:现场设备层、数据采集层、逻辑控制层和人机交互层。现场设备主要是土壤湿度传感器、水位传感器、电磁阀、水泵、压力变送器,数据采集靠PLC的模拟量输入模块把4-20mA或者0-10V信号读进来,控制逻辑全部放在1200的CPU里,触摸屏通过以太网跟CPU通讯。

控制方式我设计成三种模式:手动模式、自动模式和定时模式。手动模式适合调试和设备检修,操作员直接在触摸屏上开关每个阀门和泵。自动模式根据土壤湿度传感器的实时数值来判断,低于下限阈值自动开阀浇水,达到上限自动停。定时模式则适合有固定灌溉习惯的场景,在触摸屏上设定每天哪几个时段浇水,每次浇多长时间。

这三种模式不是简单堆功能,而是相互制约的。比如手动模式下,自动和定时逻辑要被旁路掉,不能让两种模式同时指挥同一个阀门,否则现场会乱套。我在程序里设计了一个模式选择字,选到哪个模式就把另外两个模式的输出强制清零,这个思路在后面程序段会详细展开。

1.3 灌溉策略是怎么定出来的

灌溉策略是整个系统能不能真正落地使用的关键。单纯做湿度下限浇水、上限停水的逻辑看着简单,实际运行会有很多问题。比如土壤湿度变化很慢,传感器数值在小范围内波动,如果阈值设置太死,阀门会频繁开关,对电磁阀寿命影响非常大。

我的做法是引入回差控制,也就是滞回比较。比如目标湿度下限设为40%,上限设为60%,那当湿度低于40%时开启灌溉,等到湿度升到60%以上才关闭,中间的20%就是回差区间。这样阀门不会在临界点来回抖动,控制动作会平稳很多。这个回差值要放在DB块里做成可调参数,因为不同土壤类型、不同作物对湿度波动的敏感度不一样。

另外考虑一个灌溉轮灌的问题。如果一个系统带多路电磁阀,所有阀门同时打开,管路末端压力可能不够,出水量也不均匀。我给每路阀门设置了轮灌延时,第一路开起来运行一段时间后第二路才启动,以此类推,这样既保证压力,又避免水泵瞬间负载过大。

1.4 硬件清单和IO分配参考

拿到一个项目先别急着写程序,把IO点数和硬件配置理清楚再动手,这步做不好后面全是坑。我按这次项目实际用到的设备列一个清单,大家可以根据自己现场情况增减。

设备类型参数/型号数量用途说明
可编程控制器S7-1200 CPU 1214C DC/DC/DC1主控制器,集成14DI/10DO
模拟量模块SM1231 AI 4x13bit1采集湿度和水位信号
触摸屏Smart 700 IE V31本地监控和操作
电磁阀DC24V 常闭型4控制四路灌溉分区
潜水泵380V 1.5kW 配接触器1从蓄水池抽水
土壤湿度传感变送器4-20mA输出2两个分区的典型点位监测
液位传感器4-20mA输出1蓄水池低液位检测
压力变送器4-20mA输出1管网压力监测

IO分配大致这样:数字量输入有手动/自动切换、急停、泵运行反馈、液位上限和液位下限;数字量输出有四路电磁阀、一路水泵接触器、一路声光报警。模拟量输入是两路土壤湿度、一路液位、一路压力,剩下两个通道做备用。这个分配相对合理,每一路都有明确用途,没有浪费点数,也留了扩展空间。

2. 核心控制程序设计细节

2.1 程序块架构:OB、FC、FB、DB怎么分配

博途里写程序,最大的好处是结构化编程做得清楚。我第一次做1200项目的时候把逻辑全塞在OB1里,一个扫描周期几千条指令,改起来痛不欲生。这个灌溉系统我做了明确的分层:OB1只负责调用各个功能块,本身不写具体的控制逻辑;初始化数据放到OB100里,上电时执行一次;FC块处理模拟量采集、报警判断和模式切换;FB块做成阀门控制的通用功能块,每路阀门调用一个背景DB;全局DB用来存放参数、实时数据和报警状态。

每个阀门控制逻辑做成一个FB的好处非常明显。四路电磁阀,意味着你要调用四次相同逻辑,如果写四遍FC代码,改一个地方就要同步改四处,很容易漏。用FB加多重背景,四个实例共享同一套代码,修改只动FB本身,实例自动更新,可靠性和维护效率都会高很多。

全局参数DB是程序跟触摸屏交互的桥梁。我把所有操作员需要调整的参数,比如湿度上下限、灌溉持续时间、轮灌延时、故障复位按钮,都定义在这个DB里,并且把DB变量的访问属性设置为非优化访问。这里要特别注意,HMI访问PLC的DB块时,如果DB定义成优化访问,触摸屏那边无法直接寻址符号名,必须用绝对地址,非常麻烦。所以涉及到HMI交互的DB,我习惯统一设置为非优化访问,这样触摸屏变量连接可以直接用DB地址。

2.2 模拟量采集与滤波处理

土壤湿度传感器输出的4-20mA信号进入SM1231后,PLC读到的是一个0到27648之间的整数。IEC标准模拟量转换规则就是这样,4mA对应0,20mA对应27648,量程映射是线性的。程序里第一步就是把原始整数转成工程量数值,这一步叫标度变换。

以湿度传感器0-100%对应4-20mA为例,转换公式是:湿度百分比=原始整数/27648乘以100。在博途里可以直接调用SCALE_X指令,输入MIN是0,MAX是100,VALUE接IW地址,输出就是对应的工程量。注意SCALE_X的输入输出类型要匹配,整数要转成Real,否则算出来的结果始终是整数,精度不够。

采集值拿到之后不能直接用,传感器信号在现场会受到干扰,可能会有一些毛刺。我的做法是做一个滑动平均滤波:连续采集五次,去掉最大值和最小值,剩下三次取平均。这个滤波器不需要额外指令,用移位和数学运算就能实现,效果比单纯的平均值滤波好很多,尤其能去掉尖峰脉冲干扰。在实际调试中,这个滤波逻辑能明显让触摸屏上的湿度数值稳定下来,不再跳来跳去。

2.3 手动、自动、定时三种模式的切换逻辑

模式切换是整个程序框架的一个枢纽。我专门写了一个FC块来处理模式选择逻辑,输入是触摸屏上的模式选择变量,输出是每种模式的使能标志。这三个标志之间做了互锁,同一时刻只能有一个为TRUE,优先级是手动最高、自动次之、定时最后。

手动模式下,操作员从触摸屏直接给阀门和泵发开关命令,程序只做联锁保护,不做自动开停。自动模式下,系统实时检测湿度传感器的数值,低于下限开阀,高于上限关阀。这里有一个容易被忽略的细节:自动模式下泵和阀是联动还是独立控制?我选择的是泵阀联动,任何一个阀门有开阀指令时,泵必须先启动,等管道压力建立起来,阀门再开,避免阀门先开导致管路憋压。

定时模式我实现得比较灵活,触摸屏上可以设置每个灌溉时段的开始时间和持续时间,最多支持四个时段。这个功能用一个时间比较指令实现,系统当前时间在设定的开始时间和结束时间内,就触发灌溉输出。定时模式的输出也需要经过阀门互锁和泵联锁逻辑。

2.4 泵阀联锁与故障保护逻辑

灌溉系统最怕的是泵在无水状态下空转,或者阀门没有打开就启动泵。我针对这两种情况都做了保护。

液位保护:蓄水池液位传感器监测到液位低于下限值时,不管处于什么模式,立即停止水泵,同时在触摸屏上报“低液位报警”。这个保护逻辑的优先级要高于手动模式,也就是说即使操作员在手动模式下强行起泵,低液位信号也能把泵停掉。从安全角度讲,设备保护永远大于操作员误操作,这是写程序必须坚持的原则。

泵阀联锁逻辑我做成这样:阀门开启条件为对应分区的灌溉需求满足,并且泵已经在运行状态。水泵的启动条件是有任意一个阀门需要开启,并且液位不在低限,并且没有急停信号。水泵停止条件是所有阀门都关闭,或者液位低限报警,或者急停触发。再搭配上阀门关闭后延时一段时间再停泵,能把管道里的余水充分排出去。

2.5 报警分类和故障复位机制

报警信息我按严重程度分成两类:一类是不影响设备安全的提醒型报警,比如湿度低于设定下限,这类报警在触摸屏上提示,但不阻塞自动流程;另一类是设备保护型报警,比如低液位、传感器断线、急停触发,这类报警会直接让相关设备停机,等故障解除之后需要手动复位才能恢复。

传感器断线检测容易被新手忽略。4-20mA信号如果变送器断线,PLC读到的数值会掉到零或者直接跳到最大值,如果程序没有检测逻辑,就会把它当成真实的低湿度信号,导致系统误开阀门,那可就闹笑话了。我在模拟量处理FC里加了一个范围判断:湿度值如果小于0.5%或者大于100.5%,就判定为传感器故障,输出断线报警,同时禁止这个通道参与自动控制。

故障复位我采用边沿触发方式:触摸屏上的复位按钮从0变1的瞬间,把报警字清零,而不是按钮为1的持续状态一直清。如果用持续状态清报警,按钮没有松开时新产生的报警也会被清掉,现场排查问题会非常困难。这个细节在做HMI报警功能时经常踩,我用过一次就记住了。

3. 触摸屏画面组态实操

3.1 画面整体结构规划

触摸屏画面规划,我的思路是宁多勿缺,把操作员需要的信息拆成几个独立页面,不要全部堆在一个界面里。这次项目我一共做了六个画面:主画面、手动控制画面、自动参数设置画面、定时设置画面、报警画面、趋势曲线画面。画面之间通过按钮切换,按钮上有返回主画面的快捷入口。

主画面放的是系统总览,用一个简单的示意图表示蓄水池、水泵、四条灌溉管路,每个阀门用颜色区分运行状态,绿色表示打开,灰色表示关闭,红色表示故障。这样操作员一进画面就能直观看到整个系统的工作状况。画面上再放几个关键数据:当前湿度值、液位值、当前模式、报警汇总条。报警汇总条是全局可见的,不管切到哪个画面,只要系统里有报警,顶部就会显示红色闪烁,这个实现方法在HMI组态里是直接支持的对象。

手动控制画面布局是一个列表,每一行对应一路阀门,包含阀门名称、开关按钮、当前状态指示灯。每一路旁边还有一个“泵联动”显示,让操作员知道当前阀门状态对泵有没有影响。这个画面是调试期间最常用的,现场试设备基本都在这个页面上操作。

3.2 变量连接和参数传递的关键设置

触摸屏和PLC之间的数据交互,博途里直接用HMI变量表就能完成。这里有一个非常关键的设置:在PLC的DB块属性里,把“仅存储在装载内存中”和“优化块访问”这两个选项的处理方式搞清楚。优化块访问的DB,HMI只能通过符号访问,改成非优化后就能用绝对地址如DB1.DBD100这种方式连接。

我的经验是,参数DB直接取消优化访问,数据记录DB也取消优化访问,这样做的好处是触摸屏变量连接非常直观,而且在线监控的时候也能看到物理地址,排查问题方便。坏处是程序里如果用符号名访问DB,编译后DB的地址是固定的,以后如果要插入新变量,地址会整体偏移,所以在做DB结构的时候就要把预留位规划好,避免频繁改结构。

HMI变量表建好之后,还要在HMI连接设置里确认通讯参数。博途V16里自动生成的S7连接通常不用改,但要注意HMI的IP地址和PLC的IP地址必须在同一网段。比如PLC设置192.168.0.10,HMI就设置192.168.0.20,网关可以不填,子网掩码默认255.255.255.0就行。这个IP规划做不好,下载完程序后HMI屏上直接显示“无连接”,很多初学者第一次连不上设备都是栽在这上面。

3.3 报警画面和趋势曲线的实现

报警画面我用的是HMI的报警视图控件。报警来源可以直接选择PLC里的报警变量,也可以自己在HMI里设置报警文本,然后绑定到PLC的位变量上。我推荐后者,因为这样报警的文本描述可以在触摸屏里随意编辑,而且现场报中文信息显示更加友好。把报警变量按前面说的两类报警分别建两个报警组,显示的时候可以按组过滤。

趋势曲线是我个人觉得特别实用的一个画面。博途HMI的趋势视图可以把模拟量变量随时间变化画出来。我把两路土壤湿度和一路液位放进趋势视图,时间轴设为10分钟滚动显示。调试期间这个画面的价值太大了,湿度变化趋势、阀门开关后的响应速度,一眼就能看出来。之前没有趋势图的时候,只能靠数字跳变去猜传感器的动态响应,效率完全不在一个量级。

趋势视图的参数设置里要注意采样周期和缓冲区大小。采样周期我设成1秒,缓冲区10000个点,可以存差不多两个多小时的曲线。如果采样太密缓冲区会很快写满,太疏又看不到中间细节,1秒对于灌溉这个场景是够用的。

4. 博途V16工程实施中的坑与排查

4.1 博途V16安装和许可证常见问题

博途V16的安装,我踩过的坑主要集中在这几个地方。首先是最小安装和完全安装的选择,我建议选完全安装,虽然体积大一点,但省得后面要用某个组件发现没装。安装路径尽量不要带中文和空格,有些版本的许可证组件对中文路径兼容不好,会出现激活失败。

许可证问题是我见过最多人问的。博途软件打开后提示找不到许可证,STEP 7 Professional和WinCC都是单独授权的,有的人只装了STEP 7的授权,打开WinCC画面组态就会报错。正确做法是两个产品的授权都要装,如果用的是试用授权,到期时间也要注意。另外系统时间如果调得不对,也可能导致授权软件判定异常,这个细节很坑,现场调试时如果系统时间被改过,最好先恢复正确时间再打开博途。

还有一个比较常见的报错是“无法定位程序输入点getsystemtime于动态链接库”,这个基本是杀毒软件把某个运行库文件隔离了或者某个系统补丁造成兼容性问题。解决思路是先卸载杀毒软件,然后以管理员身份运行安装包修复,如果还不行,就卸载博途重装。这个问题在Win11上出现的概率比较高,所以能用Win10专业版做开发环境的话,尽量别在Win11上折腾。

4.2 添加设备和在线通讯的坑

博途V16里添加设备时卡转圈,这个问题有几种可能:一是电脑配置不够,博途本身对内存要求很高,卡顿是常态,这种情况除了升级配置没有太好的办法;二是软件安装不完整,重新修复安装可以解决;三是杀毒软件实时监控占用资源,把程序目录加入白名单能缓解。

在线连接不上PLC,先排查最基础的三个环节:IP地址是否在同一网段、PLC是否在运行模式或STOP模式、网线是否正常。然后用博途的“可访问设备”功能扫描一下,看能不能扫到PLC。如果扫描到了但是打不开,多半是固件版本和软件版本不兼容,V16的软件打开V14或者更早版本的固件项目,需要先对设备进行固件更新。如果扫不到设备,检查电脑的防火墙,博途安装的时候虽然会自动添加防火墙规则,但有些精简版系统默认拦截,手动把S7DOS HELP服务加入允许列表就能解决。

4.3 PLCSIM仿真和在线调试技巧

博途V16的S7-PLCSIM支持对1200程序做仿真调试,这个功能在项目前期逻辑验证时非常有用。把程序下载到虚拟PLC里,然后在监控表里直接给变量赋值,模拟传感器信号的变化,观察输出逻辑是否正确。这样做的好处是测试环境完全和真实程序一致,不用等到现场接完线才能验证逻辑。

仿真有一个限制要注意:某些硬件相关的指令在仿真环境里无法真实运行,比如模拟量模块的输入输出,仿真时读到的值只有0和27648两个极限状态。所以我仿真时会给模拟量变量单独写测试值,通过监控表直接把DB里的原始数值改成模拟值,间接验证程序逻辑。另外PID_Compact功能块在PLCSIM里可以运行,但PID参数整定需要在线实际设备上做,仿真只能看逻辑分支是否正常。

在线调试时的监控表是我最常用的工具。建一张监控表,把模式切换变量、各路阀门的输出位、湿度采集值、泵的运行状态全部放进去,修改触点输出时直接强制变量,看程序响应是否常快。博途还可以用“交叉引用”功能查某个变量被哪些程序块使用,排查临时变量错用和地址冲突特别方便。

4.4 常见问题速查表

我在整理这个项目的时候把典型问题做了一个速查表,放在这里给同行参考。

故障现象可能原因解决方法
博途打开提示找不到许可证STEP 7和WinCC授权缺失两个产品分别安装许可证
Win11下无法定位getsystemtime运行库被隔离或兼容问题卸载杀毒、以管理员修复安装
添加设备一直转圈安装不全或电脑内存不足修复安装,确保8G以上内存
在线连不上PLCIP不同网段、防火墙拦截、固件不兼容检查IP段、放行防火墙、升级固件
HMI屏显示无连接HMI和PLC的IP不在同一网段修改HMI的IP地址到同一网段
模拟量读数跳动现场干扰或电源不稳信号线采用屏蔽双绞线,做滤波处理
湿度值始终0或最大传感器断线或接线错误检查接线,看模拟量通道接线图和量程
阀门频繁开关湿度阈值没有回差设置滞回区间,避免临界抖动

这套系统的程序从编写到调试,我前后花了一周多时间,其中一半时间花在参数整定上。如果大家拿到类似项目,建议先花半天时间把所有硬件接线和IO地址表核对一遍,再写程序,这样调试改动最小。还有一条个人经验:每写一段程序块,就顺手把注释写好,博途的注释支持中文,不要偷懒。项目做完三个月后你回头维护,真正让你少掉头发的不是当年多聪明的程序,而是那些清楚的注释。这个灌溉系统后续如果要做远程监控,可以加一个物联网网关,把PLC的数据通过MQTT协议传上去,用手机小程序就能查看湿度数据和远程启停设备,那又是另外一个话题了,先把当下的方案落地,效果会比什么都重要。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询