西门子PLC中的STL指令合集

发布时间:2025-08-16
来源:
点击:20

在西门子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,然后输出1RLO 变为 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主流),但是对于有些年代的旧设备中还是会看到。

免责声明:本站所提供信息均来源于网友提供或网络搜集,由本站编辑整理,如涉及版权问题,请联系本站管理员予以更改或删除
旗下服务
在线课程 现场培训
微信公众号
© 2019-现在 版权所有,并保留所有权利。ICP备案证书号:沪ICP备18011190号-4

沪公网安备 31011202007493号