发布于 2008-12-14 19:20:55
0楼
你的思路是对的,但程序有问题。我觉得要考虑的是:每个模拟量的上下限是否一样,如不,你还得在数据据块中加进去。你可以创建一个FB将FC105的输入及输出各个变量,在FB的声明表中组态成一个STRUCT类型,然后再创建ARRAY变量,下标就是你所采集的最大的变量数,这个ARRAY变量的类型就是STRUCT变量。然后读取ARRAY的首址,利用循环指令,采用指针,读写各个变量到TEMP变量中,然后再将TEMP变量送FC105的实参中进行处理。
第二种方法采用SFC20,我编了一下,可能细节的地方不一定对,思路就是这样(假设采样有50个变量):
FUNCTION_BLOCK FB 1
TITLE =
VERSION : 0.1
VAR
DB_I_1 : STRUCT
IN_DB : INT ;
LO_LIM_DB : REAL ;
BIPOLAR : BOOL ;
RET_VAL_DB : WORD ;
OUT_DB : REAL ;
HI_LIM_DB : REAL ;
END_STRUCT ;
DB_IN : ARRAY [1 .. 50 ] OF STRUCT
DB_I : STRUCT
IN_DB : INT ;
LO_LIM_DB : REAL ;
BIPOLAR : BOOL ;
RET_VAL_DB : WORD ;
OUT_DB : REAL ;
HI_LIM_DB : REAL ;
END_STRUCT ;
END_STRUCT ;
END_VAR
VAR_TEMP
Temp1 : ANY ;
Temp2 : ANY ;
Temp3 : INT ;
Temp4 : INT ;
END_VAR
BEGIN
NETWORK
TITLE =
L 1;
T #Temp3;
M001: LAR1 P##Temp1;
L B#16#10;
T LB [AR1,P#0.0];
L B#16#2;
T LB [AR1,P#1.0];
L 18;
T LW [AR1,P#2.0];
L 0;
T LW [AR1,P#4.0];
L P##DB_I_1;
T LD [AR1,P#6.0];
LAR1 P##Temp2;
L B#16#10;
T LB [AR1,P#0.0];
L B#16#2;
T LB [AR1,P#1.0];
L 18;
T LW [AR1,P#2.0];
L 0;
T LW [AR1,P#4.0];
L #Temp3;
L P##DB_IN;
*D ;
T LD [AR1,P#6.0];
CALL "BLKMOV" (
SRCBLK := #Temp2,
RET_VAL := #Temp4,
DSTBLK := #Temp1);
NETWORK
TITLE =
CALL "SCALE" (
IN := #DB_I_1.IN_DB,
HI_LIM := #DB_I_1.HI_LIM_DB,
LO_LIM := #DB_I_1.LO_LIM_DB,
BIPOLAR := #DB_I_1.BIPOLAR,
RET_VAL := #DB_I_1.RET_VAL_DB,
OUT := #DB_I_1.OUT_DB);
NETWORK
TITLE =
L 1;
T #Temp3;
LAR1 P##Temp1;
L B#16#10;
T LB [AR1,P#0.0];
L B#16#2;
T LB [AR1,P#1.0];
L 18;
T LW [AR1,P#2.0];
L 0;
T LW [AR1,P#4.0];
L P##DB_I_1;
T LD [AR1,P#6.0];
LAR1 P##Temp2;
L B#16#10;
T LB [AR1,P#0.0];
L B#16#2;
T LB [AR1,P#1.0];
L 18;
T LW [AR1,P#2.0];
L 0;
T LW [AR1,P#4.0];
L #Temp3;
L P##DB_IN;
*D ;
T LD [AR1,P#6.0];
CALL "BLKMOV" (
SRCBLK := #Temp1,
RET_VAL := #Temp4,
DSTBLK := #Temp2);
L 50;
L #Temp3;
JC END;
L 1;
+I ;
T #Temp3;
JU M001;
END: NOP 1;
END_FUNCTION_BLOCK
学如逆水行舟,不进则退