news 2026/5/15 21:46:03

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
你以为 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 项目,第一次写博客,有什么不对的地方,欢迎大家在评论区指正~

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/15 21:44:08

【Midjourney建筑效果图量产指南】:单日批量生成200+合规效果图的工业化工作流(含AutoCAD→MJ→PS无缝链路)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Midjourney建筑效果图量产的工业化认知革命 传统建筑设计表达长期受限于人力绘图周期、渲染资源瓶颈与风格一致性难题。Midjourney 的规模化应用正推动建筑可视化从“手工定制”迈向“参数化流水线”—…

作者头像 李华
网站建设 2026/5/15 21:43:36

避开这些坑!STC8H8K64U IAP升级中FLASH分区与Keil定位的保姆级教程

STC8H8K64U IAP升级实战&#xff1a;FLASH分区设计与Keil定位全解析 第一次接触STC8H8K64U的IAP功能时&#xff0c;我花了整整三天时间才搞明白为什么程序总是莫名其妙地崩溃。直到发现是FLASH分区地址计算错误导致用户程序覆盖了ISP引导区&#xff0c;才恍然大悟。本文将分享从…

作者头像 李华
网站建设 2026/5/15 21:43:34

如何快速掌握MTK设备安全绕过:完整技术实现指南

如何快速掌握MTK设备安全绕过&#xff1a;完整技术实现指南 【免费下载链接】bypass_utility 项目地址: https://gitcode.com/gh_mirrors/by/bypass_utility MTK设备安全绕过工具是一个专为联发科&#xff08;MediaTek&#xff09;设备设计的专业安全研究工具&#xff…

作者头像 李华
网站建设 2026/5/15 21:43:06

跳槽时如何评估一家公司的技术氛围?面试中观察这五个细节

对于软件测试从业者而言&#xff0c;跳槽时评估一家公司的技术氛围&#xff0c;往往比单纯看薪资数字更具长远价值。技术氛围不仅是技术栈的先进程度&#xff0c;更是团队对质量的敬畏、对效率的追求以及对个人成长的滋养。然而&#xff0c;技术氛围具有极强的隐蔽性&#xff0…

作者头像 李华
网站建设 2026/5/15 21:42:41

在Node.js服务中集成Taotoken为CRM用户提供个性化回复

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在Node.js服务中集成Taotoken为CRM用户提供个性化回复 现代CRM网站的后端常使用Node.js构建&#xff0c;其核心价值在于管理与客户…

作者头像 李华