|
我在一个案例中,用FB创建了很多相似的控制对象(FB1),他们都会输出一个请求信号,暂且叫做req_status[1..n] ,这些状态都要交给另一个FB块(FB2)作为输入信号,控制逻辑是,只要这些对象FB1中有请求,都会触发FB2中的一个动作。 普通的或运算显得有些冗长,于是我就做了个‘变态’的或运算。 这个‘或’可以处理布尔类型的数组。这样1号对象的输出叫做req_status[1], 2号对象叫 req_status[2] ...., 然后我只要把数组的名称送到这个‘变态’或的输入端,就搞定了。
上程序:
FUNCTION "Large_OR" : VOID
TITLE =
VERSION : 0.1
VAR_INPUT
sig_Array : POINTER ;
max : INT ;
DBnumber : WORD ;
END_VAR
VAR_TEMP
T_AR1 : DWORD ;
T_AR2 : DWORD ;
Cnter : INT ;
Has_one : BOOL ;
PointerWord0 : WORD ;
PointerDWord2 : DWORD ;
Db_NO : WORD ;
sum_status : BOOL ;
END_VAR
BEGIN
NETWORK
TITLE = Save the contents of the address registers AR1 and AR2
TAR1 #T_AR1;
TAR2 #T_AR2;
SET ;
R #Has_one;
NETWORK
TITLE =
L P##sig_Array;
LAR1 ;
L W [AR1,P#0.0];
T #PointerWord0;
L D [AR1,P#2.0];
T #PointerDWord2;
L #PointerDWord2;
LAR2 ;
L #DBnumber;
L 0;
==I ;
JC N2L2;
L #DBnumber;
T #Db_NO;
OPN DB [#Db_NO];
L #max;
N2L1: T #Cnter;
A DBX [AR2,P#0.0];
S #Has_one;
+AR2 P#0.1;
L #Cnter;
DEC 1;
T #Cnter;
L #Cnter;
L 0;
<=I ;
JC End;
L #Cnter;
JU N2L1;
N2L2: L #max;
N2L3: T #Cnter;
A [AR2,P#0.0];
S #Has_one;
+AR2 P#0.1;
L #Cnter;
DEC 1;
T #Cnter;
L #Cnter;
L 0;
<=I ;
JC End;
L #Cnter;
JU N2L3;
NETWORK
TITLE = Restore the contents of the address registers AR1 and AR2
End: A #Has_one;
= #sum_status;
SAVE ;
LAR1 #T_AR1;
LAR2 #T_AR2;
END_FUNCTION
新建stl source --- 编译后可见。 |
|