PLC的结构化文本ST语言编程,请教一个简单的例子。

PLC的结构化文本ST语言编程,请教一个简单的例子。,第1张

下面是一个用ST结构化文本语言编程实现的例子:
css

PROGRAM Example
VAR
X0: BOOL;
Y0: BOOL;
a: INT;
END_VAR
a := 0;
WHILE TRUE DO
IF X0 THEN
a := a + 1;
END_IF

IF a = 3 THEN
Y0 := TRUE;
ELSE
Y0 := FALSE;
END_IF

IF a >= 5 THEN
a := 0;
END_IF

// 延时,防止程序过快执行
DELAY 100ms;
END_WHILE
这个程序首先定义了三个变量X0、Y0和a,其中X0表示按键输入,Y0表示输出信号,a表示按键按下的次数。然后通过一个无限循环来不断检测X0输入是否为真,并根据条件判断和计数来实现功能。
具体来说,程序先将a初始化为0,然后在循环中不断执行以下 *** 作:
判断X0是否为真,如果为真则将a加1;
如果a等于3,则将Y0输出为真,否则输出为假;
如果a大于等于5,则将a重置为0,重新开始计数;
延时一段时间,防止程序过快执行。
需要注意的是,ST语言中的循环语句使用WHILE DO和END_WHILE来表示,IF语句的条件判断需要用THEN和END_IF来限定,变量赋值可以使用:= *** 作符。

首先,通常我们需要准备7种方块,4个方向的形状表,相当多的俄罗斯方块程序就是在开头写了这样一个很长的数组定义,
有的光这个定义就直接超100行了,这个程序是怎么实现的呢?
其实这个程序,同样是使用一个7416的数组来保存这个形状表,但是,它没有直接初始化,见这个数组的定义:
int sp[8][4] = {{15,4369},{23,785,116,547},{71,275,113,802},
{39,305,114,562},{54,561},{99,306},{51,51},{-1}};
这个莫名其妙的数组的值是什么意思呢?其实很好猜的,我们尝试把这些数化为二进制:
15 = 1111
4369 = 1000100010001
合理地四位四位拆开,从低位到高位,从左到右,从上到下排列一下:
1111
0000
0000
0000
1000
1000
1000
1000
你终于发现,这就是长条方块的两个形状
后面类似
然后你会发现,这个数组并不完整,有的只定义了两个形状,有的是四个形状,没定义的数会默认置0的,这个怎么解释?
看这个数组定义的下面第二行:
for (p = sp[0]; p >= 0; ++p) if ( p == 0 ) p = p[-2];
意思是找出这个数组为0的元素,用它前面的元素值填上即p = p[-2]
而数组中最后一个元素值-1起监督头的作用,用于让这个循环跳出
虽然可以把这些常数全直接写在数组里,但常数太多显得不太好,就这样写了
之后你看到这行代码:
gtpool = >_pool[4];
为什么定义两个pool呢?因为我们需要在原来的pool的界外用-1值填充,以便后面做碰撞检测减少不必要的代码
但如果直接用原来的_pool,那每次访问都要加上一个偏移常数,不美观且显得代码长,就用另一个指针直接指向开始的位置
然后,后面的三重循环就是解开那个位压缩数组以初始化gttmap数组,这个数组就是记录74种形状的数组
再下面三行,就是初始化pool,游戏区为0,界外为-1
而其中,i < 10决定了游戏池的宽度为10,sizeof(int[21])决定了游戏池的高度是20 (0我们不使用,这一行有特殊作用,后文会讲)
用memset也是为了免写二重循环而已。整个初始化流程就到这里了
然后,是一个trsCopy函数,这个函数综合了碰撞检测,复制到游戏池和反复制,行为由参数c (是control缩写字母)控制
c为0就单纯的碰撞检测,c为1是复制,c为2就是反复制,细心分析一下,这个函数功能就清楚了,这里不详细展开
好了,到了trsScene函数,整个游戏的主逻辑流程就在这里了
我们先看第75行的那个二重循环,只有那个地方是根据pool保存的值来输出
所以,这个时候,你应该明白为什么trsCopy函数还要复制和反复制了,
它把你正在控制的方块,复制到pool里,统一输出,这样就不需要另加一个函数来绘画你的控制块了
而绘图之前,就是键盘处理等的逻辑控制,这里就没有什么复杂难懂的代码了,
唯一要讲讲的是,if (k == 'S' || k == 's' || gtt < 0)
这一段是判断下落键的按下,和是否到时间强制下落
里面for (--y; y > 0; --y)开始是消行计算
你可能会奇怪这个y没有明显的初始值,直接就来一个 --y,初始从哪里来?
其实就在之前讲的输出绘画那个循环里,循环结束后,y的值一定是最后一行+1
所以我们只要--y就得到最底下一行,因为消行计算,从下往上,只要一次就解决了,代码较少
好了,现在解释之前说的,为什么不是从0,而是从1开始
消行计算这里,每消除一行,最顶的一行就应该用0填充,但如果你因为这个多写一个for循环就不值得了
我们改成从1开始,那么把第0行的内容复制到第一行,就完成0填充了,就可以少写一个for
好了,差不多接近尾声了,最后说说trsScene的返回值
trsScene返回值的意思很简单,如果是1就继续循环,如果是0就退出
所以你可以在代码里看到,当按下ESC(值为27)的时候才返回0
而方块落下一个的时候,返回1,让主函数重新调用它,就能再次初始化当前控制块的位置和形状了,
达到免除状态管理的代码的作用
最后,在主循环除了初始化,只要华丽的一行for (trsInit(); trsScene(); ); 就可以玩这个游戏了

方法/步骤

第一种

1、首先我们打开CX-P软件,并设置好PLC型号,进入编程段,准备编程。

2、平常我们编程时,习惯输入LD指令编程,当我们需要输入上升沿时,便需要输入@LD000,即可

3、下降沿指令需要输入%LD001即可。

第二种

1、首先我们正常输入不带上升/下降沿的指令,然后选中我们需要设置上升/下降沿的指令

2、同时按住 shift和@键即可按成上升沿 *** 作,下降沿需要同时按住shift和%键即可完成下降沿 *** 作。

第三种

这种方法对于后期调试来讲相对比较实用,也是比较简单的,我们首先选中我们需要更改的指令,右键--微分--上升,即可。

-Works2/3编程软件的两种PLC程序ST语言创建方法:
1,新建结构化工程,使用ST语言编程。
2,新建简单工程,勾选使用标签,大部分的程序还是用梯形图来编程,在编程窗口要插入的位置,点击鼠标右键→编辑→内嵌ST框插入,或者输入“STB”按回车即可。

ST语言的特点:
条件判断以及四则运算有强大的优势,逻辑顺控不如梯形图直观好用,用梯形图语言插入ST语言可以很方便的写大型模拟量、定位算法的程序。
注意事项:
1,输入法要切换到英文、半角输入模式。
2,在结构化工程模式,输入指令后,接着按“CtrI+F1”系统会提示这条指令的使用规则。在内嵌模式下按CtrI+F1,不能得到提示。程序可直接写在框内,也可以去结构化工程模式下复制,再粘贴到内嵌模式框内。
3,在写的过程中要经常转换/编译,不容易出错。
4,ST语言不能计算32位的数据,要新建标签,用32位的数据类型来标示,再用DMOV读写标签里的数据。
5,一个指令或者元件输入完之后要按空格键表示输入完成。
6,计算的时候,先做乘法再做除法,避免较大误差。
7,ST程序末尾以标点符号“;”结束。
8,注释记法:(注释)或//注释//或/注释/。

可以把if语句设置为循环的条件,但是for循环,是不判断条件是否符合的。
在不知道循环内需要执行几次语句时,要用Do循环,但是,在知道要执行几次时,则最好使用For…Next循环。 与Do循环不同,For循环使用一个叫做计数器的变量,每重复一次循环之后,计数器变量的值就会增加或者减少。For循环的语法如下:
For 计数器=初始值To 终值 [Step 增量]
语句
Next 计数器
计数器、初值、终值和增量都是数值型的。注意增量参数可正可负。如果增量为正,则初值必须小于等于终值,否则不能执行循环内的语句,如果增量为负,则初值必须大于等于终值,这样才能执行循环体。如果没有设置Step,则增量默认值为1。在执行For循环时,会执行下面的 *** 作。
设置计数器等于初值。
测试计数器是否大于终值。如果计数器大于终值,则退出循环。
执行语句。
计数器增加增量。
重复上述步骤。

在Q系列创建项目,使用标签方式编程,如果不使用该方式,你将不能使用ST语言。之后,你可以使用ST语言来编辑程序。在GX Works2中,你需要创建结构化工程方式,并在建立程序的时候选择编程语言为ST语言后,你可以使用ST语言编程。
在GX Developer中,不能对FX系列使用ST语言,只能对Q系列,且必须在安装GX Developer时选择使用ST语言选项。
1、每半年或季度检查PLC柜中接线端子的连接情况,若发现松动的地方及时重新坚固连接;对柜中给主机供电的电源每月重新测量工作电压。
2、每六个月或季度对PLC进行清扫,切断给PLC供电的电源把电源机架、CPU主板及输入/输出板依次拆下,进行吹扫、清扫后再依次原位安装好,将全部连接恢复后送电并启动PLC主机。认真清扫PLC箱内卫生;每三个月更换电源机架下方过滤网。
3、 检修前准备好工具;为保障元件的功能不出故障及模板不损坏,必须用保护装置及认真作防静电准备工作;检修前与调度和 *** 作工联系好,需挂检修牌处挂好检修牌。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13410942.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-30
下一篇 2023-07-30

发表评论

登录后才能评论

评论列表(0条)

保存