CODESYS平台的ST语言笔记

前言:

基于汇川plc软件,底层是CODESYS平台。
这回ST语言正儿八经要用 所以要学,做笔记是为了梳理加深基础要点印象,顺便分享交流学习。
codesys平台包括汇川,英文是不区分大小写。

目录:

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

正文:

一、符号、操作数、变量

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(配置变量)。

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

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位。

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

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.声明定义
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 //结束变量声明

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.赋值指令

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

3.功能块调用
功能块实例名:(功能块参数1,功能块参数2);

已验证FB块创建、实例化、调用、返回值。

//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变量

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;

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)已验证汇川PLC需要在FOR循环外面加判断语句。举例“

  IF A THEN
M:=1;
FOR i := 1 TO 5 BY 1 DO //FOR循环开始
M:=M*2;
END_FOR;
// A:=0;
END_IF;

(2)已验证基恩士脚本,可能不是基于标准ST

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 <标识符>; 任意跳转到标识符位置执行。

8.函数封装声明调用

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

9.其他
空语句 ;
注释 多行注释(* *) 单行注释//

四、高级一点的东西

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

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    //数据段结束

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

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

3、数组

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

4、共用体(联合体):

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

5、别名

6、指针

五、重点区分一下数组与结构体的关联。

数组是相同数据类型元素的集合。在array中所有元素之间存在明显的递进性。

结构体可以不同数据类型元素的集合。在struct中这些值之间并没有特别的联动性。

数组可以直接通过下标访问调用。 结构体必须用结构体成员的变量名访问调用。

1.单独的数组

2.单独的结构体

3.结构体嵌套结构体

4.数组嵌套结构体

//·单独数组
//1、变量声明区//如下。
PROGRAM PLC_PRG
VAR
A :ARRAY[0..9] OF INT; //“整型数组”。
B :ARRAY[0..8] OF WSTRING(20); //“字符串数组”。
NAME :ARRAY[0..9] OF 学生信息; //“数组嵌套结构体” 学生信息是结构体名称。
END_VAR
//2、调用//如下。
M:=A[0];
A[2]:=2;
E:=NAME[0].体重;
//·单独结构体
//1、变量声明区//如下
TYPE 学生信息 :
STRUCT
名字 :WSTRING(8):="陈仪";
年龄 :INT:=18;
身高 :INT:=180;
体重 :INT:=120;
ID :INT:=1314; END_STRUCT
END_TYPE
//2、调用//如下。
PROGRAM PLC_PRG
VAR
学生信息1:学生信息;
F:WSTRING(20);
END_VAR F:=学生信息1.名字;
H:=学生信息1.年龄;
//·数组嵌套结构体
//1、结构体声明区//如下
TYPE 学生信息 :
STRUCT
名字 :WSTRING(8):="陈仪";
年龄 :INT:=18;
身高 :INT:=180;
体重 :INT:=120;
ID :INT:=1314; END_STRUCT
END_TYPE
//2.程序声明区
PROGRAM PLC_PRG
VAR
学校信息1:学校信息;
A:WSTRING(4); //关于字符类型,小写单个字母abcd占一个字符用STRING,单个汉字占2个且用WSTRING双字符串类型。
B:WSTRING(8);
C:INT;
D:INT;
E:INT;
NAME :ARRAY[0..9] OF 学生信息; //数组嵌套结构体
END_VAR
//3.程序内容
B:=NAME[0].名字;
C:=NAME[0].年龄;
D:=NAME[0].身高;
E:=NAME[0].体重;
//·结构体套结构体
//1、外层结构体声明区//如下
TYPE 学校信息 :
STRUCT
名称 :WSTRING(4) :="南昌一中";
学院 :WSTRING(14) :="电气工程学院";
专业 :WSTRING(10) :="自动化专业";
班级 :WSTRING(10) :="2017班";
辅导员 :WSTRING(4) :="可欣";
学生信息1:学生信息; END_STRUCT
END_TYPE
//2、内层结构体声明区//如下
TYPE 学生信息 :
STRUCT
名字 :WSTRING(8):="陈仪";
年龄 :INT:=18;
身高 :INT:=180;
体重 :INT:=120;
ID :INT:=1314;
END_STRUCT
END_TYPE

ST语言的更多相关文章

  1. [PLC]ST语言四:INV_MEP_MEF_PLS_PLF_MC_MCR

    一:INV_MEP_MEF_PLS_PLF_MC_MCR 说明:简单的顺控指令不做其他说明. 控制要求:无 编程梯形图: 结构化编程ST语言: (*运算结果的反转INV(EN);*) M415:=in ...

  2. [PLC]ST语言七:MOV_SMOV_CML_BMOV_FMOV_XCH_BCD_BIN

    一:MOV/SMOV/CML/BMOV/FMOV/XCH/BCD/BIN 说明:简单的顺控指令不做其他说明. (MOV)控制要求:无 (MOV)编程梯形图: (MOV)结构化编程ST语言: (*传送指 ...

  3. [PLC]ST语言六:DI/EI/FEND/WDT/FOR/NEXT

    一:DI/EI/FEND/WDT/FOR/NEXT 说明:简单的顺控指令不做其他说明. 控制要求:无 编程梯形图: 结构化编程ST语言:

  4. [PLC]ST语言五:STL/RET/CMP/ZCP

    一:STL/RET/CMP/ZCP 说明:简单的顺控指令不做其他说明. 控制要求:无 编程梯形图: 结构化编程ST语言: (*步进指令STL(EN,s);*) SET(M8002,S3); STL(T ...

  5. [PLC]ST语言三:OUT/OUT_T/OUT_C/OUT_C-C32

    一:OUT/OUT_T/OUT_C/OUT_C-C32               说明:简单的顺控指令不做其他说明. 控制要求:无 编程梯形图: 结构化编程ST语言: (*OUT(EN,D);*) ...

  6. [PLC]ST语言二:LDP_LDF_ANDP_ANDF_ORP_ORF

    一:LDP_LDF_ANDP_ANDF_ORP_ORF基本指令 说明:简单的顺控指令不做其他说明. 控制要求:无 编程梯形图: 结构化编程ST语言: (*LDP(EN,s)/ORP(EN,S)*) M ...

  7. [PLC]ST语言一:LD_LDI_AND_ANI_OR_ORI

    一:LD_LDI_AND_ANI_OR_ORI基本指令 说明:简单的顺控指令不做其他说明. 控制要求:无 编程梯形图: 结构化编程ST语言: M400:=(M0 OR M1) AND M2; M401 ...

  8. 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何把FBD功能块转换成ST语言

    假如我定义了一个MC_Power的标准功能块,我想知道它对应的ST语言   在MAIN(ST语言界面下)右击,Input Assistant,然后找到Standard Function Blocks, ...

  9. PLC中ST语言的几种程序流程控制语句

    ST语言是IEC61131-3中规定的5中标准语言之一,目前常用见品牌的PLC都支持这种语言(施耐德,AB可以直接选择创建该类型的程序段或者功能块,西门子的略微麻烦一点),ST语言的一个好处是移植性好 ...

  10. 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何配置虚拟轴 TC2

    右击NC- Configuration,然后Append Task,然后右击Axis,Append Axis   轴的类型可以分为:Continuous Axis,默认的类型,NC可以连续闭环控制该轴 ...

随机推荐

  1. 使用go语言开发自动化API测试工具

    前言 上一篇文章说到我还开发了一个独立的自动测试工具,可以根据 OpenAPI 的文档来测试,并且在测试完成后输出测试报告,报告内容包括每个接口是否测试通过和响应时间等. 这个工具我使用了 go 语言 ...

  2. Spring Cloud 系列之Hystrix、Ribbon、Feign 源码剖析(一)引子

    系列目录 Spring Cloud 系列之Hystrix.Ribbon.Feign 源码剖析(一)引子 Spring Cloud 系列之Hystrix.Ribbon.Feign 源码剖析(二)原理概括 ...

  3. vscode 注释后 光标下移(注释后光标快速定位下一行) 仿照idea

    VSCode 注释后光标快速定位下一行 1. 安装插件 Multi-command Multi-command 2.打开 Keybinding.json Keybinding.json 左下角齿轮图标 ...

  4. Kotlin学习快速入门(10)—— 重载运算符使用

    原文:Kotlin学习快速入门(10)-- 重载运算符使用 - Stars-One的杂货小窝 Kotlin中提供了基础的运算符,但是只是针对基础的数据类型,如Int,Double等 如果我们想让两个对 ...

  5. Java基础知识篇01——Java基本介绍

    一.什么是 Java Java 是 Sun Microsystems 于 1995 年首次发布的一种编程语言和计算平台.编程语言还是比较好理解的,什么是计算平台呢? 计算平台是电脑中运行应用程序(软件 ...

  6. vmware虚拟机共享文件夹显示不出来的解决办法

    今天在虚拟机里部署测试环境时,遇到一个问题,就是在vmware设置里明明共享了文件夹,但是在CentOS里却看不到共享的文件夹 环境 宿主机:MacBook Pro 虚拟机:vmware 15 虚拟机 ...

  7. 【干货】Java开发者快速上手.NET指南

    前言 前几天有小伙伴在技术群里发了一个微软官方出的:适用于Java开发人员的.NET快速入门免费电子书,今天大姚来分享一下Java开发者想要快速上手.NET有哪些教程和优质资料. 微软适用于Java开 ...

  8. [Spring]aop的配置与使用

    [版权声明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://blog.csdn.net/m0_69908381/article/details/129907717 出自[进步* ...

  9. Redis 中 scan 命令太坑了,千万别乱用!!

    作者:铂赛东\链接:www.jianshu.com/p/8cf8aac3dc25 1 原本以为自己对redis命令还蛮熟悉的,各种数据模型各种基于redis的骚操作.但是最近在使用redis的scan ...

  10. flink scala 从Oracle同步数据到MySql

    pom <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> ...