APP下载

如何通过不同方式在SCL/CFC中访问资料块?

消息来源:baojiabao.com 作者: 发布时间:2024-06-02

报价宝综合消息如何通过不同方式在SCL/CFC中访问资料块?

可以通过不同方式在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指标直接和第二个结构变数的起始地址相连。

2019-06-30 21:49:00

相关文章