在西门子PLC中经常看到STL语句,其实对于STL语句在电脑输入软件之前是最常用的编程器,也就是我们以前用的手持式编程器,所以像在西门子PLC早期的产品中经常看到STL编程语句,并且像老一辈的工程师更擅长STL语句编程。比如在之前S7-300/400PLC中经常看到,下面就常用的STL指令进行整理分享。
位逻辑指令 (Bit Logic Instructions)
位逻辑指令主要用于处理布尔量(0和1),比如PLC的输入(INPUT)点和输出点(OUTPUT),以及内存位块位DBX等。
1:A <位地址>:与 (AND) 操作。检查指定地址的位状态是否为1
,并将结果与逻辑运算结果(存储在 RLO - 逻辑运算结果中)进行AND操作。
例:A I0.0
// 检查输入 I0.0 是否为 1,结果与当前 RLO 进行 AND。类似于梯形图指令中的常开点串联操作。
2:O <位地址>:或(OR)操作。检查指定地址的位状态是否为1
,并将结果与逻辑运算结果(RLO)进行OR(或)操作。
例:O M10.0
// 检查内存位 M10.0 是否为 1,结果与当前 RLO 进行 OR。相当于梯形图指令中的常开点并联操作。
3:AN <位地址>:与非 (AND NOT) 操作。检查指定地址的位状态是否为0
(即取反),并将结果与逻辑运算结果(RLO)进行AND操作。
例:AN Q4.1
// 检查输出 Q4.1 是否为 0(即 NOT Q4.1),结果与当前 RLO 进行 AND。
4:ON <位地址>:或非 (OR NOT) 操作。检查指定地址的位状态是否为0
(即取反),并将结果与逻辑运算结果(RLO)进行OR操作。例:ON DB1.DBX2.5
// 检查数据块 DB1 中位 2.5 是否为 0,结果与当前RLO进行 OR。
5:= <位地址>:赋值 (Assign)。将当前的逻辑运算结果(RLO)赋值给指定的位地址(如 Q, M, DBX)。
例:= Q5.0
// 将 RLO 的值(1 或 0)直接输出到 Q5.0。
6:S <位地址>:置位 (Set)。如果 RLO 为1
,则将指定的位地址置位为1
(并保持为 1,直到被复位)。RLO=0 时无操作。
例:S M20.1
// 如果 RLO=1,则将 M20.1 置为 1 并保持
7:R <位地址>:复位 (Reset)。如果RLO为1
,则将指定的位地址复位为0
(并保持为 0,直到被置位)。RLO=0 时无操作。
例:R T1
// 如果 RLO=1,则将定时器 T1 的位复位为 0 (停止计时)。
8:NOT:取反 (Invert RLO)。将当前的逻辑运算结果(RLO)取反(1 变 0,0 变 1)。
例:NOT
// RLO 反转。
9:X <位地址>:异或 (XOR)。将指定地址的位状态与当前的 RLO 进行XOR操作,结果存回 RLO。
例:X I1.2
// RLO 与 I1.2 进行异或运算,新结果存入 RLO。
10:XN <位地址>:与非异或 (XOR NOT)。先将指定地址的位状态取反,再与当前的 RLO 进行XOR操作,结果存回 RLO。
例:XN M30.3
// RLO 与 (NOT M30.3) 进行异或运算,新结果存入 RLO。
11:SAVE:保存 RLO 到 BR 寄存器。将当前的逻辑运算结果(RLO)保存到状态字的 BR (二进制结果) 位中。常用于在 FC/FB 结束时指示执行结果是否有错误(BR=1 通常表示无错误/程序正常执行)。
例:SAVE
// 将 RLO 的值复制到 BR 位。
二、定时器指令 (Timer Instructions)
1:SP <定时器号>:脉冲定时器 (Pulse Timer)。当 RLO 从0跳变到 1(上升沿)时启动定时器。定时器在设定时间TV
内输出1
。如果在设定时间内 RLO 变为 0,定时器立即停止输出。
例:L S5T#2S
// 将时间值 2 秒加载到 ACCU1中。
SP T1
// 使用 ACCU1 中的时间值启动脉冲定时器 T1
2:SE <定时器号>:扩展脉冲定时器 (Extended Pulse Timer)。上升沿启动定时器。定时器在设定时间TV
内持续输出1,即使 RLO 在定时结束前变回 0
,不影响TV时间内持续输出,直至到达设定时间。
例:L SST#500MS
// 加载 500 毫秒
SE T2
// 启动扩展脉冲定时器 T2
3:SD <定时器号>:接通延时定时器 (On-Delay Timer)。上升沿启动定时器。仅在设定时间TV
结束后且 RLO 仍为 1时,定时器才输出1
。如果在定时结束前 RLO 变为 0,定时器停止并复位。
例:L T#10S
// 加载 10 秒
SD T3
// 启动接通延时定时器 T3
4:SS <定时器号>:保持型接通延时定时器 (Retentive On-Delay Timer)。上升沿启动定时器。定时器累加运行时间直到达到设定值TV
,然后输出1
。RLO 变为 0不会复位累积的时间值,必须用R
指令复位。
例:L T#1M30S
// 加载 1 分 30 秒
SS T4
// 启动保持型接通延时定时器 T4
5:SF <定时器号>:断开延时定时器 (Off-Delay Timer)。当 RLO 从 1 跳变到 0(下降沿)时启动定时器。定时器输出1
,直到设定时间TV
结束。
例:L T#5S
// 加载 5 秒
SF T5
// 启动断开延时定时器 T5 (在 RLO 下降沿时启动)
6:FR <定时器号>:使能定时器 (Enable Timer)。当 RLO 为1
时,允许定时器在下次启动条件满足时重新启动(清除之前的运行值)。不是启动定时器。
例:FR T1
// 如果 RLO=1,则允许 T1 被重新启动
7:L <定时器号>:加载定时器当前值。将指定定时器的当前时间值 (16 位 BCD 格式) 加载到 ACCU1。
例:L T1
// 将 T1 的当前剩余时间值 (BCD) 加载到 ACCU1
8:LC <定时器号>:以整型格式加载定时器当前值。将指定定时器的当前时间值 (32 位整型格式,单位为毫秒) 加载到 ACCU1。
例:LC T1
// 将 T1 的当前剩余时间值 (ms 整数) 加载到 ACCU1
三、计数器指令 (Counter Instructions)
1:S <计数器号>:置位计数器预置值 (Set Counter Preset Value)。将 ACCU1 低字(16 位)中的预置值 (PV - Preset Value) 装载到指定的计数器中。不是启动计数!通常与CU
/CD
配合使用。
例:L 100
// 将预置值 100 加载到 ACCU1
S C10
// 将 ACCU1 中的预置值 100 设置到计数器 C10
2:CU <计数器号>:加计数 (Count Up)。在 RLO 的上升沿(0 变 1),计数器当前值 (CV - Current Value) 增加 1。当 CV >= PV 时,计数器位为 1。
例:CU C10
// 在 RLO 上升沿,C10 的 CV 加 1
3:CD <计数器号>:减计数 (Count Down)。在 RLO 的上升沿(0 变 1),计数器当前值 (CV - Current Value) 减少 1。当 CV <= 0 时,计数器位为 0。
例:CD C10
// 在 RLO 上升沿,C10 的 CV 减 1
4:FR <计数器号>:使能计数器 (Enable Counter)。当 RLO 为 1
时,允许计数器在下次 CU/CD 上升沿时响应计数脉冲(清除之前的边沿检测记忆)。不是计数!
例:FR C10
// 如果 RLO=1,则允许 C10 在下一个 CU/CD 上升沿计数
5:L <计数器号>:加载计数器当前值。将指定计数器的当前计数值 (CV - 16 位 BCD 格式) 加载到 ACCU1。
例:L C10
// 将 C10 的当前计数值 (BCD) 加载到 ACCU1。
6:LC <计数器号>:以整型格式加载计数器当前值。将指定计数器的当前计数值 (CV - 32 位整型格式) 加载到 ACCU1。
例:LC C10
// 将 C10 的当前计数值 (整数) 加载到 ACCU1
装载与传送指令 (Load and Transfer Instructions)
1:L <地址>:加载 (Load)。将源操作数(常数、内存地址如 I, Q, M, DB, T, C 的值等)的值加载到 ACCU1。原 ACCU1 内容移到 ACCU2。
例:L 25
// 将常数 25 加载到 ACCU1
L MW10
// 将内存字 MW10 的值加载到 ACCU1
L DB1.DBD20
// 将数据块 DB1 中双字地址 20 的值加载到 ACCU1
L T1
// 将定时器 T1 的当前时间值 (BCD) 加载到 ACCU1 (见定时器)
L C5
// 将计数器 C5 的当前计数值 (BCD) 加载到 ACCU1 (见计数器)
2:T <地址>:传送 (Transfer)。将 ACCU1 的内容传送到指定的目标地址(如 Q, M, DB, PIW, PQW 等)。ACCU1 内容不变。
例:T QW8
// 将 ACCU1 的值传送到输出字 QW8
T DB2.DBW30
// 将 ACCU1 的值传送到数据块 DB2 中字地址 30
T PQD256
// 将 ACCU1 的值传送到外设输出双字 PQD256 (直接写输出模块)
3:LC <地址>:以整型格式加载 (Load in Integer Format)。主要用于定时器和计数器(见上文),将时间值(ms)或计数值(整数)加载到 ACCU1。也可用于加载某些特殊地址的整型值。
例:LC T1
// 将 T1 的当前时间值 (ms 整数) 加载到 ACCU1
LC C5
// 将 C5 的当前计数值 (整数) 加载到 ACCU1
五、 比较指令 (Comparison Instructions)
这些指令用于比较两个值(通常来自 ACCU1 和 ACCU2),并根据比较结果设置 RLO(为 1 表示条件满足)。
1:==I:等于 (整数) (Equal - Integer)。比较 ACCU1 和 ACCU2 低字的内容(16 位整数)。如果相等,RLO=1。
例:L MW20 // 加载 MW20 值到 ACCU1
L 100 // 加载常数 100 到 ACCU1 (原 ACCU1 值移入 ACCU2)
==I // 比较 ACCU2 (MW20) 和 ACCU1 (100) 是否相等,结果设置 RLO
2:<>I:不等于 (整数) (Not Equal - Integer)。
3:>I:大于 (整数) (Greater Than - Integer)。
4:
5:>=I:大于等于 (整数) (Greater Than or Equal - Integer)。
6:<=I:小于等于 (整数) (Less Than or Equal - Integer)。
7:==D:等于 (双整数) (Equal - Double Integer)。比较 ACCU1 和 ACCU2 的内容(32 位双整数)。
8:<>D, >D, =D, <=D:类似上面的双整数比较。
9:==R:等于 (浮点数) (Equal - Real)。比较 ACCU1 和 ACCU2 的内容(32 位 IEEE 浮点数)。
10:<>R, >R, =R, <=R:类似上面的浮点数比较。
六、算数运算指令,常用的加减乘除等这些。
七、转换指令,主要用于数制转换。
八、移位和循环指令,这个与正常梯形图SCL等用法一致。
还有一些指令如程序控制,数据块等。STL算是相对来说比较底层的PLC语言,虽然强大但是却比较复杂,随着技术发展需要,慢慢的在现在常用的博图中已经不是主流编程语言(LAD/SCL主流),但是对于有些年代的旧设备中还是会看到。