• CODESYS平台的ST语言笔记


    目录:
    一、符号、关键字、操作数、变量介绍
    二、声明定义、运算符介绍
    三、基本语法介绍
    四、高级一点的语句

    正文:

    一、符号、操作数、变量

    1.符号认识

    // (* ) :注释,// ( 注释 )。
    ‘’ :字符串,‘Hello!$L’。
    “” :UNICODE字符串,“中文”。
    := :赋值,a:=b。
    ; :语句分隔符,QU:=5
    (A+B);QD:=4*(A-B);
    … :范围分隔符,ARRAY(1…2,1…3);
    => :输出连接符,
    % :直接变量前缀,%QX1.1。
    其他符号 :±#e.,
    时间符号 :T#、TOD#。
    运算符号 :NOT、MOD、+、-、*、/、<、>、&、AND、OR、XOR。

    2.关键字

    PROGRAM END_PROGRAM 程序段
    FUNCTION END_FUNCTION 函数段
    FUNCTION_BLOCK END_FUNCTION_BLOCK 功能块段
    VAR END_VAR 变量段
    VAR_INPUT END_VAR 输入变量段
    VAR_OUTPUT END_VAR 输出变量段
    VAR_IN_OUT END_VAR 输入输出变量段
    VAR_GLOBAL END_VAR 全局变量段
    TYPE END_TYPE 数据类型段
    STRUCT END_STRUCT 结构体段
    CONSTANT 常数变量
    ARRAY OF 数组
    AT 直接地址
    EN ,ENO 使能输入,使能输出
    TRUE ,FALSE 逻辑真,逻辑假
    IF THEN EISIF ELSE END_IF IF 语句
    CASE OF ELSE END_CASE CASE 语句
    FOR TO BY DO END_FOR FOR 循环语句
    REPEAT UNTIL END_REPEAT REPEAT 循环语句
    WHILE DO END_WHILE WHILE 循环语句
    RETURN 跳转返回符
    NOT,AND,OR,XOR 逻辑操作符
    BOOL,REAL,INT
    SIN,COS,RS,TON
    LD,ST,ADD,GT
    NOT,MOD,AND
    VAR_GLOBAL(全局变量),VAR_TEMP(临时变量),
    VAR_STAT(静态变量),VAR_CONFIG(配置变量)。
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    3.常数

    常数语法:<类型># <数值>
    <类型>指定所需的数据类型;可能 BOOL, SINT, USINT, BYTE, INT, UINT,
    WORD, DINT, UDINT, DWORD, REAL, LREAL 该类型必须是书面的大写字母。
    举例:
    2#0101,10#123,16#FF,BOOL#TURE,BYTE#12,INT#255,T#12h23m30s90ms,
    D#2023-06-16
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4.操作数

    操作数语法: %<存储器区前缀><长度前缀><数字1>.<数字2>
    注释:
    %:表示操作数。
    存储器区前缀: 表示该操作数的存储位置区域:
    I:输入区域,物理输入;Q:输出区域,物理输出;M:内存区域。
    长度前缀: 表示操作数的长度
    X: Bit,一位,X类型变量类型:BOOL
    B: Byte,一个字节,B类型变量类型:BYTE,SINT,USINT,BOOL
    W: Word,一个字,W类型变量类型:WORD,INT,UINT
    D: Double Word,两个字,D类型变量类型:DWORD,DINT,UDINT、REAL
    数字1:变量对应内存的偏移地址
    数字2:作为BOOL或者word等类型时,偏移地址后的第几位
    例如:%IX0.0表示输入存储区域的二进制数第0个字节第0个bit位。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    5.变量

    变量常数语法:<标识符>:<数据类型> {:=<初值>};
    直接地址变量:< 标识符> AT <地址>:<数据类型> {:=<初始化值>};
    
    • 1
    • 2

    6.变量类型

    
    变量类型:
    
    VAR 局部变量 --- R/W
    VAR_INPUT 输入变量,由外部提供。 R/W R
    VAR_OUTPUT 输出变量,有内部变量提供给外部。 W R/W
    VAR_IN_OUT 输入-输出变量。 R/W R/W
    VAR_GLOBAL 全局变量,能在所有配置、资源内使用。 R/W R/W
    VAR_TEMP 临时变量,程序和功能块内部存储使用的变量。 --- R
    VAR_STAT 静态变量。
    VAR_EXTERNAL 外部变量
    
    变量属性:
    RETAIN 保持型变量,用于掉电保持。
    PERSISTENT 保持型变量
    VAR RETAIN PERSISTENT
    VAR PERSISTENT RETAIN两者功能一样,皆为保持性变量,用于掉电保持
    CONSTANT 常量
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    二、声明、运算符

    1.声明定义

    ST编程支持的数据类型包括:位(BOOL)、字节(BYTE)、整型(INT)、
    双字节整型(DINT)、实数(REAL)、字符串(STRING)和时间(TIME)。
    声明变量时需要指定其数据类型。
    (1)变量声明
    格式如下:
    VAR 变量名 : 数据类型;END_VAR
    举例如下:
    
    复制代码
    VAR                  //本地变量
        a : BOOL;        //a定义为布尔型本地变量
        b : BYTE;        //b定义为字节型本地变量
        c : INT;         //c定义为整型型本地变量
        d : DINT;        //d定义为双字节整型本地变量
        e : REAL;        //e定义为单精度实数浮点本地变量
        f : STRING(20);  //f定义为字符串本地变量
        g : TIME;        //g定义为时间本地变量
    END_VAR              //结束变量声明
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    复制代码

    2.运算符

    ST编程语言支持基本的
    算术运算符(+、-、*、/)(求幂EXPT、求负-)
    比较运算符(=<>>>=<<=),
    逻辑运算符(与AND、或OR、异或XOR、求补NOT)
    函数调用 函数名(参数列表,由逗号分隔)
    还包括特殊的运算符MOD和DIV,
    举例如下:
    
    a := b + c;
    d := e / f;
    g := h MOD i;
    IF j <> k THEN    
    P := m;
    END_IF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    三、语法

    1.表达式

    2.赋值指令

    A:=B++;  //把左边值赋给右边。
    A S=B;   //B接通,A被置位。
    A R=B;   //B接通,A被复位。
    
    • 1
    • 2
    • 3

    3.然后写主函数声明部分

    //1.先写FB函数声明部分
    FUNCTION_BLOCK FB01                         //FB功能块函数标识符号+FB函数名
    VAR_INPUT                                    //FB功能块的输入变量定义
        i_IN1:BOOL;                             //i_IN1为布偶型输入变量                       /*  变量声明 */       /* 变量名:数据类型:= 初始值 */
        i_IN2:INT:=2;                            //i_IN2为整型型输入变量 初始值为2;
    END_VAR
    VAR_OUTPUT                                    //FB功能块的输出变量定义
        Q_OUT1:INT;                                //Q_OUT1为整型输出变量
        Q_OUT2:BOOL;                            //Q_OUT2为布偶型输出变量
    END_VAR
    VAR                                         //其他或中间变量定义
        M_F:INT;
        M_G:BOOL;
        i:INT:=0;
    END_VAR
    //2.再写FB函数功能
    IF i_IN1=1 THEN              //如果IN1使能开关打开
        FOR i:=1 TO 3 BY 1 DO    //执行循环  /*FOR循环*/  /* FOR 循环变量寄存器:=起始初值 TO 目标循环次数 BY 步长 DO 循环体;END_FOR;  */
            i_IN2:=i_IN2*2;         //条件满足执行循环体     
        END_FOR;                 //结束循环
        Q_OUT1:=i_IN2;             //计算结果传递给输出变量
        Q_OUT2:=1;                 //运算标志=1
        i_IN1:=0;                //关闭触发使能
    ELSE
        Q_OUT2:=0;               //运算标志=0
        i_IN1:=0;                 //关闭触发使能
    END_IF
    //3.然后写主函数声明部分
    PROGRAM PLC_PRG       //主函数标识符+ 主函数名
    VAR                      //变量定义声明
        FB01_0:FB01;      //FB函数声明实例化     /*  实例名:FB函数名
        U1 : INT;         //主函数的变量声明
        U2 : BOOL;
    END_VAR
    //4.最后写主函数功能
    FB01_0(i_IN1:=1,i_IN2:=1,);    //调用实例化FB函数FB01_0
    U1:=FB01_0.Q_OUT1;               //把实例FB01_0的输出变量Q_OUT1赋给U1变量
    U2:=FB01_0.Q_OUT2;               //把实例FB01_0的输出变量Q_OUT2赋给U2变量
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    4.return返回语句

    RETURN指令表示当前置条件为TRUE时,离开此POU。

    5.选择判断语句

    ①IF-THEN-ELSEIF-ELES-ENDIF完整版
    IF <条件1布尔表达式> THEN     //如果条件1=1则执行语句1;否则执行语句3.
       <语句 1>;                   
    ELSEIF
       <条件2布尔表达式>          //如果条件2=1则执行语句2;
       <语句内容 2>; 
       .                       //可多重嵌套,省略
       .
       .
    ELSEIF                     //如果条件n=1则执行语句n;
       <条件n布尔表达式>
       <语句内容n>; 
    ELSE                       //如果条件1=0则执行语句3;
       <语句内容 3>; 
    END_IF;                    //结束IF选择语句。
    IF控制语句简写版:
    IF-THEN-IF_END             //一个条件一个判断,省略else和再分支。
    IF-THEN-ELSEIF-IF_END      //一个条件一个判断执行,继续嵌套分支判断执行。
    IF-THEN-ELSE-IF_END        //一个条件两个判断。
    
    ②CASE语句
    CASE <条件变量> OF          //条件变量=数值n,就执行对应语句,否则执行语句8,结束case选择控制语句。 
    <数值 1>: <语句内容 1>;                   
    <数值 2>: <语句内容 2>;
    <数值 3, 数值 4, 数值 5>: <语句内容 3>;
    <数值 6 .. 数值 10>: <语句内容 4>;
    ...
    <数值 n>: <语句内容 n>;
    ELSE
    <ELSE 语句内容8>;
    END_CASE;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    6.循环语句

    FOR <变量> := <初始值> TO <目标值> {BY <步长>} DO<语句内容> END_FOR;
    举例如下:
        FOR Counter:=1 TO 5 BY 1 DO   //假设Var1初始值为1,循环五次则Var1=1*(2*2*2*2*2)=32。
        Var1:=Var1*2;
        END_FOR;
        Erg:=Var1;
    
    WHILE <布尔表达式><语句内容> ;END_WHILE;
    举例如下:
        WHILE Counter<>0 DO           //假设Var1初始值为1,Counter初始值等于5,
        Var1:= Var1*2;                //循环一次则Var1翻倍一次,
        Counter := Counter-1;         //循环一次则Counter减一,
        END_WHILE                     //循环五次则Counter=0,则循环结束Var1=32。
    
    
    REPEAT <语句内容> UNTIL <布尔表达式> END_REPEAT;
    举例如下:
        REPEAT                        
        Var1:=Var1*2;                 //执行循环体语句
        Counter:=Counter-1;           //执行循环体语句
        UNTIL Counter=0;              //Counter=0不成立则循环执行循环体语句,直到成立结束循环。
        END_REPEAT;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    7.跳转语句

    (1)EXIT; 用于迭代语句退出循环。
    举例如下:
        FOR i := 0 TO 9 DO            //FOR循环开始
        IF (Input[i] = TRUE) THEN     //条件判断
        EXIT;                         //条件若成立,执行EXIT语句,退出FOR循环控制语句。
        END_IF;
        END_FOR;
        
    (2)CONTINUE; 用于迭代语句结束本次循环。
    举例如下:                        //提前结束本轮循环,并重新开始下一轮循环。
        FOR Counter:=1 TO 5 BY DO
        INT1:=INT1/2;
        IF INT1=0 THEN
        CONTINUE;
        END_JF
        Var:=Var1/UBT1L
        END_FOR;
        Erg:=Var1;
    
    (3)<标识符>: JMP <标识符>; 任意跳转到标识符位置执行。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    8.函数封装声明调用

    FUNCTION 函数名 : [返回值数据类型]
    VAR_INPUT            // 输入参数
    END_VARVAR_OUTPUT    // 输出参数
    END_VARVAR           // 私有变量
    END_VAR              // 执行该代码块
    END_FUNCTION
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    9.其他

    空语句 ;
    注释 多行注释(* *) 单行注释//

    10、结构体:多种数据类型的变量集合。

    TYPE St_PointAxis :               //轴结构体定义声明
    STRUCT                           //参数如下
                                     //输入
        i_xReset            : BOOL;  //轴复位
        i_xSerOn            : BOOL;  //轴使能
        i_xStop             : BOOL;  //轴停止
        i_xHalt             : BOOL;  //轴暂停
        i_xHome             : BOOL;  //轴回原
                                     //输出
        o_xResetDone        : BOOL;  //轴复位完成
        o_xResetErr         : BOOL;  //轴复位失败
                                      //指针
        pAxis               : POINTER TO AXIS_REF_ETC_DS402_CS;//轴地址
        pServer             : POINTER TO ETCSlave;//站地址
    END_STRUCT                        //结构体段结束
    END_TYPE                          //数据段结束
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    11、枚举:列举一组自定义字符表达常数值

    TYPE Enum_StateMachine ://状态机枚举
    (
        未就绪         := 0,
        故障           := 1,
        初始化中       := 2,
        待机          := 3,
        手动           := 4,
        自动           := 5
    );
    END_TYPE
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    12、数组

    见如下数组与结构体的区分联系。

    13、共用体(联合体):

    //此集合体的每一个变量共用内存和存储位置,一旦其中一个变量数值发生了变化,其他变量会一致变化。
    TYPE <联合体名称>:UNION
    <变量的声明1>
    <变量的声明2>
    END UNION
    END TYPE

    5、别名

    在CODESYS的Structured Text(ST)语言中,可以使用别名(Alias)来为变量、函数等创建一个新的名称。这可以使代码更易读,也可以用于创建引用或者简化一些表达式。下面是一个简单的例子
    VAR
    myVariable: INT := 42;
    aliasForVariable: INT := myVariable; // 创建别名
    END_VAR

    aliasForVariable := 100; // 修改别名,实际上也修改了 myVariable
    在这个例子中,aliasForVariable 是 myVariable 的别名。这样,你可以使用 aliasForVariable 来读取或修改 myVariable 的值,两者之间的变化是同步的。

    在实际应用中,别名可以用于简化代码,特别是在使用结构体或其他复杂数据类型时。例如:

    TYPE
        MyStruct:
            STRUCT
                x: INT;
                y: INT;
            END_STRUCT;
    END_TYPE
    
    VAR
        point1: MyStruct := (x := 10, y := 20);
        point2: MyStruct := point1; // 创建结构体的别名
    END_VAR
    
    point2.x := 30; // 修改别名,实际上也修改了 point1 的值
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    6、指针、引用

    VAR
        myVariable: INT := 42;
        myPointer: REF_TO INT; // INT 类型的引用指针
    END_VAR
    
    myPointer := ADR(myVariable); // 将引用指针指向 myVariable 的地址
    //myPointer := ADR(myVariable); // 将引用指针指向 myVariable 的地址
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    通过引用修改变量的值:
    myPointer^ := 100; // 通过引用指针修改 myVariable 的值为 100。

    在这里,^ 运算符用于解引用指针,从而修改指针所指向的变量的值。

  • 相关阅读:
    计算机毕业设计JavaSteam游戏平台系统(源码+系统+mysql数据库+lw文档)
    Part4_场景_第52章 场景描述&第53章 柏林I:BVG场景&第54章 柏林II:CEMDAP-Matsim-Cadyts方案
    为什么我会性格懦弱?如何改变懦弱的性格?
    Python自学笔记8:实操案例五(循环输出26个字母对应的ASCII码值,模拟用户登录,猜数游戏,计算100-999之间的水仙花数)
    接口技术:总线部分练习题(PCI配置空间)
    @vue/cli脚手架的安装
    Spring中事务失效的原因
    JS——数字字符串的比较逻辑分析
    使用 pnpm 管理全栈、多包 monorepo
    好的FPGA编码风格(2)--多参考设计软件的语言模板(Language Templates)
  • 原文地址:https://blog.csdn.net/qq_38156743/article/details/134504192