教你用三菱PLC+HMI仿真制作《俄罗斯方块》
很多人刚学过plc编程都想自己编程实现一个小功能或者小游戏来检验自己的学习成果,如果你学过ST(结构化)语言,那我们可以用PLC实现一个更为复杂的游戏,比如《俄罗斯方块》!本文将详细介绍如何使用三菱的ST语言来编写,在此过程中我们也可以体会ST语言的特点,感兴趣的同学可以一起探讨。
我们先看一下成品视频。
视频加载中...
需要的软件
1.GX Work2。用于编辑PLC程序。
2.GT Designer3。用于构建HMI画面。
选择三菱产品的原因有两个。一是三菱的PLC与HMI的仿真可以通讯,无需硬件;二是虽然三菱的ST支持的内容比较少,但是比较正规,上手也快。
制作HMI画面
我们先画出我们要控制的内容,规定好控制的具体变量以便于我们后面的编程。按照以下几步制作HMI画面。
1.打开GT Designer3,在弹出的窗口选择新建,随便选择一个型号的设备都可以,这里选择的是2000系列的800x600分辨率的机器,点击确定后弹出连接机器设置窗口,选择三菱的Q系列,因为我们后面要用Q系列的plc进行编程,也可以选择其他的。
选择触摸屏型号
2.在“基本画面”中新建一个画面,设置一个背景色如黑色,创建一个位指示灯作为游戏的一个像素,设定指示灯在off和on状态下的颜色和形状。可以将off状态的颜色设置为背景色,这样在off状态下这个像素就“隐身”了。
设置位指示灯
设定指示灯关联的PLC软元件,文中设定的是D0.b0,D0是一个16位的字类型软元件,我们用它的第一位来控制灯的状态。当然,既然是位指示灯你完全可以用M0等位软元件。
3.右键点击指示灯,点击“连续复制”,设置XY方向的复制的数量,勾选软元件号增量,选择复制的方向。一般俄罗斯方块的像素是20x10,这里稍微设置大一些30x16。确定后生成游戏的主屏幕,横向为X+,竖向为Y+。
连续复制
4.用上方面的方法制作一个4*4像素的预览小屏幕,再画几个控制方向和开始复位等按钮,制作完成。
控制流程
开始写一个程序时我们要先确定整个逻辑的框架,正式的项目一般还要画一个流程图,我们这里就省略流程图用文本的形式确定整个流程。
1.随机生成一个图形,缓存在预览窗口,跳转至2;
2.将预览窗口缓存的图形在主窗口的最上方显示,随机生成一个新的图形在预览窗口显示,跳转至3;
3.判断主窗口的图形是否可以下降,yes跳转至4,no判断游戏是否结束,yes跳转至100,no跳转至6;
4.将主屏幕的图形向下(Y+方向)挪动一格;跳转至5;
5.延时等待,延时结束时跳转至3。此时可以使用按钮控制图形移动和旋转;
6.此时图形无法继续向下,判断是否有一行摆满需要消除,如果有消除计算得分。跳转至2;
100.游戏结束。
整个流程可以用一个case of 语句来编写,这样程序就十分清晰可读,plc资源占用也少。
流程1,生成图形
在开始逻辑编程前我们要先将触摸屏的一维软元件(D0.b0-D29.b15)转化为我们方便操作的二维的标签(X0,Y0-X15,Y29),这样我们想要点亮一个像素只要给出一个坐标(X,Y)就可以了,要实现这个目的我们要先建立一个结构体变量“iY”,里面包含容量为16的位数组“iX”:
坐标结构体
图里面的type用于区别像素的状态,后面会讲。
然后在全局标签将这个结构体声明成容量为30的数组,起个名字为“Main_iY”,这两个数字正好与HMI里面指示灯的横向纵向数量相等,然后进行标签与软元件的关联,如下图:
标签与软元件关联
预览小屏同理。
想要显示一个图形我们需要知道这个图形对应哪些坐标,这里我们使用excel列出所有图形的坐标值:
所有图形
可以看到一共有7个图形,每个图形有4个方向,所有图形显示的像素个数都是4,这样我们可以用两个容量为4的字数组存储这个4个XY坐标,想要在预览窗口中显示图形可以直接将这4个坐标依次显示出来就可以了。而给XY一个偏移值,就可以实现主窗口显示,各个方向的移动。
想随机生成一个图形需要用到随机数指令RND生成两个随机数,在通过数学计算将这两个数一个控制在0-6,作为图形的种类;一个控制在0-3,作为图形的方向。
生成两个随机数
通过两个数字变量确定一个数组的程序我们可以写成一个Function(功能、指令),因为后面我们还要用到这个程序,减少程序篇幅。我们把所有图形的坐标写到这个FC里面,FC的返回值设为结构体,便于起名字。
生成图形指令
在主程序中调用FC:
流程1完整程序
流程2,预览图形更新
将上一步生成的OBJ数组(图形坐标)传给临时变量tempObj,然后再重新生成新的图形,并在预览窗口显示。显示方法为使用for循环,赋值4个X,Y坐标对应的像素。
生成新预览图形并显示
这里面offsetX,offsetY为坐标偏移,我给定一个初始值,图形坐标加上offset值后在主屏幕上方还没有进入,所以先不用显示。
流程3,下降判断
判断图形能不能下降,方法为将图形的所有Y坐标+1,然后再判断Y坐标是否满足两个条件的其中之一,也就是“或”关系(or),第一个条件是至少1个Y坐标=30,意味着图形到了主屏幕的最底部;第二个条件是再主屏幕内的图形像素的iType为2,这里的iType就是前面建立像素结构体时增加的数字变量,我定义运动中的图形像素iType=1,固定的iType=2。
两个条件都不满足则可以下降,满足其一则意味着图形是不能下降的,这时将图形的像素类型更改为2(iType=2)。
图形不能下降我们还要判断游戏是不是结束了,方法是判断图形所有的像素当前Y坐标是否存
在<0的情况。
下降判断
流程4,移动一格
这里比较简单,将数组对应的像素置为false,Y坐标+1,再将数组对应的像素置为true。
移动一格
这里也是主屏幕能够显示出图形原因,主屏幕的像素指示灯已经关联到“Main_iY”全局变量中,只要将上一步生成的数组对应的像素置true就可以显示了,但是超过屏幕范围外的坐标不要赋值,否则会引起数组超限报错。
流程5,延时等待,按钮操作
延时的时间可以根据分数来设定,这里直接指定1000ms。
在这个流程中还要编辑左,右,下和旋转4个按钮的动作,“左右下”动作比较容易实现,只要将图形的所有坐标+1或者-1就行了,参考流程4的写法;需要注意移动后的图形不能超过边界,不能穿越已经降落固定的图形,判断方法参考流程3。
向左移动
“旋转”功能需要将找到当前这个图形的类型和方向,也就是流程2里面记录的ObjType和ObjDirection,然后将这个方向ObjDirection进行+1或者-1操作,使用FC生成新的图形坐标,将旧的图形删除,将新的图形显示。
图形旋转
这里我们在真正的旋转前仍然要先判断,旋转后的图形是否超边界或与固定图形重合,我这里的逻辑是与固定图形重合的不允许旋转,超左右边界的移动一格坐标后进行旋转。这里实际上存在bug,但是很难出现我懒得改了。。。
流程6,判断消除
在流程3里面判断图形无法下降并固定的时候进入此流程,图形固定后我们要判断是否存在需要消除的行,方法为逐行判断是否全部显示,消除后记得将消除行上方的图形下降,记录得分。
运行调试
消除所有的错误和bug,添加必要的启动复位按钮程序,将程序段拉入PLC循环扫描任务中,编译后启动仿真,然后启动HMI的仿真,就可以愉快的玩耍啦~
PLC编程语言入门,常用指令集汇总分享
一、西门子PLC编程语言
PLC的编程语言包括以下五种:梯形图语言(LD)、指令表语言(IL)、功能模块图语言(FBD)、顺序功能流程图语言(SFC)及结构化文本语言(ST)。不同型号的PLC编程软件对以上五种编程语言的支持种类是不同的,早期的PLC仅仅支持梯形图编程语言和指令表编程语言。目前的PLC对梯形图(LD)、指令表(STL)、功能模块图(FBD)编程语言都以支持。比如,SIMATIC STEP7 MicroWIN V3.2。
(1)梯形图
在西门子PLC实际编程使用情况中中,梯形图语言是PLC程序设计中最常用的编程语言。它是与继电器线路类似的一种编程语言。由于电气设计人员对继电器控制较为熟悉,因此,梯形图编程语言得到了广泛的欢迎和应用。
梯形图编程语言的特点是:与电气操作原理图相对应,具有直观性和对应性;与原有继电器控制相一致,电气设计人员易于掌握。梯形图编程语言与原有的继电器控制的不同点是,梯形图中的能流不是实际意义的电流,内部的继电器也不是实际存在的继电器,应用时,需要与原有继电器控制的概念区别对待。
(2)指令表
松下PLC编程
指令表编程语言是与汇编语言类似的一种助记符编程语言,和汇编语言一样由操作码和操作数组成。在无计算机的情况下,适合采用PLC手持编程器对用户程序进行编制。同时,指令表编程语言与梯形图编程语言图一一对应,在PLC编程软件下可以相互转换。
指令表表编程语言的特点是:采用助记符来表示操作功能,具有容易记忆,便于掌握;在手持编程器的键盘上采用助记符表示,便于操作,可在无计算机的场合进行编程设计;与梯形图有一一对应关系。其特点与梯形图语言基本一致。
(3)功能模块图语言(FBD)
功能模块图语言是与数字逻辑电路类似的一种PLC编程语言。采用功能模块图的形式来表示模块所具有的功能,不同的功能模块有不同的功能。
功能模块图编程语言的特点:功能模块图程序设计语言的特点是:以功能模块为单位,分析理解控制方案简单容易;功能模块是用图形的形式表达功能,直观性强,对于具有数字逻辑电路基础的设计人员很容易掌握的编程;对规模大、控制逻辑关系复杂的控制系统,由于功能模块图能够清楚表达功能关系,使编程调试时间大大减少。
(4) 顺序功能流程图语言(SFC)
顺序功能流程图语言是为了满足顺序逻辑控制而设计的编程语言。编程时将顺序流程动作的过程分成步和转换条件,根据转移条件对控制系统的功能流程顺序进行分配,一步一步的按照顺序动作。每一步代表一个控制功能任务,用方框表示。在方框内含有用于完成相应控制功能任务的梯形图逻辑。这种编程语言使程序结构清晰,易于阅读及维护,大大减轻编程的工作量,缩短编程和调试时间。用于系统的规模校大,程序关系较复杂的场合。
顺序功能流程图编程语言的特点:以功能为主线,按照功能流程的顺序分配,条理清楚,便于对用户程序理解;避免梯形图或其他语言不能顺序动作的缺陷,同时也避免了用梯形图语言对顺序动作编程时,由于机械互锁造成用户程序结构复杂、难以理解的缺陷;用户程序扫描时间也大大缩短。
(5)结构化文本语言(ST)
结构化文本语言是用结构化的描述文本来描述程序的一种编程语言。它是类似于高级语言的一种编程语言。在大中型的PLC系统中,常采用结构化文本来描述控制系统中各个变量的关系。主要用于其他编程语言较难实现的用户程序编制。
结构化文本编程语言采用计算机的描述方式来描述系统中各种变量之间的各种运算关系,完成所需的功能或操作。大多数PLC制造商采用的结构化文本编程语言与BASIC语言、PASCAL语言或C语言等高级语言相类似,但为了应用方便,在语句的表达方法及语句的种类等方面都进行了简化。
结构化文本编程语言的特点:采用高级语言进行编程,可以完成较复杂的控制运算;需要有一定的计算机高级语言的知识和编程技巧,对工程设计人员要求较高。直观性和操作性较差。
在PLC控制系统设计中,要求设计人员不但对PLC的硬件性能了解外,也要了解PLC对编程语言支持的种类。
二、西门子PLC指令表功能汇总
指令( 英文全称意思 ) :指令含义
1、LD ( Load 装载 ) :动合触点
2、LDN ( Load Not 不装载 ) : 动断触点
3、A ( And 与 动合) : 用于动合触点串联
4、AN ( And Not 与 动断 ) :用于动断触点串联
5、O ( Or 或 动合 ) :用于动合触点并联
6、ON ( Or Not 或 动断 ) : 用于动断触点并联
7、= ( Out 输出 ) : 用于线圈输出
8、OLD ( Or Lode): 块或
9、ALD ( And Lode): 块与
10、LPS ( Logic Push ) :逻辑入栈
11、LRD ( Logic Read ) :逻辑读栈
12、LPP ( Logic Pop ) :逻辑出栈
13、NOT ( not 并非 ) :非
14、NOP ( No Operation Performed ) : 无操作
15、AENO ( And ENO ) :指令盒输出端ENO相与
16、S ( Set 放置 ) : 置1
17、R ( Reset 重置,清零 ) :清零
18、P ( Positive) :上升沿
19、N ( Negative) :下降沿
20、TON ( On_Delay Timer ) :接通延时定时器21、TONR ( Retentive On_Delay Timer ) : 有记忆接通延时定时器
22、TOF ( Off_ Delay Timer ) :断开延时定时器
23、CTU ( Count Up ) : 增计数器
24、CTD ( Count Down ) : 减计数器
25、CTUD ( Count Up/ Count Down ) :增减计数器
26、ADD ( add 加 ) : 加注意
//ADD_I (_ I 表示整数)
ADD_DI( DI表示双字节整数)
ADD-R (R 表示实数)
它们都是加运算只是数的大小不同。
27、SUB ( Subtract 减去,减少) :减
28、MUL ( Multiply ) : 乘
29、DIV ( Divide ) : 除
30、SQRT ( Square root ) : 求平方根
31、LN ( Napierian Logarithm 自然对数 ) : 求自然对数
32、EXP ( Exponential 指数的 ) : 求指数
33、INC_B ( Increment 增加 ) : 增1
//其中_B代表数据类型 还有W(字节)、DW双字后面几个都是这样的。34、DEC_B ( Decrement 减少 ) : 减1
35、WAND_B ( Word and 与命令 ) :逻辑与
36、WOR_B ( Word or 或命令) : 逻辑或
37、WXOR_B ( Word exclusive or 异或命令) :逻辑异或
38、INV_B ( Inverse 相反 ) : 取反
39、MOV _B ( Move 移动 ) : 数据传送
40、BLKMOV_B ( Block Move 块移动) :数据块传送
41、SWAP ( Swap 交换 ) : 字节交换
42、FILL ( Fill 填充 ) : 字填充
43、ROL_B ( Rotate Left 循环 向左) :循环左移位
44、ROR_B ( Rotate Right 循环 向右) : 循环右移位
45、SHL_B ( Shift Right 移动向左) :左移动
46、SHR_B ( Shift Right 移动向右 ) : 右移动
47、SHRB ( Shift buffer 移动缓存) :寄存器移位
48、STOP ( Stop 停止 ) : 暂停
49、END /MEND ( End /Mend ) : 条件/无条件结束
50、WDR ( Watch dog reset ) : 看门狗复位
51、JMP ( Jump 跳) :跳转
52、LBL ( Label 位置 ) : 跳转标号
53、FOR ( For 循环 ) : 循环
54、NEXT ( Next 再下去) :循环结束
55、SBR ( Subprogram Regulating子程序控制 ) : 子程序调用
56、SBR_T ( Subprogram Regulating Take ) : 带参数子程序调用
57、SCR ( Sequence Control 顺序控制 ) : 步开始
58、SCRT ( Sequence Control Transfer 顺序控制转移 ) : 步转移
59、SCRE ( Sequence Control End 顺序控制结束 ) : 步结束
60、AD_T_TBL ( Add data to table 添加数据到表格中) : 填数据表
61、FIFO ( First in First out 先进先出 ) : 先进先出
62、LIFO ( Last in First out 后进先出 ) :后进先出
63、TBL_FIND ( Table Find 表格查找 ) : 表查找
64、BCD_I ( Binary Coded Decimal _I 二进制编码的十进制 ) :BCD 码转整数
65、I_BCD ( I_ Binary Coded DecimaL ) :整数转BCD码
66、B_I ( Bit to int ) :字节转整数
67、I_B ( int to bit ) :整数转字节
68、DI_I ( Double int to int ) :双整数转整数
69、I_DI ( int to double int ) :整数转双整数
70、ROUND ( Round 取整 ) : 实数转双整数
71、TRUNC ( Trunc 截取 ) :转换32位实数整数部分(舍去小数取整)
72、DI_I (double int to int ) :双整数转实数
73、ENCO ( Encode 编码) : 编码
74、DECO ( Decode 译码) :译码
75、SEG ( Segment decoder分断译码器 ) : 七段显示译码器
76、ATH ( ASCII码 turn hex ) : ASCII码转16进制
77、HTA ( Hexadecimal to ascii) : 16进制转ASCII码
78、ITA ( // int to ascii) : 整数转ASCII码
79、DTA ( // double int to ascii ) : 双整转ASCII码
80、RTA ( // real to ascii) : 实数转ASCII码
81、ATCH (//attach ) : 中断连接
82、DTCH ( Depatch ) : 中断分离
83、HDEF ( High speed counter definition ) : 高速计数器定义
84、HSC ( High Speed Counter 高速计数器 ) :启动高速计数器
85、PLS ( Pulse 脉冲 ) :脉冲输出
86、READ_ RTC ( Read real time clock 读实时时钟 ) :读实时时钟
87、SET_RTC ( Set real time clock ) : 写实时时钟
88、XMT ( Transmitter ) : 自由发送
89、RCV ( Receive 接收 ) : 自由接收
90、NETR ( Net read 网络读 ) : 网络读
91、NETW ( Net write 网络写 ) : 网络写
92、GET_ADDR ( Get address 获取地址 ) : 获取口地址
93、SET_ADDR ( Set address 设置地址 ) : 设定口地址
94、PID ( Proportional Integral Differential 比例、积分、微分 ) :比例积分微分调节器。
如有不妥,欢迎指正!
相关问答
西门子PLC226程序状态监控时,触点和线圈变成蓝色方块是什么意思?
这是PLC程序运行监控画面,在程序编程状态模拟PLC运行状态,蓝色方块表示该触点为能流导通状态,接点闭合,线圈送电。这是PLC程序运行监控画面,在程序编程状态模...
plc编程语言有哪些?
1、梯形图语言(LD)梯形图语言是PLC程序设计中最常用的编程语言。它是与继电器线路类似的一种编程语言。由于电气设计人员对继电器控制较为熟悉,因此,梯形图...
西门子plc里面地址里,长方框里的是什么意思?
表示有八个位(也就是一个框)组成一个字节,两个字节组成一个字,四个字节组成一个双字表示有八个位(也就是一个框)组成一个字节,两个字节组成一个字,四个字节组...
三菱plc编程软件windows764位的CPU肿么装不了啊?能打开但是...
用WORKS2没有的话我发给你。换一个版本这个软件不兼容64位
plc步分哪几种?
当PLC控制器投入运行后,其工作过程一般分为三个阶段,即输入采样、用户程序执行和输出刷新三个阶段。完成上述三个阶段称作一个扫描周期。在整个运行期间,PLC控...
plcraft整合包怎么玩?
plcraft整合包的玩法如下:首先,你需要下载并安装plcraft整合包。安装完成后,打开游戏启动器,并选择plcraft整合包进行启动。plcraft整合包是一个游戏的整合包...
三菱plc密码忘了?
1、首先将三菱PLC通电,然后通过点击传输设置将三菱PLC编程电缆和电脑连接。2、打开三菱PLC编程软件,名为GX-Developer。3、接着点击“在线”,然后“登陆关键...
在单位做设备维修,很多设备上有PLC,想在PLC上多下点功夫,怎么做?
我是矿山电气小东,分享电气知识。看到这个问题时,第一时间就想到了我自己在十几年前,初次接触PLC的场景我与PLC初相识那还是在2007年的一天,我们矿的一斜...1...
电磁阀的应用及原理是什么?它是如何与PLC配合使用的?
我是矿山电气小东,分享电气知识。电磁阀的应用及原理是什么?它是如何与PLC配合使用的?电磁阀在我们的生产中应用十分广泛,我们先对电磁阀有个初步的认识,矿...
三菱PLC时间锁程序?
三菱PLC锁机([密码])设置方式:将PLC通电,并通过编程电缆和电脑连接,在编程软件GX-DEVELOPER中依次选择“在线”→“登录关键字”→“新建登录”,在弹出的对...