☰
基于西门子PLC与触摸屏的自动呼车系统设计与仿真实现
2026/10/20 7:24:02 网站建设 项目流程

提到“PLC自动呼车系统”,很多人第一反应是:这不就是几个按钮加一辆小车来回跑吗?但真正在车间里待过的人都知道,这里面的门道远不止“按一下、跑一趟”这么简单。呼叫点怎么布、多台车同时被呼怎么办、到位信号怎么确认、超时怎么处理、操作记录怎么留,每一步都藏着细节。我之前帮某制造企业做过一套类似的物流呼叫改造,也是基于西门子PLC和触摸屏的组合,配合博途TIA Portal工程环境完成开发和仿真验证。说实话,这套方案特别适合做教学演示,也适合中小型产线的物流调度场景。这篇就把我的完整思路、选型过程、程序核心逻辑、HMI画面规划以及调试时踩过的坑一次性整理出来,给正在做类似项目或者准备入门工业自动化的朋友一个参考。

1. 先搞清楚自动呼车系统到底在解决什么问题

1.1 一个典型到不能再典型的车间场景

假设有一条装配线,线上有六个工位,每个工位在物料不足时需要叫一辆物料小车从仓库送料过来。以前的做法是什么?工人放下手里的活,扯着嗓子喊一句“三号工位要料了”,或者打个内线电话给仓库,仓库再安排人开着小车送过来。遇到忙的时候,这一来一回可能耽误十几分钟,产线停在那里等料,工时白白浪费。更头疼的是,喊完就忘了,没人记录到底几点叫的料、几点送到的,出了问题根本追溯不了。这就是自动呼车系统要解决的痛点:把“人喊人”变成“按钮触发、系统调度、自动记录”的闭环流程。

1.2 功能需求拆解:一个闭环系统最少要有什么

我在设计这套系统时,第一时间不是急着写程序,而是先把需求分成四个层次。第一层是最基础的呼车触发:每个工位要有呼叫按钮,按下之后PLC要能收到信号,并且知道是哪个工位在呼叫。第二层是多任务管理:如果多个工位同时呼叫,系统得有先后顺序,不能一辆车接到命令后还要原地纠结。第三层是到位确认:小车到达某个工位后,应反馈一个到位信号,PLC确认之后才算把这次呼叫闭环掉,否则任务会一直挂在那里。第四层是记录和报警:谁叫的、几点叫的、几点到的、有没有超时,这些信息要在触摸屏上可查,异常情况要有声音或文字报警。把这四层想清楚,后面的程序框架也就自然出来了。

1.3 为什么说“仿真先行”特别重要

参与过我项目的人都知道,我特别强调先用仿真把逻辑跑通再上真实设备。原因很简单,现场调试时间非常宝贵,产线停一分钟都是成本,而程序逻辑的问题如果能在仿真阶段发现,根本不会浪费现场时间。博途TIA Portal本身就提供PLCSIM仿真环境,可以模拟PLC运行状态,搭配HMI面板的仿真功能,完全可以在没有真实PLC和触摸屏的情况下,把整套呼车流程从触发、排队、响应到完成都走一遍。这篇博文里所有提到的内容,都是基于博途V16及以上版本的仿真环境来展开的,你可以直接跟着操作,不需要先买一堆硬件。

2. 方案选型:为什么是西门子PLC加触摸屏这套组合

2.1 控制器方案横向对比:PLC、单片机、继电器谁适合

有人可能问,做个呼车系统,用继电器电路行不行?用单片机行不行?都能做,但体验完全不一样。继电器电路逻辑一旦写死就很难改,比如原本三个呼叫点,后面加第四个,硬接线就要重来。单片机虽然便宜,但抗干扰能力弱,车间里电机一启停,电平信号就可能乱跳,而且出了问题调试很不方便。PLC不一样,它的输入输出都做了电气隔离,抗干扰能力强,程序修改直接在线下载就行,扩展点位也容易。西门子的S7-1200系列尤其适合这种中小规模的系统,性价比高,博途编程环境又直观,是我做这套方案的首选。

2.2 触摸屏的价值:把“看不见的逻辑”变成“看得见的操作”

如果只有PLC,按键接线也能实现基本呼车,但操作者按下去之后到底有没有成功、前面还有几辆车在排队、车当前在哪个位置,这些信息全看不见。加一块触摸屏,效果完全不同。操作工在屏幕上按一个虚拟按钮,面板上立刻显示“呼叫已登记”、“排队中第几位”,从体验上就让人觉得这套系统很可靠。而且触摸屏可以把报警列表、历史记录、参数设置全部集成在一个彩色面板里,比物理指示灯和蜂鸣器直观太多了。我用的是西门子精简系列面板,KTP700这类,在博途里直接组态就能和PLC通信,不需要额外编程。

2.3 博途TIA Portal工程的版本与设备选择

这里必须提醒一句,博途从V13开始每个大版本之间工程文件兼容问题很麻烦,高版本能打开低版本,但低版本打不开高版本。我建议统一用V16或V17,这两个版本目前用户最多,找资料也容易。CPU方面,S7-1214C DC/DC/DC是常见选择,不带以太网口的版本不要买,因为和触摸屏通信还有后续扩展都需要网口。触摸屏用KTP700 Basic PN,屏幕大小适中,分辨率够用,支持PN通信。工位呼叫点就接普通按钮到PLC的数字量输入点,小车到位信号我这边用接近开关模拟,实际项目里可能是光电开关或行程开关,反正都是数字量输入,逻辑不变。

3. 核心逻辑设计与实操要点

3.1 呼叫站点地址规划与I/O映射

这一步决定后面所有程序写起来顺不顺手。我习惯把每个站点的物理输入地址和逻辑中间变量一一对应,做成一张映射表。比如第一工位呼叫按钮接在I0.0,第二工位在I0.1,小车到位信号在I0.7,所有输出比如蜂鸣器接Q0.0,小车的启动、停止、前进、后退分别接Q0.1到Q0.4。注意,我程序里不会直接到处调用I地址,而是先用M变量把它们缓存一遍,比如M10.0代表一号站呼车请求,M10.1代表二号站呼车请求,这样好处是现场改线时不需要去翻程序,改一下映射逻辑就行。而且M变量在仿真和在线监视时看起来非常直观,别人看你的程序也能快速理解思路。

3.2 呼车请求与排队机制:优先级到底怎么设计

多站同时呼叫是最常见的场景,处理不当下就会“抢车”。我的做法很简单,分两个维度:先按呼叫时间排队,再按站点优先级排队。先用一个呼车时间戳队列记录每个站点呼叫的先后顺序,当小车空闲时,调度程序从时间戳队列里取最早呼叫的站点去响应。但如果某个站点被标记为高优先级,比如原料库出来的主通道站点,它可以插入队列前方,优先获得小车。实现上我用了两组数组,一组存站点编号,一组存呼叫时间毫秒值,程序里用指针移动来实现队列进出。这个逻辑用SCL写特别方便,梯形图写起来会绕一些,我后面的代码示例就用SCL了。

3.3 到位确认与超时复位:一个闭环状态机

呼车不是按下就不管了。我把每个呼叫点设计成一个迷你状态机,包含空闲、呼叫中、派车中、到位、完成五个状态。按下按钮,状态从空闲跳到呼叫中,小车如果空闲立即进入派车中,车走到位给到位信号,状态跳到到位,这时候现场可能需要人工确认一下,再按一下确认按钮,状态变成完成,然后复位,等待下一次呼叫。假如小车在派车过程中超过设定时间比如3分钟还没到位,状态机会跳转到超时报警,触摸屏弹出提示,同时重新生成一条派车指令。这个超时时间我在HMI里留了一个可写参数,现场调起来非常方便,不用改程序。

3.4 HMI画面组态的几个关键点

触摸屏画面不要贪大求全,我建议分成三个主页面。第一页是总览,左侧六个工位的状态灯和按钮,右侧一辆小车的当前位置示意和“空闲/运行中”状态。第二页是报警画面,显示超时报警和到位确认异常等事件。第三页是数据记录,按时间排序显示每一次呼叫的站点、时间、到位时间、耗时。组态时要注意,HMI的变量名要和PLC符号表保持一致,尤其是背景画面和全局变量的区分,新手经常把按钮放在背景画面上,结果每个页面都出现这个按钮,地址一绑定就乱套。更稳妥的做法是每个工位按钮放独立画面模板里,实例化时只改实例前缀。

4. 实操过程:从零搭建一个自动呼车工程

4.1 新建博途项目与硬件组态完整步骤

打开博途后,第一步创建新项目,选择“创建新项目”,命名建议带版本日期,比如CallCar_Sys_V1.0_20250330。然后在项目树里双击“添加新设备”,选择控制器,这里选SIMATIC S7-1200,具体型号1214C DC/DC/DC,固件版本选V4.4或更高。接着再添加一个HMI设备,选KTP700 Basic PN。博途会自动弹出网络视图,把PLC的PROFINET接口和HMI的PN接口用鼠标拖拽连接起来,系统会自动分配IP地址,我习惯用PLC的192.168.0.1和HMI的192.168.0.2,保持在同一网段。设备添加之后,打开设备组态界面,可以看到CPU的模块布局,数字量输入输出都在板载通道上,不需要额外加信号模块,除非你要扩展点位。

4.2 编写PLC程序:核心SCL代码示例

程序分三个OB块和一个数据处理逻辑。OB1主程序里调用所有功能,OB100初始化,OB35定时中断用来做时间戳刷新。下面是我写的一小段呼车请求登记逻辑,用SCL实现,可读性比梯形图高很多。代码中我用数组来模拟队列:

// 呼车请求登记逻辑(部分) #temp_queue := #temp_queue + 1; // 新的呼叫进入队列尾部 IF #station = 1 THEN #callSign[#temp_queue] := 1; #callTime[#temp_queue] := #currentTime; ELSIF #station = 2 THEN #callSign[#temp_queue] := 2; #callTime[#temp_queue] := #currentTime; END_IF; // 小车调度:优先选择最早呼叫的站点 #dispatchIndex := 1; FOR #i := 2 TO #queueLength DO IF #callTime[#i] < #callTime[#dispatchIndex] THEN #dispatchIndex := #i; END_IF; END_FOR; #activeStation := #callSign[#dispatchIndex];

这段代码的逻辑是一旦呼车站点发出请求,就进入队列;调度时用轮询找最早时间戳的站点。实际项目里我还会在FOR循环前加一个判断,如果当前有站点正在派车中,就跳过调度,避免打断正在执行的任务。这个简单的“忙则跳过”逻辑能避免很多任务打架的问题。

4.3 HMI变量连接与画面按钮绑定实操

在博途的HMI组态界面里,双击“连接”可以看到PLC连接已经被自动建立,默认通信驱动是SIMATIC S7-1200,接口是以太网。变量表里你可以手动添加需要交互的PLC变量,比如每个站点呼叫按钮对应的M变量、到位状态对应的M变量、超时时间对应的DB变量。有个细节需要注意:HMI变量一定要取消“保持”勾选,否则每次HMI重新连接后,按钮状态可能和PLC不一致。按钮的“按下”事件选择“置位位”,并设置变量地址为对应的站呼车请求M地址,“释放”事件选择“置位位”,但把值设成0,这样才能做到按下接通、松开断开,模拟物理按钮的瞬时行为,而不是像开关一样保持住。

4.4 联合仿真调试:PLCSIM和HMI仿真的联动

在博途里启动仿真之前,要先把PLC程序编译下载到仿真器里。点击“启动仿真”会弹出PLCSIM界面,第一次建议选择“无连接接口”或者选择你本机实际的以太网适配器,我一般选无连接接口,因为仅仿真不需要走真实网卡。程序下载完成后,把PLCSIM切换到RUN状态。接着在HMI组态界面点“启动仿真运行系统”,HMI仿真窗口会弹出。这个窗口启动后,注意左下角会显示连接状态,如果显示“建立连接”或者“SYSTEM RUN”就OK了。调试时,你用鼠标点击触摸屏上的某个工位呼叫按钮,PLCSIM里能监视到对应的M变量变TRUE,同时HMI画面上该工位的指示灯变红,再模拟给小车到位信号,在PLCSIM里点对应的I点置位,程序应该往下走完成状态,HMI画面上的状态也随之变化。整个闭环跑通,就说明逻辑没问题了。

5. 常见问题与排查技巧实录

5.1 PLCSIM和HMI仿真连接不上怎么办

这个问题初次接触博途的人十有八九会遇到。HMI仿真窗口弹出来了,但画面右下角一直显示设备连接中断。排查思路这么一列,基本都能解决:第一看博途项目里PLC和HMI是否组态在同一子网,并且IP在同一网段;第二看PLC仿真器有没有先下载程序并且处于RUN模式;第三看HMI启动仿真时选的项目访问路径对不对,如果是多项目环境,比较容易选错。另外提醒一点,PLCSIM启动后,电脑上的防火墙有时会拦截模拟网口通信,如果以上三项都没问题,先关防火墙再重启仿真。我调试时遇到最多的情况就是忘记先开PLC SIM再开HMI SIM,顺序反了,连接就闪断。

5.2 呼车信号闪断导致漏任务

现场按钮如果接触不良或者有抖动,PLC收到的信号可能在一瞬间从0变1又变回0,程序如果不做处理,可能这条命令读到一半就丢了,任务根本没建立。解决思路有两个。第一是加延迟滤波,在读取物理输入之后,用一个定时器延时100到200毫秒,确认输入稳定后再执行登记逻辑,相当于给信号一个“确认时间”。第二是在程序里用“上升沿”指令捕捉信号,即使按钮抖动多次,也只捕捉到第一次有效沿,在沿触发的程序段里登记任务,后面再抖动也不会重复登记。我比较推荐第二个方案,因为省定时器,而且逻辑更直接。

5.3 多台车场景下的任务冲突

如果系统里不止一辆小车,调度逻辑不能简单“取最早任务”,还得考虑每台车当前的位置和状态。我给出的简化模型是单小车,但扩展多车时有个核心思路:给每台车定义一个状态结构体,包含当前位置、当前任务、状态字;调度器为每台空闲车辆计算到每个呼车站点的路程距离,取最近的那台车去执行任务。如果你在原有单车逻辑上做扩展,记住不要让两台车同时被派往同一个站点,最好在程序里加一个目标站点忙标志,每次派车前检查这个站点是否已经有一个任务在途。我见过因为没加这个标志,两辆车同时到位,在窄通道里互挤的现场,相当狼狈。

5.4 HMI按钮按下没反应,但变量监视正常

这种情况很迷惑,PLC那边明明看到M变量有变化,但HMI按钮却像没按过一样。仔细检查后发现,是HMI变量表里“采集周期”设置问题,默认可能设成了周期性采集且周期很长,按钮按下后的画面刷新跟不上。把HMI变量表里涉及的PLC变量采集周期改小,比如100毫秒,或者设置为“永久”采集,问题就消失了。还有一次是按钮事件绑定错了,绑定到“单击”而不是“按下”,我画的按钮因为画面层级关系,单击事件被上层透明框拦截了,挪一下图层顺序就好。碰到问题别急着改程序,先在HMI变量状态表里看实际链接的变量是否在刷新,再检查图层,最后检查事件。

5.5 避坑经验:把“注释”和“命名规范”当成程序的一部分

这一点放在最后说,但我觉得比前面所有技术细节都重要。程序里所有站点号、状态、时间戳变量,命名务必带有含义,比如Write_Q1_CallReq表示一号站呼车请求,HMI侧和PLC侧统一名称。别小看这一点,项目调试到后面,你会发现最耗时间的不是改逻辑,而是回忆某个地址到底是什么功能。我当时吃了亏,最开始用M0.0这种裸地址,过了一个月再去维护,翻得头都大。后来照着设备做了一张完整点位表,贴在项目文件里,接线图、PLC变量表、HMI变量表三方对账一清二楚,后面维护就轻松太多了。仿真项目也一样,注释写详细点,过段时间重新打开工程,看注释就知道当时的设计意图,效率翻倍。

我个人的体会是,自动呼车这种项目看起来小,但五脏俱全。从信号采集、任务管理、状态机、人机交互到仿真调试,每一环都是工业自动化里的经典基本功。做熟了这套,再去接触那些堆垛机、AGV调度之类的复杂系统,你会发现底层逻辑都是相通的。如果你现在还在入门阶段,我特别建议你亲手在博途里把这套仿真搭一遍,别只看别人写好的工程文件,自己动手建项目、连变量、跑仿真,遇到的问题都记下来,收获比刷十篇教程都有用。后续如果你想往深了做,可以试着在这套基础上加入多车调度、呼叫次数统计、无线遥控模块这些扩展点,这座小山爬过去,前面就是另一片大平原了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询