先说个事:我见过不少人把立体车库的电气控制系统想得很简单,觉得无非就是几个电机正反转、几个限位开关、一块触摸屏。真把项目接到手里才明白,麻烦的不是单个动作,而是“一排车位、两层甚至三层、还要防止人和车同时出问题”的调度和联锁。今天这篇就围绕一套用博图(TIA Portal)做的 S7-1200 立体车库控制系统展开,重点说清楚控制需求怎么拆、PLC 程序怎么写、WinCC 触摸屏怎么搭、以及如何用 PLCSIM 把整套逻辑在电脑上跑起来。文中的主线是一套两层三列升降横移车库,后面再讲怎么把它扩展成多型车库仿真。
适合谁看?如果你正在做机械式停车设备的电气设计,或者刚接触西门子 S7-1200 和 WinCC 触摸屏,需要一个完整的项目作参照,这篇文章能帮你少走不少弯路。我不打算讲太多教科书理论,只讲项目中真正用过的方案和踩过的问题。
1. 立体车库项目为什么几乎都绕不开 S7-1200 + WinCC 这套组合
1.1 先把现场负载列出来,才知道 PLC 需要多大的“肚量”
立体车库和很多单机设备不一样,它不是一个电机一启动就完事,而是几十个输入输出信号要同时协作。以两层三列升降横移车库为例,现场设备大概包括:
- 每个上层车位有一个升降电机,用于把载车板放下或升起;
- 每个下层车位有一个横移电机,用于把载车板左右平移,给上层让出通道;
- 每个车位还要有光电传感器,用来判断车位里到底有没有车;
- 升降部分要有上极限、下极限、减速位,横移部分要有左限位、右限位;
- 安全方面还要有光幕、急停、松链检测、过载保护等信号。
这些算下来,纯数字量输入通常就有二三十点,数字量输出也在十几二十点左右,再加上报警灯、蜂鸣器、接触器/热继电器反馈,I/O 数不会太少。用 S7-1200 的 CPU 1214C 时,本体自带 14 点输入、10 点输出,如果点数不够,可以扩展 SM 1223 等数字量模块,也可以在 CPU 侧面插入信号板补几个点。对我来说,选 1214C 而不是 1212C 的真正原因是留余量,后面现场加信号方便得多,不用再换 CPU。
除了离散量,有些立体车库还会带变频器,用来控制升降电机的加减速,让运行更平顺。那时候 S7-1200 就要走 PROFINET 或 Modbus TCP 跟变频器通信,而不是简单输出一个正反转信号。所以选型时不要只算 I/O 点数,还要算通信口数量和控制策略。
1.2 S7-1200 与另外几个选择之间的取舍
常有人问,做立体车库到底用 S7-200 SMART 还是 S7-1200,甚至直接上 S7-1500。我个人的判断是这样的:
| 对比项目 | S7-200 SMART | S7-1200 | S7-1500 |
|---|---|---|---|
| 项目规模 | 小型单区域车库 | 中小型多层多列车库 | 大型复杂物流式停车系统 |
| 组态软件 | STEP 7-Micro/WIN SMART | TIA Portal | TIA Portal |
| 通信能力 | 以太网/Modbus 为主 | PROFINET、Modbus TCP/RTU、MQTT 扩展等 | 更强,可做大规模分布式控制 |
| HMI 集成度 | 一般配 SMART Line 屏 | 与 WinCC 同工程集成,仿真方便 | 与 WinCC 同工程集成 |
| 系统柔性 | 比较有限 | 功能块可复用,适合做多型号变种 | 很强,适合做平台化 |
| 成本 | 较低 | 适中 | 偏高 |
S7-200 SMART 用来做那种只有几个车位的简易两层车库,确实够用,控制柜也便宜。但如果这个项目要接 WinCC 触摸屏做仿真,还要考虑以后扩展成三层、四层,或者做多套车库集中监控,S7-200 SMART 在博图体系之外,调试和版本管理都不太方便。S7-1500 是好东西,但对这种几十个 I/O 的场景属于大材小用,成本往往甲方不愿意出。
S7-1200 处在中间位置,性能足够,扩展能力不错,而且和 KTP 系列触摸屏可以在同一个 TIA Portal 项目里组态。正因为 PLC、HMI、网络都在一个工程里,后面做离线调试和仿真才有一个统一的环境。
1.3 给博图集成环境投出“信任票”的成本考量
很多人一听说博图就觉得软件大、安装麻烦。这个确实没法回避,TIA Portal 体积不小,V16 以后动辄十几二十 GB,内存不够的话跑起来会很卡。但作为开发者,我更看重的是它能把 PLC 程序和 HMI 工程放在同一个项目里,变量可以互相关联,不需要像传统项目那样两边单独建点表再手工核对。
对于立体车库这种系统,触摸屏不是可有可无的装饰,而是操作员和车库之间的唯一界面。车库现场往往没有太多操作空间,操作员不可能盯着 PLC 的输出指示灯去判断哪一步执行到了哪里,也不可能打开电脑监控程序。绝大多数时候,他们要面对的就是一块 WinCC 触摸屏:选车位、看状态、看报警。把 S7-1200 程序和 WinCC 画面放在博图里一起维护,最大的收益是“变量改一处,两边都不容易对不上”。
再说一遍我的经验:如果项目主要控制器已经定了 S7-1200,触摸屏又是西门子 KTP 或精智系列,就不要自己折腾两套软件了。老老实实用博图加 WinCC,后面做 PLCSIM 仿真的时候会非常顺。
2. 从两层三列升降横移车库开始拆解控制需求
2.1 升降横移车库的运行过程和空位规则
先说一个最常见的布局:两层三列升降横移车库。上层有三个车位,下层理论上也能停三个车位,但其中一个下层位置必须做“空位”,作为上层车板升降的交换通道。所以实际能停的数量是五个而不是六个。
空位规则是整个控制的灵魂。如果我想取上层 1 号位的车,而它下面的下层 1 号位停着车,那么程序必须先让下层 1 号位横移到空位处,把这个垂直通道让出来,然后上层 1 号位的载车板才能下降。反过来,存车时又要先判断哪个位置是空位、哪个下层车位需要移动、移动方向往哪边。这个过程听起来简单,但一旦车位多了,空位被移动来移动去,如果程序里写死一堆“如果……就……”的指令,早晚会乱。
我在设计时把动作分解成三类:
- 横移让位:下层载车板在没有重物阻挡的情况下,水平移动到相邻空位;
- 升降存取:上层载车板根据指令下降到地面,或者从地面升回上层;
- 状态恢复:存取完成后,把刚才让位的下层载车板移回原位,把系统恢复到可用状态。
有人会问,为什么不把上层车位也设计成可以横移的?因为机械结构和成本不允许。上层车板要升降,它的导轨就和下层不一样。升降横移式车库是综合成本和场地后的产物,所以控制上要考虑的逻辑也主要是“谁先动、谁后动、什么时候不能动”。
2.2 输入输出点表的规划原则
做任何 PLC 项目,第一步不是写代码,而是先把 I/O 点表做出来。我习惯用下面这个表格来管理和 PLC 接线图对应,避免程序里用了一个从未接到端子上的地址。
| 信号类型 | 点位描述 | PLC 地址 | 信号说明 |
|---|---|---|---|
| DI | 上层1号位上限位 | I0.0 | 载车板到位后停止上升 |
| DI | 上层1号位下限位 | I0.1 | 载车板下放到地面后停止 |
| DI | 下层1号位左限位 | I0.2 | 横移到位信号 |
| DI | 下层1号位右限位 | I0.3 | 横移到位信号 |
| DI | 1号位有车光电 | I0.4 | 检测车位上是否有车 |
| DI | 安全光幕 | I0.5 | 有人或物进入动作区,立即停止 |
| DI | 急停 | I0.6 | 常闭信号,断线也应视为急停 |
| DO | 上层1号位升降接触器 | Q0.0 | 驱动上升 |
| DO | 上层1号位下降接触器 | Q0.1 | 驱动下降 |
| DO | 下层1号位横移接触器 | Q0.2 | 驱动横移 |
| ... | ... | ... | ... |
点表规划的时候要注意几件事:
第一,把所有常闭信号,比如急停、热继电器常闭触点,也按实际接线填入。PLC 程序里最好把常闭反馈统一处理成“1 表示正常,0 表示故障”的内部变量,否则写程序时非常容易搞反逻辑。
第二,同一台电机的正反转输出要预留互锁,不能仅靠 PLC 程序里的联锁。电气图纸上还要有接触器辅助触点互锁,双重保险。
第三,现场接线时,输入信号最好按柜内走线顺序排,不要东一个西一个。后期排查故障时,电工打开柜门看端子号,发现和点表严格对应,会谢天谢地。
2.3 安全联锁不是“加分项”,是控制程序的底座
我碰到很多初学者,写程序的第一步就是研究怎么调用电机正反转,但对安全联锁不重视。真正做立体车库,安全是整个系统最重要的东西,因为它关系人身安全。一套合格的程序里必须包含以下安全逻辑:
第一是动作互锁。任何时候,同一台电机不能同时输出正转和反转;同一个车位列,横移和升降不能在重合位置同时发生。简单说,上层车板升降之前,必须确认该列下层已经让开;下层横移之前,必须确认上层车板没有正在下降。这些条件不满足,程序直接禁止输出。
第二是位置联锁。每个动作都要依赖对应限位信号。比如没有检测到上限位,不执行“下降”;没有检测到下限位,不执行“上升”。如果程序里采用“先复位再动作”的逻辑,限位信号更是判断动作完成与否的唯一依据。
第三是超时保护。电机长时间运行时,必定会碰到负载卡死、限位损坏、接触器粘连等情况。我在每个动作分支里都加一个定时器,比如横移电机连续运行超过 15 秒还没到位,就判定故障并切断输出;升降电机连续运行超过 20 秒还没到位,也判定故障。这个时间要根据现场车板实际行程调,但不能省。
第四是安全光幕和急停。光幕遮挡时,所有运动必须立即停止;急停按下后,系统回到初始状态,且必须手动复位才能重新运行。在触摸屏上,急停和光幕类故障要用明显的红色报警显示出来,并带有故障发生时间。
这些内容说起来都是常规,但在实际项目里特别容易在调试时因为图简单而省掉。省掉的后果,轻则电机、机械损坏,重则出现安全事故。我不止一次强调,宁可程序多写几个自锁位,也不能用“手动按钮控制时靠人注意安全”这种想法。
3. 让 PLC 学会“找空位”和“走流程”
3.1 数据建模用数组而不是几十个独立位
控制思路想清楚之后,如何把这些车位状态在 PLC 里表示,会直接影响程序的复杂程度。如果你给每个车位单独建一个变量:车位1有车、车位1限位、车位2有车、车位2限位……编程时会非常痛苦,尤其是做多型车库仿真时,变量会膨胀到失控。
我推荐的做法是使用数组或者自定义数据类型。在 S7-1200 里可以建一个 PLC 数据类型(UDT),比如:
TYPE GaragePos VERSION : 0.1 STRUCT Occupied : Bool; // 此位置是否有车 CarLayer : Int; // 层号,1为下层,2为上层 CarCol : Int; // 列号,1、2、3 IsEmptySpace : Bool; // 是否作为空位 LimitUp : Bool; // 上限位 LimitDown : Bool; // 下限位 LimitLeft : Bool; // 左限位 LimitRight : Bool; // 右限位 MotorStatus : Int; // 0停止,1上升/左移,2下降/右移 END_STRUCT END_TYPE然后在 PLC 变量表里建一个数组变量,比如GaragePosArr : Array[1..5] of GaragePos;,五个位置正好对应两层三列里实际可用的五个位置。这样做的好处是,所有查找空位、判断某列是否空余的逻辑,都可以用FOR循环遍历数组实现,不需要一个个车位写条件。
如果你用梯形图,数组访问相对繁琐,而博图提供 SCL 语言,使用 FOR 循环、CASE 结构都很顺手。我实际项目就是在 OB1 中调用一个 FB,全部用 SCL 写状态机。不是说梯形图不好,而是这种多对象运算的任务,SCL 的表达效率明显更高。
3.2 自动取车/存车的状态机怎么写
自动流程建议采用“状态机”模式。很多人习惯用 M0.0、M0.1 这一串中间继电器去搭流程,但一旦状态多了,很难复盘。我用 SCL 里的CASE指令来实现状态切换,代码结构非常清晰。
以自动取车为例,大致流程可以分成:
CASE iAutoStep OF 0: // 空闲状态,等待取车指令 IF bCmdTakeCar THEN iTargetPos := iSelPos; // 记录目标位置 iAutoStep := 1; END_IF; 1: // 检查目标位置是否需要让位 IF GaragePosArr[iTargetPos].CarLayer = 2 THEN iNeedMovePos := iTargetPos - 3; // 找到其下层的对应位置 IF NOT GaragePosArr[iNeedMovePos].IsEmptySpace THEN // 下层有车,必须移动下层空位 iAutoStep := 2; ELSE // 下层已经是空位,直接下降 iAutoStep := 3; END_IF; END_IF; 2: // 执行下层横移让位,调用横移电机功能块 IF bMoveDone THEN iAutoStep := 3; END_IF; 3: // 目标上层载车板下降 GaragePosArr[iTargetPos].MotorStatus := 2; // 下降 IF GaragePosArr[iTargetPos].LimitDown THEN GaragePosArr[iTargetPos].MotorStatus := 0; // 到位停止 iAutoStep := 4; END_IF; 4: // 等待司机取车完成 IF NOT GaragePosArr[iTargetPos].Occupied THEN iAutoStep := 5; END_IF; 5: // 载车板升回上层 GaragePosArr[iTargetPos].MotorStatus := 1; IF GaragePosArr[iTargetPos].LimitUp THEN GaragePosArr[iTargetPos].MotorStatus := 0; iAutoStep := 6; END_IF; 6: // 恢复下层车位 IF bRestoreDone THEN iAutoStep := 0; END_IF; END_CASE;这只是一个示意性的骨架,实际还要插入电机互锁、超时复位、暂停位判断、安全光幕中断等处理。但核心思想是:每个状态只做一件事,做完之后跳转到下一个状态;如果有故障,跳转到故障状态而不是继续执行。
这种写法的最大好处是可调试性和可扩展性。以后新增了三层、四层车库,状态机的骨架基本不用变,只需要在“找让位位置”的步骤里换成根据层数和列数动态计算,或者直接查一张路径表。
3.3 手动和检修模式为什么必须保留到底
无论自动程序多完善,现场调试一定离不了手动模式。调试时电工需要单动某个电机,观察机械行程是否准确,此时自动流程反而碍事。所以我的 HMI 画面上一定有“手动/自动”切换开关。
手动模式下,每个电机都通过按钮点动控制,但安全联锁仍然要生效。比如手动让上层下降,同样要检查下层是否让开;手动横移前,同样要检查目标方向有没有限位冲突。不能因为切到手动就把所有限制放开。这一点非常关键,很多事故恰恰发生在检修人员手动调试时,因为程序跳过了联锁。
还要做一个检修速度限制。有些项目会加装变频器,手动模式强制电机低速运行;如果不带变频器,至少在程序中限制手动按钮的最长动作时间,防止操作员按住不放导致机械一直走到极限。
4. WinCC 触摸屏画面设计的重心在“信息结构”而不是“美观”
4.1 画面层级规划
做 HMI 画面,最忌讳想到什么画什么。我一般先画一个页面关系图,再开始创建画面。以这个车库项目为例,画面层级大致分四层:
- 首层是主画面,显示车库俯视状态,每个车位用一个矩形块表示,有车显示一种颜色,无车显示另一种颜色,空位用特殊标识;
- 第二层是操作画面,包括自动存车、自动取车的目标选择列表,以及手动调试按钮;
- 第三层是报警画面,显示当前故障和历史报警;
- 第四层是参数与系统画面,用来设置动作时间、通信参数、触摸屏时间等。
不要把主画面堆得太满。操作员一天到晚面对屏幕,如果按钮密集得像仪表盘,很容易误触。在主画面上,我会固定放几个全局控件:当前模式(手动/自动)、急停状态、关键报警闪烁区域、返回主画面按钮。这样无论在哪一页,操作员都能快速判断系统是不是正常。
4.2 把 PLC 数据块变量正确地接到 HMI
WinCC 触摸屏访问 S7-1200 变量的前提是变量地址准确、访问权限允许。我在博图里做 HMI 连接时,一般直接把 HMI 的变量表指向 PLC 变量表,建立“动态连接”。在 HMI 变量表中选用“连接”并选择对应的 S7-1200,然后变量名称直接写 PLC 变量名,系统会自动建立映射。
不过这里有一个细节经常让人卡住。S7-1200 的数据块默认是“优化访问”模式,这种模式下变量没有固定的绝对地址,HMI 跨项目访问有时会受限。最稳妥的做法,是在项目里直接让 PLC 和 HMI 处于同一个 TIA Portal 工程中,通过符号寻址访问。如果一定要跨工程或者用第三方上位机读取,我通常会把变量所在数据块的“优化块访问”选项目取消。但取消优化会占用更多内存,并且程序里不能用符号名直接访问绝对地址的绝对部分,需要注意。
立体车库这类项目,我不太提倡把所有变量都挂在 M 区。M 区变量数量有限,而且触摸屏、报警、脚本都要访问,管理起来很乱。把车位的状态放到数据块数组中,HMI 访问时即使因为数据块结构复杂导致起点地址变化,也能靠符号名正确解析。
4.3 按钮事件、报警文本和权限设置(仿真常踩坑区)
WinCC 里按钮的触发方式有很多种:有的用“单击”,有的用“按下”和“释放”,有的要调用系统函数。车库项目中,像“急停复位”这类按钮建议用普通的单击事件;像“点动上升”这类手动控制按钮,我用到的是“按下事件”置位电机正转输出,“释放事件”复位电机输出。这样操作员按住按钮电机运行,松开就停,符合点动的惯例。
如果使用“单击”去触发一个长时间的运行动作,现场调试容易失控。按下去后不知道什么时候会停,除非再加一个停止按钮。所以,手动点动场景尽量模拟按钮的物理特性,按下置位、释放复位。
报警文本建议用 HMI 自带的报警控件,而不是在画面上放一个文本控件自己变色。报警控件能记录报警时间、确认时间、恢复时间,这是验收时特别有用的信息。用 HMI 报警时,要把 PLC 里的故障位和报警变量关联起来,在报警文本里写清楚故障内容,比如“上层1号位上升超时”“安全光幕动作”,并设置优先级。紧急故障设为最高优先级,操作员一眼能看出来。
权限设置是一个很少在教程里展开但现场很要命的问题。立体车库的“手动操作”“参数修改”不能开放给所有操作员。我在 WinCC 用户管理里设置了管理员、操作员、只读三种角色。普通操作员只能进行“自动存取车”和“查看报警”;手动点动、修改超时时间、修改车位数量等功能只有管理员能操作。有些项目投诉“触摸屏被乱按导致车位状态乱了”,基本就是没有做权限控制。
5. 用 PLCSIM 和 HMI 仿真把一套车库装进电脑
5.1 联合仿真启动的顺序常见失败
在真正连接硬件之前,先用仿真把 PLC 程序跑通,能省下大量现场时间。S7-1200 结合博图自带的 S7-PLCSIM,可以模拟 CPU 的运行;WinCC 触摸屏也有仿真模式。两个仿真放在一起,就是一套没有真实硬件也能操作的“虚拟车库”。
操作顺序是有讲究的。我平时这样做:
- 在 TIA Portal 里确认 PLC 程序和 HMI 程序都已完成组态;
- 点击 PLC 文件夹,选择“仿真”按钮,软件会启动 S7-PLCSIM;
- 把 PLC 程序下载到 PLCSIM 中的虚拟 CPU,并运行 CPU;
- 再回到 HMI 文件夹,点击“开始仿真”,启动 WinCC Runtime 模拟器;
- HMI 仿真画面出来后,在画面里进行存车/取车操作,观察 PLCSIM 里的程序状态和变量变化。
很多新手会卡在第 4 步:HMI 仿真开始后,画面显示 PLC 通信中断,按钮没有任何反应。最常见的原因是 HMI 连接里选了一个不存在的“实际接口”,或者没有先启动 PLCSIM。你要记住,仿真时 HMI 的通信伙伴是 S7-PLCSIM 里的虚拟 PLC,而不是真实网卡。如果 HMI 连接属性里选择了 PROFINET 网卡并且勾选了真实接口,那它自然找不到 PLC。
另外,如果你的 TIA Portal 版本里有多套 Runtime,比如 WinCC Runtime Professional 和组合了 Comfort Panel 的 Runtime,启动仿真时要选择与画面类型匹配的那个入口。KTP 精智面板对应的仿真器和 Unified 精智面板的仿真器不一样,别点错。
5.2 “HMI 仿真按钮点了没反应”这类问题的排查顺序
这个问题出现的频率很高。我总结了一条排查顺序,每次按照这个顺序走,基本都能定位到问题:
第一,看 PLCSIM 是否处于运行状态。如果没启动或者已经停止,HMI 连不上任何 PLC,按钮点下去当然没反应。
第二,看 HMI 画面右上角或状态栏有没有通信错误图标。如果有红色断开标记,说明连接不稳定,去检查 HMI 变量表里的连接参数,确认连接名称指向正确的 PLC。
第三,看按钮的事件设置。检查按钮事件是配置在“单击”还是“按下”还是“释放”上。有些情况下,事件配置了但动作选错了,比如选择“设置变量”却把变量值写成了固定的 False,结果变量永远不变。
第四,用 PLCSIM 里的变量表实时监视对应变量。如果按钮按下后变量值没有变化,说明问题出在 HMI 到 PLC 的写入路径;如果变量变化了但电机没有动作,说明问题在 PLC 程序逻辑而不是 HMI。
第五,看画面对象是否被“禁用”或“不可见”。我在做权限控制后,曾经忘了给默认用户开放操作权限,结果运行 HMI 后所有带权限的按钮全部置灰,看起来就像按钮没反应。
还有一个小坑:如果 HMI 项目里用了“内部变量”而不是 PLC 变量,按钮只能改变 HMI 内部的值,永远不会写入 PLC。仿真时特别容易搞混,因为内部变量也能在画面里变化,但 PLC 程序毫无感知。
5.3 一鱼多吃:多型车库的仿真模拟怎么做
标题里提到“多型车库仿真模拟”,这也是我把程序做成通用功能块的原因。立体车库不只两层三列一种,常见的还有负一正一升降横移、平面移动、循环式等。如果每个新项目都从零开始写一套 PLC 程序,工作量巨大,而且容易引入新 bug。
我的做法是提炼公共动作块:
Func_CarMove:负责一个载车板的运动,输入是目标位置和动作方向,输出是执行结果和故障码;Func_FindEmptySpace:负责搜索当前车库的空位;Func_AutoDispatch:负责存车/取车的整体调度;WinCC_Interface:专门处理和触摸屏交互的数据结构。
在做多型车库仿真时,只需要在 PLC 里把车位数组的尺寸和位置编号改成对应类型,比如三层三列就在数组里定义 8 个有效位置,再在调度函数里把“找下层对应位置”的规则改成按层数循环查找。HMI 画面也可以通过修改列表变量来切换车型,而不必为每个车库类型重新画一遍画面。
我在博图里用一个项目同时组态过三种车型的测试画面:车型 A 是两层三列,车型 B 是三层三列,车型 C 是地下两层加地面层的简易升降。每个车型对应一套 PLC 背景数据块和一组画面变量。仿真时,用 HMI 的“系统变量”或画面模板切换不同车型页面,就能在同一套 PLCSIM 环境下验证不同程序的调度逻辑。这个做法对产品系列很全的机械停车设备厂家特别有用。
5.4 仿真通过后别忘了“硬件在环”认知
必须强调一句:PLCSIM 仿真再好,也不能替代现场接线检查。为什么?因为仿真环境里不会出现接触器线圈烧毁、限位开关触点接触不良、电机热保护跳闸这类现场问题。PLCSIM 里给定一个限位信号它就立即为 True,但现场可能要花几秒钟才能真正碰到限位,甚至因为机械抖动产生毛刺信号。
所以,仿真主要用来验证调度逻辑是否正确,HMI 操作流程是否顺畅,报警条件是否能触发。真正到现场,还需要做一次完整的点动测试和限位信号校准。我习惯在现场调试前,把 HMI 画面再对着点表过一遍,确认每一个显示状态对应的 PLC 变量确实接到了对应传感器上。
6. 项目收尾阶段值得反复检查的细节
6.1 触摸屏字符串和文本不刷新的处理经验
这个问题的表象很怪:PLC 里的字符串变量明明已经变成 0 或另一个值,触摸屏上却还保留上一次内容。我处理过不止一次。
先说结论:大多数情况下,这不是 PLC 值没改,而是 HMI 画面对象没有收到“刷新通知”。WinCC 触摸屏对于字符串变量的显示,一般要等画面重新激活或变量值发生“变化事件”才更新。如果字符串变量是通过通信周期性写入,而 HMI 的采集周期设得比较长,或者 HMI 读取的数据块属性不允许通信访问,画面就会停在旧值。
我在仿真时还遇到过另一种可能:画面上用的是“文本列表”而不是字符串变量。文本列表显示的是数字编号对应的文本,比如 0 对应“空闲”,1 对应“运行”。如果你改的是 PLC 里的字符串变量,但画面控件使用的是数字值和文本列表映射,那显然不会刷新。这种情况下应该检查画面对象是不是“IO 域”的字符串模式,或者是不是“符号 IO 域”的文本列表模式。
经验做法是:能不用字符串就不在 HMI 上直接显示动态字符串,用“数字状态量+文本列表”或“多状态指示灯”来实现,刷新率和可靠性都要好很多。如果一定要显示字符串,给 HMI 变量设置一个足够短的采集周期,或者用一个额外的 Bool 位做“变化触发”。
6.2 博图版本、授权和项目备份的自我保护
最后说一点工程习惯。博图版本升级很快,V16、V17、V18、V19、V20 都有大量人在用。对项目工程师来说,最关键的一点是:高版本能打开低版本项目,低版本打不开高版本项目。规划项目时,先确认业主、施工队、监理所有的软件环境,再定 TIA Portal 版本,否则后面换电脑维护时会特别痛苦。
如果要在同一台电脑上装多个博图版本,安装顺序和兼容性要比想象的更敏感。我建议是能分开电脑就分开电脑;实在要装一起,至少不要把跨大版本的两个软件同时安装到同一系统目录,并且严格按官方兼容矩阵来。安装 WinCC 相关组件时,如果遇到授权或长密钥安装问题,先检查 Windows 账户权限和杀毒软件拦截,不要把时间花在反复重装同一次报错上。
项目备份我也吃过亏。TIA Portal 项目文件最好每次修改后都生成完整备份包,或者通过项目归档功能导出。归档文件要带上日期和项目名。程序里如果有注释、符号名、背景数据块,这些信息在备份里都有;如果需要上载现场 PLC 程序,不一定能把原注释完整带回来,尤其是跨版本项目。碰到现场 PLC 被密码保护的情况,千万不要尝试用第三方手段绕保护,正规做法是找设备厂家提供密码或程序文件,并确保程序修改有记录。
6.3 现场验收清单(每一条都是我交过学费的)
项目交付之前,我会按下面这个清单自己先过一遍,再带着业主一起过:
- 每个手动按钮单独动作是否正常,电机会不会出现反转方向错误;
- 限位开关信号和 PLC 变量是否一致,谁动了限位能在 HMI 上立刻看到状态变化;
- 光幕遮挡时,正在运行的电机会不会立刻停机;
- 急停按下后,屏幕上有没有红色报警,恢复后必须先复位才能重新启动;
- 自动存车流程中,如果上层目标位下方有车,程序会不会先启动让位动作;
- 自动取车流程中,如果司机取了车但没有把车完全开出,程序会不会误判;
- 电机连续运行超时后,报警能不能正确触发,故障复位后能否正常恢复;
- 触摸屏的权限配置是否按照人员角色设定,普通操作员能不能误入参数页;
- 断电再上电后,车库状态和当前车位占用情况是否还能正确保持,还是全部丢失;
- 把 HMI 切到断电重启,是否能自动进入主画面,不会卡在某个报警确认页。
这里面最容易出问题的是第 9 条。很多程序把“车位是否有车”直接存在 PLC 的掉电保持区之外,导致断电后数据丢失,重新上电时 HMI 显示的车位状态和实际不一致。立体车库现场经常有人误按急停甚至拉闸断电,所以车位占用信息一定要放在掉电保持的数据块变量里,或者采用保存在存储卡中的方式。
再分享一个我自己的调试习惯:不要一上来就全自动跑整个流程。先把 PLC 程序下载进去,切到手动,用 HMI 点动每个电机运行到限位,确认每个输入点都能被正确采集;确认完输入输出,再开放自动模式,用“空板运行”不带任何车的情况下空跑几遍存取动作。这些步骤看起来慢,实际上是最快的路径。现场时间不是省出来的,是按流程一步步稳下来的。
我常说,立体车库控制系统最怕的不是某个算法不会写,而是“你以为它是 A,结果它是 B”的边界情况。S7-1200 加 WinCC 这套组合帮我们解决了很多工程化的问题,但真正决定项目能不能稳定运行,还是靠控制逻辑里的互锁、超时和状态恢复这些细节。希望这篇内容能给你自己的项目带来一些可直接落地的思路。