做非标自动化这些年,洗车机控制算是我接触得比较多的一类典型顺序控制项目。最近刚好在整理一套西门子S7-1200的自动洗车机控制方案,从头到尾把博途(TIA Portal)里的PLC程序、HMI组态、仿真验证完整跑了一遍,踩了不少坑,也沉淀出一些可以直接复用的套路。这篇就把整套方案从选型、I/O规划、程序逻辑、HMI画面设计到联调仿真的完整链路拆开讲,重点说清楚每一步为什么这么做,以及哪些地方容易翻车。
如果你正在入门PLC编程、准备做设备控制方案的仿真验证,或者手头刚好接了洗车机、类似步进式流水线的项目,这篇文章都值得仔细看一遍。哪怕是零基础,跟着思路走一遍,也能明白一台自动洗车机的控制程序到底是怎么从需求变成实际可运行代码的。
1. 项目背景与方案选型:这套仿真方案解决什么问题
动手写程序之前,先把方案构成的逻辑理清楚,这比急着打开博途新建项目重要得多。很多人拿到资料包第一步就去看梯形图,结果看了半天不知道自己该改哪里、程序块之间什么关系,归根结底是对整套方案的组成和设计思路不熟悉。
1.1 一套完整的洗车机控制方案包含哪些内容
所谓“程序包”或者“仿真方案”,其实不只是那个 .ap18 或 .zap18 的工程文件,它应该是一整套可以闭环的东西。我这里整理的方案主要包含四块内容:S7-1200 PLC程序源码、HMI组态画面、仿真环境配置说明、以及I/O点表和工艺流程文档。四块缺一不可。
PLC程序是核心,负责接收传感器信号、执行顺序控制、输出驱动指令;HMI组态是人与设备交互的窗口,负责显示状态、按钮操作、报警提醒;仿真环境是验证手段,没有实物PLC和触摸屏的情况下,用PLCSIM和HMI模拟运行来验证逻辑是否正确;而I/O点表和工艺文档则是理解程序的钥匙,没有点表,你拿到程序包只能对着网络十连懵。
值得注意的是,一套成熟的方案里,程序架构的重要性远大于某一条逻辑。比如我这次用的就是“主循环OB1 + 功能块FC + 数据块DB”的结构,自动流程、手动控制、报警处理分成不同功能块,互不干扰,后期维护改起来非常方便。这种模块化思想在博途里尤其重要,也是以后做任何设备程序都能复用的方法论。
1.2 S7-1200选型思路:为什么不是Smart 200也不是1500
选PLC这件事经常被初学者忽略,觉得差不多能跑就行,但选型直接决定项目开发效率。我在这套方案里选S7-1200,核心原因是它处在“性价比”和“功能性”的平衡点上。
对比Smart 200,S7-1200最大的优势是博途原生仿真支持。Smart 200虽然经济,但做仿真调试需要额外的软件,流程繁琐;S7-1200从博途V16开始,PLCSIM对1200的支持已经很成熟,PLC程序和HMI可以一起仿真跑,极大缩短开发周期。对比S7-1500,1200价格更低,对于洗车机这种I/O点数不多、控制逻辑偏顺序控制的场景,1200的性能绰绰有余,没必要用1500。
具体选型号时抓住三个维度:CPU型号、数字量/模拟量通道数、通信需求。洗车机一般需要20到30个数字量点、1到2路模拟量(比如水压、水温),CPU选1214C DC/DC/DC基本够用,自带14入10出,扩展一个SM1223数字量模块和一个SM1231模拟量模块就完整了。不需要额外走通信,用CPU集成的PROFINET口连HMI就够。
1.3 博途版本选择与安装避坑:V16还是V18还是V21
博途版本的选择经常把人逼疯,因为高版本打开低版本工程没问题,反过来低版本打不开高版本。我这次用的工程是基于博途V16做的,主要是考虑到V16对S7-1200和PLCSIM的支持已经非常成熟,运行稳定,教程也多,碰见问题好查资料。
如果你机器性能还可以,装V18或V21也行,但要注意一个关键点:不同版本的安装包不能混用,PLCSIM也要选对应版本。比如你装的是V16主程序,仿真软件也得是V16的PLCSIM,否则点击仿真按钮会报找不到许可证或版本不兼容。
再说说安装避坑。很多人问“博途软件能安装在D盘吗”,答案是可以,但不建议只改安装路径就完事。博途底层依赖SQL Server和一堆Windows组件,单纯改路径可能导致后续升级、授权管理出问题。稳妥做法是:保持默认安装路径,把空间不够的烦恼交给“精简安装”——在安装选项里只勾选需要的PLC和HMI组态组件,别把Step 7 Professional、WinCC Professional等几个大块头全选上,能省不少空间。
还有一个高频问题:装旧版本博途之前要彻底清理注册表残留,否则会提示“无法安装,已检测到更高版本”。我习惯用微软的Program Install and Uninstall疑难解答工具扫一遍注册表残留,再把C盘里遗留的Siemens文件夹删掉,最后重装。至于“博途密钥过期怎么办”,打开Automation License Manager把过期密钥删掉,重新激活即可,这一步很多人卡住是因为没注意到后台还有旧密钥在占用。
2. 洗车工艺拆解与I/O规划:程序逻辑的地基
程序写得像不像样,一半取决于你对工艺流程的理解深度。洗车机不是简单“按钮一按,电机就转”的事,它是一条需要严格顺序控制的流水线。每个工位什么时候启动、什么时候停止、什么条件下才能切到下一步,都要在动手编程前用文字和表格梳理清楚。
2.1 自动洗车流程分析:从车辆进入到风干完成的完整链路
我按最常见的隧道式自动洗车机来设计流程,整个工艺可以分为六个阶段:车辆到位、预冲洗、泡沫喷洒、滚刷清洗、风干、驶离。其中预冲洗和滚刷清洗之间,有些方案还会加一道“摇摆喷洒”或“底盘清洗”,这里为了突出核心控制逻辑,只保留主流程。
车辆到位阶段:入口处安装光电传感器和地感线圈,车辆压到指定位置后,传感器信号给PLC,系统进入待机状态。此时HMI显示“请停稳”,操作员确认后按下启动按钮。
预冲洗阶段:启动预洗泵,喷水从上往下冲洗车身灰尘。这一阶段要注意高压泵的启动顺序,不能先开泵再开阀,否则憋压损坏管路。我在程序里就是用“先开出口阀,延时2秒,再启动泵电机”的逻辑。
泡沫喷洒阶段:预冲洗结束,启动泡沫泵,同时把洗涤剂电磁阀打开,水蜡混合液均匀覆盖车身。这里涉及液位传感器,液位低于下限时要停泵并报警。
滚刷清洗阶段:依次启动侧刷电机和顶刷电机,每个刷子都有正转、反转两个输出。刷洗过程中,传送带以低速前进,带动车辆通过刷洗区。刷子电机的启动必须延时错开,避免多台大功率电机同时启动造成电压跌落。
风干阶段:刷洗完成,启动风机,同时传送带提速,把车身水分吹干。风机启动后至少要延时运行到位,不能立刻停止,否则循环风道压力反冲。
驶离阶段:出口传感器检测到车辆完全离开后,系统复位到初始状态,等待下一辆车。整个流程可以在任意安全时刻通过停止按钮暂停,急停按下后所有输出全部断开。
这个流程看着简单,但每个阶段的切换条件和超时保护才是程序的重点。比如车辆进入后超过30秒没人按启动,系统要自动复位并提示;某一步动作在设定时间内没有完成反馈,要报警并停机,避免设备带病运行。
2.2 I/O点表与硬件组态:把信号预算做到心中有数
流程梳理完,下一步就是做I/O点表和硬件组态。我把这套方案的I/O分配整理成下表,直接照着这个思路去建博途项目就行。
| 信号类型 | 地址分配 | 功能说明 | 备注 |
|---|---|---|---|
| DI | I0.0 | 启动按钮 | 常开,上升沿有效 |
| DI | I0.1 | 停止/复位按钮 | 常开 |
| DI | I0.2 | 急停按钮 | 常闭,输入滤波10ms |
| DI | I0.3 | 入口车辆检测传感器 | 光电式,检测到为1 |
| DI | I0.4 | 出口车辆检测传感器 | 光电式 |
| DI | I0.5 | 水箱液位下限 | 浮球式,低液位断开 |
| DI | I0.6 | 泡沫液位下限 | 浮球式 |
| DI | I0.7 | 预洗泵过载保护 | 热继电器的常闭触点 |
| DI | I1.0 | 风机过载保护 | 热继电器的常闭触点 |
| DI | I1.1 | 传送带变频器故障 | 故障输出为1 |
| DO | Q0.0 | 预洗泵接触器 | 持续输出 |
| DO | Q0.1 | 泡沫泵接触器 | 持续输出 |
| DO | Q0.2 | 传送带正转接触器 | 持续输出 |
| DO | Q0.3 | 侧刷电机正转 | 持续输出 |
| DO | Q0.4 | 侧刷电机反转 | 持续输出,与Q0.3互锁 |
| DO | Q0.5 | 顶刷电机正转 | 持续输出 |
| DO | Q0.6 | 顶刷电机反转 | 与Q0.5互锁 |
| DO | Q0.7 | 风干风机接触器 | 持续输出 |
| DO | Q1.0 | 绿色运行指示灯 | 输出 |
| DO | Q1.1 | 红色报警指示灯 | 输出 |
| DO | Q1.2 | 声光报警器 | 输出 |
模拟量部分我留了一路AI通道接水压传感器,用来检测预洗泵出口压力,压力低于设定值时认为管路堵塞或水泵异常。之所以用文字强调“输入滤波”和“互锁”,是因为洗车机环境潮湿、电机启停频繁,信号抖动和输出乱动是两大故障源,硬件上做好防抖和互锁,软件上才能少出幺蛾子。
硬件组态时,在博途里添加CPU 1214C DC/DC/DC,再挂一个SM1223(8DI/8DO)和一个SM1231(4AI)扩展模块,HMI用KTP700 Basic。组态完成后一定要先编译一次,确认硬件配置和I/O地址没有冲突,再进入下一步写程序。很多仿真跑不起来的案例,第一步就死在“变量表地址和物理地址对不上”。
3. PLC程序核心逻辑实现:洗车时序控制的正确写法
程序是整个方案的灵魂。我在这一部分会先讲整体架构,再贴一段核心的步骤控制代码,把“顺序控制”这个洗车机里最关键的程序设计模式讲透。
3.1 程序整体结构与模块划分:别把所有逻辑塞进OB1
博途里最忌讳的做法是,把几百个网络全堆在OB1里,看起来一条条挺清晰,实际上后期维护想死的心都有。项目一复杂,你必须做模块化划分。模块化编程的核心就是:OB负责调度,FB/FC负责具体功能,DB负责数据存储,全局变量负责跨块访问。
我这套方案的块划分如下:
- OB1:主循环,按周期调用各功能块
- OB100:初始化,恢复默认参数
- FC1:AutoProcess(自动流程控制)
- FC2:ManualProcess(手动控制)
- FC3:AlarmProcess(报警与保护)
- FC4:IOProcess(输入输出映射)
- DB1:ProcessData(工艺参数数据块)
- DB2:AlarmData(报警信息数据块)
为什么要把输入输出单独做一个FC4映射?因为我吃过亏。直接用物理地址编程,万一硬件点位接错了,整个程序所有网络都要改。做一层“中间变量”映射,程序里用的全是DB里的符号量,硬件改动时只需要改FC4的映射关系,主流程代码一行不用动。这是设备程序设计的标准做法,强烈建议沿用。
3.2 自动洗车流程的步骤控制:CASE语句加TON延时
顺序控制的程序写法有很多种,我比较推荐在SCL里用CASE语句配合TON定时器。相比梯形图的置位复位方式,CASE结构逻辑一目了然,改流程顺序时不用推翻整个程序,只需要调整对应步号及跳转条件。
先解释一下“博途SCL中TON怎么用”。TON是接通延时定时器,在SCL中可以用“TON(IN:=变量, PT:=时间)”,需要给定时器声明一个类型为TON_TIME的变量,例如“Timer : TON_TIME”。定时器输出的ET表示已计时时间,Q表示定时完成状态。在步骤控制里,TON最常用的场景就是“动作已执行,等待反馈或等待延时结束”。
下面是我在自动流程里用的核心步骤控制程序,用SCL编写,配合ProcessData数据块里的Step变量实现步进切换。需要注意,这段代码做了简化,实际项目里每个步骤还应该附带超时逻辑,后面我会专门讲。
// 自动流程控制 FC1 // 输入输出变量: // DB1.Step 当前步骤号,范围 0-10 // DB1.CmdStart 启动命令(来自HMI或按钮) // DB1.ModeAuto 自动模式标志 // IO_Start 启动按钮地址映射 // IO_VehicleIn 车辆到位传感器映射 IF NOT #ModeAuto THEN #Step := 0; // 非自动模式强制回到初始步 RETURN; END_IF; // 启动条件:按钮上升沿 + 车辆到位 + 液位正常 IF #Step = 0 THEN IF #CmdStart AND #IO_VehicleIn AND #LevelOK THEN #Step := 1; END_IF; END_IF; // 步骤1:预冲洗 5 秒 IF #Step = 1 THEN #Q_PreWash := TRUE; // 预洗泵输出 #Timer1(IN := TRUE, PT := T#5S); IF #Timer1.Q THEN #Q_PreWash := FALSE; #Step := 2; END_IF; END_IF; // 步骤2:泡沫喷洒 5 秒 IF #Step = 2 THEN #Q_Foam := TRUE; #Timer2(IN := TRUE, PT := T#5S); IF #Timer2.Q THEN #Q_Foam := FALSE; #Step := 3; END_IF; END_IF; // 步骤3:启动侧刷正转,传送带低速,刷洗10秒 IF #Step = 3 THEN #Q_SideBrushFwd := TRUE; #Q_ConveyorFwd := TRUE; #Timer3(IN := TRUE, PT := T#10S); IF #Timer3.Q THEN #Q_SideBrushFwd := FALSE; #Q_ConveyorFwd := FALSE; #Step := 4; END_IF; END_IF; // 步骤4:风干8秒 IF #Step = 4 THEN #Q_Dryer := TRUE; #Timer4(IN := TRUE, PT := T#8S); IF #Timer4.Q THEN #Q_Dryer := FALSE; #Step := 5; END_IF; END_IF; // 等待车辆离开,出口传感器复位后回到初始步 IF #Step = 5 THEN IF NOT #IO_VehicleOut THEN #Step := 0; END_IF; END_IF;这段程序看起来不复杂,但有几个细节值得展开。第一,每个步骤的动作输出只在对应步号为TRUE,步骤切换时上一步输出必须手动复位,否则会出现“预洗泵还开着,泡沫泵也启了”的叠加状态。第二,步骤切换条件不只是定时器,还必须叠加安全条件。比如刷洗过程中如果急停被按下,Step要立刻跳到安全步,不能固守原定时流程。
我还给每个步骤加了一层超时保护,具体做法是:进入任一步骤的同时启动一个超时定时器,比如步骤3刷洗过程如果超过30秒还没有完成,就触发报警并停机。这个逻辑在程序里单独做成一个FC3的扫描判断,防止某个传感器失效后设备干耗。超时时间设置要合理,比工艺正常耗时多出一倍是比较稳妥的阈值。
3.3 报警与急停逻辑:这些安全机制必须单独处理
很多初学者把报警逻辑当成附属品,写程序时先写动作流程,报警后面加上去就行。我的经验是,报警逻辑一定要提到前面单独考虑,尤其是急停和互锁,这是设备安全的底线。
急停逻辑:我用了硬件常闭触点接到I0.2,急停按下时输入断开,对应中间变量为FALSE。主程序OB1里,我会用一段代码把所有输出清零。注意,急停不是走到下一步,而是无条件停止所有动作,必须靠硬件常闭加程序封锁双重保证。
互锁逻辑:侧刷电机正转和反转之间必须有输出互锁,也就是Q0.3和Q0.4不能同时为TRUE。这个互锁既要在硬件线路上做,又要在程序里做。程序里我用一个NOT条件,如果Q0.3已经输出,则Q0.4启动条件被封锁,反之亦然。
报警分类:我把报警分为三类。第一类是工艺报警,比如某一步超时、液位偏低,这类报警不影响立即停机,而是提示操作员处理;第二类是设备故障报警,比如热继电器过载、变频器故障,参数来自I点映射,一旦触发立即停机;第三类是系统报警,比如急停按下,对应HMI显示急停状态。每类报警在HMI上的显示颜色和确认方式不同,后面HMI会提到。
4. HMI组态设计与仿真联调:画面不是画得好看就行
HMI组态最容易被低估。很多人觉得画面做到位、按钮连上变量就完事了,结果一仿真,要么按钮点了没反应,要么状态显示不对。这一节把HMI设计和仿真的高频坑都过一遍。
4.1 画面规划与变量连接:把操作逻辑摆在最顺手的位置
洗车机HMI不需要花哨的设计,但必须直观高效。我按照操作习惯规划了三个画面。
主画面:显示整体流程状态、当前步骤、设备运行指示灯、车辆到位指示。操作区域放启动、停止、复位三个按钮,以及急停状态显示。主画面最上方放报警条,出现报警时能第一时间看到。
手动画面:给维修人员用的,每个执行器一个按钮,并配上运行状态指示灯。手动模式必须在“手动/自动”切换开关拨到手动时才有效,防止误动作。手动画面还加了一个“输出测试”区域,每次启动设备前可以对所有输出做一次强制测试,这个对现场排查故障非常有用。
报警画面:显示历史报警和当前报警,支持报警确认。报警记录存储在DB2里,每条记录带时间戳和报警文本,方便事后分析。HMI报警控件和PLC侧报警文本要保持一致,别把变量名字写错,否则报警显示为空白。
变量连接方面,HMI侧的每个控件都必须明确绑定PLC变量表里的地址。最容易犯的错是把HMI内部变量当成PLC变量用,结果画面仿真是好的,PLC却根本接收不到。记住一条原则:凡是需要来自PLC的数据,变量类型必须选“来自PLC”,且地址要和PLC变量表一致;操作按钮用“置位”“复位”或“取反”模式,不要在按钮事件里写一堆脚本。
4.2 仿真联调完整步骤:PLCSIM和HMI仿真一起跑
仿真阶段是方案的验收环节。开始仿真前,先确认两件事:第一,博途里已经编译通过,没有语法错误和地址冲突;第二,PLCSIM和HMI Runtime版本对应。
完整的仿真步骤大概是这样的。先在博途里选中PLC程序项目,点击“仿真”图标启动PLCSIM。PLCSIM启动后,会要求设置IP地址,默认是192.168.0.1,一般直接确认即可。将程序下载到PLCSIM后,PLC处于STOP状态,需要把PLCSIM切换到RUN,程序才会执行。
然后启动HMI仿真。选中HMI画面,点击“开始仿真”,会弹出HMI Runtime窗口。HMI Runtime启动后需要在“连接设置”里确认和PLC仿真器的接口、IP地址匹配。同一台电脑上,HMI仿真默认通过内部接口连接PLCSIM,一般不用额外设置,但如果你改过IP地址,就可能导致HMI连不上PLC,画面出现一堆“###”或“无连接”标识。
两个仿真器都运行后,在HMI上点击启动按钮,观察PLC程序里DB块和M区的变化,验证逻辑是否符合预期。我习惯在博途的监控表里同时监视Step变化、输出变量和报警变量,配合HMI画面,能很快判断是HMI层问题还是PLC逻辑问题。
4.3 HMI仿真按钮无反应:原因排查与处理
“博图HMI仿真按钮无反应”是出现频率最高的仿真问题之一。我遇到的情况主要有以下几种。
第一种是PLC仿真器没有运行。PLCSIM还在STOP状态,程序根本没执行,HMI按钮自然不会有任何反应。解决方法很简单,把PLCSIM切到RUN,再看监控表里变量是否变化。
第二种是变量连接错误。HMI按钮连接的变量在PLC变量表里不存在,或者类型不匹配,仿真时按钮能点击,但数据写不进去。排查方法是在HMI仿真画面里按下按钮,同时看PLC监控表对应地址有没有变化,没有变化就说明变量绑定问题。
第三种是画面层覆盖。有些工程师在意境画面上放了几层透明面板,按钮虽然看得见,但鼠标点击被上层面板拦截了,导致按钮无反应。这个问题在HMI仿真里尤其隐蔽,你排除了前两类原因还是无反应时,就去检查画面对象的层序,把按钮放到最顶层。
第四种是仿真软件版本不一致。比如博途V16的HMI仿真和V15的PLCSIM混用,提示无法建立连接。这个只能统一版本解决,没有捷径。
4.4 画面设计的一些经验法则
关于HMI画面设计,我最后补几点经验。字体大小至少24号,操作工戴着手套点屏幕,太小会误触。按钮大小不小于80×80像素,相邻按钮间隔不小于20像素。设备运行状态用绿色、停止用灰色、报警用红色,这几乎是工业界共识,别标新立异。
按钮的“按下”反馈也很重要。不要在按钮上只做“置位”事件,一定要加“变量状态显示”,否则操作工点了都不知道有没有生效。比如启动按钮,可以用“SetBit”事件写变量,同时在按钮边上放一个绿色的运行指示灯绑定同一变量,按下去灯亮,逻辑对不对一目了然。
5. 工程导入导出与常见问题清单:拿到程序包之后怎么做
最后这部分,我用实际经验回答一个大家拿到资料包都会问的问题:程序包怎么用?以及仿真调试中那些反复出现的坑,怎么快速定位和解决。
5.1 PLC程序的导入与导出:从资料包到你自己的博途项目
程序包的格式常见有 .zap18(V18导出的压缩工程)、.ap18(V18项目文件)和 .awp(源文件)。拿到程序包后,第一步要看清版本。我用V16写的工程,你用V15是打不开的,要么升级你的博途版本,要么让提供者转成更低版本或用源文件形式给。
导入工程有两种方式。最常用的方式是打开博途后在“项目视图”里选择“打开项目”,找到.ap18文件直接打开。如果拿到的是.zap压缩包,先解压到本地,再用博途“恢复”功能导入。导入后要留意,工程里用到的库、GSD文件、HMI画面字体等资源可能会丢失,这时候按提示重新指定路径或重新添加即可。
“PLC程序的导入与导出”还有一种方式叫源文件导出/导入,通常用于跨版本迁移。在博途里选中程序块,右键“从块生成源文件”,会生成一个.scl源文件;在目标工程里右键“从源文件生成块”,就能把程序块重建出来。这种方式不依赖整体工程文件,适合只分享核心逻辑代码的场景。对于洗车机这种控制方案,我建议同步导出I/O点表和DB参数表,否则别人拿到代码也对应不上信号。
另外说一个细节:打开别人工程时,经常遇到“找不到目标组态”的提示。这是因为对方电脑上的设备组态和你电脑上的不完全一致,比如HMI型号差一个版本。这时候不用紧张,把HMI设备删掉重新组态一遍,再导入画面和变量即可。前提是你必须有对应的HMI型号授权和画面元素库。
5.2 常见问题与排查技巧:仿真和现场调试的速查表
我把这段时间在洗车机项目上遇到的问题汇总成一张表,覆盖仿真器操作和真机调试两类场景,方便你对照排查。
| 问题现象 | 可能原因 | 排查方法与解决 |
|---|---|---|
| PLCSIM点击启动没反应 | 博途版本不匹配 / 未安装对应PLCSIM | 确认主程序和PLCSIM版本一致,重装对应版本PLCSIM |
| 程序下载到PLCSIM失败 | 接口设置错误 / IP冲突 | 检查PG/PC接口设置为PLCSIM,把电脑防火墙临时关闭 |
| HMI仿真按钮无反应 | PLC仿真未运行 / 变量连接错 / 画面图层遮挡 | 按4.3节逐项排查 |
| HMI画面显示“###” | HMI和PLC连接断开 / IP不一致 | 检查HMI连接配置,确认仿真IP和PLC同一网段 |
| 仿真时定时器不走 | PLC处于STOP / 定时器变量被重复调用 | 切到RUN,检查定时器变量是否在多个地方被同时使用 |
| 输出点全部无动作 | 急停变量被触发 / 程序处于安全步 | 检查急停输入状态,确认Step变量是否为0 |
| 刷洗电机正反转互相抢 | 互锁逻辑没写 / 输出地址重复使用 | 检查正反转输出是否存在同一地址,补充程序互锁 |
| 传感器信号抖动导致误动作 | 现场干扰 / 输入滤波设置太短 | 在硬件组态里给DI通道设置10~20ms输入滤波 |
| 报警文本不显示 | 报警变量地址不对 / HMI报警控件未绑定 | 核对报警变量,确认报警文本的触发地址一致 |
| 博途安装后密钥过期 | 授权文件冲突 / 试用期到期 | 打开Automation License Manager清理旧授权重新激活 |
5.3 仿真调试的两个实用技巧
最后分享两个我在仿真调试过程中摸索出来的实用技巧。第一个是用“监控表+强制表”配合观察。仿真模式下,很多真机上无法随便强制的情况是可以直接操作的。比如想测试某个传感器故障时系统的响应,直接在监控表里强制该位为1或0,观察程序执行结果。这比一遍遍地模拟传感器遮挡高效得多,能快速验证报警和互锁逻辑是否有效。
第二个技巧是在HMI仿真时打开“运行系统控制面板”。HMI Runtime启动后,右下角有个设置图标,点进去可以切换分辨率、模拟触摸等。有时候画面控件位置偏移了,就是分辨率设置和画面设计分辨率不一致导致的。把运行分辨率调到和画面设计一致,才能准确验收画面效果。
我在实际调试中还体会到一个点:程序写得再严谨,仿真做得再充分,真机上设备电气接线的错误依然会冒出来。因此,仿真验证时一定不要跳过“手动模式逐个测试输出”这一关。每次接触器动作、电机转向都要单独验证过,再切换自动模式跑流程。这个习惯救过我很多次,否则自动流程一跑起来,电机转向反了都不知道从哪里查起。
这套洗车机控制方案的整体技术路线就是这样:从选型定位到工艺拆解,再到模块化编程、HMI组态和仿真联调,一步步走下来,你会发现自动洗车机并没有想象中那么复杂,核心就是把顺序控制和安全逻辑做扎实。后续如果再往下扩展,可以加入远程监控功能,比如通过S7-1200的开放式以太网通信把设备状态上报到手机端,或者接入变频器走PROFINET实时调速,让传送带在不同工位自动变速,原理都是今天这套东西的延伸。