前阵子接了个单部五层电梯的控制项目从头到尾用西门子博图TIA Portal做了一遍程序放在PLCSIM里跑画面用WinCC做了全自动仿真联动。这个项目不算大但麻雀虽小五脏俱全内呼、外呼、顺向截梯、自动平层、开关门时序、上下行指示真实电梯该有的逻辑一样不少。做完之后我最大的感受是这种“程序画面”联动的仿真方式特别适合在真机调试之前把逻辑跑通也特别适合刚入门的朋友理解电梯到底是怎么被“控制”起来的。这篇就把整个过程拆开讲一遍从IO规划到程序架构从画面组态到仿真联调最后把踩过的坑一并列出来。1. 动手前先想明白一台五层电梯到底要控什么很多初学者拿到这种题目第一反应是“直接写程序”这恰恰是最容易翻车的做法。电梯控制看着简单但如果你没把IO清单和运行需求理清楚写出来的程序大概率是一团乱麻功能上能跑逻辑上一塌糊涂。我习惯先花半天时间把需求拆透再动笔写代码。1.1 先把IO和变量清单列出来五层电梯的信号其实可以用一张表覆盖。先看输入侧轿厢内有5个内呼按钮1楼到5楼各楼层有外呼按钮但注意一楼只有上行按钮五楼只有下行按钮中间楼层二、三、四楼各有一个上行和一个下行按钮。这样外呼按钮总数是122218个。加上5个内呼输入端至少13个数字量。输出侧呢方向指示至少两个上行、下行门机控制至少两个开门、关门再加上七段码楼层显示或二进制楼层指示灯以及呼叫应答指示灯。如果要做安全功能还要考虑上下极限、门区感应、开关门到位等信号。下面是这个项目我实际用的简化变量表变量名地址/类型功能说明内呼按钮1~5I0.0~I0.4轿厢内选层外呼上1~4I0.5~I0.7, I1.01~4楼上行呼梯外呼下2~5I1.1~I1.42~5楼下行呼梯平层感应I2.0到站平层信号开门到位I2.1门开到位反馈关门到位I2.2门关到位反馈上行输出Q0.0驱动上行接触器/方向指示下行输出Q0.1驱动下行接触器/方向指示开门输出Q0.2驱动开门关门输出Q0.3驱动关门楼层指示Q1.0~Q1.2二进制/七段码楼层显示这张表看起来简单但它是后面所有程序的“地基”。做仿真时像平层感应、开关门到位这些现场信号没有实物就需要在程序里用定时器和内部变量模拟出来。我建议画变量表时就预留几个内部变量位比如“模拟当前楼层”“模拟运行计时”后面写仿真逻辑时直接引用不用回头再改地址。1.2 电梯的“大脑”到底在算什么把IO表列完你会发现电梯的“大脑”其实就干三件事记住所有呼叫目标、判断当前应该往哪个方向走、到站后完成开门关门的时序管理。听上去简单但细节全在“判断”里。用生活类比来理解调度电梯就像一辆只在五层楼之间跑的出租车。车上有乘客内呼目标路上还会遇到招手的人外呼目标。司机的原则是如果正在往上走就优先接顺路方向上的乘客顺路的没有了才调头处理反方向的。这就是电梯行业常说的“顺向截梯”和“反向最远端响应的基础逻辑。如果你把这个比喻想明白了程序框架就已经在脑子里了。那为什么选西门子博图来做这个仿真TIA Portal把PLC编程、HMI画面组态、PLCSIM仿真放在一个工程里变量表是共享的PLC里定义好的变量可以直接拖到WinCC画面里用。这意味着程序里改一个变量名画面绑定自动跟着更新不用像老式Step 7加WinCC那样在两个软件之间反复导变量。对于单部电梯这种需要频繁调试的项目这个集成度省下的时间非常可观。2. 程序怎么编调度逻辑与仿真细节程序是整套仿真的大脑。我习惯用“状态机目标集合”的思路来写而不是一上来就堆一堆互锁的梯形图。状态机让程序结构清晰目标集合让调度逻辑不丢楼层。2.1 状态机先行把电梯拆成5种状态电梯运行的状态其实很固定待机、上行、下行、开门、关门含开门保持。我建议用数字给状态编号1到50留作初始清理态。为什么这么干因为很多新手喜欢用布尔量表示状态比如“上行位”“下行位”“开门位”结果程序里到处都是置位和复位查问题的时候根本分不清当前到底处于哪个状态。用一个整型状态字CASE语句一拉逻辑一目了然。下面是这个项目里状态切换的核心SCL片段我简化了中间细节但框架就是这样的CASE #state OF 1: // 待机 IF #hasTarget THEN IF #targetFloor #currentFloor THEN #state : 2; // 上行 ELSE #state : 3; // 下行 END_IF; END_IF; 2: // 上行 IF #currentFloor #targetFloor AND #levelSignal THEN #state : 4; // 到站转入开门 END_IF; 3: // 下行 IF #currentFloor #targetFloor AND #levelSignal THEN #state : 4; END_IF; 4: // 开门 IF #doorOpenTimer.Q THEN #state : 5; // 开门到位延时后关门 END_IF; 5: // 关门 IF #doorCloseTimer.Q THEN #state : 1; // 关门到位回到待机 END_IF; END_CASE;状态切换有几个必须注意的细节。上行过程中判断到站不能只看“目标楼层等于当前楼层”一定要加平层信号也就是电梯真正进入门区的那一下。否则程序会在电梯还没停稳时就发开门指令这在仿真里不明显但在真实设备上就是事故。另一个细节是状态切换必须等当前动作完成后才进行比如关门状态要等关门到位信号不能直接跳回待机否则门还没完全关上电梯又开始跑了这在现场是绝对禁止的。2.2 目标楼层怎么“记”和怎么“选”这是整个程序里最考验逻辑的地方。很多人的第一反应是设一个“目标楼层”变量有呼叫就更新它。这个做法在只有内呼时还能勉强跑但一旦有多个楼层同时呼叫问题立刻暴露后一个呼叫会覆盖前一个中间楼层的乘客直接被遗忘电梯就开始乱跑了。正确做法是用“目标集合”也就是5个BOOL变量或一个长度为5的数组分别代表1到5楼是否有等待的呼叫。内呼也好外呼也好只是把对应楼层的位“置1”而不是把目标楼层号赋给一个变量。这样多个呼叫可以同时存在互不覆盖。选目标层时我用循环扫描// 上行时找当前层之上最近的目标 #defaultFound : FALSE; FOR #i : #currentFloor 1 TO 5 DO IF #targetSet[#i] THEN #nearestTarget : #i; #defaultFound : TRUE; EXIT; END_IF; END_FOR;这个思路对应前面说的出租车原则往上走时只关心上方的呼叫越近越优先上方没有了才考虑反方向。反方向的调度可以单独用另一个分支处理但要注意处理“最远端反向”还是“就近反向”。这个项目里我采用的是实用派做法如果同方向没有目标就直接找最远端反向目标这样电梯不会频繁调头运行效率最高。如果你用的是梯形图别试图用一堆比较指令手写循环直接用SCL写FOR循环博图里梯形图功能块内嵌SCL非常方便。2.3 仿真怎么模拟电梯“跑起来”真实电梯靠电机带着轿厢跑编码器反馈位置平层感应器确认楼层。但仿真环境没有物理量所以全得靠程序模拟。我这里用了一个“模拟当前楼层”变量和两个定时器来模拟运行过程。核心逻辑很简单电梯上行时启动一个“运行计时器”按每层2秒来算计时器每满2秒当前楼层加1同时产生一个50ms的平层脉冲。这个脉冲用来做什么就是给状态机里的平层信号用的。注意平层信号必须是边沿触发不能是持续的电平否则状态机在开门状态下会反复触发“到站”造成门开一半又去判断下一站电梯逻辑直接乱掉。开门和关门同样用定时器模拟。开门延时设为3秒门到位信号在定时器到达时置位关门延时设为2秒关到位后置位复位再回到待机状态。实际上真实项目里开门和关门到位信号来自门机反馈这里用定时器代替是为了在没有硬件的情况下把整个流程闭环跑起来。这里要提醒一个坑模拟运行计时器在上行和下行时都要清零重开而且方向切换时要特别注意计时器不能被上一次运行的剩余时间干扰。我在初版程序里就吃过这个亏电梯下行时计时器沿用上行的计时结果导致仿真里电梯像瞬移一样一下跳过两层楼。最后的解决办法是每次状态机进入上行或下行状态的第一扫描周期强制把运行计时器清零。3. 画面怎么组让电梯看得见程序写完后项目完成度其实只到了一半。这个项目叫“从程序到画面”说明HMI联动的全自动仿真才是重头戏。画面组态看起来是“画画”但实际操作中有不少门道尤其是动画绑定这一层不自己动手试一遍很容易卡住。3.1 画面布局设计先画出井道和楼层打开博图的WinCC画面编辑器我先画一个纵向的电梯井道背景左右两边用两条细长矩形当导轨中间画5个楼层分界线左侧标注1到5楼的数字。轿厢用一个大一点的矩形表示颜色和背景区分开这样运行起来时移动效果才明显。画面的右侧专门放操作区和状态区5个内呼按钮我用圆形对象加文本实现、各楼层的外呼请求指示灯、当前楼层显示、上下行方向箭头、开关门状态文字。每一个元素都对应PLC里的一个变量按钮类型选“按钮”按下时触发变量置位指示灯类型选“圆形”或“矩形”颜色随变量变化。布局上有个小技巧先把背景、轿厢、楼层线这些静态对象画好然后再放按钮和文本这样不容易互相遮挡。画完后要学会用“对齐”工具把所有元素按井道中轴线居中不然运行起来画面会显得乱。3.2 动画绑定移动、变色、可见性这是整个画面组态最核心的部分。WinCC里给对象添加动画不是在属性里直接填一个数值而是在“属性-动画”页里配置。选中轿厢矩形添加“移动”动画连接“模拟当前楼层”变量设置Y轴偏移方向和范围。这里的关键参数是楼层间距。如果井道总高600像素5层楼等分每层就是120像素。轿厢在1楼时Y坐标设为0在5楼时Y坐标设为480。WinCC的移动动画允许设置变量的上限和下限把上下限设置为0到4或1到5再配合目标值换算就能实现楼层和像素的对应。我建议把换算放在PLC里做HMI只做显示比如在PLC中多设一个“显示Y坐标”变量直接对应像素偏移量这样即使以后改画面尺寸也不用回头调PLC逻辑。按钮状态、指示灯颜色、方向箭头这些全部用“颜色动画”绑定。比如外呼上行灯变量为1时显示红色为0时显示灰色轿厢方向箭头通过“可见性”动画控制上行箭头变量为真时可见下行箭头为真时隐藏。我还会加一个“开门状态”文本用“文本动画”连接状态变量显示“开门中”“关门中”“待机”等文字这样仿真运行时整个电梯的动作一目了然不用盯着PLC变量表猜状态。3.3 HMI仿真怎么和PLCSIM连起来程序编译下载到PLCSIM后还要让WinCC画面和PLCSIM里的程序“对话”。具体操作其实不复杂在博图项目树里建立PLC和HMI的连接路径选“以太网”地址设成同一网段然后在HMI的“连接”设置里确保激活了仿真运行。启动顺序也很重要我一般先把PLCSIM启动并切到RUN状态再启动HMI仿真。有个非常容易踩的坑HMI仿真启动后画面上的变量全部显示“###”或者“变量无法访问”十有八九是连接路径没配对。检查方法是展开HMI的“连接”选项卡看连接状态是否为绿色不是绿色就重建连接。另一个坑是HMI变量的“访问路径”选错了比如PLC程序里变量在OB1的临时区HMI访问不到因为临时变量不保留数据。所有要在画面上显示的变量必须放在DB数据块或M区里我用的是DB块偏移地址固定HMI连接时直接选DB名和变量名干净利落。4. 联调中的坑与排查实录仿真联调阶段画面能显示、程序能跑不等于一切正常。我在这个项目里先后遇到了“电梯不动”“电梯乱跑”“画面不刷新”“画面整体偏移”这几类典型问题逐个说下排查思路和处理方法。4.1 程序正确但电梯“一动不动”怎么查这是最让人头大的情况因为你看梯形图觉得逻辑没问题看SCL也觉得没错但仿真里电梯就是死都不动。我给自己定了一套排查顺序从外到内第一看PLCSIM状态是否在RUN不在RUN一切白搭顺便看一下CPU有没有报错红灯。第二看OB1到底有没有调用你写的函数块。这个低级错误出现频率高得惊人我见过不止一个人把FC/FB写完了但OB1里压根没调用程序自然不会执行。第三用交叉引用检查关键变量是否被多个地方写操作尤其是状态字和运行计时器如果被两段程序同时写结果就是状态被覆盖电梯永远停在待机。第四检查初始状态。如果你的状态变量初始值是0但0又是某个状态开机瞬间可能直接进入非预期状态。我统一用1到5编号0作为“未初始化”进入OB1第一段先把状态字初始化为1也就是待机这样逻辑永远是可控的。4.2 电梯反复开关门、乱跑的坑项目做到一半仿真里电梯出现了一个很诡异的现象到站后门开了又关、关了又开反复好几次才走。排查下来问题出在平层信号上我最初用的是电平触发“当前楼层等于目标楼层”作为到站条件结果电梯在门区停留时这个条件一直成立状态机就被反复触发。解决办法是加R_TRIG上升沿检测。平层感应只产生一个脉冲状态机只在脉冲那一个扫描周期内进入开门状态之后就不会再被触发。另一个反复开关门的原因是开门到位和关门到位的反馈信号没有互锁我加了一个门状态锁存位开门过程中屏蔽关门指令关门过程中屏蔽开门指令故障现象立刻消失。至于电梯“乱跑”多半和目标选层逻辑有关尤其是多个呼叫同时存在时没有用目标集合而是用了单变量覆盖。另外方向切换时要注意先复位运行状态再置位新的方向位避免同一扫描周期内上行、下行同时为真。这一点在所有PLC品牌里都一样双线圈和重复输出是逻辑混乱的最常见来源。4.3 WinCC画面整体偏移的调整技巧联调时还遇到了一个很影响体验的问题画面整体往左偏移右侧有一大块空白区域按钮都偏出去了。查了一圈不是PLC的问题是HMI画面本身的分辨率设置和电脑显示缩放不匹配。TIA Portal的WinCC画面在仿真时默认按设定的分辨率显示如果你电脑系统显示缩放是125%或150%而画面分辨率设置比实际小仿真窗口打开后就会被系统缩放干扰看起来像整个画面偏移。解决办法有三个按优先级排序第一在项目树里检查HMI设备的显示设置分辨率改为与仿真窗口一致第二把电脑显示缩放临时调整为100%第三如果只是个别元素偏移选中所有对象整体拖回原位再用“对齐”工具统一排列。做了这几步后画面整体偏移的问题基本就消失了。4.4 常见问题速查表这些年调试电梯仿真我把高频问题整理成了一张速查表新手照着查效率会高很多现象可能原因排查/处理办法电梯完全不动OB1未调用功能块/PLC未RUN查OB1调用确认PLCSIM运行状态电梯到站不停平层信号未触发/条件用了电平改用上升沿触发检查模拟平层脉冲反复开关门门反馈未互锁加门状态锁存互锁开门/关门指令电梯乱跑目标楼层被覆盖改用5位目标集合不要用单变量存目标画面变量显示###HMI连接未建立/变量路径错误检查连接状态和访问路径确保变量在DB/M区画面整体偏移分辨率与显示缩放不匹配调画面分辨率或临时改系统缩放为100%编译报step 7 basic相关错误软件版本与系统不兼容/路径含中文改纯英文工程路径用管理员权限打开TIA Portal5. 走过几遍弯路之后的实操心得前面聊了很多技术细节最后说几句心里话。这个五层电梯仿真项目做完后我的直接感受是仿真联调这一步的价值被很多人低估了。很多做PLC的朋友习惯在真机上直接调但电梯这种设备一旦逻辑没整明白就上电轻则程序锁死重则机械损坏。用博图的PLCSIM加WinCC做全自动仿真你能在完全不碰硬件的情况下把调度逻辑、状态切换、画面联动全部验证一遍这种安全感是没法用钱衡量的。我个人的实操建议是不要试图一次性写完所有功能。第一次只做内呼逻辑把轿厢跑动和楼层显示弄通第二次加外呼处理顺向截梯第三次再优化反向调度和开关门时序。每完成一个阶段就另存一个版本这样即使改崩了还能退回上一版。变量命名也尽量规范不要用“M0.0”“M0.1”这种地址当符号名而是用“内呼1楼”“外呼上行4楼”这种可读性强的名称联调时你会发现这个习惯能救命。最后再分享一个小技巧仿真调试时把博图的“监控表”和WinCC画面分屏显示一边看变量变化一边看画面动作定位问题的速度比单看画面或单看变量快得多。我自己调试时PLCSIM监控窗口放在左边WinCC仿真窗口放在右边切换逻辑变量时两边对照基本几轮就能锁定问题所在。这个项目虽然规模不大但把它的逻辑吃透后面再去做二十层、三十层的电梯核心思路都是一脉相承的。
