一、ST语言简介
结构化文本/结构式文件编程语言(英语:Structured text)也称为ST语言,是为可编程逻辑控制器(PLC)设计的编程语言,是相关的IEC 61131-3标准中支援几种语言之一。
ST语言与我们传统所熟知的梯形图或顺序功能图有比较大的差别,学习过Linux系统下shell脚本编程或python的同事们应该会发现,ST语言的编程风格更像是一种可执行脚本。ST语言提供了其他脚本语言一样的功能支持,如IF.。.ELSE、CASE、WHILE、FOR等条件判断与循环执行语句,下面我将逐一为大家举例介绍基本的编程规则,如有遗漏或错误,还请大家批评指正,谢谢!
二、基本语法规则的介绍:
注意:
在ST语言中,赋值符号不再是等号(=),等于号被用作条件判断;ST语言用称为海象符的符号(:=)来替代等号,其规则也是将符号右边的值赋值给左边。
使用ST语言,加、减、乘、除算法运算将不再使用运算块,而是直接使用符号+、-、*、/来代替,计算顺序从左到右,其中,*与/的计算优先级高于+、-。
1、条件判断语句(IF.。。.END IF)
此语法结构用来判断条件,并在条件被满足的情况下,执行结构内的代码;基本的语法格式为:
IF 判断的条件要求 THEN.。。。。。。。 //这里面是满足条件时,所需要执行的语句//。。。.END_IF;也可以是:IF 判断的条件要求 THEN.。。。。。。。.ELSE: //ELSE后面的是,当条件不满足时,所执行的语句//。。。。。。。。。。。.EMD_IF;IF 判断的条件要求 THEN.。。。。。。。.ELSIF 判断的另一个条件要求 THEN //这里当前面的IF所对应的条件无法满足时,会执行到这里来判断这里的条件//。。。。。。。。.END_IF;//条件判断语句支持嵌套,但应该始终坚持一个原则:IF和END IF必须成对出现!!//IF 判断的条件要求 THEN 。。。。。 。。。。。 IF 判断的条件 THEN //这个就是嵌套在内部的条件判断语句// 。。。。。 。。。。。 END_IF; 。。。。。 。。。。.END_IF;//判断的条件可以是常数或变量,判断是否相等(aaa=bbb)、判断是否大于(aaa》bbb)、判断是否小于(aaa《bbb)。// 举个例子:
2、条件选择语句(CASE.。。。。.END_CASE)
此语法结构以一种表格的形式来判断某个条件值得状态,并执行对应状态下的语句。具体的语法规则:
CASE 《判断的条件变量》 OF 《变量值1》: ····· ····· //条件变量值满足值1时执行的语句,执行结束后自动返回到CASE外// 《变量值2》: ····· ····· 《变量值3,变量值4,变量值5》: //条件变量满足值3、4、5任意一个,就会执行下面对应的语句// ····· ····· · · · 《变量值n.。变量值n+5》: //条件变量的值满足n到n+5之间所有值的任意一个,都会执行里面的语句// 。。。。。 。。。。。 ELSE //条件变量值在以上变量都不满足时,就执行这里面的语句,这个条件分支可以不写// 。。。。。 。。。。.END_CASE;/*==================== 注意一下语法规则 ========================*//*1、每个条件分支执行完毕后,会自动返回退出CASE表,不会继续执行剩下的内容; 2、条件变量的数据类型支持:INT、BYTE、WORD等数字形式的变量与条件。 3、CASE条件语句一样支持嵌套,也一样需要坚持一个原则:CASE和END_CASE必须成对出现!!*//*=============================================================*/ 举个例子:
3、FOR循环迭代语句(FOR.。.END_FOR)
for循环语句设置循环条件的初始值与目标值,并按照步长,每执行一次循环体内的语句就增加一个步长,直到条件变量到达或大于目标值,则退出循环执行。语法规则:
FOR 《条件变量:=初始值》 TO 目标值 BY 步长 DO //条件变量从初始值开始,每一次循环增加一个步长,直到大于或等于目标值,就退出循环//······ //这里面是循环执行的语句//···END_FOR;FOR 《条件变量:=初始值》 TO 目标值 BY 步长 DO······IF aaaa THEN continue; //可以支持使用continue打断当前当次循环,也可以使用return直接返回POU开头// END_IF;······END_FOR;/*=================FOR循环的一些特性==================*//*1 程序执行进入循环体内后,将暂时不理会POU程序模块的循环周期间隔时间 2 for循环的条件变量值会根据初始值和目标值的大小对比,自动加步长值或减步长值 3 for循环体也同样支持嵌套,但一样需要坚持一个原则:FOR和END_FOR必须成对存在!! 4 如果目标值等于条件值变量类型的极限值,FOR循环就会进入死循环!!*//*===================================================*/ 举个例子:
4、WHILE条件循环语句(WHILE.。。。。.END_WHILE)
while循环语句就是不断判断执行循环体内语句的条件是否被满足,然后循环执行直到条件不被满足或被特殊指令打断才退出的语句。语法规则:
WHILE 《执行的条件》 DO 。。。。 。。。。 //被循环执行的语句// 。。。.END_WHILE;/*============WHILE循环执行语句的注意事项==============*//*1 while循环语句执行过程中,将暂时忽略pou程序循环执行的周期间隔时间; 2 while循环可以使用continue或return语句打断当前循环或结束循环,return返回POU开头; 3 while循环语句同样支持嵌套,但也必须坚持一个原则:WHILE和END_WHILE必须成对出现!!*//*===================================================*/ 举个例子:
5、REPEAT循环语句(REPEAT.。。.UNTIL.。。。.END_REPEAT)
REPEAT循环语句的执行特点是,先执行循环体内的语句,再去判断执行条件,条件满足则退出执行。基本语法规则:
REPEAT //先执行循环体内的语句// ··· ··· //被循环执行的语句// ···UNTIL 《退出执行的条件》 //这里执行了一次循环体的语句后,在去判断是否可以退出循环//END_REPEAT;REPEAT ···· ···· //这里可以忽略UNTIL判断条件,但这样子存在死循环的危险!!!//END_REPEAT;/*====================repeat循环语句的特点===================================*//*1 在循环体内执行语句时,会暂时忽略POU程序循环执行的间隔时间; 2 与其他循环执行语句一样,也支持嵌套,且REPEAT.。.END_REPEAT必须成对出现!!! 3 REPEAT循环语句内,也可以执行continue和return来中断循环的执行; 4 UNTIL可以出现但每个REPEAT循环只能有一个退出条件!!!*//*==========================================================================*/ 举个例子:
6、JMP跳转语句(JMP 《标识符》)
JMP跳转语句可以实现程序块的非顺序执行逻辑和程序段的回调,为应用程序提供了更加灵活的编程逻辑,但用得不好也会造成一些麻烦。语法结构:
JMP 《目标程序段的标识符》 //标识符可以是任意的数据类型//《对应的标识符》://通过jmp跳转到标识符位置后,代码会从这个位置开始顺序往下执行,一直到下个jmp出现// ···· ···· //这些就是会被执行的程序段// ····补充说明两个打断或改变程序执行顺序的指令:EXIT:一般在循环体执行语句中,用来退出当前循环体,程序退出循环体后,继续往下执行。CONTINUE:一般用在循环体执行语句中,用来打断循环体当次的循环执行,立即回到循环体的开头,重新循环执行。/*======================jmp标识符程序跳转语句的特性====================*//*1 每个JMP都必须有对应的标识符与之对应,也就是:JMP 《标识符》 ---》 《标识符》: 这个结构必须存在且完整 2 JMP语句只负责将程序的执行位置跳转到对应的标识符的位置,并不会自动跳回!! 3 如果有替代方案,建议轻易不要使用JMP这个跳转结构!!!*//*===================================================================*/ 举个例子:
三、ST语言调用功能块与函数的基本语法:
在CODESYS中,编写函数时往往需要在POU里调用一些程序块;CODESYS提供的功能封装格式有FB(功能块)、FUN(函数)和POU。下面,我将逐一介绍这三种功能封装在ST语言编程下如何调用:
1、功能块FB的调用:
首先,功能块需要在CODESYS中被实例化,也就是要定义一个变量,其变量类型就是目标功能块,这一步操作跟使用哪种语言编程无关!如图:
接下来,在POU主程序里,使用ST语言通过实例化对象调用功能块。如图:
2、函数(FUN)的调用:
CODESYS提供的函数形式封装的程序块,与功能块最大的区别是:函数有返回值且函数可以不需要实例化,直接使用即可。如下图:
3、对工程块POU的调用:
在有些情况下,我们需要通过调用另外一个POU来实现程序的嵌套或跳转。CODESYS提供的POU程序封装在被其他POU或其他程序封装调用时,和功能块类似,但无需实例化。如图:
总结:最后我想说,ST语言编程最终需要大家通过实践来掌握更多细节,通过看别人的资料始终时无法心领神会的!!!加油吧,别老是找捷径,人生本来就很短,你还一直想抄近道?