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. Thinkphp6 自定义命令创建类文件

    以创建控制器为例 1.先通过 think 命令创建一个make文件,效果如下图: php think make:command make/MyController 2.修改上面创建的文件[MyCont ...

  2. 解决 Genymotion 显示‘unable to start the virtual device’的问题

    ·解决方案 以管理员身份运行以下命令: bcdedit /set hypervisorlaunchtype off ,然后重启电脑,打开模拟器即可. 注意,一定是以[管理员]的身份运行的[命令提示符] ...

  3. autohotkey 设置快捷键 设置光标位置 (ctrl + alt + Numpad0)

    autohotkey 设置快捷键 设置光标位置 (ctrl + alt + Numpad0) 原因 3个屏幕,所以鼠标设置的灵敏度非常高,经常就找不到鼠标在哪了. 设置个快捷键,让鼠标每次都初始化一个 ...

  4. ohmyposh 安装 - 基于 powershell7.2.1 - 最后改成 profile自定义

    今天偶然下载了 powershell7.2.1 https://mydown.yesky.com/pcsoft/468254.html 这想着 vscode也支持了,得装一个 ohmyposh的主题啊 ...

  5. SourceTree 摘樱桃 === 遴选 [不要使用这个功能!!不要使用!不要使用!]

    SourceTree 摘樱桃 === 遴选 不要使用摘樱桃!!不要使用!不要使用! 我找了一个文本的git,进行的测试,发现很不好用,文档我又恢复过来了,因为就改了几个字,代码的话,会造成 不可挽回的 ...

  6. 【目标检测】Faster R-CNN算法实现

    一.前言 继2014年的R-CNN.2015年的Fast R-CNN后,2016年目标检测领域再次迎来Ross Girshick大佬的神作Faster R-CNN,一举解决了目标检测的实时性问题.相较 ...

  7. 5分钟上手Python爬虫:从干饭开始,轻松掌握技巧

    很多人都听说过爬虫,我也不例外.曾看到别人编写的爬虫代码,虽然没有深入研究,但感觉非常强大.因此,今天我决定从零开始,花费仅5分钟学习入门爬虫技术,以后只需轻轻一爬就能查看所有感兴趣的网站内容.广告? ...

  8. grails中使用render方法输出XML总结

    GrailsXMLJava 1.首先看看简单的XML生成情况 Java代码  收藏代码 <images>        <image title="one" /& ...

  9. 记录-一个栗子让你彻底弄懂CSS3补间动画和逐帧动画

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 CSS3提供了Animation关键帧动画,我们在工作中比较常用.但在写CSS动画的时候,其实Animation能实现两种动画模式: 补间 ...

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

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