PLC-Robot 2026-1-18 08:10:05 | 显示全部楼层 | 阅读模式
抖音粉丝群1
『7x24小时有问必答』

AI浪潮下的计算机行业——从业者现状与未来展望
西门子PLC STL指令合集
在西门子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主流),但是对于有些年代的旧设备中还是会看到。感兴趣可以研究一下,并非坏事。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

Copyright 2010-2015. All rights reserved. 

微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码