|
可在ST程序中使用的语法如下所示: 应用半角字符记述语法 项目 | 内容 | 代入语句 | 代入语句 | 子程序控制语句 | FB调用语句、函数调用语句 | RETURN语句 | 选择语句 | IF语句(IF THEN、IF ELSE、IF ELSIF) | CASE语句 | 重复语句 | FOR语句 | WHILE语句 | REPEAT语句 | EXIT语句 |
代入语句: 书写格式 | 内容 | 记述示例 | <左边>:=<右边>; | 具有将右边公式的结果代入到左边的标签及软元件中的功能。 右边公式的结果需与左边的数据类型相同。 | intV1:=0; intV2:=2; |
备注:使用数组型标签及结构体标签的情况下,应注意代入语句的左边与右边的数据类型。 数组型标签的情况下,左边与右边的数据类型与要素数需要相同。此外,请勿指定要素。 例: intAry1:=intAry2;//结构体标签的情况下,左边与右边的数据类型(结构体的数据类型)需要相同。 |
例: dutVar1:=dutVar2; 右边为函数调用方式的情况下,函数的返回值将代入左边。将返回值代入标签的示例如下所示。 |
函数 | 记述示例 | 具有1个输入变量的函数的情况(例:ABS) | Output1 := ABS(Input1); | 具有3个输入变量的函数的情况(例:MAX) | Output1 := MAX(Input1, Input2, Input3); | 具有EN/ENO的函数(通用函数)的情况(例:MAX_E) | Output1 := MAX_E(boolEN, boolENO, Input1, Input2, Input3); | 通用函数以外的情况(例:MOV) | boolENO := MOV(boolEN, Input1, Output1); (执行完函数的结果为ENO,第一自变量(变量1)变为EN。) |
数据类型的自动转换: 在ST语言中记述不同数据类型的代入或算术运算公式时,可以自动转换数据类型。 例: dintLabel1 := intLabel1 ;//代入语句:将INT型(intLabel1)的值自动转换为DINT型,代入至左边的DINT型(dintLabel1) dintLabel1 := dintLabel2 + intLabel1 ;//算术运算公式:INT型(intLabel1)的值自动转换为DINT型,执行DINT型的加法运算 DMOV(TRUE, wordLabel1, dwordLabel1);//指令、函数、FB调用语句:将WORD型输入自变量(wordLabel1)的值自动转换为DWORD型,执行传送 类型转换在代入语句、向FB及函数(包括指令、通用函数、通用FB)交接输入自变量(VAR_INPUT部)、算术运算公式中进行。 从数据类型容量小的开始往容量大的顺序进行,以确保类型转换时不丢失数据。类型转换以数据类型中的下述数据类型为对象。 数据类型 | 内容 | 字[带符号] | 转换后变为双字[带符号]的情况下,自动转换为符号扩展值。 单精度实数或双精度实数的情况下,自动转换为与转换前的整数相同的值。*1 | 字[无符号]/位串[16位] | 转换后为双字[无符号]/位串[32位]或双字[带符号]的情况下,自动转换为零扩展值。*2 单精度实数或双精度实数的情况下,自动转换为与转换前的整数相同的值。*1 | 双字[带符号] | 转换后为双精度实数的情况下,自动转换为与转换前的整数相同的值。 | 双字[无符号]/位串[32位] | 单精度实数 | 转换后为双精度实数的情况下,自动转换为相同的值。 |
*1 数据类型若将16位数据(字[带符号]或字[无符号]/位串[16位])过渡为ANY_REAL的输入自变量,则自动转换为单精度实数。 *2 数据类型若将字[无符号]/位串[16位]数据过渡为ANY32的输入自变量下,则自动转换为双字[无符号]/位串[32位]。 上述以外的数据类型,应使用类型转换函数。此外,下述情况也无法进行类型转换,应使用类型转换函数。 • 符号不同的整数型之间的类型转换 • 数据丢失型之间的类型转换 子程序控制语句: 一 FB调用语句 书写格式 | 内容 | 实例名(输入变量1:=变量1,...输出变量1=>变量2,...); | 在实例名后,用“()”括住输入变量、输出变量的代入语句。 多个变量的情况下,各代入语句之间用“,”(逗号)隔开 | 实例名.输入变量1:=变量1; ... 实例名(); 变量2:=实例名.输出变量1; | 在FB调用的前后列举输入自变量、输出自变量的代入语句。 |
在FB调用语句的自变量中所使用的符号与可分配表达式如下所示。 类型 | 内容 | 使用符号 | 可分配表达式 | EN,VAR_INPUT | 输入变量 | := | 所有的表达式 | ENO,VAR_OUTPUT, VAR_OUTPUT_RETAIN | 输出变量 | => | 只有变量 | VAR_IN_OUT | 输入输出变量 | := | 只有变量 |
FB的执行结果通过在实例名后添加“.”(句号)指定输出变量且代入变量被存储。 FB | FB定义 | 记述示例 | 具有1个输入变量、1个输出变量的FB的情况 | FB名:FBADD FB实例名:FBADD1 输入变量1:IN1 输出变量1:OUT1 | FBADD1(IN1:= Input1); Output1 := FBADD1.OUT1; | 具有3个输入变量、2个输出变量的FB的情况 | FB名:FBADD FB实例名:FBADD1 输入变量1:IN1 输入变量2:IN2 输入变量3:IN3 输出变量1:OUT1 输出变量2:OUT2 | FBADD1(IN1:=Input1,IN2:= Input2,IN3:= Input3); Output1 := FBADD1.OUT1; Output2 := FBADD1.OUT2; |
二 函数调用语句 无返回值的函数或参数中包含VAR_OUTPUT变量的函数,通过在函数调用方式的后方加上“;”(分号),可作为语句执行。 书写格式 | 内容 | 函数名(变量1,变量2,...); | 用“()”将紧接在函数名后的自变量括起来。 多个自变量的情况下用“,”(逗号)隔开。 |
三 RETURN语句 语法 | 书写格式 | 内容 | 记述示例 | RETURN | RETURN; | 在中途结束程序、FB、函数时使用。 如果在程序中使用RETURN语句,将跳转到程序的最后语句的下一步。 如果在FB中使用RETURN语句,将从FB返回。 如果在函数中使用RETURN语句,将从函数返回。 对于1个RETURN语句,在系统中使用1点指针型标签。 | IF bool1 THEN RETURN; END_IF; |
选择语句 语法 | 书写格式 | 内容 | 记述示例 | IF THEN | IF<布尔表达式>THEN <语句>; END_IF; | 布尔表达式(条件表达式)为真(TRUE)时,执行语句。布尔表达式为假(FALSE)时,不执行语句。对于布尔表达式,只要单一的位型变量的状态或包含多个变量的复杂表达式的布尔运算结果为返回真(TRUE)或假(FALSE)的表达式,则可以在任意表达式中使用。 | IF bool1 THEN intV1 := intV1 + 1; END_IF; | IF...ELSE | IF<布尔表达式>THEN <语句1>; ELSE <语句2>; END_IF; | 布尔表达式(条件表达式)为真(TRUE)时,执行语句1。 布尔表达式的值为假(FALSE)时,执行语句2。 | IF bool1 THEN intV3 := intV3 + 1; ELSE intV4 := intV4 + 1; END_IF; | IF...ELSIF | F<布尔表达式1>THEN <语句1>; ELSIF<布尔表达式2>THEN <语句2>; ELSIF<布尔表达式3>THEN <语句3>; END_IF; | 布尔表达式(条件表达式)1为真(TRUE)时,执行语句1。布尔表达式1的值为 假(FALSE)且布尔表达式2的值为真(TRUE)时,执行语句2。布尔表达式1、2的值都为假(FALSE)且布尔表达式3的值为真(TRUE)时,执行语句3。 | IF bool1 THEN intV1 := intV1 + 1; ELSIF bool2 THEN intV2 := intV2 + 2; ELSIF bool3 THEN intV3 := intV3 + 3; END_IF; | CASE | CASE<整数表达式>OF <整数选择值1>: <语句1>; <整数选择值2>: <语句2>; ... <整数选择值n>: <语句n>; ELSE <语句n+1>; END_CASE; | 具有与整数表达式(条件表达式)的值一致的整数的选择值的语句被执行后,若无一致,则执行ELSE语句的下一语句。例如,根据单一的整数值及复杂表达式的结果的整数值,可在执行选择语 句时使用CASE语句。 | CASE intV1 OF 1 : bool1 := TRUE; 2 : bool2 := TRUE; ELSE intV1 := intV1 + 1; END_CASE; |
重复语句 语法 | 书写格式 | 内容 | 记述示例 | FOR...DO | FOR<重复变量初始化> TO<最终值> BY<增加表达式>DO <语句>; END_FOR; | 对作为反复变量使用的数据初始化。根据增加公式对初始化后的反复变量进行加法或减法运算,重复执行自D0到END_FOR间的一个及其以上的语句,直至超出最终值为止。FOR...DO语句结束后的反复变量,保持在结束时点的值。 | FOR intV1 := 0 TO 30 BY 1 DO intV3 := intV1 + 1; END_FOR; | WHILE...DO | WHILE<布尔表达式>DO <语句>; END_WHILE; | 布尔表达式(条件表达式)为真(TRUE)时,执行1个及其以上的语句。布尔表达式在执行语句之前被判定,布尔表达式为假(FALSE)时,不执行DO...END_WHILE中的语句。WHILE语句中的<布尔表达式>,无论返回的结果为真或假,只要有返回即可,因此IF语句中的<布尔表达式>中可指定的表达式全可以使用。 | WHILE intV1 = 30 DO intV1 := intV1 + 1; END_WHILE; | REPEAT...UNTIL | REPEAT <语句>; UNTIL<布尔表达式> END_REPEAT; | 布尔表达式(条件表达式)为假(FALSE)时,执行1个及其以上语句。布尔表达式在执行语句后被判定,值为真(TRUE)时则不执行REPEAT...UNTIL内的语句。REPEAT语句中的<布尔表达式>,无论返回的结果为真或假,只要有返回即可,因此IF语句中的<布尔表达式>中的可指定的表达式全可以使用。 | REPEAT intV1 := intV1 + 1; UNTIL intV1 = 30 END_REPEAT; | EXIT | EXIT; | 只可在重复语句中使用的语法,于中途结束重复语句。如果在执行重复环路过程中达到EXIT语句,则不执行EXIT语句之后的重复环路处理。从终止重复语句后的下一行开始继续执行程序。 | FOR intV1 := 0 TO 10 BY 1 DO IF intV1 > 10 THEN EXIT; END_IF; END_FOR; |
使用代入语句时 • 字符串的代入的最大字符串长为255字符。代入的字符串超过最大字符串长时,将变为转换错误。 • 定时器型、计数器型的触点与线圈无法在代入语句的左边使用。 • FB的实例无法在代入语句的左边使用。应在代入式的左边使用实例的输入变量、输出变量、外部变量。 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |