四川达州西门子PLC模块销售
一些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 符号地址
另一种方法是“先打开后访问"。在访问某数据块中的数据前,先“打开"这个数据块,也就是将数据块号(数据块的起始地址)装入数据块寄存器。这样,存放在数据块中的数据就可利用数据块起始地址加偏移量的方法来访问。如: