ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

基于博图V15的S7-1200四层电梯PLC与触摸屏仿真完整实战

基于博图V15的S7-1200四层电梯PLC与触摸屏仿真完整实战 前阵子接到一个技术咨询对方在做一个西门子S7-1200的4层电梯仿真模拟程序要求在博图V15软件下同时完成PLC程序和触摸屏画面。聊了一会儿发现大部分卡住的地方不是PLC基础指令而是不知道电梯控制逻辑怎么从“人的直觉”翻译成“PLC的扫描循环”以及触摸屏和PLC在仿真模式下怎么配合跑起来。这个项目在实训、毕设和工程师入门里都很常见问的人也多所以我把完整实现思路和联调经验整理成一篇实战笔记适合正在做电梯项目的朋友也适合准备接触运动控制和HMI集成的初学者。1. 项目拆解4层电梯的输入输出和控制功能1.1 为什么选S7-1200和博图V15这套组合S7-1200是西门子中小型PLC的主力型号CPU 1214C DC/DC/DC自带14路数字量输入和10路数字量输出做4层电梯仿真模拟程序刚好够用。而且S7-1200在博图V15中有比较成熟的PLCSIM仿真能力这意味着没有真实PLC也能完成大部分程序验证和调试对没有硬件条件又想学习的人来说非常友好。博图V15最大的价值是把PLC编程和HMI组态放进同一个工程项目里。早年间做西门子项目PLC用STEP 7触摸屏用WinCC Flexible两边变量对接经常要手动维护稍微改一个地址就容易漏掉。V15里直接拖一个PLC设备和一个HMI设备进同一项目PLC变量能被HMI直接引用程序块一编联调成本低了不少。做4层电梯这种“逻辑不复杂但联动很多”的项目这套开发模式优势尤其明显。当然做电梯不只有西门子一个选择三菱FX系列、欧姆龙CP系列、台达和汇川也都能做。但如果你在毕设、实训或者公司项目里被指定用S7-1200或者你希望以后做西门子系项目时积累经验那么用博图V15来落地电梯项目确实是合理的选择。后面要讲的逻辑和思路换到别的PLC平台也一样适用只是指令和开发环境不同。1.2 4层电梯到底要完成哪些功能很多初学者上来就写梯形图结果写了一半发现漏了按钮、漏了方向判断甚至漏了“电梯到站得先停下来”这个最基本的行为。我建议先把功能清单列全再考虑怎么写程序。4层电梯仿真模拟程序至少应该包含以下功能轿厢内呼1层到4层共4个选层按钮厅外召唤1层只有上行召唤4层只有下行召唤2层和3层有上行加下行召唤共6个按钮运行方向指示上行、下行状态要能显示在触摸屏上楼层指示实时显示当前所在楼层平层与到站停车电梯运行到目标楼层后准确停靠自动开关门到站后自动开门延时后自动关门顺路停靠同方向运行途中遇到请求楼层会停反向请求不响应手动开关门和检修模式这是真实电梯的必要功能仿真项目也应该有如果只做最基本的“点按钮电梯走”那只能叫“楼层选择器”不叫电梯。顺路停靠逻辑才是电梯控制里最能体现工程思维的地方也是面试时经常被追问的内容。1.3 I/O分配与硬件组态建议先把I/O规划好程序写起来才不会乱。这里给一份我实际使用的I/O分配表你可以根据自己的硬件条件调整。信号名称地址类型说明内呼按钮1层I0.0BOOL轿厢内选层1内呼按钮2层I0.1BOOL轿厢内选层2内呼按钮3层I0.2BOOL轿厢内选层3内呼按钮4层I0.3BOOL轿厢内选层4外呼上行1层I0.4BOOL1层厅外上呼外呼上行2层I0.5BOOL2层厅外上呼外呼上行3层I0.6BOOL3层厅外上呼外呼下行2层I1.0BOOL2层厅外下呼外呼下行3层I1.1BOOL3层厅外下呼外呼下行4层I1.2BOOL4层厅外下呼门开限位I1.3BOOL开门到位信号门关限位I1.4BOOL关门到位信号平层脉冲I1.5BOOL每经过一个楼层触发一次急停按钮I1.6BOOL常闭信号检修模式I1.7BOOL检修状态切换输出上行Q0.0BOOL电机上行接触器输出下行Q0.1BOOL电机下行接触器开门输出Q0.2BOOL开门继电器关门输出Q0.3BOOL关门继电器上行指示Q0.4BOOL方向灯/触摸屏状态下行指示Q0.5BOOL方向灯/触摸屏状态七段码A-DQ1.0-Q1.3BOOL楼层数字显示平层脉冲这个信号值得专门说一下。真实电梯在井道每层都安装了平层感应器感应器穿过隔磁板时会产生一个脉冲。电梯往上或往下运行时PLC根据脉冲来数楼层。仿真项目里如果没有实际感应器可以用PLCSIM里的输入强制信号来模拟也可以让触摸屏上的按钮临时触发这个脉冲信号。总之楼层定位不能只靠“当前层判断”必须有脉冲计数逻辑否则电梯无法“知道自己到第几层了”。2. 控制逻辑的核心状态机、方向决策与请求管理2.1 把电梯看成状态机而不是一堆按钮电梯控制逻辑最容易犯的错误是试图把所有按钮和条件直接排列组合成梯形图。结果就是程序庞大、互锁复杂改一个条件可能引发连锁问题。我在做项目时习惯把电梯抽象成几个明确的状态待机停靠IDLE上行运行中RUN_UP下行运行中RUN_DOWN开门状态DOOR_OPEN状态之间的转换条件才是真正的控制逻辑待机到上行检测到高于当前楼层有请求待机到下行检测到低于当前楼层有请求上行到开门当前楼层存在请求需要停靠下行到开门当前楼层存在请求需要停靠开门到待机/上行/下行关门延时结束根据剩余请求决定下一步把电梯当成状态机来设计好处是程序结构清晰每个状态之间的“箭头”都是一段独立逻辑调试时能明确知道“现在卡在哪一步”。如果所有逻辑乱堆在一个OB块里一旦电梯不动作你都不知道是该查方向判断还是查门锁信号。2.2 方向决策算法同向优先顺路停靠方向决策是电梯程序里最容易写错的地方。很多初学者写的逻辑是“有请求就往那个方向走”听起来没问题但会产生一个经典Bug电梯在2层上行时乘客按了1层下行召唤电梯立刻变向下楼结果3层的内呼乘客被晾在一边。真实电梯不会这样它会先完成当前方向的所有请求再换向。同向优先的算法思路是如果当前方向是上行就先响应当前楼层以上的所有请求只有确认上方已经没有请求了才开始响应下方请求。反过来也一样。用SCL伪代码表达就是// 判断上方是否存在请求 HasRequestAbove : FALSE; FOR i : CurrentFloor 1 TO 4 DO IF CarCall[i] OR HallCallUp[i] OR HallCallDown[i] THEN HasRequestAbove : TRUE; END_IF; END_FOR; // 当前方向为上行时如果上方无请求允许换向 IF RunDirection DIR_UP THEN IF NOT HasRequestAbove THEN RunDirection : DIR_DOWN; END_IF; END_IF;注意这个判断要在电梯运行过程中持续扫描。也就是说电梯上行时每次都检查上方是否还有请求如果没有了就在完成当前楼层停靠后自动准备换向。这样就能做到“不会漏掉顺路请求也不会提前反向”。顺路停靠的判断也要细化。严格来说电梯上行时遇到当前楼层有“外呼下行”请求通常不应该停靠因为乘客的方向和电梯运行方向相反。但在仿真项目里如果只做单梯模拟可以简化为“当前楼层只要有任意请求就停靠”程序更简单也不容易产生体验上的明显缺陷。如果你想把逻辑做得更接近真实电梯可以加上方向匹配判断上行停靠只匹配内呼、上行外呼和本层下行召唤中的“本层内呼”与“上行召唤”反向召唤不响应。2.3 请求置位与清除的时机请求管理看似简单实则坑很深。请求的置位规则是按钮按下就置位直到电梯完成服务才复位。请求的清除时机则要仔细设计。一个常见错误是电梯刚到站停稳程序立刻把当前楼层请求复位。实际运行中你会发现这时候门还没打开乘客还没上下但PLC已经“忘记”了这次请求于是刚关上门外呼按钮可能又被按了一次电梯又重新开门看起来就像门反复开关。正确的做法是在门开到位、乘客上下时间结束或者门开始关闭前再清除当前楼层的对应请求。这样才能保证“服务已经完成”而不是“电梯刚到位”。另外请求清除要区分内呼和内外呼。如果电梯停靠当前层是因为内呼应该同时清除该层的内呼和同向的外呼请求如果是因为外呼停靠则清除该层对应的外呼请求。在仿真项目里可以简化成统一清除该层所有请求避免出现“内呼清了但外呼还亮着”的怪象。3. 博图V15里的具体实现SCL、变量表和FB3.1 项目创建与硬件组态里的几个细节打开TIA Portal V15新建项目添加一个S7-1200 CPU 1214C DC/DC/DC再添加一个HMI设备。如果打算运行仿真HMI可以选择KTP1200 Basic PN这是西门子比较常见的触摸屏型号也是和S7-1200搭配最顺的。硬件组态里有几个细节容易踩坑第一是IP地址。S7-1200默认IP是192.168.0.1KTP1200默认IP是192.168.0.2。如果你电脑网卡也配置在同一网段下载时就不会出问题。做仿真时PLCSIM会接管IP通常不需要额外设置但如果你用真实PLC和真实HMI一定要确认两个设备的IP在同一个子网。第二是HMI的映像文件。热词里有一条“plc由于缺少面板映像下载失败。请安装缺少的面板映像”这个问题我在V15里也遇到过。winCC下载时提示缺少面板映像是因为安装博图V15时没有把对应HMI设备的映像文件装上。解决办法有两个一是重新运行博图V15安装程序勾选安装所有HMI映像文件安装包比较大二是从西门子支持网站下载对应设备的映像补丁包安装后重新生成下载文件。这个坑在初学者里出现频率非常高尤其是用了精简版安装包的机器。第三是PLC和HMI必须建立PROFINET连接。组态时把PLC的PROFINET接口和HMI的PROFINET接口连到同一个工业以太网交换机或直接连到同一个子网否则后面HMI没法访问PLC变量。3.2 变量表与数据块设计在PLC变量表里把前面I/O分配表中的地址全部定义好命名规范一点输入信号以I开头输出信号以Q开头。这样后面写程序时不容易把地址搞混。我建议把电梯控制相关的数据集中放在一个数据块里结构类似这样DB Elevator_Data CurrentFloor: Int; RunDirection: Int; State: Int; CarCall: Array[1..4] of Bool; HallCallUp: Array[1..4] of Bool; HallCallDown: Array[1..4] of Bool; DoorOpenCommand: Bool; DoorCloseCommand: Bool; DoorOpenTime: Time; DoorCloseTime: Time; HighSpeedRun: Bool; AlarmStop: Bool;为什么用数组而不是单独定义CarCall_1、CarCall_2、CarCall_3、CarCall_4这样的变量因为数组配合FOR循环可以大幅简化“判断楼上楼下是否还有请求”的逻辑。上面方向决策代码里用了一个FOR循环扫描4层请求如果用单独的变量就得写4遍或8遍判断程序又长又容易漏。另外建议单独建一个“HMI_Data”DB专门放触摸屏要读写的数据。比如当前楼层、方向、请求状态、门状态、手动开关门指令、报警标志等。这样HMI的变量连接只指向这个DB不需要满项目去找变量。后期如果调整PLC内部结构也不会影响HMI画面。3.3 核心SCL程序段的写法程序主体放在一个函数块FB里我习惯命名为FB_Elevator。语言选择SCL这样状态机、FOR循环、数组操作都比梯形图方便太多。创建FB后在接口里定义好输入输出和静态变量然后把下面的逻辑块填充进去。第一个逻辑状态机主框架。CASE State OF IDLE: // 待机状态判断是否启动 IF HasRequestAbove THEN State : RUN_UP; MotorUp : TRUE; ELSIF HasRequestBelow THEN State : RUN_DOWN; MotorDown : TRUE; END_IF; RUN_UP: // 上行中 IF CurrentFloorRequest THEN // 到站准备停车 MotorUp : FALSE; State : DOOR_OPEN; DoorOpenCommand : TRUE; END_IF; RUN_DOWN: // 下行中 IF CurrentFloorRequest THEN MotorDown : FALSE; State : DOOR_OPEN; DoorOpenCommand : TRUE; END_IF; DOOR_OPEN: // 开门状态延时后关门 IF DoorOpenTimeTout THEN DoorCloseCommand : TRUE; END_IF; // 关门到位后回到待机或继续运行 IF DoorCloseLimit AND DoorCloseTimeTout THEN State : IDLE; END_IF; END_CASE;第二个逻辑楼层计数。这个必须在电梯运行过程中持续扫描不能被状态机跳过。// 平层脉冲上升沿 R_TRIG_Instance(CLK : 平层脉冲信号, Q PulseEdge); IF PulseEdge THEN IF MotorUp THEN CurrentFloor : CurrentFloor 1; ELSIF MotorDown THEN CurrentFloor : CurrentFloor - 1; END_IF; END_IF;这里用R_TRIG检测平层脉冲的上升沿。为什么不能用直接判断“如果I1.5为真就加1”因为PLC扫描周期非常快一个持续几百毫秒的脉冲信号会被扫描成千上万次如果不做上升沿检测楼层数会瞬间加几万次。这个细节很容易被忽略但凡是做过编码器计数的人都懂。第三个逻辑开门延时和关门延时。// 开门延时 TON_DoorOpen(IN : DoorOpenCommand, PT : DoorOpenTime, Q DoorOpenTimeTout); // 关门延时 TON_DoorClose(IN : DoorCloseCommand, PT : DoorCloseTime, Q DoorCloseTimeTout);在真实项目中开门通常要等门开限位信号关门要等门关限位信号。仿真里也要保留这两个信号否则程序就跳过了“门是否真的到位”的确认。用触摸屏或PLCSIM强制信号来模拟门限位才能让程序流程完整跑通。第四个逻辑请求置位。// 内呼置位 IF I0.0 THEN CarCall[1] : TRUE; END_IF; IF I0.1 THEN CarCall[2] : TRUE; END_IF; ... // 外呼置位 IF I0.4 THEN HallCallUp[1] : TRUE; END_IF; ...在真实项目中这些按钮可能是自复位按钮按下导通松开断开所以程序要把按下状态锁存为请求。如果用的是触摸屏上的按钮按钮本身可以做成“置位”按钮但PLC端做锁存逻辑更稳妥因为这样不依赖HMI的按钮类型。第五个逻辑请求清除。这个要放在开门状态里配合门的状态处理。// 开门到位后延时1秒再清除请求 IF DoorOpenLimit THEN // 清除当前楼层请求 CarCall[CurrentFloor] : FALSE; HallCallUp[CurrentFloor] : FALSE; HallCallDown[CurrentFloor] : FALSE; END_IF;实际调试时你会发现这个“延时1秒”很关键。如果门一开就清除请求开门期间用户按下按钮请求又置位服务完成后请求还可能残留。延时再清能让整个流程更稳定。3.4 用梯形图还是SCL我的选型看法我知道有些学校或者培训机构倾向于要求梯形图因为梯形图更接近电气控制图的思维方式也容易让初学者理解“常开常闭、线圈输出”的基本概念。但就电梯这个项目而言SCL的结构化编程优势非常明显状态机用CASE表达、楼层扫描用FOR循环、请求数组用下标访问这些都是梯形图做起来很别扭的事情。如果你用梯形图写电梯要么程序长得吓人要么逻辑绕成一团。我的建议是主体逻辑用SCL写外部输出回路比如电机正反转接触器的互锁、门锁回路的急停串联用梯形图做。这种混合编程模式在工业现场非常普遍既保证了控制逻辑的清晰性又保留了电气回路的直观性。当然如果你所在的项目要求必须全部用梯形图也不是不可以。只是你需要把数组和FOR循环的概念翻译成“指针和索引扫描”或者用MOVE和比较指令硬写。过程很痛苦而且后期维护很容易出问题。4. 触摸屏画面设计让电梯看得见、控得住4.1 HMI选型西门子面板还是威纶通/昆仑通态如果你手头有真实的西门子KTP1200 Basic PN触摸屏那直接用就好。博图V15支持KTP系列变量可以直连PLC的DB块不需要额外通信映射省心很多。但如果你手头的设备是威纶通或者昆仑通态这也很常见。威纶通触摸屏通过Modbus TCP访问S7-1200时需要在PLC里调用MB_SERVER指令把S7-1200的保持寄存器区域映射成Modbus可访问的数据块。这里有个基础概念要说清楚热词里常有人问“威纶通触摸屏3x、4x、5x是什么意思”3x对应输入寄存器只读4x对应保持寄存器可读写5x对应线圈。和PLC通信时S7-1200的数据主要映射到4x保持寄存器区域触摸屏才能正常读写。昆仑通态也类似通过Modbus TCP访问时同样需要做数据映射。但如果你用的是西门子KTP触摸屏就不需要关心这些寄存器映射问题PROFINET连接直接访问DB这是西门子全家桶方案最大的优势。4.2 画面布局与移动动画主画面我建议按这个布局设计画面左侧是竖排电梯井道示意图从上到下依次是4层、3层、2层、1层中间是轿厢图标运行时会随楼层位置移动右侧是内呼按钮1到4外呼上行和下行按钮下方是开门、关门按钮以及当前状态指示轿厢移动动画在WinCC里可以通过“移动”功能实现。创建一个图形对象表示轿厢把它的Y坐标关联到一个变量这个变量根据当前楼层换算成像素位置。比如画面高度是600像素4层电梯每层间隔150像素那么1层Y坐标为4502层Y坐标为3003层Y坐标为1504层Y坐标为0。程序里用一个公式Y坐标 (4 - CurrentFloor) * 150然后赋值给HMI的移动变量。需要注意的是HMI里的移动动画通常是整数像素单位所以CurrentFloor变化后Y坐标要立即刷新。配合电梯运行时的脉冲计数画面里的轿厢会一格一格地“爬”上去
返回列表