肇庆西门子代理商 肇庆西门子代理商
SLD 3 形成数据块存储地址指针
T LD8 在临时本地数据双字LD 8中存入数据块存储地址指针
L #CH_LEN 以要读入的通道数为循环次数,装入累加器1
2.读模拟输入量程序
一些S7-300的应用系统中,使用8通道模拟量模块采集信号,当模块数量较多时,读模拟输入量就很繁琐。下面给出一个通用程序FC100,利用它可以方便地把模拟量读回并顺序存入数据块,因为模入模块的起始地址、通道数、存储数据块号及数据在数据块中的存储起始位置均是可变的,所以可在调用FC100时灵活确定。
Address Decl. Symbol Data Type Initial Value Comment
0.0 In PIW_Addr INT
模入模块通道起始地址
2.0 In CH_LEN INT
要读入的通道数
4.0 In DB_No INT
存储数据块号
6.0 In DBW_Addr INT
存储在数据块中的字地址
Network 1
L #DB_No
T LW0
OPN DB[LW 0] 打开存储数据块
L #PIW_Addr
SLD 3 形成模入模块地址指针
T LD4 在临时本地数据双字LD 4中存储模入模块地址指针
L #DBW_Addr
SLD 3 形成数据块存储地址指针
T LD8 在临时本地数据双字LD 8中存入数据块存储地址指针
L #CH_LEN 以要读入的通道数为循环次数,装入累加器1
NEXT:T LW 0
将累加器1的值,装入循环次数计数器LW0(临时本地数据字)
L LD4
LARl 将模入模块地址指针装入地址寄存器1
L PIW[ARl,P#0.0] 读模入模块装入累加器1
T LW2 将累加器1的内容暂存入缓冲器LW2
L LD8
LARl 将数据块存储地址指针装入地址寄存器1
L LW2 将数据缓冲器中的内容装入累加器1
T DBW[ARl,P#0.0] 将累加器的内容存入数据块中
L LD4 AR1+P#2.0→AR1
+ L#16 ACC1+(.._0001_0 000)
T LD4 调整模入模块地址指针,指向下一通道Acc1+(bb bbbb bxxx)
L LD8
+ L#16
T LD8 调整数据块存储地址指针,指向下一存储地址
L LW0 将循环次数计数器LW0的值装入累加器1
LOOP NEXT 若累加器1的值不为0,将累加器减1继续循环;若累加
器为0,则结束
在FC100中,寄存器间接寻址指令OP NDB[LW0]使用了临时本地数据LW0,变量表中定义的临时变量虽然也在L堆栈中,但不能用于存储器间接寻址,从这里也可看出临时本地数据与临时变量的区别。程序中LW2、LD4和LD8起的作用也可用临时变量替代。
下面举例说明如何使用FC100。在某应用中,机架0的4号槽位安装了一个8模入模块(地址256开始),若要将前6个模入模块信号读回,存入DB50.DBW10开始的6个字单元中,可按下列形式调用FC100:
CALL FC100
PIW_Add:= 256
CH_LEN:= 6
DB_No:= 50
DBW_Addr:= 10
数据块
数据块定义在S7 CPU存储器中,用户可在存储器中建立一个或多个数据块。每个数据块可大可小,但CPU对数据块数量及数据总量有限制,如对于CPU314,用作数据块的存储器多为8 KB(8192 B),用户定义的数据总量不能超出这个限制。对数据块必须遵循先定义后使用的原则,否则,将造成系统错误。
1. 定义数据块
在编程阶段和运行程序中都能定义数据块。大多数数据块是在编程阶段用STEP 7开发软件包定义的,定义内容包括数据块号及块中的变量(包括变量符号名、数据类型以及初始值等),定义完成后,数据块中变量的顺序及类型决定了数据块的数据结构,变量的数量决定了数据块的大小。数据块在使用前,必须作为用户程序的一部分下载到CPU中。
如果确实需要,还可以在程序运行中动态定义一个数据块。动态定义时,数据块号是自动产生的,数据块在存储器中的位置是动态分配的。由于要定义的数据块有可能大于CPU存储器(用于数据块的部分)的剩余空间,因此动态定义过程有可能失败
2.访问数据块
在用户程序中可能定义了许多数据块,而每个数据块中又有许多不同类型的数据,因此,访问时需要明确数据块号和数据块中的数据类型与位置。根据明确数据块号的不同方法,可以用多种方法访问数据块中的数据。
直接在访问指令中写明数据块号,如:
L DB5.DBW10
T DB10.DBW20
L Motor_1.Speed 符号地址
另一种方法是“先打开后访问”。在访问某数据块中的数据前,先“打开”这个数据块,也就是将数据块号(数据块的起始地址)装入数据块寄存器。这样,存放在数据块中的数据就可利用数据块起始地址加偏移量的方法来访问。如:
OPN DB5
L DBW10
OPN DB10
T DBW20
在打开一个数据块时,先打开的数据块会自动关闭(没有专门的数据块关闭指令)。由于有两个数据块寄存器(DB和DI寄存器),因此,多可同时打开两个数据块。一个作为背景数据块,数据块的起始地址存储在DI寄存器中;另一个作为共享数据块,数据块的起始地址存储在DB寄存器中。打开背景数据块,在调用FB时可以自动实现。由于调用FB时使用DI寄存器,因此,一般不在FB程序中用OPN DI n指令打开数据块。
3. 背景数据块和共享数据块
背景数据块和共享数据块有不同的用途。任何FB、FC或OB均可读写存放在共享数据块中的数据。背景数据块是FB运行时的工作存储区,它存放FB的部分运行变量。调用FB时,必须一个相关的背景数据块。作为规则,只有FB块才能访问存放在背景数据块中的数据。
一般情况下,每个FB都有一个对应的背景数据块,一个FB也可以使用不同的背景数据块。如果几个FB需要的背景数据*相同,为节省存储器,则可以定义成一个背景数据块,供它们分别使用。通过多重背景数据,也可将几个FB需要的不同的背景数据定义在一个背景数据块中,以优化数据管理。各数据块在CPU的存储器中是没有区别的,只是由于打开方式不同,才在打开时有背景数据块和共享数据块之分。原则上,任何一个数据块都可以当作共享数据块或背景数据块使用,实际上,一个数据块由FB当作背景数据块使用时,必须与FB的要求格式相符。
数据结构