简介:一份面向电气自动化、机电一体化专业学生和PLC入门工程师的完整课程设计报告,围绕运料小车控制系统展开,完整覆盖从需求分析、硬件选型、主接线设计到程序实现与调试的每一步骤。包体为单个Word文档,约1.28MB,内容可直接查看修改,便于课程设计报告撰写时对照参考。报告重点包括设计要求与工作原理说明,步进电机、驱动器、PLC、接近开关、按钮、开关电源及触摸屏的选型要点,PLC的I/O分配与外部I/O接线方法,以及包含启动、暂停、停止逻辑的程序设计框图、暂停键与停止键运行框图和硬件调试过程。对于学习运动控制类PLC应用、完成同类课程设计或进行项目方案论证,都有较强的借鉴意义。目前已有1145人学习下载,适合作为课程设计参考或复习资料。 运料小车控制这个题目,几乎每一个PLC课程设计题库里都有,但说实话,能把这道题真正做扎实的人不多。别误会,不是梯形图跑不起来,而是很多交上来的方案经不起工程细节的推敲——要么手动/自动切换时输出打架,要么急停只靠程序切断结果PLC死机就傻眼,要么程序只在仿真软件里能跑、一接实物就乱跳。我当年做这个题目的时候也踩了一堆坑,后来带学弟学妹做实训又看他们重复踩类似的坑,所以干脆把从需求拆解、硬件设计、STL步进编程到联调排障的完整过程整理出来。这篇文章用的例程是三菱FX3U,但思路对西门子S7-200 SMART、信捷XC系列、汇川H1U这些同样适用,指令名称改一改就能平移。
1. 题目拆解:运料小车要满足的不只是“来回跑”
1.1 原始控制要求里的隐性条件
很多课程设计任务书里写得很简单:小车在A点和B点之间自动往返运料,A点装料、B点卸料,碰到限位开关就停下,延时后反向运行。看起来就这么几句话,但落到工程实现上,至少有四个隐性需求是任务书不会明说的。
第一个是原点位置不确定。小车通电以后可能停在A点、B点或者中间任意位置,程序不能假设它一定从A点出发,所以启动逻辑里得先判断当前小车在哪里,再决定第一步往哪边走。
第二个是手动和自动必须同时存在。课程设计答辩时老师一定会问“如果自动运行中我需要手动点动一下怎么办”,所以控制面板上必须有手动/自动切换开关,手动模式下能用按钮单独控制左行、右行、装料、卸料,自动模式下则按流程自动循环。
第三个是保护环节不能省。左右两个方向的运行必须互锁,防止两个接触器同时吸合导致相间短路;热继电器过载要能切断主回路;紧急停止不能只靠PLC程序里的一个输入点,因为PLC万一死机或程序跑飞,急停就失去意义了。
第四个是装料和卸料要有时间概念。一般课程设计用电磁阀或指示灯模拟装料、卸料执行机构,这时候要用定时器做延时,延时结束后才允许小车继续行走。这个延时参数直接影响整个循环时间,所以要在程序里做成可调、可观察的。
1.2 控制方案选型:三种方案的可比性在哪
这个题目可以用的方案无非三种:继电器接触器控制、单片机控制、PLC控制。课程设计报告里一般都要有个方案对比的段落,但很多学生写得很敷衍,我在这里把三个方案的优缺点列清楚,写报告时可以直接参考。
| 对比维度 | 继电器接触器控制 | 单片机控制 | PLC控制 |
|---|---|---|---|
| 修改逻辑的成本 | 改接线、重新配盘,非常麻烦 | 改程序、重新烧录,需配仿真器 | 改程序在线下载,秒级完成 |
| 抗干扰能力 | 较强,但对触点磨损敏感 | 较弱,需额外的隔离和滤波电路 | 强,输入输出自带光电隔离 |
| 时间控制精度 | 时间继电器精度低,温漂明显 | 定时器精度高,但需写代码 | 定时器精度足够,梯形图直观 |
| 调试便利性 | 万用表逐个查线 | 需要示波器、仿真器辅助 | 在线监控软元件状态,直观 |
| 扩展通信能力 | 几乎无法扩展 | 需要自己写协议栈 | 自带串口,支持Modbus等协议 |
| 课程设计工作量 | 硬件接线量大,逻辑简单 | 软硬件都要自己搞,周期长 | 集中在程序设计和系统联调 |
从这张表能看出来,PLC方案的核心优势不在“能不能实现”,而在“改起来快、查起来方便、跟工业现场接轨”。这也是为什么几乎所有院校的电气自动化专业课程设计都会选PLC——它让你在有限的设计周期内把精力放在控制逻辑本身,而不是陷在电路细节里。
1.3 品牌选择:实验室有什么就用什么,但思路要通用
课程设计一般用学校实验室现有的设备,最常见的是三菱FX系列和西门子S7-200 SMART,这两种的思路完全一致,差异在软元件命名和指令写法。三菱FX3U是实训台最常见的型号,所以我后面所有程序示例都用FX3U的指令表来写。
如果你用的是国产PLC,比如信捷XC系列、汇川H1U系列,它们的指令体系大多兼容三菱GX Works2的编程习惯,STL步进指令、SET/RST指令、定时器软元件的用法基本一样,把地址范围按型号手册改一改就能跑。用西门子的同学就把思路换成S7-200 SMART的SCR顺控指令,本质上也是状态继电器那一套逻辑,只是叫法不同。
2. 硬件设计与I/O分配:接线之前先把这四件事定下来
2.1 I/O分配表:先把每一个点位的含义钉死
硬件设计的起点不是画接线图,而是先做I/O分配。这一步做不好,后面写程序时地址改来改去,最容易出低级错误。我设计的I/O分配表如下,针对的是“两站往返、带手动/自动切换、带保护”的完整控制要求。
| 类型 | 地址 | 代号 | 名称 | 说明 |
|---|---|---|---|---|
| 输入 | X0 | SB1 | 启动按钮 | 常开触点,自动模式启动运行 |
| 输入 | X1 | SB2 | 停止按钮 | 常闭触点接入,程序中取反使用 |
| 输入 | X2 | SQ1 | A点限位开关 | 小车在A点到位信号 |
| 输入 | X3 | SQ2 | B点限位开关 | 小车在B点到位信号 |
| 输入 | X4 | SA1 | 手动/自动切换开关 | OFF自动,ON手动 |
| 输入 | X5 | SB3 | 手动左行按钮 | 仅在手动模式下有效 |
| 输入 | X6 | SB4 | 手动右行按钮 | 仅在手动模式下有效 |
| 输入 | X7 | SB5 | 急停按钮 | 常闭触点,硬件回路直接切断接触器电源 |
| 输入 | X10 | FR | 热继电器辅助触点 | 常闭,过载时断开 |
| 输出 | Y0 | KM1 | 左行接触器 | 驱动电机正转(小车向左) |
| 输出 | Y1 | KM2 | 右行接触器 | 驱动电机反转(小车向右) |
| 输出 | Y2 | YV1 | 装料电磁阀 | 模拟A点装料执行机构 |
| 输出 | Y3 | YV2 | 卸料电磁阀 | 模拟B点卸料执行机构 |
| 输出 | Y4 | HL1 | 运行指示灯 | 自动循环运行中常亮 |
| 输出 | Y5 | HL2 | 故障指示灯 | 热继电器动作或急停按下时亮 |
两个细节我要特别说明。第一个是停止按钮和急停按钮都用常闭触点接入,这是安全惯例——线路断线时系统会判停,而不是线断了但系统还以为按钮没按。第二个是热继电器的常闭触点要串联在接触器线圈回路里直接切断主回路,而不是只送给PLC输入让程序去处理。后面调试章节我会详细讲为什么这么做。
2.2 主电路与控制回路:电气互锁是保命的底线
小车电机是三相异步电机正反转控制,主电路就是最常见的两个接触器KM1/KM2调换两相相序。这里必须强调:KM1和KM2之间要有电气互锁,也就是KM1的常闭辅助触点串联在KM2线圈回路里,KM2的常闭辅助触点串联在KM1线圈回路里。这个互锁绝对绝对不能省,PLC程序里的互锁只是软件层面的第一道防线,万一接触器触点粘连,软件逻辑根本拦不住,只有电气互锁和主回路熔断器能兜底。
控制回路里还应该串入急停按钮SB5的常闭触点、热继电器FR的常闭触点,以及启动/停止逻辑。急停和热继电器都串硬件回路的原因很简单:它们必须在任何情况下都能直接切断接触器电源,包括PLC死机、通讯中断、程序跑飞这些场景。如果只把急停接成PLC输入,靠程序去断开输出,那PLC一死机急停就废了。
2.3 输入接线的漏型源型问题
FX3U的输入端公共端S/S,默认接法是漏型输入,也就是S/S接+24V,传感器用NPN型,信号从X端流入。行程开关和按钮本身就是干触点,不存在NPN/PNP的问题,把一端接到X端子、另一端接到公共端就行。但如果你后面要用接近开关代替行程开关,这就要注意了:NPN型接近开关配漏型输入,PNP型接近开关配源型输入,接反了信号就是不来。
3. 程序核心:STL步进指令实现两站往返运输
3.1 为什么选STL步进指令而不是SET/RST
实现顺序控制有好几种写法:用SET/RST指令自己做状态位、用比较指令跳转、用MC/MCR主控指令、用STL步进指令。课程设计阶段我最推荐STL,原因有三点。
第一,STL的编程模型和顺序控制过程天然对应,一个状态继电器对应一个工序,条件满足就往下一个状态转移,代码可读性极高,答辩时老师看你梯形图一眼就能看懂控制流程。第二,STL状态下只执行当前激活状态段的程序,非激活状态段的输出不会被扫描执行,这从机制上避免了“多个状态同时输出”的混乱。第三,STL的转移条件可以写得很复杂,比如“装料延时到且B点空闲”这样的组合条件,扩展性好。
SET/RST写法不是不行,但状态一多,你就要自己维护十几个中间继电器的置位和复位关系,漏掉一个复位就可能出现多个状态同时为ON的“撞车”情况,排查起来很痛苦。
3.2 状态流程图与指令表实现
先看控制流程。我设计的是:启动后小车如果在A点,就先装料,装料完成后右行去B点,到B点卸料,卸料完成后左行回A点,回A点再装料,如此循环。如果启动时小车不在A点,则在状态S24里先让小车回到A点再进入自动循环。完整状态分配为:S0初始状态,S20装料状态,S21右行状态,S22卸料状态,S23左行状态,S24回原点状态。
指令表参考写法如下,注意注释里的K值单位,FX3U定时器K50表示50×100ms=5秒。
; 系统上电或按下停止,进入初始状态 LD M8002 SET S0 STL S0 ; 初始状态 LD X0 ; 启动按钮 SET S20 ; 进入装料状态 STL S20 ; A点装料状态 OUT Y2 ; 装料电磁阀ON OUT T0 K50 ; 装料延时5秒 LD T0 SET S21 ; 装料完成,进入右行状态 STL S21 ; 右行状态 OUT Y1 ; 右行接触器ON LD X3 ; 到达B点限位 SET S22 ; 进入卸料状态 STL S22 ; B点卸料状态 OUT Y3 ; 卸料电磁阀ON OUT T1 K50 ; 卸料延时5秒 LD T1 SET S23 ; 卸料完成,进入左行状态 STL S23 ; 左行状态 OUT Y0 ; 左行接触器ON LD X2 ; 到达A点限位 SET S20 ; 回到装料状态,形成循环这段逻辑里有一个关键细节:从S23左行回到S20装料,没有经过S0初始状态,这是为了保持自动循环的连续性,不需要每次回到A点都重新按启动按钮。如果你希望每跑完一个循环就停下来等下一次启动,那就在S23回到S0而不是S20。两种流程设计没有绝对的对错,但要在报告里说清楚你选的是哪种,并说明理由。
3.3 回原点状态S24的补充逻辑
再补一段S24回原点逻辑。这个状态解决的是“小车不在A点就启动自动循环”的问题。
STL S24 ; 回原点状态 LD X2 ; 当前在A点 SET S20 ; 进入装料状态 LD X3 ; 当前在B点 SET S20 ; 等效,也可以直接回到A点再装料 STL S21 ; 这里只是占位,实际程序中状态不冲突一个更稳妥的实现方式是:在S24里判断X2和X3,如果在B点先左行回到A点,如果在中间也左行回到A点,到达A点后跳转到S20。这样做逻辑更完整。实际编程时要避免两个SET同时满足的歧义,所以用X2作为唯一回A点条件就行——不管你在中间还是B点,一律左行,直到X2被压到。
3.4 手动/自动模式的切换实现
手动和自动的切换是这道题最容易写翻车的地方。我的做法是用一个中间继电器区分模式:X4为OFF时自动,X4为ON时手动。自动段用STL状态驱动,手动段放在STL程序之外,并且手动段的输出不直接驱动Y输出,而是驱动中间继电器,最后统一做一次输出映射。
; 手动模式逻辑 LD X4 ; 手动模式有效 ANI M100 ; 自动运行锁存复位 AND X5 ; 手动左行按钮 OUT M20 ; 左行中间继电器 ; 输出映射 LD M20 OUT Y0这里引入中间继电器M20而不是直接OUT Y0,是为了避免和STL状态里的Y0输出形成双线圈冲突。这个问题在第四章会展开讲。
4. 调试实录:双线圈、模式卡死与限位抖动
4.1 双线圈冲突:手动和自动程序在抢同一个输出
我见过最多的坑就是这个。很多人写程序的时候,自动模式里用了OUT Y0控制左行,手动模式里又写了OUT Y0控制左行,一运行就发现输出不受控制。PLC的扫描机制是自顶向下扫描、末端输出刷新,同一个输出地址如果在程序里出现多次,最终输出状态以最后一次扫描到的运算结果为准。也就是说,你的程序物理位置上前面的那段Y0可能会被后面那段覆盖掉,表现就是手动按钮按了没反应、自动模式跑着跑着突然停了。
排查逻辑链是这样的:先看程序里Y0出现几次,用编程软件的“软元件使用一览”功能查;然后看每一处Y0的设备上下文是手动段还是自动段;最后把每一处输出都改成中间继电器M20、M21,程序末尾统一映射。
LD M20 OUT Y0 LD M21 OUT Y1这个“输出集中映射”的写法,在工程上叫“逻辑与驱动分离”,手动自动切换再怎么折腾,最终驱动输出的地方只有一个。这个习惯不只适用三菱,西门子、信捷、汇川的程序里都应该这么干。
4.2 模式切换后步进状态卡死
第二个高频问题:自动运行到一半,把切换开关拨到手动,手动点了几下,再拨回自动,小车不动了。原因很简单——你从自动切到手动时,STL状态还停在S21或者S22没有复位,切回自动后小车还认为自己在某个运行状态,而这个状态的转移条件已经不存在了,所以卡死。
解决方案是在切换开关的下降沿做一次状态总清:
LD X4 ; 拨到手动时 ANI M1 OUT M1 LD X4 AND M1 ZRST S20 S24 ; 批量复位所有自动状态 RST Y0 RST Y1 RST Y2 RST Y3 OUT S0 ; 回到初始状态,等待下一次自动启动注意这里的沿处理。用X4的下降沿触发复位动作,避免在手动运行过程中反复执行ZRST把手动逻辑也搞乱。复位之后回到S0,再次启动自动运行时从原点判断重新开始,整个流程就干净了。
4.3 限位开关抖动误触发
第三个坑来自机械层面。行程开关被撞块压下时,触点会抖动几十毫秒,PLC扫描周期通常几个到几十毫秒,就可能出现一个扫描周期里X2和X3都“瞬间为ON”的假象。放在运料小车这个场景里,表现就是小车刚到A点装料还没几秒,又触发右行指令跑走了。
我是用定时器滤波解决的。把原始限位信号先经过一个0.1秒的延时,确认信号稳定后才作为状态转移条件:
LD X2 OUT T10 K1 ; 100ms延时滤波 LD T10 OUT M10 ; M10是滤波后的A点到位信号后续所有状态判断都用M10和M11,不再直接用X2和X3。这样加一个定时器的成本极低,但抗抖动效果明显。如果现场限位安装位置离到位点太近,还要留出机械缓冲距离,让小车撞上行程开关后还有一段滑行余量,不至于把限位撞坏或者冲过位。
4.4 急停和热继电器的仲裁逻辑
再强调一次急停的处理。急停按钮SB5的常闭触点既串在硬件控制回路里,同时也接到PLC输入X7。程序里检测到X7为OFF时,要立刻ZRST所有步进状态、复位所有输出、置位故障指示灯Y5。但真正的安全保障是硬件回路——拍下急停,接触器线圈电源直接断开,电机立刻停。PLC这边的处理只是为了让屏幕上有显示、让程序知道出了故障、复位后才能重新启动。安全层级不要放颠倒了。
5. 从课程设计到工程思维:扩展方向与报告提醒
5.1 从两站往返扩展到多站点呼叫
这道题做完之后,想往上进阶的话,可以尝试把两站改成三站、四站甚至多站点呼叫。思路不再是STL逐个写状态,而是用数据寄存器D记录目标站号和当前站号,用比较指令判断运行方向,用移位指令或者查表法生成站点位置地址。
这种扩展的核心变化是:程序从“状态驱动”变成“数据驱动”,控制逻辑的通用性大大提升。你再加一个站点,不需要新增任何STL状态,只需要改站点数据表。这个思路和工业现场AGV小车的调度逻辑是相通的,值得认真做一做。
5.2 与组态王、触摸屏和SCADA的联动
如果你们的实验台有多余的触摸屏或上位机组态软件(组态王、力控、WinCC都行),可以把小车监控界面做出来:实时显示当前站号、运行方向、装料卸料状态、运行次数计数。FX3U可以用编程口或者FX3U-485-BD扩展板走Modbus RTU协议,组态王里建好设备驱动就能读地址。
这里有个实用经验:PLC里的状态地址建议单独划一块地址区给上位机读取,比如把所有状态标志位放在M100~M199,上位机只读这一块,不直接访问散布在各处的软元件。这样通信数据点表清晰,出了故障也容易定位。
5.3 课程设计报告和答辩的几个加分细节
报告结构建议按这个顺序写:课题任务书、总体方案论证、硬件设计、I/O分配表、状态流程图、梯形图及指令表、调试记录、设计总结。方案论证部分一定要写明为什么选PLC而不选继电器或单片机,把我在第一章那张对比表的核心观点用自己的话讲清楚。
答辩时老师最爱问的问题就那几个,提前准备好:两个限位同时压住怎么办?小车走到中途断电怎么办?接触器触点粘连了程序能不能检测到?装料时间改成10秒怎么改?这些问题都能用我们前面讲的逻辑回答——限位同时压住时程序要做互锁仲裁,断电后重新上电回到S0从原点判断,触点粘连只能靠硬件互锁和热继电器兜底,定时器参数改成K100即可。
最后说一个我实际带实训时特别强调的事:现在AI辅助编程工具很多,输入题目就能生成一段PLC代码,但课程设计的意义在于你亲手把状态图画出来、把每一行的软元件含义讲清楚。AI生成的代码跑通了不等于你懂了,答辩一问转移条件为什么这么写就露馅。把这套STL逻辑自己推一遍、调一遍、踩一遍坑,后面不管是做三菱、西门子还是国产PLC,你会发现自己拿到手的是一套通用的调试方法,而不是一段能跑的程序。
本文还有配套的精品资源,点击获取