进制
进制 | 表示 | 备注 |
二进制 | 2#00110011 | |
八进制 | 8#17 | |
十进制 | 10#522或522 | |
十六进制 | 16#AF10 |
数据类型
类型名称 | 类型标识符 | 数据下限 | 数据上限 | 存储空间 | |
布尔型 | BOOL | 0 | 1 | 1bit | |
整型 | 字节型 | BYTE | 0 | 255 | 1byte |
字型 | WORD | 0 | 65535 | 2byte | |
双字型 | DWORD | 0 | 4294967295 | 4byte | |
短整型 | SINT | -128 | 127 | 1byte | |
无符号短整型 | USINT | 0 | 255 | 1byte | |
整型 | INT | -32768 | 32767 | 2byte | |
无符号整型 | UINT | 0 | 65535 | 2byte | |
长整型 | DINT | -2147483648 | 2147483647 | 4byte | |
无符号长整型 | UDINT | 0 | 4294967295 | 4byte | |
实数型 | REAL | -3.402823E+38 | 3.402823E+38 | 4byte | |
字符串行 | STRING | 默认80个字符,最大255个字符,第一个字节存储字符串长度。 | 256byte | ||
时间型 | 时间型 | TIME | TIME表示一个时间值,单位为毫秒,初始值为0。 | 4byte | |
时刻型 | TOD | TOD表示当天的时刻,单位为毫秒,初始值为凌晨0点0分。 | 4byte | ||
日期型 | DATE | DATE表示当前日期,单位为秒,初始值是1970年1月1日。 | 4byte | ||
日期时刻型 | DT | DT 表示当前日期和时刻,单位为秒,初始值是1970年1月1日凌晨0点0分。 | 4byte |
转义符号
转义符号 | 意义 | 备注 |
$$ | 美元 | |
$L | 换行 | |
$N | 新行 | |
$R | 回车符 | |
$T | 制表符 | |
$P | 换页 |
变量属性
属性类型 | 意义 | 备注 |
VAR | 局部变量 | 在PRG和FB中有记忆,在FC和Method中没有记忆 |
VAR_GLOBAL | 全局变量 | |
VAR_RETAIN | 掉电保持型变量 | |
VAR_CONSTANT | 常量 | |
VAR_IN | 输入变量 | |
VAR_OUT | 输出变量 | |
VAR_IN_OUT | 输入输出变量 | |
VAR_TEMP | 临时变量 | 在所有程序段中都没有记忆,每次调用都会初始化 |
VAR_STAT | 静态变量 | 在所有程序段中都有记忆 |
自定义数据类型
数组定义:
<数组名>:ARRAY [<L1>..<M1>,<L2>..<M2>,<L3>..<M3>] OF <基本数据类型>
一维数组 A1: ARRAY[0..9] OF BOOL;
二维数组 A2: ARRAY[0..9, 0..9] OF REAL; 三维数组 A3: ARRAY[0..9, 0..9, 0..9] OF INT; 枚举: TYPE<标识符>:(<Enum_1>,<Enum_2>,…,<Enum_3>); END_TYPE 定义举例 TYPE Color : ( Red := 0, Green, Yellow ); END_TYPE 结构: TYPE <结构名>: STRUCT <变量声明1> <变量声明2> <变量声明n> END_STRUCT END_TYPE 定义举例 TYPE Motor : STRUCT V:REAL; A:REAL; Hz:REAL; END_STRUCT END_TYPE 指针: <指针名>: POINTER TO <数据类型或功能块类型>
语句
IF 表达式1 THEN 语句块1; ELSIF 表达式2 THEN 语句块2; …… ELSE 语句块3 END_IF; CASE 表达式 OF 值1:语句块1; 值2:语句块2; …… ELSE:语句块; END_CASE; WHILE 表达式 DO 语句块; END_WHILE; FOR 控制变量:=初始值 TO 结束值 BY 增量值 DO 语句块; END_FOR
常用指令
VAR intVar1: INT; intVar2: INT; intVar3: INT; boolVar1: BOOL; VarOut: INT; VarIn: INT; wordVar1: WORD; wordVar2: WORD; wordVar3: WORD; realVar1: REAL; realVar2: REAL; intArr1: ARRAY[0..9] OF INT; dintVarAddress1:POINTER TO INT; uintVar1: UINT; R_TRIG1: R_TRIG; F_TRIG1: F_TRIG; CTUD1: CTUD; CTD1: CTD; CTU1: CTU; TON1: TON; TOF1: TOF; END_VAR //赋值运算符 intVar1:=123; //算数运算符 intVar1:=intVar2+123; intVar1:=intVar2-123; intVar1:=intVar2*123; intVar1:=intVar2/123; intVar1:=intVar2 MOD 123; (*取余*) //选择指令 intVar3:=SEL(boolVar1,intVar1,intVar2);(*二选一*) intVar1:=MUX(intVar2,-123,456,789);(*多选一*) intVar3:=MIN(intVar1,intVar2); intVar3:=MAX(intVar1,intVar2); VarOut:=LIMIT(intVar1,VarIn,intVar2);(*极限值指令*) //比较指令 boolVar1:=intVar1<intVar2; boolVar1:=intVar1<=intVar2; boolVar1:=intVar1>intVar2; boolVar1:=intVar1>=intVar2; boolVar1:=intVar1<>intVar2; boolVar1:=intVar1=intVar2; //移位指令 wordVar1:=SHR(2#10011001,2); wordVar1:=ROR(2#10011001,2); wordVar1:=SHL(2#10011001,2); wordVar1:=ROL(2#10011001,2); //逻辑运算指令 wordVar1:=NOT wordVar2; wordVar1:=wordVar2 AND wordVar3; wordVar1:=wordVar2 OR wordVar3; wordVar1:=wordVar2 XOR wordVar3; //初等数学运算指令 realVar1:=SQRT(realVar2); realVar1:=ABS(realVar2); realVar1:=EXP(realVar2); realVar1:=LN(realVar2); realVar1:=LOG(realVar2); realVar1:=EXPT(realVar2,5); realVar1:=SIN(realVar2); realVar1:=ASIN(realVar2); realVar1:=COS(realVar2); realVar1:=ACOS(realVar2); realVar1:=TAN(realVar2); realVar1:=ATAN(realVar2); //地址运算指令 uintVar1:=SIZEOF(intArr1);(*获取变量所占字节数*) dintVarAddress1:=ADR(intVar1);(*获取变量地址*) intVar2:=dintVarAddress1^;(*获取指针变量所指向的值*) //数据转换指令 _TO_ intVar1:=BOOL_TO_INT(boolVar1); //计数器 CTUD1(CU:= , CD:= , RESET:= , LOAD:= , PV:= ,QU=> , QD=> ,CV=> ); CTD1(CD:= , LOAD:= ,PV:= , Q=> , CV=> ); CTU1(CU:= , RESET:= , PV:= , Q=> , CV=> ); //定时器 TON1(IN:= , PT:= , Q=> , ET=> ); TOF1(IN:= , PT:= , Q=> , ET=> ); //触发指令 R_TRIG1(CLK:=boolVar1 , Q=> ); F_TRIG1(CLK:=boolVar1 , Q=> );
示例 上升沿下降沿触发指令
FUNCTION_BLOCK R_F_TRIG VAR_INPUT CLK: BOOL; END_VAR VAR_OUTPUT QR: BOOL; QF: BOOL; END_VAR VAR_STAT TEMP: BOOL := FALSE; END_VAR QR:=CLK AND (NOT TEMP); QF:=(NOT CLK) AND TEMP; TEMP:=CLK; PROGRAM MAIN VAR R_F_TRIG_0: R_F_TRIG; C: BOOL; ADD1: INT; ADD2: INT; END_VAR R_F_TRIG_0(CLK:=C , QR=> , QF=> ); IF R_F_TRIG_0.QR THEN ADD1:=ADD1+1; END_IF IF R_F_TRIG_0.QF THEN ADD2:=ADD2+1; END_IF