02 CODESYS应用基础之ST语言语法基础

一、ST语言简介:参考了百度文库https://baike.baidu.com/item/ST/18737108?fr=aladdin

       结构化文本/结构式文件编程语言(英语: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

      举个例子:

02 CODESYS应用基础之ST语言语法基础_第1张图片

 

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必须成对出现!!*/
/*=============================================================*/

       举个例子:

02 CODESYS应用基础之ST语言语法基础_第2张图片

 

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循环就会进入死循环!!*/
/*===================================================*/

       举个例子:

02 CODESYS应用基础之ST语言语法基础_第3张图片


 

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必须成对出现!!*/
/*===================================================*/

      举个例子:

02 CODESYS应用基础之ST语言语法基础_第4张图片

 

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循环只能有一个退出条件!!!*/
/*==========================================================================*/

        举个例子:

02 CODESYS应用基础之ST语言语法基础_第5张图片

 

6、JMP跳转语句(JMP <标识符>)

     JMP跳转语句可以实现程序块的非顺序执行逻辑和程序段的回调,为应用程序提供了更加灵活的编程逻辑,但用得不好也会造成一些麻烦。语法结构

JMP <目标程序段的标识符>   //标识符可以是任意的数据类型//

<对应的标识符>://通过jmp跳转到标识符位置后,代码会从这个位置开始顺序往下执行,一直到下个jmp出现//
    ····
    ····   //这些就是会被执行的程序段//
    ····


补充说明两个打断或改变程序执行顺序的指令:
EXIT:一般在循环体执行语句中,用来退出当前循环体,程序退出循环体后,继续往下执行。

CONTINUE:一般用在循环体执行语句中,用来打断循环体当次的循环执行,立即回到循环体的开头,重新循环执行。


/*======================jmp标识符程序跳转语句的特性====================*/
/*1 每个JMP都必须有对应的标识符与之对应,也就是:JMP <标识符> --->  <标识符>: 这个结构必须存在且完整

  2 JMP语句只负责将程序的执行位置跳转到对应的标识符的位置,并不会自动跳回!!

  3 如果有替代方案,建议轻易不要使用JMP这个跳转结构!!!*/
/*===================================================================*/

      举个例子:

02 CODESYS应用基础之ST语言语法基础_第6张图片

 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

三、ST语言调用功能块与函数的基本语法:

       在CODESYS中,编写函数时往往需要在POU里调用一些程序块;CODESYS提供的功能封装格式有FB(功能块)、FUN(函数)和POU。下面,我将逐一介绍这三种功能封装在ST语言编程下如何调用:

       1、功能块FB的调用:

            首先,功能块需要在CODESYS中被实例化,也就是要定义一个变量,其变量类型就是目标功能块,这一步操作跟使用哪种语言编程无关!如图:

            02 CODESYS应用基础之ST语言语法基础_第7张图片

            接下来,在POU主程序里,使用ST语言通过实例化对象调用功能块。如图:

 

 

02 CODESYS应用基础之ST语言语法基础_第8张图片

02 CODESYS应用基础之ST语言语法基础_第9张图片

 

        2、函数(FUN)的调用

             CODESYS提供的函数形式封装的程序块,与功能块最大的区别是:函数有返回值且函数可以不需要实例化,直接使用即可。如下图:

            02 CODESYS应用基础之ST语言语法基础_第10张图片

02 CODESYS应用基础之ST语言语法基础_第11张图片

       

         3、对工程块POU的调用

               在有些情况下,我们需要通过调用另外一个POU来实现程序的嵌套或跳转。CODESYS提供的POU程序封装在被其他POU或其他程序封装调用时,和功能块类似,但无需实例化。如图:

               02 CODESYS应用基础之ST语言语法基础_第12张图片

02 CODESYS应用基础之ST语言语法基础_第13张图片

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

    总结:最后我想说,ST语言编程最终需要大家通过实践来掌握更多细节,通过看别人的资料始终时无法心领神会的!!!加油吧,别老是找捷径,人生本来就很短,你还一直想抄近道?

 

附加说明:本人承接Linux系统的嵌入式软件开发项目,CODESYS的runntime组件开发。欢迎加微:wxk101633(备注:委托开发)

你可能感兴趣的:(CODESYS)