当前位置: 首页 > news >正文

你以为 PLC 只能控制传送带?我用西门子 1200 做了个打地鼠小游戏!

大家好,这是我第一次写技术博客,之前学 PLC 的时候,总觉得 PLC 都是用来控制传送带、电机这些工业设备的,能不能用它做点好玩的?

于是花了一周时间,用西门子博途做了个打地鼠小游戏,不仅能学习还能边玩,今天把整个过程分享给大家,新手也能跟着做~

屏幕录制 2026-05-13 204652

一. 项目介绍

这个小项目实现了完整的打地鼠功能:

  • 支持启动 / 停止游戏,停止自动复位所有状态
  • 3 档难度切换:简单 / 中等 / 困难,地鼠停留时间不同
  • 打中加分、按错扣分、漏打扣分(暂时没有)
  • 20 分胜利、分数负数失败的胜负判定
  • 完整的 HMI 交互界面,支持联合仿真

二. 准备工作:

用到的工具:

  • 软件:TIA Portal V21(V17/V18 也通用)
  • 仿真:PLCSIM + WinCC RT 仿真
  • 知识点:FB 功能块、结构化 DB、HMI 变量绑定、联合仿真(如果你有实际硬件的话也可以加:实际我用只用了仿真也能完全跑通)

三.核心实现步骤(分步骤讲,新手能跟着抄):

1)第一步:变量定义,符合 PLCopen 规范

首先我定义了所有的变量,把变量全存在了DB块里避免了地址重复用模糊的问题:

规范变量名变量类型作用说明
启动按钮Bool(输入)游戏总启动按钮:点击后复位所有状态,开启新一局游戏
停止按钮Bool(输入)游戏总停止按钮:点击后强制结束游戏,熄灭所有灯、复位得分
模式切换Int难度模式选择:1 = 简单 / 2 = 中等 / 3 = 困难,用来切换地鼠的停留时间
难度Time地鼠停留时间:不同难度对应不同值,简单模式 2 秒 / 中等 1 秒 / 困难 0.5 秒
Light[1~7]Bool 数组7 个地鼠洞的灯:TRUE代表地鼠亮起(可以击打),FALSE代表地鼠隐藏
按钮[1~7]Bool 数组7 个地鼠洞的击打按钮:玩家点击按钮时触发,用来检测是否打中地鼠
计数Int当前游戏得分:打中地鼠加 1 分,按错按钮 / 漏打地鼠扣 1 分
aInt新地鼠编号:每次定时器触发后,生成 1~7 的随机数,代表下一个要亮起的地鼠位置
cInt旧地鼠编号:上一个亮起的地鼠位置,用来熄灭上一个地鼠的灯
中间[0]Bool游戏运行标志:TRUE代表游戏正在进行,FALSE代表游戏已停止
中间[1]Bool定时器使能标志:用来实现自复位定时器的中间标志位
获胜Bool胜利触发信号:得分达到 20 分后置位,触发游戏结束
失败Bool失败触发信号:分数低于 0 后置位,触发游戏结束
gInt(Temp 临时)FOR 循环的计数变量:专门存在 Temp 区,避免覆盖工艺数据(这里踩了个新手坑,一开始用工艺变量当循环变量,把数据覆盖了,后来才改过来)

2)第二步:HMI 界面设计

然后做了 HMI 的界面,布局很简单:中间是 7 个地鼠洞,左下角是启停按钮,右上角是得分和难度切换,界面上还有获胜和失败的文字显示。

下面我来讲怎么绑定变量:

1):灯

1,首先鼠标选中你要绑定的灯----->2,点击属性----->3,选在动画里面的外形这里没有可以点击添加动画----->4,再左边项目树中找到你存放变量的DB块点击一下----->5,选中你要绑定的变量----->6,拖到变量名称里----->7,这里改一下变量范围改为1,因为当灯为1时才开始亮。

(1)

2):文字显示

这里跟上图操作一样的,范围也要改为从1至1

(2)

3):按钮变量绑定

按钮需要绑定在事件里面,点击按下,点击添加函数找到编辑位选择按下按钮是置位位之后再把需要的变量拖到变量里面就可以了

4):得分显示

得分显示只需要把计数变量拖至到画面里面就可以了

5):模式切换

在元素里面选择符号I/O域

之后再项目树找到文本和图形列表,点击添加命名改为”模式切换“之后点击命名,在文本列表条目里添加要选择的模式就可以了

之后在属性里面选择常规在文本列表里选择刚刚创建的”模式切换"文本,可见条目选择3就可以了。

3)第三步:核心逻辑的实现

这里是FC块里面的内容

这里是FB块里面的内容之后只将FB块拖到OB1里面就可以了

// ========== 1. 模式切换 ==========
IF "虚拟".中间[0]=0 THEN
CASE "虚拟".模式切换 OF
1:
"虚拟".难度 := T#0S; // 困难:0秒切换(几乎立即)
2:
"虚拟".难度 := T#1S; // 中等:1秒切换
3:
"虚拟".难度 := T#2S; // 简单:2秒切换
END_CASE;

END_IF;

// ========== 2. 启动 / 停止 ==========
IF "虚拟".启动按钮 THEN
// 开始新游戏
"虚拟".中间[0] := 1; // 游戏运行标志
"虚拟".中间[1] := TRUE; // 定时器使能(自复位用)
"虚拟".获胜 := FALSE;
"虚拟".失败 := FALSE;
"虚拟".计数 := 0; // 分数归零
ELSIF "虚拟".停止按钮 THEN
// 强制结束游戏
"虚拟".中间[0] := 0; // 关闭运行标志
"虚拟".中间[1] := 0; // 关闭定时器
"虚拟".计数 := 0; // 分数清零
"虚拟".Light["虚拟".c] := FALSE;
"Tag_2" := 0;
// 熄灭所有灯
FOR "虚拟".g[0] := 1 TO 7 DO
"虚拟".Light["虚拟".g[0]] := FALSE;
END_FOR;
END_IF;

// ========== 3. 定时器(自复位) ==========
#IEC_Timer_0_Instance(IN := "虚拟".中间[1],
PT := "虚拟".难度);

// ========== 4. 地鼠切换控制 ==========
IF #IEC_Timer_0_Instance.Q AND "虚拟".中间[0] THEN
//--- 切换地鼠 ---
"Tag_2" := 1; // 点亮下一个地鼠的标记
"虚拟".c := "虚拟".a; // 保存旧编号(用于熄灭)
"FC_RandomInt"("虚拟".a); // "FC_RandomInt"("虚拟".a); 调用的生成新随机编号(1~7)
"虚拟".中间[1] := 0; // 关闭定时器,为自复位做准备

ELSIF "虚拟".中间[1] = 0 AND "虚拟".中间[0] THEN
"虚拟".中间[1] := 1; // 重新启动定时器(自复位关键)
END_IF;

// ========== 5. 灯输出控制 ==========
IF "Tag_2" THEN
"虚拟".Light["虚拟".c] := FALSE; // 熄灭旧地鼠
"虚拟".Light["虚拟".a] := TRUE; // 点亮新地鼠
"Tag_2" := 0; // 复位标记,避免重复执行
END_IF;

// ========== 6. 计分(按钮检测) ==========
FOR "虚拟".g[1] := 1 TO 7 DO
// 每个按钮独立检测上升沿
#R_anniu["虚拟".g[1]](CLK := "虚拟".按钮["虚拟".g[1]]);

IF #R_anniu["虚拟".g[1]].Q THEN
IF "虚拟".Light["虚拟".g[1]] THEN
//----- 按对了:地鼠亮着 -----
"虚拟".计数 := "虚拟".计数 + 1;
"虚拟".Light["虚拟".g[1]] := FALSE; // 打中后立即灭灯
IF "虚拟".计数 >= 20 THEN
"虚拟".获胜 := TRUE;
"虚拟".中间[0] := 0; // 胜利,停止游戏
"虚拟".中间[1] := 0;
END_IF;
ELSE
//----- 按错了:地鼠没亮 -----
"虚拟".计数 := "虚拟".计数 - 1;
IF "虚拟".计数 < 0 THEN
"虚拟".失败 := TRUE;
"虚拟".计数 := 0;
"虚拟".中间[0] := 0; // 失败,停止游戏
"虚拟".中间[1] := 0;
END_IF;
END_IF;
END_IF;
END_FOR;

四.总结 & 感悟

做这个项目,我最大的感悟就是,PLC 不是只能做枯燥的工业控制,也能做好玩的东西,这是我第一次做完整的 PLC 项目,第一次写博客,有什么不对的地方,欢迎大家在评论区指正~

http://www.jsqmd.com/news/824211/

相关文章:

  • 【C++】--- 类和对象(上)
  • 车载以太网测试实战:从CAN到TSN的范式转移与工程实践
  • 【GD32F427开发板试用】跨平台嵌入式开发实战:从零构建macOS/Linux下的ARM-GCC + VSCode + PyOCD工作流
  • 【NotebookLM档案学研究辅助实战指南】:20年档案专家亲授AI时代文献管理黄金法则
  • 2026年防爆监控技术:最新权威排名与专业指南。
  • 收藏!小白程序员必看:大模型训练全解析(从预训练到微调)
  • 免费在线去视频水印工具推荐,去本地视频水印怎么去?2026 实测方法汇总 - 爱上科技热点
  • 语音提示工程实战:从原理到应用,解锁AI声音表现力
  • 书匠策AI:一个让论文小白也能“开挂“的毕业论文神器,到底有多能打?
  • 如何把视频转换成音频 简单几步学会无损转换 - 爱上科技热点
  • 干货版《算法导论》04:渐近复杂度与序列接口实战
  • OpenClaw 用户迁移至 Taotoken 平台享受更优 Token 价格
  • 2026实测|下载抖音作品怎么去掉水印?抖音去水印工具推荐与方法全指南 - 爱上科技热点
  • AI Agent安全防御实战:从威胁模型到工程化防护体系
  • 【2024视频生成决策指南】:基于237小时渲染日志、41个商业项目回溯,Sora 2与Runway到底该选谁?
  • Linux内核C语言编程技巧:从零开销抽象到高效并发实战
  • 高效视频转音频方法汇总 日常剪辑必备实用干货 - 爱上科技热点
  • 视频水印怎么去掉?手机电脑去除视频水印教程,2026免费安全方法全盘点 - 爱上科技热点
  • 告别ET1100?用AX58100这颗国产EtherCAT从站芯片,低成本搞定机器人关节控制
  • 一、延迟飙升的幕后黑手
  • QModMaster:为什么这款开源Modbus调试工具能解决你90%的工业通信难题?
  • Translumo终极指南:实时屏幕翻译神器,让你跨越语言障碍的完整教程
  • 教育机构在 AI 编程课程中采用 Taotoken 作为统一实验平台的考量
  • 【Midjourney建筑效果图量产指南】:单日批量生成200+合规效果图的工业化工作流(含AutoCAD→MJ→PS无缝链路)
  • 高清提取视频音频教程,完整保留原声优质音质 - 爱上科技热点
  • 避开PWM输入捕获的坑:STM32G431双定时器(TIM3TIM8)中断回调函数编写详解
  • NAND Flash编程策略:One Shot与Two Pass的性能与可靠性博弈
  • 使用Python快速接入Taotoken实现多模型API调用,告别Claude Code封号烦恼
  • 书匠策AI官网www.shujiangce.com|期刊论文写作这件事,原来可以像“搭积木“一样简单
  • 5个实用技巧:用MouseJiggler彻底解决Windows自动休眠问题