ARTICLE DETAIL

资讯详情

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

基于Simulink的电梯控制系统建模与仿真:从速度曲线到Stateflow

基于Simulink的电梯控制系统建模与仿真:从速度曲线到Stateflow 简介本资源是一套面向控制工程与自动化专业初学者的电梯控制系统仿真实践材料聚焦MATLAB Simulink平台建模与PID控制算法实现解决动态系统建模、闭环控制设计与仿真结果分析等核心学习难点。压缩包共3个文件4KB含关键脚本文件dianti.m封装参数配置、系统方程定义与仿真启动逻辑、说明文档txt梳理建模要点与调试提示及备份文件zbak便于版本回溯与代码比对类型精炼、结构紧凑适合作为课程实验或自学项目快速上手。已有48人下载学习配套脚本完整呈现了动力单元、牵引机构、位置检测、安全保护等六大模块的Simulink建模路径并内置PID整定逻辑与时序响应可视化方案读者可直接运行观察电梯位置、速度与加速度曲线深入理解垂直运输系统的动态特性与控制机理具备扎实的教学参考价值与工程迁移潜力。 做电梯控制系统的Simulink仿真最容易被低估的是控制逻辑本身。很多人以为电梯就是“按一下按钮、门开、门关、到站”真到了要把这套逻辑在Simulink里跑起来的时候才发现光是“方向怎么定、信号怎么排队、门什么时候重开”就能让人改到怀疑人生。我这次把整个模型从零搭了一遍从速度曲线到Stateflow状态机再到传感器反馈整个过程走完最大的体会是仿真模型的价值不在“像不像电梯”而在它逼着你把每一句控制规则都写清楚。这篇内容就围绕我搭建这套电梯控制系统仿真模型的全过程展开包括控制需求怎么拆、速度曲线怎么设计、状态机怎么划分、模型怎么连、调试时踩了哪些坑适合正在做相关课程设计、毕业设计或者在项目预研阶段想用Simulink快速验证电梯控制方案的工程师参考。1. 电梯控制系统到底在控什么先拆需求再谈建模1.1 电梯的核心控制任务电梯控制系统表面上看只是“响应呼梯、开关门”但如果把控制需求完整列出来其实可以分为三个层面安全层面、舒适性层面和效率层面。安全层面包括门锁检测、超速保护、上下限位、故障急停等这些在仿真中可以简化为逻辑保护和状态强制转移。舒适性层面主要落在速度曲线和加速度变化率上直接决定乘客是否感觉“被甩了一下”。效率层面则涉及呼梯信号的排队策略、顺向截梯规则、反向时不响应的调度逻辑这些是电梯控制系统最核心也最容易写错的部分。我在建模前先画了一张控制逻辑的总框图把输入、输出、反馈信号全部标出来。输入信号包括轿厢内选层按钮、各楼层上行/下行呼梯按钮、门区信号、平层信号、限位开关、开门/关门按钮、超载信号。输出信号包括运行方向指示、楼层显示、开关门指令、运行指令、抱闸指令。反馈信号包括当前楼层、当前位置、当前速度、当前运行方向。这张图的价值在于它把模型的所有接口提前固定下来了。后面在Simulink里搭模块本质上就是按这张图填空。如果没有这一步很容易出现建模到一半发现漏掉了某个反馈信号导致整个逻辑返工。1.2 控制逻辑的层次划分在实际电梯控制系统中逻辑是分层的。最常见的是三层结构调度层、逻辑控制层和驱动控制层。调度层负责决定电梯当前应该往哪个方向走、响应哪个呼梯信号这是电梯的“大脑”。逻辑控制层负责具体的顺序控制比如启动条件满足后先关抱闸再给速度指令到站后先减速再开门开门到位后开始计时关门。驱动控制层则负责速度闭环、电流闭环让电机按照给定的速度曲线运行。我在Simulink模型里也是按这三层来组织的。调度层用Stateflow实现逻辑控制层也用Stateflow但放在另一个Chart里驱动控制层则用连续时间模块搭了一个简易的曳引机模型加PI速度环。分层的好处不仅是结构清晰更重要的是调试方便——某一层出了问题可以单独隔离测试不用在整个模型里来回找。1.3 为什么选Simulink而不是纯代码或PLC方案这个项目选择Simulink而不是写C代码或者用PLC编程核心原因有三个。第一电梯控制是典型的逻辑控制和连续控制混合系统Simulink刚好是处理这类混合系统最顺手的工具。纯代码做这种混合逻辑要把状态机、定时器、模拟量采集全部揉在一起写起来很费劲。PLC虽然适合逻辑控制但速度环、S曲线这些连续控制部分表达起来不够灵活。第二Simulink的可视化能力对验证控制逻辑帮助很大。仿真过程中我可以在Scope里同时看到速度曲线、位置曲线、开关门信号、方向信号随时暂停检查某一时刻各种信号的对应关系。这种全局观是看代码没法比的。第三Stateflow对状态迁移的表达接近自然语言。电梯的运行逻辑本质上是一个有限状态机用Stateflow来建模状态迁移条件写起来直观别人接手时也容易读懂。当然Simulink也有缺点比如模型大了以后仿真速度会明显下降离散和连续混合模块如果不注意采样时间配置很容易出现莫名其妙的警告。但作为控制方案验证和教学演示工具它的优势是压倒性的。2. 速度曲线与曳引传动模型电梯舒适性的关键2.1 从S曲线到梯形速度曲线电梯运行舒适性的核心指标是加速度变化率也就是急动度Jerk单位是m/s³。如果加速度在启动瞬间从0直接跳到额定值乘客会明显感觉到冲击这就是所谓的“被推了一下”。所以实际电梯的速度给定曲线通常不是梯形曲线而是S形曲线——加速度从0开始逐渐增大到中间保持恒定接近目标速度时逐渐减小到0。我这次模型里用的是常见的S曲线生成方式把加减速过程分阶段计算加速度通过积分器积分得到速度速度再通过积分器积分得到位置。具体实现时用一个可配置的加速度斜坡来限制加速度的变化率。比如额定加速度取0.8m/s²急动度取1.5m/s³那么加速度从0上升到0.8m/s²大约需要0.53秒。S曲线的生成逻辑我放在一个MATLAB Function模块里输入是剩余距离和目标速度输出是当前时刻的速度给定。这样做的好处是不管目标楼层距离是近是远都能生成合适的速度曲线。如果剩余距离很短还没加速到额定速度就要开始减速那么速度曲线就变成一个倒三角形或更小的S形。这里有一个容易忽略的问题减速点的计算。电梯需要在到达目标楼层之前预留足够的减速距离否则就会冲过平层位置。我用的方法是在每个控制周期根据当前速度和期望减速能力计算“如果现在开始减速还需要多少距离”然后跟剩余距离比较一旦剩余距离小于等于这个值就开始从加速/匀速阶段切入减速阶段。这个逻辑用再简单不过的话说就是跑得太近还全速冲肯定刹不住。2.2 曳引电机与轿厢的等效模型曳引系统的物理模型如果做得很细会涉及电机电磁转矩、曳引轮摩擦、钢丝绳弹性形变、轿厢与导轨的摩擦力、对重装置等这些在Simulink里都可以搭出来但对于控制系统验证来说过度精细的物理模型反而会拖慢仿真速度而且对控制逻辑验证没有太多额外帮助。我采用的是工程上常用的简化方式把电机加传动系统等效为一个一阶惯性环节加一个积分环节。曳引电机的转速经过减速箱和曳引轮之后换算成轿厢的运行速度。这里需要注意几个传动比参数减速比、曳引比和曳引轮直径。我用的参数是曳引比2:1、减速比50:1、曳引轮直径400mm那么电机转速1450rpm时折算到轿厢的速度大概是1450 / 50 / 2 × π × 0.4 ≈ 9.11m/min约0.15m/s这个速度偏低。如果想让额定速度接近1m/s需要调整减速比或者曳引轮直径。这说明建模时传动链参数一定不能随便填每个参数都会直接影响到最终的运行速度。在模型里我用一个Gain模块来代表传动折算系数用一阶惯性环节1/(Ts1)来代表电机响应延时再用一个积分器把轿厢速度积分成位置。速度环的PI控制器参数就是根据这个等效对象来整定的比例增益Kp取30积分增益Ki取20响应速度和平稳性比较折中。整定时我采用的方法是先给阶跃速度给定看响应调Kp让系统不振荡再调Ki消除稳态误差这一套在Simulink里操作起来非常方便。2.3 平层精度怎么保证平层精度是电梯系统一个非常直观的指标。国家标准里对电梯平层精度有明确要求通常要求在±10mm以内好一点的系统能做到±5mm。仿真模型里如果没有平层逻辑电梯到站后位置可能停在离目标楼层几十毫米甚至一百多毫米的地方看着就很不“专业”。平层逻辑在仿真模型里是这样实现的每层楼都有一组平层传感器信号当轿厢进入该楼层的平层区域时平层信号置为1。电梯在此前的减速过程中控制系统会持续检查当前位置与目标楼层平层位置的距离误差一旦满足平层条件速度接近0且位置误差在允许范围内就发出停车指令同时建立抱闸。为了模拟这一过程我给每层楼设置了一个门区范围比如目标楼层平层位置上下各15mm的范围为平层区域。当轿厢位置进入这个区域且速度低于0.05m/s时判定为平层成功。这个逻辑放在Stateflow的“停车确认”状态里通过条件迁移来触发。仿真里看到的波形是速度曲线平滑降到0位置稳稳落在平层范围内这时开门信号才被允许输出。3. 用Stateflow搭电梯运行逻辑状态机3.1 状态划分从空闲到故障的全生命周期电梯的运行逻辑用状态机来表达是最自然的方式。我划分的状态包括空闲待机、加速运行、匀速运行、减速停车、平层确认、开门、开门等待、关门、关门等待、故障急停。每个状态都有明确的进入条件和退出条件。空闲待机状态是电梯的默认状态此时无任何呼梯信号轿厢停在某一层门保持关闭。一旦接收到呼梯信号系统根据信号位置和当前楼层位置判断应该往哪个方向走、是直接启动还是先开门。如果呼梯楼层就是当前楼层直接进入开门状态不需要运行。加速运行、匀速运行、减速停车这三个状态是根据速度曲线阶段来划分的。速度曲线生成模块输出当前速度给定后Stateflow根据当前速度与目标速度的相对关系判断电梯正处于哪个阶段。这些状态之间的迁移条件不需要额外计算直接比较速度给定和实际速度即可。开门状态和开门等待状态的区别在于开门状态是门正在打开过程中门到位信号为0开门等待状态是门已经完全打开开始计时等待乘客进出。同理关门状态是门正在关闭关门到位信号为0关门等待状态是门已经完全关闭但可能因为本层有呼梯而需要重新开门也就是俗称的“本层开门”功能。3.2 呼梯信号的采集与排队策略呼梯信号分两类轿内选层指令和外呼信号。外呼信号又分为上行和下行两个方向。仿真模型里我用了三个数组来存储这些信号分别对应轿内指令、外呼上行、外呼下行。每个信号用0/1表示是否有请求发生呼梯时对应位置置1响应完成后清0。这里有个关键细节呼梯响应完不能直接清掉信号要等电梯到达该楼层并完成开门动作之后才清除。如果电梯只是在目标楼层经过但没有停靠信号不应该被清除。我在Stateflow里专门设了一个“信号清除判定”的逻辑在平层确认且门开始打开后才把对应信号清0。排队策略上我采用的是最常规的集选控制方式电梯在同一方向上优先响应所有顺向的呼梯信号运行到最远的顺向呼梯楼层后如果没有反向呼梯则换向有反向呼梯则继续往反方向走。这相当于把电梯的调度简化为一个“单梯集选控制”问题已经足够覆盖大多数教学和仿真验证场景。3.3 顺向截梯与反向不停调度规则在模型里的实现顺向截梯是电梯调度里最容易理解也最容易做错的部分。举一个具体例子电梯当前在3楼轿内有去8楼的指令此时6楼有人按了上行外呼。按照顺向截梯规则电梯在往上运行时经过6楼应该停靠因为6楼的上行请求和电梯当前运行方向一致属于“顺向截梯”。但是如果此时4楼有人按了下行外呼电梯在往上运行的过程中不应该停靠4楼因为4楼的下行请求和电梯当前的上行方向相反。电梯会先完成8楼的轿内指令然后进入无指令状态再检测到4楼的下行呼梯才下行响应。这套规则在Stateflow里的实现方式是运行状态下每次经过一个楼层时检查当前楼层是否存在“有效呼梯信号”。有效信号的判定条件是如果电梯当前向上运行则本层外呼上行或轿内指令有效如果电梯当前向下运行则本层外呼下行或轿内指令有效。同时还要判断本层是否已经超出了本次运行方向上的最远目标——如果已经超过了即使有顺向呼梯也不再停靠先完成当前行程再说。4. 完整的Simulink模型搭建过程4.1 模型总体架构我的Simulink模型按功能模块划分整体结构是串联加反馈的关系。最左侧是输入信号模块包括各楼层呼梯按钮、轿内选层按钮、开关门按钮、超载信号等。中间是控制逻辑模块包含两个Stateflow Chart一个是调度状态机负责方向和呼梯响应另一个是门状态机负责开关门的顺序控制。右侧是驱动控制模块包含S曲线生成、速度环PI、曳引传动模型。最下面是传感器反馈模块从机械模型的位置信号中产生限位、门区、平层等逻辑信号反馈给控制逻辑。这种架构的好处是模块边界非常清楚。我建模型的时候任何一个模块出问题只需要双击进去看Scope就能定位不需要在整个模型里翻来翻去地找信号源。信号连接上我尽量使用Goto/From标签而不是直接连线。直接用线连模块多了以后模型图会变成一张蜘蛛网根本没法看。用Goto/From之后模型图整洁很多而且每个Goto标签名就是信号的名称可读性反而更好。当然这种做法牺牲了一部分信号追溯的直观性所以我在命名标签时要求自己做到“看名字就知道信号是什么”比如BtnUp6表示6楼上行呼梯按钮PosCar表示轿厢位置。4.2 传感器模块的建模方式电梯的传感器反馈在模型里如果直接读位置信号做逻辑判断会出现一个问题连续的位置信号和离散的逻辑信号之间需要做转换。我处理的方法是把传感器建模成独立的模块输入是轿厢位置和当前楼层基准位置输出是布尔逻辑信号。楼层限位开关建模比较简单如果轿厢位置小于最低楼层位置加一个阈值或者大于最高楼层位置减一个阈值就输出限位信号。这个阈值取值要跟实际限位开关的安装位置对应。门区传感器建模则判断轿厢位置是否落在某一层门区范围内这里我用了一个比较灵活的查表方式每层楼的门区上下界存在一个常量数组里查表后用逻辑比较模块输出。平层传感器比门区传感器更精确判断范围更窄。我在门区范围的基础上把平层范围设为±15mm只有进到这个范围才有效。这样整个传感器层级就分成了三层限位传感器保证安全边界门区传感器控制开门条件平层传感器保证精确停车。4.3 控制逻辑与驱动模型的接口信号设计控制逻辑和驱动模型之间的接口信号是建模时需要仔细设计的地方。我定义的接口信号包括运行使能信号逻辑型1表示允许运行、方向指令数值型1向上、0停车、-1向下、速度给定连续型m/s、抱闸释放信号逻辑型、平层到位信号逻辑型。这里有一个容易踩的坑如果控制逻辑输出的是连续时间信号而Stateflow输出的是离散的逻辑信号两者直接相加或比较时Simulink会提示采样时间不一致。我的处理方法是所有接口信号统一用模型配置里的离散求解器采样时间统一为10ms。逻辑信号的输出端设置为“输出离散信号”连续信号的输入端设置零阶保持器这样整个模型在同一采样框架下运行既保证了逻辑判断的正确性也避免了采样时间冲突警告。速度和位置计算这部分我用的是连续时间积分器。位置信号本身是连续的但为了和离散控制周期对齐我在控制逻辑读取位置信号之前加了一个零阶保持器。实测下来10ms的采样时间对电梯控制这种时间尺度来说完全够用平层精度也不受影响。如果你做的是更高精度的伺服控制采样时间可能需要压到1ms以内但电梯系统没有这个必要。5. 仿真运行、结果分析与参数调试5.1 仿真参数配置模型配好之后仿真参数配置是下一个关键步骤。我推荐使用定步长离散求解器步长10ms仿真时长根据场景来定。为什么要用定步长而不是变步长因为Stateflow逻辑和离散控制器都需要固定的采样节拍变步长可能导致逻辑判断和采样时刻错位引起奇怪的问题。求解器选离散discrete步长0.01s。仿真停止时间根据测试场景设置比如测试单层呼梯时设10秒就够了测试跨层加连续呼梯时设30秒。模型里我用了几个To Workspace模块来记录关键信号包括轿厢位置、速度、速度给定、运行方向、门状态等方便仿真结束后统一分析。5.2 典型场景测试与波形分析模型搭完后我设计了几个典型测试场景来验证逻辑是否正确。场景一电梯空闲在1楼有人在5楼按了上行呼梯。期望行为是电梯启动向上运行经过2、3、4楼不停到达5楼减速平层开门等待一段时间后关门进入空闲状态。仿真的速度曲线呈现一个典型的S形加速—匀速—S形减速过程位置曲线从1楼基准逐渐上升到5楼基准偏差在±10mm以内。场景二电梯从1楼向上运行去7楼中途4楼有人按上行呼梯6楼有人按下行呼梯。期望行为是4楼应该停靠因为顺向6楼不停靠因为反向。仿真波形验证了这一点电梯在4楼有一次明显的减速—开门—关门动作而6楼则直接经过。同时可以看到在完成7楼指令后电梯停在7楼此时6楼的下行呼梯仍然有效电梯在短暂空闲后重新启动向下运行响应6楼下行呼梯。场景三连续呼梯压力测试。在电梯运行过程中随机在不同楼层产生多个呼梯信号验证调度逻辑是否会出现漏响应或死循环。我跑了20分钟仿真逻辑保持稳定每个呼梯都被响应没有出现电梯在某一层反复开关门的现象。5.3 调试中踩过的坑和解决办法调试过程中的坑说实话比建模本身更值得记录。第一个坑是代数环。最初我把平层信号直接接到控制逻辑的停止判定条件上而这个判定又反过来影响速度给定形成了Simulink的代数环。仿真速度变得极慢而且报警告。解决办法是在反馈通路里插入一个Memory模块或者Unit Delay把直接反馈打断给控制周期一个采样节拍。这个问题在连续时间模型里很常见如果你也看到Simulink报“Algebraic loop”警告优先检查反馈路径上是不是少了采样模块。第二个坑是状态机死锁。有段时间电梯运行到目标楼层后不进入开门状态排查后发现是平层条件和平层传感器信号之间的时序问题平层信号有效时Stateflow还在“减速停车”状态里没有跳出等跳出到“平层确认”状态时轿厢已经因为超调滑出了平层区域导致永远满足不了平层条件。解决方法是把平层判定范围加大同时在减速停车状态内部就开始检查平层条件而不是等到完全停车后才检查。第三个坑是门状态机的信号清除时序。最初我在发出开门指令的同时就清了呼梯信号结果出现一种情况电梯还没到目标楼层中途经过某楼层时信号已经清了但电梯并没有停靠呼梯按钮对应的请求就丢失了。后来我把信号清除逻辑放在“门已经完全打开”这个条件之后问题就解决了。这个坑在真实电梯系统里也有对应——信号保持和清除的时序必须和机械动作严格对应。第四个坑是速度曲线在短距离时出现负值。原因是S曲线生成模块在剩余距离极短时计算出来的减速距离超过了实际剩余距离速度给定被强行修正成0甚至负值。我在MATLAB Function里加了保护逻辑如果剩余距离小于最小安全距离直接输出停车指令不继续更新速度给定。这个保护逻辑在真实系统中对应的是“强制减速”和“终端限位”功能仿真模型加了这个保护后也不会出现位置冲过头的现象。最后再分享一个我自己调模型的小经验状态机的复杂度一定要控制住。我一开始把调度层、门控制、平层判定全部写进一个Stateflow Chart里结果状态迁移图乱到根本没法看调试时改一个条件牵连一大片。后来把逻辑拆成调度、门控、平层三个ChartSignal Routing用Goto/From连接模型清爽了很多问题定位也快了一个量级。另外一定要养成给每个Stateflow状态标注进入条件和退出条件的习惯。哪怕只是注释对你后期调试也帮助巨大。仿真跑出问题的时候看一眼状态路径比对着波形猜快得多。这套模型跑通之后后续可以做的扩展方向很多——比如加入多梯调度算法或者把曳引机模型换成Simscape的物理模型甚至接上真实的电机驱动做硬件在环测试。电梯控制系统看着简单真正建模跑起来涉及到的逻辑深度绝对超过大多数人的想象。希望这篇过程记录对你有用。本文还有配套的精品资源点击获取
返回列表