ARTICLE DETAIL

资讯详情

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

西门子S7-1200六层电梯PLC控制程序开发全流程实录

西门子S7-1200六层电梯PLC控制程序开发全流程实录 有阵子没正经写过工控项目总结帖了。上个月刚把手上一台单部六层电梯的PLC程序从需求梳理到现场调试完整跑完用的西门子S7-1200配合博途V15.1前后大概两周六天。这篇文章就是把这次开发的完整过程做个记录从控制需求、I/O分配、程序架构到核心逻辑、调试坑点尽量写得能直接照着抄。项目本身并不复杂但电梯控制有一个特点逻辑量不大、安全条件多、状态切换极其考验程序的严谨性。尤其单部六层这种规模几乎涵盖了绝大多数电梯控制的基本要素——轿厢内呼、各层外呼、上下行判断、顺向截车、开关门控制、楼层计数与平层、检修模式、消防返回等。做一次下来对PLC编程的理解会明显上一个台阶。如果你正准备做类似的PLC项目或者刚接触电梯控制想找一个完整范例这篇应该能给你省不少事。文中所有硬件选型、地址分配、程序块设计、调试方法都是我实测跑通过的可以直接套用但请务必结合你自己的现场设备调整安全逻辑。1. 需求分析与整体控制方案在动笔写程序之前先把电梯当做一个状态机去理解这是我这次最深的体会。电梯本质上是“命令-执行-反馈”的循环乘客按下按钮发出召唤系统根据召唤目标与当前状态决定运行方向到达目标层后停车、开门、延时关门再继续响应下一个召唤。这套流程看似简单但落到PLC程序里必须把每一个环节拆成独立逻辑块并且考虑各种组合情况比如轿厢正在上行时五层下呼信号要不要响应四层内呼按钮按了三次怎么去重平层信号闪断一下会不会导致楼层错乱这些都是在程序里必须提前挡住的。1.1 功能需求清单梳理这次项目实际要满足的功能点我整理成了一份清单建议你也照着做一份轿厢内呼六层各设一个内呼按钮对应楼层指示按下登记到达后消除支持重复召唤去重。楼层外呼一至六层设外呼按钮一层只有上呼六层只有下呼中间层有上呼、下呼两个按钮。运行方向控制根据当前楼层、当前方向、召唤目标楼层自动判断上行/下行。到站停车到达有召唤的楼层时自动停车分为顺向停车和换向停车两种情况。开关门控制自动开门、延时关门、关门过程中安全触板/光幕触发时重新开门支持手动开关门按钮。楼层计数与显示运行过程中实时更新当前楼层到达平层时校正支持数码管或触摸屏显示。平层检测与校正每层设平层感应开关停车时校正楼层计数器。上下限位与极限保护井道上下端设限位开关和极限开关触发后禁止继续运行。检修模式检修状态下只支持点动上下行不响应任何自动召唤。基础故障报警与提示门锁故障、过流、限位触发等需要记录并提示。这套需求基本是把市面上一台标准六层客梯的功能覆盖了个九成做出来之后后续想扩展到十层、二十层只是加I/O和调整算法的问题。1.2 电气控制架构与PLC选型系统整体架构可以分为三层操作层轿厢操纵箱内的内呼按钮、开关门按钮、楼层显示各层候梯厅的外呼按钮和方向指示灯。控制层西门子S7-1200 PLC负责采集所有按钮和传感信号执行逻辑运算输出控制指令。执行层主接触器、运行接触器、抱闸接触器、开门/关门继电器、楼层显示驱动等。这里有个很重要的点S7-1200基础型号的数字量I/O数量有限。以CPU 1214C DC/DC/DC为例板载DI 14点、DO 10点但本项目需要约26个数字量输入和10个数字量输出因此必须扩展信号模块。我选的是SM 1223 DI16/DQ16用来补足输入输出点数。供电层面PLC的DC24V电源与主电路AC380V必须严格隔离开关电源容量至少留出20%余量。电梯属于强干扰环境PLC输入侧全部使用光电隔离的24V输入输出侧控制中间继电器再由中间继电器驱动交流接触器绝不直接带负载这一点后面还会详细讲。1.3 I/O地址分配表我先给出这次实际用的I/O分配表直接照着接线就能跑地址符号名功能说明I0.0SB_F1一层平层感应开关I0.1SB_F2二层平层感应开关I0.2SB_F3三层平层感应开关I0.3SB_F4四层平层感应开关I0.4SB_F5五层平层感应开关I0.5SB_F6六层平层感应开关I0.6SQ_UP_LIMIT上端站限位开关I0.7SQ_DN_LIMIT下端站限位开关I1.0SQ_UP_FINAL上极限开关I1.1SQ_DN_FINAL下极限开关I1.2SB_CAR_1轿厢内呼一层按钮I1.3SB_CAR_2轿厢内呼二层按钮I1.4SB_CAR_3轿厢内呼三层按钮I1.5SB_CAR_4轿厢内呼四层按钮I1.6SB_CAR_5轿厢内呼五层按钮I1.7SB_CAR_6轿厢内呼六层按钮I2.0SB_UP_1一层外呼上行按钮I2.1SB_DN_6六层外呼下行按钮I2.2SB_UP_2二层外呼上行按钮I2.3SB_DN_2二层外呼下行按钮I2.4SB_UP_3三层外呼上行按钮I2.5SB_DN_3三层外呼下行按钮I2.6SB_UP_4四层外呼上行按钮I2.7SB_DN_4四层外呼下行按钮I3.0SB_UP_5五层外呼上行按钮I3.1SB_DN_5五层外呼下行按钮I3.2SB_OPEN轿厢开门按钮I3.3SB_CLOSE轿厢关门按钮I3.4SQ_DOOR_LOCK门锁反馈信号I3.5SG_LIGHT_CURTAIN光幕/安全触板信号Q0.0KM_UP上行运行接触器Q0.1KM_DN下行运行接触器Q0.2KM_BRAKE抱闸接触器Q0.3KM_DOOR_OPEN开门继电器Q0.4KM_DOOR_CLOSE关门继电器Q0.5HL_CAR_UP轿厢上行指示预留Q0.6HL_CAR_DN轿厢下行指示预留Q0.7KM_FAN轿厢风扇预留Q1.0KM_LIGHT轿厢照明预留Q1.1BUZZER到站提示蜂鸣器有一点要提醒极限开关和限位开关在物理接线时建议走硬线互锁串入接触器控制回路不只在程序里做软互锁。这是电控安全的基本原则——软件可能跑飞但硬回路不能丢。我这次为了演示编程程序也做了对应逻辑但现场的硬互锁环节是不能省的。2. 博途V15.1工程搭建与程序块规划S7-1200的开发环境是TIA Portal也就是博途。V15.1这个版本相对V14和V15改进了一些编译速度和下载体验对S7-1200全系列支持都很好还支持直接在PLC数据类型里建结构体配合SCL写代码非常顺手。如果你电脑配置一般V15.1比V16、V17会更流畅一些这也是我选这个版本的原因。2.1 创建项目与硬件组态博途新建项目这个步骤比较基础但有些细节处理不好会在后面浪费大量时间。具体操作是打开TIA Portal V15.1选择“创建新项目”填写项目名称例如“SixFloorElevator”然后进入“设备与网络”视图在左侧硬件目录树中找到“西门子S7-1200”下的CPU型号。我用的CPU型号是6ES7 214-1AG40-0XB0即1214C DC/DC/DC拖入设备视图。随后添加扩展模块SM 1223 DI16/DQ16型号为6ES7 223-1BL32-0XB0。组态时注意模块安装位置在CPU右边默认从机架1号槽位开始。添加完成后在“设备视图”底部能看到CPU板载I/O地址从I0.0、Q0.0开始扩展模块地址从I2.0、Q1.0开始与上一节的分配表对应。还有两个组态细节需要提前设置好CPU属性中“数字量输入”的输入滤波时间我全部设置为6.4ms。电梯现场干扰不小按钮和感应开关的信号都可能有毛刺默认的0.1ms会让误信号漏进来。具体做法在设备视图选中CPU下方属性栏选择“数字量输入”→通道0到13逐一将“输入滤波”设为6.4ms。扩展模块输入同样处理。设置“时钟存储器”为MB100方便程序里使用时钟脉冲。在CPU属性中勾选“启用时钟存储器字节”填100这样M100.0到M100.7会自动产生周期为0.1Hz、0.2Hz、0.5Hz、1Hz、2Hz、5Hz、10Hz等不同频率的方波调试门灯闪烁、指示灯提示时直接用。2.2 程序块结构设计S7-1200的程序结构推荐使用OB1负责循环扫描逻辑功能按模块拆成多个FC函数块共用数据放在全局DB中。这样的好处是程序清晰、便于调试和复用。我这次规划了以下程序块程序块类型功能OB1组织块主循环按顺序调用各FCDB_Elevator全局数据块存放楼层、状态、召唤、故障等所有核心变量FC_Init函数上电初始化置位初始状态FC_Door函数开关门控制逻辑FC_CarCall函数轿厢内呼登记与消除FC_HallCall函数外呼登记与消除FC_Direction函数运行方向判断FC_FloorDetect函数楼层检测、计数与平层校正FC_RunControl函数运行接触器与抱闸输出控制FC_Alarm函数故障信号采集与保护逻辑FC_Display函数楼层显示与方向显示FC_Maintain函数检修模式控制这样的划分基本对应“一个职责一个块”的思想。调试的时候如果某个环节出问题直接打开对应FC监视比在一大坨OB1里翻找要高效得多。2.3 核心数据块的设计全局数据块DB_Elevator我定义了以下变量组这类命名规范最好一开始就定好否则写到后面你自己都忘了变量是干嘛的类型定义新建一个PLC数据类型UDT_Elevator包含当前楼层Int、目标楼层Int、运行方向Int、运行状态Int、轿厢召唤数组Array[1..6] of Bool、上外呼数组、下外呼数组等。主DBDB_Elevator类型为UDT_Elevator集中管理。这里把召唤做成数组可以有效减少变量定义也方便用循环指令做遍历。状态常量定义枚举风格常量例如IDLE0、RUN_UP1、RUN_DOWN2、MAINTAIN9等编程时用符号名不要裸用数字。博途V15.1对PLC数据类型支持得很好在左侧项目树中右键“PLC数据类型”→新建UDT_Elevator在DB中直接使用这个类型即可。后续如果电梯扩展层数只要改这个类型和数组大小再调整循环范围整体改动量非常小。3. 核心程序逻辑实现与关键代码解析这一部分是整个项目的重点也是现场调试最容易出问题的地方。我会把内呼、外呼、方向判断、楼层计数、开关门等核心逻辑逐个拆开来讲并给出SCL和梯形图的实现思路。你有了思路用LAD还是SCL都能写出来。3.1 轿厢内呼登记与消除逻辑内呼逻辑在每层一个按钮按下登记到达该层且完成开门后消除。我在FC_CarCall中是这样实现的FUNCTION FC_CarCall : Void // 内呼按钮输入到临时变量 VAR_TEMP btnCar : Array[1..6] of Bool; // 内呼按钮I点 END_VAR // 登记按下按钮的上升沿置位对应召唤位 #btnCar[1] : I_CAR_1; // ... 依次映射六层按钮 FOR #i : 1 TO 6 DO IF #btnCar[#i] AND NOT #btnCarOld[#i] THEN DB_Elevator.CarCall[#i] : TRUE; // 置位召唤 END_IF; #btnCarOld[#i] : #btnCar[#i]; END_FOR; // 消除达到该楼层并开门到位 IF DB_Elevator.Floor #i AND DB_Elevator.DoorState DOOR_OPEN AND DB_Elevator.RunState IDLE THEN DB_Elevator.CarCall[#i] : FALSE; END_IF;这里用了上升沿检测来防止按钮长时间按住导致的重复触发。至于到达消除必须满足两个条件当前楼层等于召唤楼层并且门已打开。千万不能在刚停车还没开门时就消除召唤否则一旦开门失败召唤就丢了乘客会以为电梯没响应。在实验中发现一个细节如果内呼按钮按下去后立即松手有的按钮触点回弹会产生多个脉冲。除了在硬件上加RC滤波外程序里对按钮信号做了20ms的软件防抖。最简单做法是使用OB1循环周期计时如果按钮输入持续20ms为TRUE才判定有效。这个防抖逻辑不写后面现场调试会被误触发搞到心态崩溃。3.2 外呼登记与顺向截车逻辑外呼逻辑比内呼复杂核心是多了一个方向属性。一层到六层的按钮分上行呼梯和下行呼梯登记时不仅要记录楼层还要记录方向。我这边定义了两组数组UpCall[1..6]和DnCall[1..6]。一层只有UpCall[1]有效六层只有DnCall[6]有效中间层两组都可能触发。// 上行外呼登记 IF I_UP_2 AND NOT DB_Elevator.UpCallOld[2] THEN DB_Elevator.UpCall[2] : TRUE; END_IF; // 下行外呼同理外呼的消除条件比内呼多了一个方向判断只有电梯当前运行方向与呼叫方向一致且到达该楼层并开门后才能消除对应的外呼。这也就是电梯界常说的“顺向截车”。如果电梯正在上行经过三层时三层下行呼梯按钮虽然亮着但不会停车因为方向不一致要到电梯换向下行时才会响应三层下行呼梯。// 方向一致的停车后才能消除 IF DB_Elevator.Floor #i AND DB_Elevator.RunDir DIR_UP AND DB_Elevator.UpCall[#i] AND DB_Elevator.DoorState DOOR_OPEN THEN DB_Elevator.UpCall[#i] : FALSE; END_IF;“顺向截车”是整个电梯程序里最核心、也最容易写错的地方。写代码前先在纸上画一遍运行路径轿厢当前在三层上行方向四层有下呼五层有上呼。此时四层下呼是反向呼梯不应该响应五层上呼是同向呼梯电梯应该停靠。如果程序里没有方向判断就停电梯会不断为了反向呼梯来回折腾乘坐体验极差。3.3 运行方向判断无方向时怎么选目标当电梯处于空闲状态时需要根据所有未消除的召唤来确定下一趟运行方向。这里我用了“最远召唤”和“就近召唤”结合的方式。空闲状态下的方向判断逻辑IF DB_Elevator.RunState IDLE THEN // 查找是否有任何召唤 #hasCall : FALSE; FOR #i : 1 TO 6 DO IF DB_Elevator.CarCall[#i] OR DB_Elevator.UpCall[#i] OR DB_Elevator.DnCall[#i] THEN #hasCall : TRUE; END_IF; END_FOR; IF #hasCall THEN // 当前没召唤看向上召唤和向下召唤的最大/最小楼层 IF #targetFloor DB_Elevator.Floor THEN DB_Elevator.RunDir : DIR_UP; ELSIF #targetFloor DB_Elevator.Floor THEN DB_Elevator.RunDir : DIR_DOWN; ELSE DB_Elevator.RunDir : DIR_NONE; END_IF; ELSE DB_Elevator.RunDir : DIR_NONE; END_IF; END_IF;其中#targetFloor的计算逻辑是取所有召唤楼层中比当前楼层高且最近的那个楼层作为上行目标取所有召唤楼层中比当前楼层低且最近的那个楼层作为下行目标如果上行目标与下行目标距离一样优先进最近的召唤方向。实际调试下来这个规则在绝大多数情况下都不会让电梯“空跑”太远。需要注意一点当电梯正在运行中方向已经被锁定此时不能因为新召唤而改变方向。方向只有在停车、且门关好之后才能重新判断。这里用RunState区分运行态和空闲态空闲态才刷新方向。否则电梯下行途中忽然有人按了高楼层上呼程序一改方向电机就会在运行中反向那现场就等着烧接触器吧。3.4 楼层检测与平层校正旋转编码器故障怎么办楼层信号是整个电梯控制的基础。我这次用了两种方式结合井道每层安装一个感应开关磁感应或光电检测轿厢是否到达该层。在曳引机/限速器上安装旋转编码器通过脉冲计数推算楼层位置。正常运行时以旋转编码器计数的连续值作为当前位置感应开关用于平层停车和计数校正。这样即使某个平层信号抖动一次也不会导致楼层计数完全错乱。旋转编码器接入S7-1200的高速计数器功能。先在设备组态中启用CPU板载的HSC1高速计数器设置模式为“计数”计数类型为“轴”A/B相正交编码器输入为I0.0/I0.1。程序里通过读取ID1000HSC1当前值获得脉冲计数。程序中的脉冲当量计算每层楼高度3米曳引机减速比2:1编码器每转脉冲数1024则电梯移动一层需要脉冲数3000mm/(钢丝绳线速度与转速比)*1024。实际我们现场标定的结果是约1536个脉冲/层。这个数值可以在调试时用“井道自学习”功能自动标定从下端站以检修速度运行到上端站记录总脉冲数除以层间距得到平均每层脉冲数。平层校正逻辑// 每层平层开关触发时校正 IF I_F1 THEN DB_Elevator.Floor : 1; DB_Elevator.PulseBase : HSC1_Count; // 记录基准脉冲 END_IF;用“基准脉冲当前位置”计算楼层的公式为当前楼层 max(1, min(6, 基准楼层 (当前脉冲 - 基准脉冲) / 每层脉冲数))这种做法比单纯依赖感应开关可靠很多。如果现场因为某些原因没装编码器只有六层平层开关那就要处理一个经典问题感应开关在平层位置时信号抖动或者停车时刚好压在开关边界导致楼层计数不稳。这时程序里必须加互锁运行中收到平层信号才更新楼层静止时收到信号不更新或者用窗口比较来抑制抖动。3.5 运行控制与抱闸时序运行控制是电梯安全的核心。运行输出不能只是简单的“上行方向接触器吸合”必须考虑抱闸的时序。标准时序是收到运行指令先输出运行方向接触器KM_UP或KM_DN此时电机得电但机械抱闸仍未打开电机不会转动。延时约0.3~0.5秒确认方向接触器已经吸合通过接触器辅助触点反馈再输出抱闸打开信号KM_BRAKE。到达目标楼层并收到平层信号同时速度降到爬行速度后先执行抱闸制动KM_BRAKE断开此时电机制动。延时0.3秒确认抱闸已闭合后再断开运行方向接触器。在PLC程序中我用定时器TON实现这个时序// 启动时序 IF DB_Elevator.RunReq AND NOT DB_Elevator.Running THEN // 第一步输出方向 Q_KM_UP : (DB_Elevator.RunDir DIR_UP); Q_KM_DN : (DB_Elevator.RunDir DIR_DOWN); DB_Elevator.StepStart : TRUE; END_IF; // 延时开抱闸 #TON_Brake(IN : DB_Elevator.StepStart, PT : T#300MS); IF #TON_Brake.Q THEN Q_KM_BRAKE : TRUE; DB_Elevator.Running : TRUE; DB_Elevator.StepStart : FALSE; END_IF; // 停车时序 IF DB_Elevator.StopReq THEN // 先断抱闸 Q_KM_BRAKE : FALSE; #TON_Stop(IN : TRUE, PT : T#300MS); IF #TON_Stop.Q THEN Q_KM_UP : FALSE; Q_KM_DN : FALSE; DB_Elevator.Running : FALSE; DB_Elevator.StopReq : FALSE; END_IF; END_IF;这个时序千万不能反过来更不能再接触器未吸合时就开抱闸。电梯启动时的顿挫感、溜车问题大部分都出在抱闸时序不对上。我在调试第一版时就因为把抱闸和方向接触器同时输出导致空载电梯上行启动时严重打滑现场工人直接喊停。后来改成上述延时后一切正常。另外程序里还必须加接触器互锁和反馈检测。虽然硬件上有KM_UP和KM_DN的接触器互锁但程序里同样要保护方向输出逻辑中上行输出Q0.0时强制Q0.1为FALSE。同时用接触器辅助触点反馈I4.0、I4.1检测实际接触器状态如果输出指令与反馈不一致超过1秒立刻停车并报故障。3.6 开关门控制与光幕保护开关门逻辑相对独立但有几个细节要注意。我用FC_Door实现状态包括开门到位、正在开门、正在关门、关门到位、开门延时。开门释放条件电梯到达目标楼层并平层。空闲状态停在本层有人按外呼本层召唤。检修或消防模式下由手动控制。关门触发条件开门延时结束默认3~5秒可调。关门过程中光幕/安全触板被遮挡立即反向开门。关门过程中检测到本层有反向外呼不响应避免反复开关门。关门超时保护持续关门超过10秒仍未关到位门锁反馈未接通则停止关门并重新开门同时记录故障提示“关门超时”。这个条件很多新手会忽略但现场最常见的故障就是门卡住、光幕一直挡着或者门机皮带打滑没有超时保护电梯就会一直不死不活地反复开关门。光幕信号处理上光幕动作时不能只做一次“反向开门”就结束因为乘客还在门中间时需要保持门一直打开。正确做法是光幕信号有效时强制输出开门阀同时复位关门计时器直到光幕连续消失超过1秒才允许进入关门流程。这个“1秒延迟”很关键否则乘客刚走过光幕门就开始关极容易夹到人。4. 调试过程与现场问题排查程序写完只是第一步现场调试才是真正考验人的环节。我把这次调试中遇到最有代表性的几个问题记录下来都是网上搜不到的经验。4.1 电梯上行过冲平层停车位置不稳第一次空载调试时电梯从三层上行到四层经常越过平层位置20~30厘米才停下。查下来有两个原因一是停车判定直接用了平层感应开关的下降沿而电梯在爬行速度下从感应开关触发到机械抱闸完全抱住还有一段惯性滑行距离。在不同载荷、不同速度下这段距离并不固定。二是没有使用编码器做闭环减速控制。电梯快到目标楼层时应该先减速到爬行速度再依据编码器精确计算停车点而不是等到平层信号才急停。解决方式在程序中增加“目标楼层预减速”逻辑。当编码器脉冲数距离目标楼层平层位置约150mm时输出减速指令一般通过变频器多段速或模拟量给定控制。实际本项目用的变频器是端子控制的多段速PLC输出Q4.0高速、Q4.1低速信号切换运行频率。程序设定脉冲差大于150mm运行时高速小于150mm切换为爬行频率约10Hz。这样到平层开关时速度已经很低惯性滑行很短停车位置就能控制在±5mm内。4.2 平层信号抖动导致的楼层错乱一次测试中电梯明明到了一层楼层显示却从1跳到2然后变回1。原因是一层感应开关安装在井道底部附近有曳引机变频器的强干扰感应开关输出带了高频毛刺PLC输入滤波时间不够导致同一个平层信号被误解析为多个脉冲。我在程序里的楼层处理逻辑原本是“每个扫描周期读取所有平层开关有信号就更新楼层”这在高频毛刺下会连续触发。后来改成只在运行中且上一次楼层变化完成后再检测并且加了一个100ms的输入确认延时也就是说平层开关信号要持续100ms为TRUE才确认到达该层。这之后问题消失。其实更彻底的方案是在感应开关输出端加中间继电器用继电器触点隔离或者在PLC输入侧并一个RC滤波。但程序防抖是最终兜底无论如何都要写上。4.3 门锁信号与开门输出互相“打架”调试中遇到一个很奇怪的故障电梯能正常下行但到站后门不开。查了很久发现是关门继电器Q0.4的输出和门锁反馈I3.4的关系没处理好。情况是这样电梯停稳后程序判断“门锁反馈为TRUE”则允许开门。但停稳瞬间门锁反馈由于门的惯性晃动会出现一个非常短的FALSE脉冲。此时程序已经进入开门流程检测到门锁反馈为FALSE就判断为门锁故障把开门输出切掉了同时报了故障。结果就是门锁正常但门开不了。解决方法是把门锁反馈的判断条件加一个去抖时间门锁反馈从FALSE变TRUE后保持500ms才认为门锁确实闭合。开门输出一旦置位就不要因为门锁反馈短暂变化而立刻撤销除非故障持续超过2秒。这个问题的本质是数字信号跳变和程序流程判断时序不匹配在PLC调试中非常典型。所有涉及安全反馈信号的程序都要加“稳定时间确认”不要直接读瞬间值。4.4 单部电梯的空闲停靠策略优化基础功能跑通后我想优化一个体验问题电梯完成所有召唤后会停在最后一个响应楼层如果下一次召唤正好在相反方向乘客等待时间会变长。这次我增加了一个“空闲返航”策略电梯在空闲状态下如果5分钟内没有召唤自动返回一层待命。这个功能逻辑就一句在FC_Direction里加定时器判断空闲超时且当前楼层不是一层就自动登记一个一层内呼。代码量很小但对公寓、办公楼场景非常实用也是很多厂家默认开启的功能。如果想做得更顺手可以把等待时间做成面板可调参数掉电保持。S7-1200的DB默认是掉电保持的把“WaitTime”定义为保持型变量触摸屏上直接用Modbus或S7协议访问修改即可。4.5 现场调试前的仿真技巧博途V15.1内置的S7-PLCSIM仿真器虽然无法模拟电梯真实的感应开关时序但用来调试纯逻辑层的召唤登记和方向判断非常有用。我建议在仿真阶段做一套“手动模拟输入”逻辑用M区内存位分别模拟各平层开关和按钮信号通过强制功能或可视化工具置位/复位观察程序状态和输出。这样可以提前把内呼、外呼、顺向截车、开关门状态机这些核心逻辑跑通再上电调现场时重点只查接线和信号质量问题。这个习惯为我节省了大量现场时间。5. 自由串口通信扩展把电梯状态送到上位机系统稳定运行后甲方提了一个需求大堂要放一块显示屏实时显示电梯运行状态。传统的做法是接一组信号线点对点传输但楼层多、信号多布线麻烦。刚好S7-1200支持自由串口通信我用一个CM1241 RS485模块加一块普通的串口显示屏把这个问题解决了。5.1 硬件连接与通信参数设置CM1241 RS485模块6ES7 241-1CH30-1XB0支持自由协议可以自定义报文格式。接线方式是将模块的A、B端子分别接到显示屏的RS485的A、B端注意共地而且要接终端电阻120欧防止信号反射。通信参数我设置为9600bps8数据位无校验1停止位这在短距离30米内非常稳定。在博途中选中CM1241模块在设备组态中启用“自由端口”协议定义消息缓冲区长度我设为256字节波特率和数据格式与屏端一致。注意S7-1200的串口模块在组态中默认是“RS485”模式数据流方向自动控制不需要手动切换收发。5.2 程序实现发送电梯状态帧自由串口的发送逻辑可以放在OB1中每500ms发送一次状态帧。这里用SCL调用串口发送指令比较方便// 组态要发送的报文 #Buffer[0] : 16#AA; // 帧头 #Buffer[1] : 16#55; // 帧头2 #Buffer[2] : 16#01; // 地址 #Buffer[3] : DB_Elevator.Floor; // 当前楼层 #Buffer[4] : DB_Elevator.RunDir; // 方向 #Buffer[5] : 16#EE; // 校验简化 // 调用发送指令 Serial_Send.Send( REQ : #SendReq, PORT : Local~CM1241_RS485, BUFFER : #Buffer, LENGTH : 6, DONE #SendDone, ERROR #SendError);注意在循环扫描中REQ参数要使用上升沿触发不能每个周期都为TRUE否则会连续发送。我加了一个200ms的脉冲M100.5作为发送触发。校验字段简单用了累加和先算再发送。显示屏端按照这个帧格式解析实时显示出电梯当前楼层和运行方向。这个扩展的意义在于它证明S7-1200不只能做纯逻辑控制还能作为数据节点接入更广的监控体系。如果你以后需要接触摸屏、组态软件、云平台串口这块的逻辑是完全通用的。这里要特别说明一下自由串口仅适用于非安全相关的状态监控。电梯的安全回路、门锁回路绝对不允许通过串口或总线来控制这在国标和常识里都是红线。我用它只做状态展示不做控制指令传输控制指令永远走硬接线。6. 项目总结与几个值得记住的教训整个项目做下来程序的最终版本OB1大约400行SCL加梯形图混编六个核心FC各150到300行DB里集中管理全部变量。从需求到调试结束大约花了两周其中现场调试大概六天。如果只能分享三条经验我会选这三条第一条电梯程序的复杂度不在单条逻辑而在状态之间的组合。写代码前务必先把状态机图画出来明确每一个状态下允许哪些输入、触发哪些输出、切到哪个状态。不画状态图直接开写后面现场改到你怀疑人生。第二条安全相关信号必须“双保险”软件逻辑要做硬件互锁也要做。PLC程序写得再好面对接触器粘连、继电器触点烧死、变频器干扰这些物理问题纯软件是防不住的。方向互锁、极限开关、门锁反馈这些必须硬接线进控制回路。第三条调试问题九成出在信号质量而不是逻辑。现场遇到的平层抖动、门锁反馈毛刺、编码器干扰全都不是程序逻辑本身的问题而是信号采集环节没有做好滤波和确认。所以I/O组态时的输入滤波、程序里的去抖确认、硬件上的屏蔽接地一样都不能省。最后再分享一个小技巧每次下载程序和修改逻辑前都把当前程序完整导出备份命名带上日期版本号比如Elevator_V3.1_0506.zap15。电梯是长期运行设备甲方随时可能提出新需求一个完整的版本记录能让你在三个月后面对自己的代码时快速想起当时为什么这么写。这个项目如果继续往下扩能做的方向不少并联两部电梯的群控算法、增加变频器模拟量闭环调速、接物联网模块做远程监控都是在现有架构上合理延伸的后续工作。但单部六层这个基础版本的逻辑闭环已经足够扎实后面这几次扩展我做的时候明显感觉到当初结构分模块、变量集中规划这个决定帮自己省了太多事。
返回列表