可以通过不同方式在SCL/CFC中访问资料块。
可以在块中访问资料块号,输入管脚填起始地址。如果使用的是BLOCK_DB资料型别,也可以直接连线资料块。优点是,CFC中可以直接显示符号名。 可以将资料块与一个ANY指标相连。优点是,可以连线资料块中的某个变数,这个变数可以作为访问资料的起始点。例程包括这两种情况的SCL程式码。以下是程式中使用的资料块。
通过资料块号访问
注意,BLOCK_DB资料型别仅针对于输入引数。如果要使用输出引数或者输入输出引数,必须使用不同的资料型别,并通过转换功能块后再访问资料。(比如 INT_TO_BLOCK_DB)。
通过ANY指标访问
ANY指标格式在STEP 7线上帮助中有具体说明(标题: "Format of the ANY parameter type")。
FUNCTION_BLOCK FB602
VAR_INPUT
DB_ANY : ANY; // Any-Pointer of the Data-Block
AnyPointer AT DB_ANY : STRUCT
BYTE0 :BYTE; // Byte 0
TYP :BYTE; // Byte 1 Data-/Parametertype
ANZ :WORD; // Byte 2+3 Lenth of data
DBNO :WORD; // Byte 4+5 DB-Number
BZ :DWORD; // Byte 6 to 10 Pointer
END_STRUCT;
tmpAnyPointer AT DB_ANY : ARRAY [0..9] OF BYTE;
END_VAR
VAR_OUTPUT
Q_DB : INT;
Q_INT1 : INT;
Q_REAL1 : REAL;
Q_WORD1 : WORD;
Q_BOOL1 : BOOL;
END_VAR
VAR_TEMP
MEM_AREA : BYTE;
Offset : INT;
END_VAR
MEM_AREA := tmpAnyPointer[6]; // this Byte contains the memory area
IF (MEM_AREA 16#84) THEN
RETURN; // quit block in case the area isn't DB
END_IF;
Offset := DWORD_TO_INT(SHR (IN:=AnyPointer.BZ, N:=3)); // Offset address
Q_DB := WORD_TO_INT (AnyPointer.DBNO);
// absolute addressing from Offset address
Q_INT1 := WORD_TO_INT (WORD_TO_BLOCK_DB (AnyPointer.DBNO).DW[Offset + 0]);
Q_REAL1 := DINT_TO_REAL (DWORD_TO_DINT(WORD_TO_BLOCK_DB (AnyPointer.DBNO).DD[Offset + 2]));
Q_WORD1 := WORD_TO_BLOCK_DB (AnyPointer.DBNO).DW[Offset + 6];
Q_BOOL1 := WORD_TO_BLOCK_DB (AnyPointer.DBNO).DX[Offset + 8,0];
END_FUNCTION_BLOCK
下图是CFC图表中的功能块。
资料块号在第一个块中引数化。STRT_ADD是定义了访问资料块的起始地址,在此例中是第一个结构变数的起始地址。
资料块与第二个功能块相连线。STRT_ADD引数定义了第二个结构变数作为起始地址。在第三个块中,ANY指标直接和第二个结构变数的起始地址相连。