DTC_MAN
Gerencia uma cache de dados (fila FIFO de blocos de dados, DIB) mantida pela
aplicação em um vetor de INT: reporta ocupação, sinaliza cheia/vazia/alterada
e permite limpar o conteúdo. É um bloco de função (requer instância) e opera
em conjunto com as funções DTC_PUSH / DTC_REMOVE / DTC_GET_INFO /
DTC_GET_VALUE, que inserem e recuperam blocos da mesma cache.
Biblioteca: HI_STD · Namespace: HILS · Tipo: bloco de função
Bloco de função
DTC_MAN
+--------------+
BOOL ----|START CHNG|---- BOOL
| |
BOOL ----|CLR EMPTY|---- BOOL
| |
| FULL|---- BOOL
| |
| BLOCKS|---- INT
| |
| TOTAL|---- INT
| |
| PERC|---- UINT
| |
| RESULT|---- INT
| |
INT ----|CACHE ------- |----
+--------------+
Sendo um bloco de função, DTC_MAN requer uma instância declarada pela aplicação
e opera sobre o vetor CACHE (IN_OUT), reportando ocupação e sinalizando os estados
cheia/vazia/alterada da cache de dados.
Parâmetros
Nome |
Direção |
Tipo |
Dimensão |
Padrão |
Faixa / Unidade |
Descrição |
|---|---|---|---|---|---|---|
START |
IN |
BOOL |
— |
TRUE |
— |
Habilita o gerenciador. Com START inativo a cache não é alterada pelo bloco. |
CLR |
IN |
BOOL |
— |
FALSE |
— |
Quando ativo, limpa a cache removendo todos os blocos. |
CACHE |
IN_OUT |
INT |
[*] |
— |
— |
Vetor de |
CHNG |
OUT |
BOOL |
— |
FALSE |
— |
Indica que houve alteração na cache. |
EMPTY |
OUT |
BOOL |
— |
FALSE |
— |
Não há blocos a coletar. Funcional mesmo com START inativo. |
FULL |
OUT |
BOOL |
— |
FALSE |
— |
Cache cheia; novas inserções via |
BLOCKS |
OUT |
INT |
— |
0 |
0 .. TOTAL |
Nº de blocos (DIB) presentes na cache (um vetor/string ocupa mais de um bloco). |
TOTAL |
OUT |
INT |
— |
0 |
blocos |
Nº máximo de blocos suportado pela cache. Funcional mesmo com START inativo. |
PERC |
OUT |
UINT |
— |
0 |
0 .. 100 % |
Percentual de ocupação da cache. |
RESULT |
OUT |
INT |
— |
0 |
RET_CODE |
Código de retorno da última interação (ver Códigos de retorno). |
Estrutura da cache (CACHE)
CACHE é um vetor de INT mantido como uma fila (FIFO) de blocos de dados (DIB).
O primeiro elemento guarda o número de blocos inseridos; os demais são divididos em
blocos de 10 INT:
CACHE : ARRAY [0..X] OF INT
+----------------------------------------------+ -----
| Nº de blocos inseridos na cache (0..N) | (1 INT)
+----------------------------------------------+
| Bloco de dados 1 | (10 INT)
+----------------------------------------------+
| Bloco de dados 2 | (10 INT)
+----------------------------------------------+ N = (X-1)/10
| : |
+----------------------------------------------+
| Bloco de dados N | (10 INT)
+----------------------------------------------+ -----
Número máximo de blocos: N = (X - 1) / 10, onde X é o número de elementos do
vetor fornecido. Cada bloco (DIB) contém: identificador numérico do dado, valor (ou
valores, se vetor), data/hora de geração e tipo de dado. Um escalar nativo (exceto
STRING) ocupa 1 DIB; vetores e strings ocupam 2 ou mais DIB.
Códigos de retorno
RESULT é do tipo RET_CODE: 0 ( HILS.SUCCESS ) indica operação bem-sucedida;
qualquer valor diferente de 0 indica falha na operação da cache (consulte o
catálogo de códigos RET_CODE do ambiente).
Ver também
Exemplo
Clique aqui para baixar a tabela de variáveis
Código ST
VAR
MY_EV : BOOL := FALSE; (* Flag para inserção de dado na cache *)
MY_DATA : UDINT := 1234; (* valor a ser inserido na cache de dados *)
MY_ID : INT := 1000; (* identificador do dado no portal de telemetria *)
RET : INT; (* código de retorno da função de envio de dados para o portal *)
WCACHE : ARRAY [0..200] OF INT; (* Cache com capacidade de 20 blocos. *)
MAN : HILS.DTC_MAN; (* Gerenciador da cache de dados. *)
END_VAR
(* --- Gerenciador de blocos de dados --- *)
MAN(
(* START := , *) (* [BOOL] Ativa gerenciamento da cache *)
(* CLR := , *) (* [BOOL] Limpa o conteúdo da cache de dados *)
CACHE := WCACHE (* [INT] FIFO - área onde serão armazenados os registros *)
);
(* Quando MY_EV for true e a cache estiver com menos de 50%, envia MY_DATA ao portal *)
IF (MY_EV AND (MAN.PERC < 50)) THEN
RET := HILS.WGATE_SEND(ID := MY_ID, DATA := MY_DATA, MSGS := WCACHE);
IF RET = 0 THEN
MY_EV := FALSE;
END_IF;
END_IF;
(* ... *)