1. 基础指令
1-1. 位逻辑指令
1-1-1. 基本位逻辑指令
指令名称 功能介绍
AND 运算符“与”
OR 运算符“或”
NOT 运算符“非”
XOR 运算符“异或”
基本位逻辑指令包括有“与”、“或”、“非”、“异或”。在 XS Studio 中,从功能上分可以分为:按位
逻辑运算及布尔逻辑运算。
按位逻辑运算:对两个整型数据的相应位逐一进行布尔逻辑运算,并返回兼容的整数结果。
布尔逻辑运算:对两个布尔类型数据执行逻辑运算。
1-1-1-1. 按位“与”AND
功能:按位“与”运算指令是比较两个整数的相应位。当两个数的对应位都是 1 时,返回相应的结
果位是“1”;当两个整数的相应位都是“0”或者其中一个位是“0”时,则返回相应的结果位是“0”。
例:创建一个 POU,声明两个整型
变量iVar1和iVar2,分别对其进行赋值1和85,并对这两个变量进行按位与运算,输出结果至iResult,
具体实现代码如下所示:
VAR
iVar1:INT:=1;
iVar2:INT:=85;
iResult:INT;
END_VAR
iResult:=iVar1 and iVar2;
10 进制数 1 对应 2 进制数为 0000 0001,10 进制数 85 对应 2 进制数为 0101 0101。根据按位与运算
的定义,将每一个独立位逐一进行“与”运算,得出最终的结果 0000 0001,即 10 进制数值 1。
1-1-1-2. 布尔“与”AND
功能:布尔“与”运算用于计算两个布尔表达式的“与”结果。当两个布尔表达式的结果都为真时,
则返回为真,其中只要有一个为假时,则返回为假.
例:创建一个 POU,利用布尔“与”运算,判断运算返回值,代码如下:
VAR
B1:BOOL;
B2:BOOL;
B3:BOOL;
END_VAR
B3:=B1 AND B2;
当 B1 和 B2 都为 TRUE 时,程序的运行结果是 B3 才为 TRUE。
1-1-1-3. 按位“或”OR
功能:按位“或”运算指令是比较两个整数的相应位。当两个数的对应位有一个是“1”或者都是
“1”时,返回相应的结果位为“1”。当两个整数的相应位都是“0”时,则返回相应的结果为是“0”。
例:创建一个 POU,对变量 iVar1 和 iVar2 进行按位“或”运算,并对这两个变量进行按位或运算,
输出结果至 iResult,具体实现代码如下所示:
VAR
iVar1:INT:=1;
iVar2:INT:=85;
iResult:INT;
END_VAR
iResult:=iVar1 OR iVar2;
程序的最终运行结果为 85。
1-1-1-4. 布尔“或”OR
功能:布尔“或”运算指令用于计算两个布尔表达式的“或”结果。当两个布尔表达式中有一个表
达式返回为真时,则结果为真;当两个布尔表达式的结果都是假时,则结果为假。
例:创建一个 POU,利用布尔“或”运算,判断运算返回值,代码如下:
VAR
bResult:BOOL;
bVar1:BOOL;
iVar1:INT:=30;
END_VAR
bResult:=bVar1 OR (iVar1 <80);
由于 iVar1 的初始值为 30,故 iVar1<80 条件为真,而 bVar1 的初始值为“0”,故为假,一真一假
最终的“或”逻辑结果为真。故等式右边的条件为真,程序的运行结果是 bResult 为 TRUE。
1-1-1-5. 按位“非”NOT
功能:对逻辑串进行取反,将当前的值由“0”变“1”,或由“1”变“0”。按位“非”运算指令
是将变量或常量逐一取非。
例:创建一个 POU,利用按位“非”运算,判断运算返回值,具体代码如下:
VAR
byVar1:BYTE:=1;
byVar2:BYTE;
END_VAR
byVar2:=NOT byVar1;
由于 byVar1 的值为 1,将其转换为 2 进制后为 0000 0001,进行按位取反后,结果为 1111 1110。最
终的输出结果为 254。
1-1-1-6. 布尔“非”NOT
功能:布尔“非”运算指令用于计算单个布尔表达式的结果。当输入为真时,结果为假;当输入为
假时,结果为真。
例:创建一个 POU,利用布尔“非”运算,判断运算返回值,具体代码如下:
VAR
bResult:BOOL;
bVar1:BOOL;
iVar1:INT:=30;
END_VAR
bResult:=NOT ( 80 < iVar1 );
80<30 该命题为假,使用 NOT 指令对该布尔表达式取反后,得到的结果为真,故最后 bResult 的结
果为 True。
1-1-1-7. 按位“异或”XOR
功能:按位“异或”运算指令比较两个整数的相应位。当两个整数的对应位是一个“1”而另外一
个是“0”时,返回相应的结果位是“1”。当两个整数的相应位都是“1”或都是“0”时,则返回相应
的结果位是“0”。
例:创建一个 POU,对变量 iVar1 和 iVar2 进行按位“异或”运算,并输出结果,具体实现代码如
下:
VAR
iVar1:INT:=1;
iVar2:INT:=85;
iResult:INT;
END_VAR
iResult:=iVar1 XOR iVar2;
10 进制的 1 对应 2 进制数是 0000 0001,10 进制数 85 对应的 2 进制数是 0101 0101。根据按位“异
或”运算指令的定义,其结果为 84。
按位异或位运算。只有当一个触点的输入状态为“1”,另一个触点的输入状态为“0”时,输出为
“1”,如果两个触点状态同时为“1”或同时为“0”,则输出为“0”。
1-1-1-8. 布尔“异或”XOR
功能:布尔“异或”运算指令用于计算两个布尔表达式的结果,只有当其中一个表达式是真,另外
一个表达式为假时,该表达式返回的结果才是真;当两个表达式的计算结果都是真或者都是假时,则返
回的结果为假。
例:创建一个 POU,利用布尔“异或”运算指令,判断返回值是 TRUE 还是 FALSE,具体实现代
码如下:
VAR
bResult:BOOL;
bVar1:BOOL;
iVar1:INT:=30;
END_VAR
bResult:=bVar1 XOR (iVar1 <80);
程序的运行结果为 TRUE。
1-1-2. 置位优先与复位优先触发器指令
指令名称 功能介绍
SR 置位优先触发器:置位双稳态触发器,置位优先
RS 复位优先触发器:复位双稳态触发器,复位优先
在继电器系统中,一个继电器的若干对触点是同时动作的。在 PLC 中,指令是一条一条执行的,
指令的执行是有先后次序的,没有“同时”执行的指令。所以线圈格式的置位、复位指令有优先级。SR
触发器与 RS 触发器的置位输入和复位输入在同一条指令里,置位和复位输入谁在指令输入端的下面谁
后执行。SR 触发器为“置位优先”型触发器,当置位信号(SET1)和复位信号(RESET)同时为 1 时,
触发器最终为置位状态;RS 触发器为“复位优先”型触发器,当置位信号(SET)和复位信号(RESET1)
同时为 1 时,触发器最终为复位状态。
1-1-2-1. 置位优先触发器 SR
功能:置位双稳态触发器,置位优先。逻辑关系:Q1=(NOT RESET AND Q1) OR SET1,其中 SET1
为置位信号,RESET 为复位信号。
语法:当 SET1 为“1”时,不论 RESET 是否为“1”,Q1 输出都为“1”;当 SET1 为“0”时,
如果 Q1 输出为“1”,一旦 RESET 为“1”,Q1 输出立刻复位为“0”。如果 Q1 输出为“0”,不论
RESET 为“1”或者“0”,Q1 输出保持为“0”。
1-1-2-2. 复位优先触发器 RS
功能:复位双稳态触发器,复位优先。逻辑关系:Q1=NOT RESET1 AND (Q1 OR SET),其中 SET
为置位信号,RESET1 为复位信号。
语法:当 RESET1 为“1”时,不论 SET 是否为“1”,Q1 输出都为“0”;当 RESET1 为“0”时,
如果 Q1 输出为“0”,一旦 SET 为“1”,Q1 输出立刻置位为“1”。如果 Q1 输出为“1”,不论 SET
为“1”或者“0”,Q1 输出保持为“1”。
1-1-3. 数据单元类型
指令名称 功能介绍
R_TRIG 上升沿触发
F_TRIG 下降沿触发
边沿检测指令用来检测 BOOL 信号的上升沿(信号由 0---->1)和下降沿(信号由 1---->0)的变化,
在每个扫描周期中把信号状态和它在前一个扫描周期的状态进行比较,若不同则表明有一个跳变沿。因
此,前一个周期里的信号状态必须被存储,以便能和新的信号状态相比较。
1-1-3-1. 上升沿检测 R_TRIG
功能:用于检测上升沿。
语法:当 CLK 从“0”变为“1”时,该上升沿检测器开始启动,Q 输出先由“1”然后输出变为“0”,
持续一个 PLC 运算周期;如果 CLK 持续保持为“1”或者“0”,Q 输出一直保持为“0”。
1-1-3-2. 下降沿检测 F_TRIG
功能:用于检测下降沿。
语法:当 CLK 从“1”变为“0”时,该下降沿检测器开始启动,Q 输出先由“1”然后输出变为“0”,
持续一个 PLC 运算周期;如果 CLK 持续保持为“1”或者“0”,Q 输出一直保持为“0”。
1-2. 定时器指令
1-2-1. 脉冲定时器 TP
功能:脉冲定时。
语法:在定时器的输入端 IN 从“0”变为“1”时,定时器则启动,无论定时器输入端 IN 如何变化,
定时器的实际运行时间都是用户所定义的 PT 时间,在定时器运行时,其输出端 Q 的输出信号为“1”。
输出端 ET 为输出端 Q 提供定时时间。定时从 T#0s 开始,到设置的 PT 时间结束。当 PT 时间到时,ET
会保持定时时间直到 IN 变为“0”时。如果在达到 PT 定时时间之前输入 IN 已经变成“0”,输入 ET
编程 T#0s,PT 定时的时刻。为了复位该定时器,只需要设置 PT=T#0s 即可。
1-2-2. 通电延时定时器 TON
功能:通电延时定时。
语法:在定时器的输入端 IN 从“0”变为“1”时,定时器则启动,当到达定时时间 PT 且输入端的
信号 IN 始终维持在“1”时,其输出端 Q 的输出信号为“1”,如果在定时器的定时时间到达之前,输
入端 IN 信号由“1”变为“0”时,则定时器复位,下一个 IN 信号的上升沿定时器重启。输出端 ET 提
供定时时间,延时从 T#0s 开始,到设置的 PT 时间结束。PT 到达时,ET 将会保持定时时间直到 IN 变
为“0”为止。如果在达到 PT 定时时间之前,输入 IN 变为“0”,输出 ET 立即变为 T#0s。为了重启定
时器,可以设置 PT=T#0s,也可以将 IN=FALSE。
1-2-3. 断电延时定时器 TOF
功能:断电延时定时。
语法:在定时器的输入端 IN 从“0”变为“1”时,定时器的 Q 输出信号为“1”,定时器的启动输
入端变为“0”时,定时器则启动,只要当定时器在运行,其输出 Q 一直为“1”,当到达定时时间时,
输出端 Q 复位,在到达定时时间之前,如果定时器的输入端返回为“1”,则定时器复位,输出端的 Q
输出信号保持为“1”。输出端 ET 提供定时时间,延时从 T#0s 开始到设置的定时时间 PT 结束。当 PT
时间到时,ET 将保持定时时间直到输入 IN 返回“1”为止。如果在达到 PT 定时时间之前,输入 IN 变
为“1”,输出 ET 立即变为 T#0s。为了复位定时器,可以设置将 PT=T#0s。
1-2-4. 实时时钟 RTC
功能:在给定时间启动,返回当前日期和时间。
语法:RTC(EN, PDT, Q, CDT)表示:当 EN 为“0”,输出变量 Q 以及 CDT 为“0”相关时间为
DT#1970-01-01-00:00:00。一旦 EN 为“1”,PDT 给予的时间将会被设置,并且将会以秒进行计数。一
旦 EN 被复位为 FALSE,CDT 将会被复位为初始值 DT#1970-01-01-00:00:00。请注意,PDT 时间只上升
沿有效。
1-3. 计数器指令
1-3-1. 增计数器 CTU
当计数器输入端 CU 的信号从状态“0”变为状态“1”时,当前计算值加 1,并通过输出端 CV 进
行显示,第一次调用时(复位输入 RESET 信号状态为“0”),输入 PV 端的计数为默认值,当计数达
到上限 32767 后,计数器将不会再增加,CU 也不会再起作用。
当复位输入端 RESET 的信号状态为“1”时,计数器的 CV 和 Q 都为“0”,只要输入端 RESET 状
态为“1”,上升沿对 CU 就不再起作用。当 CV 值大于或等于 PV 时,输出端 Q 为“1”。此时 CV 仍
可继续累加,输出端 Q 继续为输出“1”。
增量功能块。输入变量 CU 和复位 RESET 以及输出变量 Q 是布尔类型的,输入变量 PV 和输出变量
CV是 WORD 类型。CV将被初始化为0,如果复位RESET是 TRUE真的。如果 CU 有一个上升沿从 FALSE
变为 TRUE,CV 提升 1,Q 将返回 TRUE,如此 CV 将大于或等于上限 PV。
1-3-2. 减计数器 CTD
当减计数器输入端的 CD 信号从“0”变为状态“1”时,当前计数值减 1,并在输出端上 CV 显示
当前值,第一次调用时(需要将加载输入端信号 LOAD 初始化,需要将其从“0”变为状态“1”,再变
为状态“0”后功能块才能生效),输入 PV 端的计数为默认值,当计数达到 0 后,计数值将不在会减少,
CD 也不再起作用。
当加载输入端信号 LOAD 为“1”时,计数值将设定成 PV 默认值,只要加载输入端信号 LOAD 状
态为“1”,输入端的 CD 上升沿就不起作用。当 CV 值小于或等于 0 时,输出端 Q 为“1”。
1-3-3. 增/减双向计数器 CTUD
当加计数输入端的 CU 信号从“0”变为状态“1”时,当前计数值加 1,并在输出 CV 上显示。
当减计数输入端的 CD 的信号状态从“0”变为状态“1”时,当前计数值减 1,并在输出端 CV 上
显示。如果两个输入端都是上升沿,当前计数值将保持不变。
当计数值达到上限值 32767 后,加计数输入端 CU 的上升沿不再起作用。因此即使加计数输入端 CU
出现上升沿,其数值也不会增加。同理,当计数值达到下极限值 0 后,减计数输入端 CD 也不会在起作
用,因此,即使减计数输入端 CD 出现上升沿,计数值也不会减少。
当 CV 值大于或等于 PV 值时,输出 QU 为“1”。当 CV 值小于或等于 0 时,输出 QD 为“1”。
例:创建一个 POU,使用增/减双向计数器 CTUD,当 bUp 有上升沿信号时,计数值增加,bDown
有上升沿信号时,计数值减小。bReset 用于数据复位,具体代码如下:
VAR
bUp: BOOL;
bDown: BOOL;
bReset: BOOL;
bLoad: BOOL;
CTUD_0: CTUD;
END_VAR
CTUD_0(
CU:= bUp,
CD:= bDown,
RESET:=bReset ,
LOAD:= bLoad,
PV:= ,QU=> ,QD=> ,CV=> );
1-4. 数据处理指令
1-4-1-1. 二选一指令 SEL
功能:通过选择开关,在两个输入数据中选择一个作为输出,选择开关为 FALSE 时,输出为第一
个输入数据,选择开关为 TRUE 时,输出为第二个数据。
语法:其文本化语言语法格式如下:
OUT := SEL(G, IN0, IN1)
参数 G 必须是布尔变量。如果 G 是 FALSE,则返回值的结果是 IN0,如果 G 是 TRUE,则返回值
的结果为 IN1。
例:创建一个 POU,当输入值 bInput 为 FALSE,输出为 3,反之,当其为 TRUE 时,输出为 4,具
体实现程序如下:
VAR
iVar1:INT:=3;
iVar2:INT:=4;
iOutVar: INT;
bInput: BOOL;
END_VAR
iOutVar:=SEL(bInput,iVar1,iVar2);
程序运行后输出结果为 3。
1-4-1-2. 取最大值 MAX
功能:最大值函数。在多个输入数据中选择最大值作为输出。
语法:其文本化语言语法格式如下所示:
OUT := MAX(IN0, …,INn)
IN0,INn 以及 OUT 可以是任何数据类型。
创建一个 POU,iOutVar 的输入值为 iVar1 和 iVar2 中的较大者,具体实现程序如下:
VAR
iVar1:INT:=30;
iVar2:INT:=60;
iOutVar: INT;
END_VAR
iOutVar:=MAX(iVar1,iVar2);
程序运行后输出结果为 60。
1-4-1-3. 取最小值 MIN
功能:最小值函数。在多个输入数据中选择最小值作为输出。
语法:其文本化语言语法格式如下所示:
OUT := MIN(IN0, …,INn)
IN0,INn 以及 OUT 可以是任何数据类型。
例:创建一个 POU,iOutVar 的输入值为 iVar1 和 iVar2 中的较小者,具体实现程序如下:
VAR
iVar1:INT:=30;
iVar2:INT:=60;
iOutVar: INT;
END_VAR
iOutVar:=MIN(iVar1,iVar2);
程序运行后输出结果为 30。
1-4-1-4. 限制值 LIMIT
功能:限制值输出。判断输入数据是否在最小值和最大值之间,若输入数据在两者之间,则直接把
输入数据作为输出数据进行输出。若输入数据大于最大值,则把最大值作为输出值。若输入数据小于最
小值,则把最小值作为输出值。
语法:其文本化语言语法格式如下,
OUT := LIMIT(Min, IN, Max)
IN,Min,Max 以及返回值可以是任何数据类型。
例:创建一个 POU,使用限制值指令,无论输入为何值,确保输出值在能在 30~80 的范围内。具
体实现程序如下:
VAR
iVar:INT:=90;
iOutVar: INT;
END_VAR
iOutVar:=limit(30,iVar,80);
最小值输入值为 30,最大值输入值为 80,实际输入值为 90,大于最大值,故最终输出以最大值 80
为输出,故最终结果为 80。
1-4-1-5. 多选一 MUX
功能:多路器操作。通过控制数在多个输入数据中选择一个作为输出。
语法:其文本化语言语法格式如下:
OUT := MUX(K, IN0,...,INn)
IN0,...,INn 以及返回值可以是任何变量类型。但是 K 必须为 BYTE、WORD、DWORD、LWORD、
SINT、USINT、INT、UINT、DINT、LINT、ULINT 或者 UDINT。MUX 从变量组中选择第 K 个数据输出。
例:创建一个 POU,使用多选一指令,根据输入控制数 iVar 选择最终要输出的数据。具体实现程
序如下:
VAR
iVar:INT:=1;
iOutVar: INT;
END_VAR
iOutVar:=MUX(iVar,30,40,50,60,70,80);
最终输出结果为 40,因为数据排序是从第 0 个元素开始累积。
如果数据超出范围,最终数据按最后一个数据为输出,如例子中,将 iVar 的值设定为 10,最终的
输出结果为 80。如果 iVar 为-1,最终输出值还是为 80。