西门子PLC有三种编程语言:梯形图、STL、SCL。今天我们就来介绍一下STL编程语言,这种语言类似汇编语言是西门子一直以来的精华所在,它所能完成的功能内容基本为100%。STL强大的地方在于不仅可以随意处理梯形图中的各种逻辑关系,而且在运算以及指针等复杂的功能上有着梯形图无法做到的功能可谓得STL者得天下。

STL指令及其结构:

一条完整的STL指令,应该包含指令符+操作数。其中的操作数是指令要执行的目标,也就是指令要进行操作的地址。

0af0eafd45b39988f8abe0ee30445ac0.png

注:有些语句指令不带操作数,他们的操作对象是唯一的,如

NOT//对逻辑操作结果(RLO)取反

操作数:

操作数包含两个要素:标识符和标识参数。标识符用来表示操作数存放区域及操作位数;标识参数用来表示操作数在该存储区域内的具体位置。

3844589039d072e0325f4e4abaaba439.png

辅助标识符包括有:X(位),B(字节),W(字—2字节),D(双字—4字节)

操作数表示:

存储区域

字节

双字

输入映像区(I)

I

IB

IW

ID

输出映像区(Q)

Q

QB

QW

QD

内部存储区(M)

M

MB

MW

MD

物理输入区(PI)

PIW

PID

物理输出区(PQ)

PQW

PQD

数据块(DB)

DBX

DBB

DBW

DBD

数据块(DI)

DIX

DIB

DIW

DID

临时堆栈(L)

L

LB

LW

LD

2c6072600e1aedb358cf12144ceb27b6.png

a3c011711a540655e6f2371881e9bf83.png

寻址方式:

立即寻址:对常数或常量的寻址方式,操作数本身包含在指令中

SET     //把RLO(逻辑操作结果)置1

L  27   //把整数27装入累加器1

L  C#0100  //把BCD码常数0100装入累加器1

直接寻址:在指令中直接给出操作数的存储单元地址

A  IO.O    //对输入位I0.0进行“与”逻辑操作

S  L20.0   //把本地数据位L20.0置1

=  M115.3   //将RLO的内容传给位存储区域中的位M115.3

L  DB1.DBD12  //把数据块DB1双字DBD12的内容传送给累加器1

存储器间接寻址:标识参数由一个存储器给出,存储器的内容对应标识参数的值(该值又称为地址指针),这种寻址方式能动态改变操作数存储器的地址,常用于程序循环过程中的寻址。

A  I[MD2]    //对由MD2指出的输入位进行“与”逻辑操作,如MD2值为2#0000 0000 0000 0000 0000 0000 01010110表示I10.6

L  IB[DID4]   //将由双子DID4指出的输入字节装入累加器1,如DID4值为2#0000 00000000 0000 0000 0000 0101 0000表示对IB10操作

OPN  DB[MW2]   //打开由字MW2指出的数据块,如MW2为3,则打开DB3

寄存器间接寻址:在S7中有两个地址寄存器(AR1和AR2),地址寄存器的内容+偏移量=地址指针

L  P#8.6     //将P#8.6装入累加器1

LAR1       //将累加器1的内容传送至地址寄存器1

L  P#10.0    //将P#10.0装入累加器1

LAR2       //将累加器1的内容传送至地址寄存器2

A  I[AR1,P#1.0]  //AR1+偏移量(9.6)

=  Q[AR2,P#4.1]  //AR2+偏移量(14.1)

LAR1  P##STAT53 //把指针指向STAT53

L  0    //把0装入累加器1

T  DIW[AR1,P#0.0]  //把地址寄存器内指向起始地址区的数据赋值

在线监视:

很多时候需要在线监视当前程序运行状况,下图是STL语言在线监视页面:

c520d9eb16fe7826c751037461fe9a1c.png

系统的内部寄存器:

S7CPU的寄存器有7个:

2个32位累加器

累加器1(ACCU1)主

累加器2(ACCU2)辅

2个32位地址寄存器

地址寄存器1(AR1)

地址寄存器2(AR2)

2个32位数据块地址寄存器

共享数据块DB

背景数据块DI

1个16位状态字寄存器

状态位

状态字:

状态字表示CPU执行指令时所具有的状态,用户程序可以访问和检测状态字,并可以根据状态字中的某些位决定程序的走向和进程。

cf08dfcb3eea84d775bd75d97a91efb3.png

逻辑操作结果(RLO):Result of LogicOperation

位置:状态字位“1”

作用:存储位逻辑指令或算术比较指令的结果

  • 无法判断RLO的数值时,可以查看FC位的情况;

  • 在某行按下F1,就知道该指令是否影响RLO。

STA

  • STA表示被操作的数据的当前状态,0或者1;

  • 仅表示布尔量;

  • 非布尔量的数值以ACCU累加器表示

例如第一句为AN  I0.0

II0.0现在为0,则STA为0;但是执行完毕后RLO为1

DI和DB的区别:

  • 访问背景数据块是,使用DI;当然也可以使用DB访问背景数据块;

  • DI的作用体现在:在单个FB里面调用了除背景数据块外的其他数据块时,可以用DB进行操作。如下图:可以用

OPN DB#DBMS  //以后所有的DB*操作均是对应DB4,而所有的DI*操作均是对应DB433

ae4b95a1e5384f95cdfb983d23b60783.png

L变量的对应关系:

很多程序里用到了L变量,此时我们可以到程序块的接口变量中TEMP里面去查看,寻求对应关系,如果找不到对应关系也无所谓,就当一个临时变量来使用就可以了,需要注意的是L变量只能在本程序块中使用,一旦出了本程序就被释放,是一种局部变量。

a9ac9814a42421d9cd88c523282e8168.png

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐