作为一个常年泡在工控圈的人,看到“基于三菱FX PLC的组态王五层电梯控制系统设计与实现”这个标题,第一反应就是:这是典型的自动化教学标杆项目,也是很多刚入门PLC的工程师必须跨过的一道坎。五层电梯控制逻辑不算复杂,但麻雀虽小五脏俱全,它把PLC的开关量控制、时序逻辑、顺控程序设计、组态软件通信、上位机画面开发这些核心技能全串起来了。组态王作为国内工控市场占有率极高的组态软件,和FX系列PLC搭配,基本就是出厂配置级别的组合。这篇文章我打算抛开教科书式的排版,直接从项目落地的角度,把整个系统的设计思路、硬件选型、程序框架、组态王配置,以及我实际调试过程中踩过的那些坑,一次性讲透。
先说清楚这个项目能解决什么问题:它模拟的是一部五层电梯的完整运行逻辑,包括轿厢内选层、楼层外召唤、电梯运行方向判断、平层停车、开关门控制,以及通过组态王上位机实现电梯运行状态的实时监控和操作。适合哪些人参考?正在做课程设计、毕业设计的自动化相关专业学生,刚入行想系统练手PLC编程的初级工程师,以及需要在实训室搭建类似教学平台的老师,都能从这里找到可以直接照搬的方案。
1. 链路设计:从现场信号到上位机画面的整体思路
1.1 系统架构解析
电梯控制系统表面上看是“按个按钮、电梯来、开个门”这么简单,但真正落地到PLC控制时,你要处理的是一个典型的多输入多输出时序控制系统。整个系统架构可以拆成三个层级:现场信号层、逻辑控制层、上位机监控层。
现场信号层就是那些物理输入,包括每层楼的上行/下行召唤按钮、轿厢内的选层按钮、平层感应开关、上下限位开关、开关门到位信号。这些信号全部接入PLC的输入端。逻辑控制层就是PLC程序,负责把所有的按钮信号、位置信号按电梯运行规则转换成电机正反转、开门关门等指令。上位机监控层则是组态王运行的计算机,通过串口或者以太网和PLC通信,实时读取电梯状态、显示楼层位置,还能下发控制指令。
这三个层级的配合逻辑是:现场信号采集进PLC → PLC跑程序逻辑输出控制 → 组态王从PLC读数据做可视化展示。所以你会发现,这个项目本质上是两套系统:PLC逻辑控制系统 + 上位机监控系统。很多人只把精力放在PLC程序上,忽略组态王配置,最后画面出不来数据,项目整体就少了一半的完成度。
1.2 为什么选择三菱FX PLC与组态王的组合
我得说,这组搭配在工业现场和教学场景中的曝光率极高,不是没有原因的。三菱FX系列PLC的特点是结构紧凑、指令系统成熟、性价比高,FX3U是当前非常主流的选择,运算速度快,内置高速计数器,还能扩展通信模块。对于五层电梯这种规模的IO点数和逻辑复杂度来说,FX3U-32MR或者FX3U-48MR完全够用,甚至留有裕量。
组态王(KingView)是国内自动化项目中使用率最高的组态软件之一,界面以拖拽式组态为主,学习曲线平缓,而且内置了大量厂商的驱动。三菱FX系列PLC直接就在组态王的驱动列表里,不用写通信协议就能建立连接,大大降低了开发门槛。
这两者的组合有一个天然优势:调试方便。PLC侧用GX Works2或者GX Developer写程序、监控状态,组态王侧随时能读到数据。如果你的程序逻辑有bug,可以一边看PLC监控里的软元件状态,一边看组态王画面上的对应变量,双端对照定位问题,效率非常高。
2. 硬件选型与I/O点表:先把家底盘清楚
2.1 PLC选型与模块配置
很多新手上来就卡在“选哪个型号”这一步,其实只要把I/O点数盘明白,选型就水到渠成了。一部五层电梯,输入信号大致包括:四个上行召唤按钮(1到4层)、四个下行召唤按钮(2到5层)、五个轿厢内选层按钮、每层一个平层感应器、轿厢门开关到位检测两个。这些加起来已经快到20个输入点了。
输出信号也要提前规划:电机上行接触器和下行接触器各一路、开门和关门继电器各一路、上行/下行方向指示灯各一路,再加上楼层数码管显示如果直接用PLC输出驱动的话需要七段码,那一共又是七个输出点。全部加起来,输出点在15个左右。这样一算,FX3U-32MR(16输入/16输出)其实已经比较紧张了,我实际做项目时更推荐FX3U-48MR(24输入/24输出),可以留出几个备用点,调试时方便临时接信号。
如果后续还想扩展功能,比如接变频器做调速或者加触摸屏,FX3U可以直接在左侧扩展通信模块,像是FX3U-485-BD这种通信板,价格不高,组态王也能兼容,完全不冲突。
2.2 I/O点统计与地址分配
地址分配是写入程序前必须先完成的一步,我见过太多学生程序写得乱成一团,根源就是地址没规划好,这里写一个X0那里写一个X15,最后查bug查到崩溃。我习惯用表格把地址先固定下来,再开始写程序。
以FX3U-48MR为例,一个典型的地趾分配表就像这样:
| 信号名称 | PLC地址 | 信号类型 | 说明 |
|---|---|---|---|
| 一层上行召唤 | X0 | 按钮输入 | 常开点 |
| 二层上行召唤 | X1 | 按钮输入 | 常开点 |
| 三层上行召唤 | X2 | 按钮输入 | 常开点 |
| 四层上行召唤 | X3 | 按钮输入 | 常开点 |
| 二层下行召唤 | X4 | 按钮输入 | 常开点 |
| 三层下行召唤 | X5 | 按钮输入 | 常开点 |
| 四层下行召唤 | X6 | 按钮输入 | 常开点 |
| 五层下行召唤 | X7 | 按钮输入 | 常开点 |
| 一层内选按钮 | X10 | 按钮输入 | 常开点 |
| 二层内选按钮 | X11 | 按钮输入 | 常开点 |
| 三层内选按钮 | X12 | 按钮输入 | 常开点 |
| 四层内选按钮 | X13 | 按钮输入 | 常开点 |
| 五层内选按钮 | X14 | 按钮输入 | 常开点 |
| 平层开关1-5 | X15-X21 | 感应开关 | 每层一个 |
| 上行接触器 | Y0 | 输出 | 控制电机正转 |
| 下行接触器 | Y1 | 输出 | 控制电机反转 |
| 开门继电器 | Y2 | 输出 | 开门动作 |
| 关门继电器 | Y3 | 输出 | 关门动作 |
| 上行指示灯 | Y4 | 输出 | 方向显示 |
| 下行指示灯 | Y5 | 输出 | 方向显示 |
这里要特别提醒一点:平层感应器的安装位置和接线方式决定了程序的判断逻辑。如果你用的是光电传感器或接近开关,需要在每层的平层位置各装一个,轿厢上安装感应挡片。程序里用当前层的平层信号去触发楼层计数或停止逻辑。我做过一个简化方案是用行程开关替代,精度偏低但能用,不过现场调试时摇摇晃晃的感觉很不舒服,有条件还是建议上光电式。
3. 核心控制逻辑:五层电梯的呼梯算法与状态机设计
3.1 内呼与外呼的优先级处理
电梯的控制程序实质上有两条主线:一条是轿厢内选层指令,也就是内呼信号,另一条是各楼层的外呼信号。这两类信号的响应策略完全不同,处理不好就会出现“电梯跑错方向”或者“响应了召唤却不开门”这种低级问题。
内呼信号优先级最高。因为轿厢内的乘客已经明确了目标楼层,电梯必须优先响应当前最近的选层目标,不能因为中途来了一个外呼信号就把方向改了。我在程序里把内呼信号分别存入M0到M4这五个中间继电器,对应楼层一到五,哪个按钮按下了,对应的继电器就置位,直到电梯到达该楼层并完成开门后才复位。
外呼信号要做的是登记和排队处理。外呼分上行召唤和下行召唤,信号必须和电梯运行方向匹配时才响应。比如电梯当前正在上行,三层有人按了下行召唤,电梯不会马上停,而是把三层下行召唤登记在记忆里,等电梯运行方向反向后才去响应。我在程序里把外呼信号分两组存,M10-M13存一到四层的上行召唤,M14-M17存二到五层的下行召唤。
这里有个很关键的编程细节:召唤信号的复位时机。内呼信号是到站开门后复位,外呼信号也要到站开门后复位,但外呼信号还包括反向呼梯的记忆。举个例子,电梯上行到五层后转而向下,此时才去响应之前登记的二层下行召唤。所以复位程序必须写在电梯过了该楼层并且方向切换之后,而不是一到站就复位,否则会出现“电梯到了三层停了一下但门不开又走了”这种尴尬情况。
3.2 方向判定逻辑设计
电梯运行方向的判定逻辑,是整个程序里最容易写乱的部分。方向判定的核心是:电梯在上行状态下,只响应当前楼层以上的上行召唤和所有内呼和上行方向的外呼;下行状态同理,只响应当前位置以下的内呼和外呼。
我的实现方法是定义一个方向标志位:M20为上行状态,M21为下行状态。每一轮扫描都做一个“找最近目标楼层”的判断。写PLC程序的时候,借助比较指令和区间判断指令可以大幅简化逻辑。FX3U支持LD=、LD>、LD<这些比较触点指令,可以直接把当前楼层值和目标楼层值做比较,再配合ZRST区间复位指令批量处理楼层信号。
方向判定还要考虑一个特殊情况:电梯空闲停在某一层时,如果同时来了两个不同方向的召唤信号,电梯先往哪边走?我采用的是“最远优先”方案:电梯从当前层出发,先比较所有召唤楼层和当前楼层的距离,距离最远的那个方向优先。实际工程中这个策略可以换,但程序逻辑上必须有一个明确的判定顺序,不能写成混沌状态。
3.3 平层与开关门时序控制
平层检测是电梯准确停靠的关键。每次电梯快要到目标楼层时,会先碰到该层的平层感应开关。程序检测到平层信号后,先切断电机运行输出Y0或Y1,然后启动抱闸延时(防止溜车),延时时间我用的是0.5秒,实际调试时根据电机惯性做微调。之后才触发开门继电器Y2。
开关门逻辑里也要防呆。开门到位信号和关门到位信号需要做互锁,开门继电器和关门继电器不能同时输出。我实际调试时,电气回路里加了互锁,程序里又加了一层互锁,双重保障,防止烧接触器。
还有一个容易忽略的细节:电梯到站开门后,如果没有人继续按任何按钮,门不应该一直开着,要有延时自动关门。我在程序里设置了一个30秒的开门延时,时间到后自动启动关门,关门到位后清除当前楼层对应的呼梯登记信号。如果关门过程中有人触发了门区感应器,立即停止关门并重新开门,这就是安全触板逻辑的简化版本。
4. 组态王上位机画面设计与通信配置
4.1 组态王设备通信配置
组态王配置的第一步是建立和PLC的通信连接。在组态王工程浏览器左侧找到“设备通信”,选择COM口或者TCP/IP,然后在新建设备向导里选择驱动类型。这里要注意,组态王对FX系列的驱动是分开的,FX2N、FX3U对应的驱动入口不完全一样,千万别选错。
我使用FX3U PLC时,优先推荐用以太网通信,比串口省心太多。FX3U本体没有网口,得加一个FX3U-ENET-L模块,或者用带网口的FX3U-ENET-ADP。组态王里选择三菱FX3U以太网驱动,将PLC的IP地址和端口填进去,注意默认端口号是5007,这个不能填错。如果临时没有以太网模块,用串口也可以,组态王选“FX3U编程口”驱动,用USB转串口线连到PLC的编程口,波特率9600、数据位7位、偶校验、停止位1,这是三菱编程口的默认参数,组态王里照这个配就行。
4.2 变量定义与画面组态
组态王里的变量分为内存变量和I/O变量。I/O变量是关键词,它直接映射到PLC的软元件地址,程序里通过读取这些变量来采集数据、下发控制。我规划的变量至少包括:当前楼层(映射到D0)、运行方向状态(映射到M20/M21)、五个内呼按钮状态(映射到M0到M4)、各层外呼状态(映射到M10到M17)、开门状态、关门状态等。
定义变量时还需要注意数据类型的一致性。FX3U的M区是位元件,对应组态王里数据类型要选“Bit”;D区是字元件,对应的是“Short”或“Int”。填错类型会导致画面上的数字显示乱码或者读不到值。
画面组态是组态王里比较有成就感的部分。我习惯的做法是:先放一个垂直的楼层井道示意图,用矩形代表楼层,用一个小色块代表轿厢。然后每层放两个指示小球,一红一绿,用来显示上下行召唤是否被登记。再用文本显示当前楼层数字。这些图形元素建立好后,通过“动画连接”功能把它们的颜色填充、位置移动、文本内容分别关联到对应的I/O变量上。
4.3 动画连接与数据绑定
动画连接是画面“活”起来的关键。很多人卡在这一步:变量定义了,画面也画了,但运行起来画面不动、数据不刷新。原因大概率是动画连接没做对。
以楼层显示为例,双击画面上的楼层文本,在弹出窗口里选择“文本显示”,关联到D0这个当前楼层变量。关键一步是设置显示格式和数值范围,如果不做映射,D0里存的是数字1到5还好,但如果你在PLC里用的是特殊编码,比如BCD码,组态王这边直接显示就会出现“1显示成01”、“5显示成05”这类问题。
轿厢位置动画的做法是:在井道图上画一个代表轿厢的小矩形,设置它的“垂直移动”动画属性,关联到当前楼层变量的同时,设置上下限值和移动像素距离。比如每层高度50像素,那下限值为1(对应一层)时轿厢位置在底部,上限值为5(对应五层)时在顶部,组态王会自动按比例做移动插值。实测下来动画效果很流畅。
5. 组态王常见故障:创建协议组件失败的排查实录
5.1 故障现象与原因分析
做这个项目时,组态王侧我碰到过好几个问题,最典型的就是“创建协议组件失败”。现象是启动组态王运行系统后,在画面下方的信息窗口里出现类似“创建协议组件失败”的报错,然后所有I/O变量全部无数据,画面上的数据全变成0或者没有链接。
这个报错本质上跟PLC通信没有直接关系,而是组态王软件自身加载通信驱动组件时出了问题。常见原因有四类:第一,软件授权或加密锁异常,导致部分COM组件没有加载成功;第二,安装路径包含中文或特殊字符,导致驱动组件的路径引用失败;第三,杀毒软件或系统防护软件把组态王的驱动组件拦截隔离了;第四,系统中已安装了不同版本的三菱通信库,和组态王自带驱动起了冲突。
5.2 排查步骤与解决方案
我当时排查这个问题的顺序是:先确认系统时间、授权状态、加密锁是否正常,然后检查安装路径是否全英文,接着关掉杀毒软件重新安装驱动组件,最后在系统服务里查看组态王相关的服务有没有被禁用。
实际解决步骤可以归纳如下:首先,用管理员身份运行组态王,很大概率就解决了权限不足导致协议组件无法创建的问题。其次,找到组态王的安装目录,比如C:\Program Files (x86)\Kingview,检查驱动文件夹下的DLL文件是否都在,如果有被杀毒软件隔离的情况,恢复文件后重启软件。最后,如果还不行,卸载组态王并清理注册表后重装,但重装前一定要备份工程文件,工程后缀是.pkg,单独拷贝出来就行。
提示:组态王的驱动组件加载过程中,在工程浏览器里点“设备通信”节点时,驱动列表能正常显示不代表协议组件就能正常创建。这两者的加载机制不同,驱动列表读的是外部配置文件,而协议组件创建发生在运行系统启动阶段。如果信息窗口反复报这个错,先把系统时间改为正确时间并重启软件,有些授权机制会在时间异常时部分功能失效。
还有一种隐蔽情况,组态王装在Windows 10以上系统且未设置兼容性属性时,组件加载也可能被拒。右键组态王运行系统的快捷方式,在兼容性选项卡里勾选“以兼容模式运行这个程序”,模式选Windows 7,实测能解决很多疑难杂症。
5.3 通信不稳定的几个隐藏坑
通信配置正确、协议组件也正常创建了,但运行一段时间后组态王画面上的数据卡住不动,这又是另一个高频问题。这时候统测手册上常写“检查波特率、检查设备地址”,但实际里还有几个隐藏坑。
第一,串口通信时USB转串口线不稳定。很多便宜的USB转串口芯片兼容性差,在数据量稍大时丢帧严重。建议至少选FTDI芯片的转换线,别用十几块钱的山寨线。第二,PLC的通信端口被占用。如果你在GX Works2里在线监控PLC的同时,组态王也在往同一个编程口发数据,两者会抢端口。GX Works2的智能模式会周期性轮询PLC内部软原件状态,这会让组态王的通信链路口径冲突,必然导致数据刷新不畅。调试时用GX Works2监控完,记得断开。第三,通信超时时间设置太短。组态王设备通信配置里默认有超时重试次数和周期设置,如果在大型工程里网络负载高,适当调长超时时间字段,数值设为1000毫秒左右更稳妥。
6. 调试经验:程序跑不通时我在想什么
6.1 用PLC监控功能做逻辑验证
程序下载到PLC后,第一件事不是急着就开组态王的画面,而是先在GX Works2的软元件监控里把所有输入输出、中间继电器的状态都看一遍。我给学生的建议永远是:先让PLC离开上位机独立运行,通过监控窗口验证逻辑正确性,再用组态王去读数据。
以这个电梯项目为例,我的调试顺序是这样的:第一步,手动强制Y0输出,确认电机正转回路正常,然后再强制Y1,确认反转回路正常,顺便确认电气互锁是否有效。第二步,模拟按钮输入,比如强制X0为ON,观察M10上行召唤登记标志是否置位,以及方向判断逻辑是否输出正确的运行方向。第三步,用手在平层感应器前面划过,模拟轿厢经过楼层,观察当前楼层D0的值变化是否正确。这三步全部没问题后,才把组态王运行起来看综合效果。
6.2 时序配合的几个经验参数
实际操作中,有几个时间参数需要根据现场情况微调。开门保持时间我上面提到了设为30秒,但这在实际演示场景里偏长,如果用于教学展示可以缩短到10秒,避免参观者等待太久。关门到位后到电梯启动运行的延时,我设了1秒,这是为了让机械结构完全落位,否则电机会带着没关紧的门硬跑,长期下来门机构容易损坏。
抱闸延时这个参数尤其重要。电机停止输出后,电梯轿厢由于惯性还会往前再溜一点,如果立即开门,轿厢可能还没对准楼层。我通过试验发现0.5秒的值比较合适,如果电梯使用的是滑行惯性较大的电机,这个值可以加到0.8秒。但是反过来,如果抱闸延时过长,电梯刚停稳时又会明显顿一下,体感舒适度很差。
6.3 组态王与PLC的数据精度问题
最后一个很容易被忽视的问题是数据精度。在组态王里,我遇到过楼层数字显示为0的情况,排查了半天,发现问题出在PLC程序里写的是K1到K5的常数,而组态王变量定义的是“Short”类型。问题不在于类型,而在于我在PLC程序里用了移位指令把楼层数存到了D0的高字节,组态王读取D0后就显示成了256这样的数。类似这种字节序问题,在组态王和FX3U通信时是经典坑。FX系列PLC是Big-Endian,而且D区是16位存储区,组态王默认的寄存器类型设置如果选错了高低字节顺序,所有数值都会错乱。
解决方式是在组态王设备通信的高级属性里找到“寄存器读写顺序”相关选项,或者在PLC程序里把数据规范化后单独存放到一个专用寄存器区。更稳妥的做法是在PLC程序里就直接用MOV指令把当前楼层存成BCD码,同时组态王变量对应的格式也选BCD,两边加密解码逻辑保持一致,就不会出现显示乱码的问题。
我在实际项目中已经养成了一个习惯,就是每个通信数据区之前先写一个数据别名注释块,标注该寄存器在组态王里对应哪个变量、数据类型是什么、字节序怎么处理。项目结束后把这部分写在技术文档里,后续维护的人会少掉很多头发。这个项目虽然是一个教学规模的五层电梯,但完整走下来之后,你对PLC控制系统的结构化编程、上位机组态通信、现场调试方法都会有一个质变级的认识。建模仿真和物理调试差距很大。组态王的画面做得再漂亮,也不代表现场PLC逻辑就是对的,反过来,PLC程序逻辑正确而组态王配置错乱,同样无法交付。两边同时推进、交叉验证,才是这类系统集成项目最实用的落地方式。