1.3 语言元素
1.3.1 字符集
- 通用编码字符集包括了其他所有字符集。它保证了与其他字符集的双向兼容,即,如果你将任何文本字符串转换为UCS格式,然后再转换回原编码,你不会丢失任何信息。UCS包含了已知语言的所有字符。
- 根据国家标准的 GB/T15969.3-2005,可编程控制器使用的文本和图形类编程语言中的文本元 素应依据国家标准 GB1988 字符的“基本代码表”的 3-7 列字符组成,并根据 GB2312-1980《信 息交换用汉字编辑字符集基本集》来表示汉字。
- 除了注释、字符串字面量和字符串变量值以外,字母的大小写具有相同的意义。例如,Control 与 CONTROL 是相同的变量名或标识符。
1.3.2 标识符
- 标识符:由字母、数字和下划线字符的一个串,并以字母或下划线字符开头。但是不允许下划线结尾,在标识符中字母的字体和大小写没有意义。同时,标识符不允许以多个下划线开头或多个内嵌的连续下划线。天行PLC中,命名空间,变量,GVS,PU,FB,FC等均遵守此规范。
- 用于命名各种变量、程序、配置、资源等。
序号 | 特性描述 | 举例 |
---|---|---|
1 | 大写字母和数字 | W4; ER8; RT8 |
2 | 大写和小写字母、数字、内嵌的下划线 | Var2; Var2_int; Var2_int_9; var1,var_int |
3 | 大写和小写字母、数字、前导或内嵌的下划线 | _Var2; _12_int |
1.3.3 注释
-
提高代码的可读性:注释可以帮助其他开发人员更好的理解代码的逻辑和意图,节省阅读代码的时间。
-
方便代码维护:随着项目的迭代,代码可能会发生更改和修复。良好的注释可以帮助开发人员更容易定位问题和进行修改。
-
注释相关说明如下表所示:
注释描述 | 举例 |
---|---|
单行注释//... | x:=12; //给变量x赋值为12 |
多行注释(*....*) | (*a:=10; b:=true;*) 将这两行代码注释掉 |
多行注释/*....*/ | /*a:=10; b:=true;*/ 将这两行代码注释掉 |
嵌套注释用(*..(*..*)..*) | (*(*b:=true;*)*) 完成嵌套注释 |
嵌套注释用/*../*..*/..*/ | /*/*b:=true;*/*/ 完成嵌套注释 |
1.3.4 字面量(常数)
- 字面量:字面量就是一个值,表示某些常数的值,有三种类型:数字直接量,字符串直接量,时间直接量。在计算机科学中,字面量(literal)是用于表达源代码中一个固定值的表示法(notation)。
- 数字直接量:定义为十进制数或基底数。在一个给定执行中,每种数字直接量的最大位数足以表示该直接量所表示的所有数据类型的值的整个范围。
- 数字直接量分为两类:整数直接量和实数直接量。整数直接量基底为十进制,也能以2或16为基底表示。对于基底是16的整数直接量,使用由A至F组成的一组扩展数字,这组数字代表十进制的10至15。基底数不应包含前置符“+”或“-”。他们被解释为位串直接量。实数数值以小数点的存在来区分。
- 数字直接量的特性和举例如下表
序号 | 描述 | 举例 | 说明 |
---|---|---|---|
1 | 整型直接量 | -12 123_4 +986 | 123_4 等于 1234 |
2 | 实数直接量 | 0.0 0.369 3.141592_6 | 3.1415926 等于 3.141592_6 |
3 | 实数直接量扩展 | -1.34E-12,-1.34e-12 1.0E+6,1.0e+6 1.334E6,1.334e6 | e(E)不分大小写 + 可以省略 |
4 | 二进制直接量 | 2#1111_1111 2#1110_0000 | 二进制全1,代表十进制255 二进制111代表十进制224 |
5 | 16进制直接量 | 16#FF 或者16#ff 16#E0或者16#e0 | 16进制FF代表十进制255 16进制E0代表十进制224 |
6 | 布尔0或1 | 数字0或1 | |
7 | 布尔真或假 | TRUE FALSE | |
8 | 类型直接量 | INT#-12 WORD#16#AFF WORD#1234 1234=16#4D2 UINT#16#89AF CHAR#‘A' BOOL#0 BOOL#1 BOOL#FALSE BOOL#TRUE |
-
字符串直接量
- 单字节:占一个字,单字节的字符串直接量是零个或多个字符的序列,并以单引号字符开头或结尾。在单字节的字符串中,美元符号与随后的2个十六进制数字的三字符组合可理解为8位字符码的十六进制表示。
- 单字节字符串直接量如下表所示:
序号 描述 举例 1 空字符(长度为零) '' 2 单个Char 'a' 3 空格 ' ' 4 单引号 '$'' 5 美元符号 '$$' 7 换行,输入行 '$L' or '$l' 8 新行 '$N' or '$n' 9 换页,输入页 '$P' or '$p' 10 回车 '$R' or '$r' 11 TAB跳格键 '$T' or '$t' 12 支持带有$字符和两个16进制字符的单个字节 '$0A' 13 字符串类型 STRING#'OK' 14 字符类型 CHAR#'X' -
时间直接量
-
持续时间数据应由关键字T#、TIME#或LTIME#在左边界定。持续时间数据要支持按天、小时、分、秒和毫秒(LTIME#支持纳秒)以及它们的任意组合表示,单位允许带下划线字符分隔,时间单位如秒、毫秒等可用大写或小写字母表示。
-
关于时间直接量固有元素如下表所示:
序号 | 描述 | 举例 |
---|---|---|
1 | d | 天 |
2 | h | 小时 |
3 | m | 分钟 |
4 | s | 秒 |
5 | ms | 毫秒 |
6 | us | 微秒 |
7 | ns | 纳秒 |
- 时间直接量长短前缀常见表示如下表所示:
序号 | 描述 | 举例 |
---|---|---|
1 | 短前缀 | T#14ms T#-14ms LT#14.7s T#14.7m T#14.7h t#14.7d t#25h15m t#5d14h12m18s35ms lt#12h4m34ms230us400ns |
2 | 短前缀(单位带有下划线字符分隔) | t#25h_15m t#5d_14h_12m_18s_35ms |
3 | 长前缀 | TIME#14msTIME#-14ms time#14.7s LTIME#5m30s500ms100.1us |
4 | 长前缀(单位带有下划线字符分隔) | TIME#25h_15m ltime#5d_14h_12m_18s_3.5ms LTIME#34s_345ns |
- 时间和日期直接量长短前缀常见表示如下表所示:
序号 | 描述 | 举例 |
---|---|---|
1 | 日期(长前缀) | DATE#1984-06-25 date#2010-09-22 |
2 | 日期(短前缀) | D#1984-06-25 |
3 | 时间(长前缀) | TIME_OF_DAY#12:36:45.32 |
4 | 时间(短前缀) | TOD#15:15:15.36 |
5 | 时间和日期(长前缀) | DATE_AND_TIME#1956-03-14-12:56:22 |
6 | 时间和日期(短前缀) | DT#2021-03-25-14:56:23 |
注意
只有最小单位不支持浮点数
1.3.5 关键字
-
关键字是位移字符组合,它被用作单独的语法元素。
-
包括:基本数据类型,语言元素等。
-
关键字如下表所示:
序号 | 说明 | 关键字 |
---|---|---|
1 | 布尔 | BOOL |
2 | 字节 | BYTE |
3 | 字 | WORD |
4 | 双字 | DWORD |
5 | 长字 | LWORD |
6 | 短整型 | SINT |
7 | 无符号整型 | UINT |
8 | 整型 | INT |
9 | 无符号整型 | UINT |
10 | 双整型 | DINT |
11 | 无符号双整型 | UDINT |
12 | 长整型 | LINT |
13 | 无符号长整型 | ULINT |
14 | 实数 | REAL |
15 | 长实数 | LREAL |
16 | 单字节字符 | CHAR |
17 | 字符串 | STRING |
20 | 持续时间(ms) | TIME |
21 | 日期 | DATE |
22 | 日时 | TIME_OF_DAY |
23 | 日时 | TOD |
24 | 日期和时间 | DATE_AND_TIME |
25 | 日期和时间 | DT |
26 | 长持续时间 | LTIME |
32 | 用户自定义类型 | TYPE |
33 | 类型结束定义 | END_TYPE |
34 | 数组 | ARRAY ARRAY |
35 | 数组或CASE语句 OF | OF |
58 | 逻辑真 | TRUE |
59 | 逻辑假 | FALSE |
60 | GVS内变量段开始 | GLOBAL VARIABLE |
61 | PU内变量段开始 | VAR |
62 | PU内临时变量段开始 | TEMP |
63 | 输入变量段开始 | INPUT |
64 | 输出变量段开始 | OUTPUT |
65 | 输入输出变量段开始 | INOUT |
66 | GVS内变量段开始 | GLOBAL CONSTANT |
67 | 常量 | LOCAL CONSTANT |
68 | 掉电保存变量 | RETAIN |
69 | 取反(求反码) | NOT |
70 | 模运算(表示a除以b的余数) | MOD |
71 | “与”运算 | AND |
72 | “异或”运算 | XOR |
73 | “或”运算 | OR |
74 | 引入 IF 指令 | IF |
75 | 引入 IF指令的指令部分 | THEN |
76 | IF 指令的选择条件 | ELSIF |
77 | IF 和 CASE 语句中的选择分支 | ELSE |
78 | 结束 IF 指令 | END_IF |
79 | 引入 CASE 语句 | CASE |
80 | 结束 CASE 语句 | END_CASE |
81 | 引入 FOR 语句 | FOR |
82 | 定义 FOR 语句的整个范围值 | TO |
83 | FOR 循环的增量 | BY |
84 | 在 FOR 和 WHILE 指令中引入 指令部分 | DO |
85 | 结束 FOR 语句 | END_FOR |
86 | 引入 REPEAT | 语句 REPEAT |
87 | 结束 REPEAT | 语句的指令部分 UNTIL |
88 | 结束 REPEAT 语句 | END_REPEAT |
89 | 引入 WHILE 指令 | WHILE |
90 | 结束 WHILE 指令 | END_WHILE |
91 | 循环中终止当前程序通道,进入下一次循环 | CONTINUE |
92 | 退出循环的指令 | EXIT |
93 | 引入 GOTO 语句 | GOTO |
94 | 退出本程序单元 | RETURN |
1.3.6 分界符
- 用在“说明”或语句中起隔离、标识等作用,逗号用于隔开多个变量;分号表示ST中一天语句的结束;
- 星号+括号(**)之间存放对程序和语句的解释部分;冒号加等号表示ST编程语句中的赋值等。
- 常用分解符合集如下表所示:
分界符 | 应用场合 | 备注和示例 |
---|---|---|
空格 | 可以再PLC程序中任何位置插入空格 | 不允许再关键字、文字、标识符和枚举值中直接插入空格 |
TAB | 可以再PLC程序中任何位置插入TAB | 不允许在关键字、文字、标识符和枚举值中直接插入TAB |
+ | 十进制的前缀符号(正数); 加操作符 | +456、+147; 22+78 |
- | 十进制数的前缀符号(负数); 年-月-日的分隔符 ; 减操作符 | -753; D#2024-05-13; 15-2 |
# | 基底数的分隔符; 数据类型分隔符; 时间文字的分隔符 | 2#1110; SINT15; T#20ms |
. | 正数和小数的分隔符; 分级寻址地址符; 结构元素分隔符; 功能块实例结构分隔符; 全局命名空间; 命名空间分隔符 | 3.14;IABC.3//IBC是位串数据类型; Channel[0].type/abc.number; TON1.Q; SYS.SR |
E/e | 指数分界符 | 1.0e+6 |
' ' | 字符串开始/结束符 | 'HelloWorld' |
$ | 串中特殊字符的开始 | '$L'表示换行; '$R'表示回车 |
: | 时刻文字分割符; 变量/类型分隔符 | TOD#12:41:21.11; Test:INT |
:= | 输入变量连接操作符; 赋值操作符 | INT_1(SINGLE:=Z2,PRIORITY:=1) |
() | 子范围分节符; 初始化重复因子; 指令表修正符; 函数自变量; 子表达式分级; 功能块输入表分界符 | DATA:INT(-100..100); ARRAY[1..2,1..3] OF INT:=1,2,3(4),6; (A>B); ARlimit(Var1); (a(b-c)+d); TON_1(IN:=a,PT:=T#5m) |
[] | 数组下标分界符 | ARRAY[1..2,1..3] OF INT; MMOD_5_CFG.CH[5].Range:=BI_10V |
, | 数组下角标分隔符; 功能块初始值分隔符; 功能块输入表分隔符; 函数自变量表分隔符; Case至表分隔符 | ARRAY[1..2,1..3] OF INT := 1,2,3(4),6; TON_1(IN:A,pt:=50ms) SR_1(S1:=A,REAL:=B); LIMIT(MN:=4,IN=A,MX:=20) CASETEP OF 1,5:DISPLAY:=FALSE |
; | 语句分隔符 | a:=15 |
.. | 数组范围分隔符; 子范围; Case范围分隔符 | ARRAR[1..2]; DATA:INT(-1000..1000); CASETEPOF(1..5):display:=FALSE |
% | 直接表示变量的前缀 | %IW0 |
=> | 输出连接操作符 | C10(CU:=iNPUT,Q=>Out) |