FS_WRITE_DATA_FILE
Escreve dados no formato binário em um arquivo previamente aberto no sistema de
arquivos do SDCARD; o arquivo precisa estar aberto em modo OPEN_FILE_WRITE ou
OPEN_FILE_APPEND. É um bloco de função (mantém estado entre scans; requer
instância).
Biblioteca: HI_STD · Namespace: HILS · Tipo: bloco de função
Bloco de função
FS_WRITE_DATA_FILE
+-------------------+
BOOL ----|START DONE|---- BOOL
| |
INT ----|FD RESULT|---- INT
| |
INT ----|DATA_LEN |
| |
----|DATA_VALUE --------|----
+-------------------+
Coloque START em TRUE para iniciar a escrita; se START voltar a FALSE antes
do fim da operação, o bloco é resetado. A saída DONE emite um pulso de um único
scan ao término da execução; nesse instante consulte RESULT para verificar o
êxito da operação. Os DATA_LEN bytes lidos a partir de DATA_VALUE são gravados
no arquivo indicado por FD, cujo descritor é obtido em FS_OPEN_FILE.
Nota
Antes de utilizar este bloco de função, consulte no manual do controlador utilizado se o mesmo possui suporte para sistema de arquivos no SDCARD.
Parâmetros
Nome |
Direção |
Tipo |
Padrão |
Faixa / Unidade |
Descrição |
|---|---|---|---|---|---|
START |
IN |
BOOL |
FALSE |
— |
Ativa (TRUE) a execução do bloco; em FALSE antes do término reseta o bloco. |
FD |
IN |
INT |
0 |
— |
Descritor do arquivo a ser escrito (obtido em FS_OPEN_FILE). |
DATA_LEN |
IN |
INT |
0 |
bytes |
Quantidade de bytes a serem escritos no arquivo. |
DATA_VALUE |
IN_OUT |
ANY |
— |
— |
Variável/estrutura de origem dos dados a serem escritos no arquivo. |
DONE |
OUT |
BOOL |
FALSE |
— |
Pulso (um scan) indicando o término da execução. |
RESULT |
OUT |
INT |
0 |
RET_CODE |
Código de retorno da execução (ver Códigos de retorno). |
Códigos de retorno
RESULT é do tipo RET_CODE. Use os identificadores com o namespace HILS
(ex.: HILS.RE_WRITE_ERR). 0 (SUCCESS) indica sucesso; qualquer valor
diferente de 0 indica falha. Códigos mais comuns deste bloco:
Código |
Identificador |
Significado |
|---|---|---|
0 |
SUCCESS |
Escrita realizada com sucesso. |
5 |
GL_INV_PAR |
Parâmetro(s) inválido(s). |
7 |
GL_UNA_CMD |
Comando não disponível ou não implementado. |
8 |
GL_INV_STT |
Estado corrente inválido. |
10 |
GL_CMD_TMO |
Timeout na execução do comando. |
11 |
GL_CMD_CAN |
Comando cancelado. |
16 |
GL_CMD_PEND |
Tratamento do comando pendente. |
24 |
RE_NOT_AVA |
Sem suporte para o sistema de arquivos ou SDCARD não detectado. |
25 |
RE_INV_LEN |
Tamanho do buffer do recurso inválido. |
27 |
RE_RES_EMP |
Buffer do recurso vazio. |
32 |
RE_WRITE_ERR |
Falha no processo de escrita do recurso. |
33 |
RE_NOT_INIT |
Recurso não inicializado. |
167 |
FS_CORRUPT |
Sistema de arquivo pode estar corrompido. |
168 |
FS_INV_OPER_MODE |
Modo de operação incompatível com o estado do arquivo. |
177 |
FS_INVALID_HANDLE |
Handle de arquivo aberto inválido. |
Lista completa dos códigos de retorno: RET_CODE - Códigos de retorno do firmware G5.
Pré-condições
O controlador deve ter suporte a sistema de arquivos no SDCARD.
O arquivo deve estar aberto em modo
OPEN_FILE_WRITEouOPEN_FILE_APPEND(ver FS_OPEN_FILE), eFDdeve conter o descritor válido retornado.DATA_LENdeve corresponder ao tamanho, em bytes, dos dados emDATA_VALUE.
Observações
Todos os bytes da variável/estrutura apontada por
DATA_VALUEsão gravados; para estruturas, todos os campos são escritos na ordem de declaração.RESULTsó deve ser consultado no pulso deDONE.
Ver também
FS_OPEN_FILE, FS_CLOSE_FILE, FS_READ_DATA_FILE, FS_CREATE_FILE
Exemplo
Clique aqui para baixar a tabela de variáveis
Código ST
TYPE
REG_DATA : STRUCT (* Estrutura criada pelo usuário *)
ALARME : BOOL := FALSE;
RUN : BOOL := FALSE;
MODO_OPERACAO : INT := 0;
CICLO_CORRENTE : INT := 0;
CICLO_TOTAL : INT := 0;
ORDEM_SERVICO : UINT := 0;
CODIGO_PRODUTO : UINT := 0;
TEMPERATURA : REAL := 0;
UMIDADE : REAL := 0;
PRESSAO : REAL := 0;
VAZAO : REAL := 0;
VELOCIDADE : REAL := 0;
END_STRUCT;
END_TYPE
VAR
TEMPERATURA : REAL; (* Variável tipo REAL *)
ACIONAMENTO : ARRAY [0..3] OF INT; (* Vetor de INT *)
DATA_USER : REG_DATA; (* Estrutura criada pelo usuário *)
VET_USER : ARRAY [0..3] OF REG_DATA; (* Vetor de uma estrutura criada pelo usuário *)
MY_START : BOOL := FALSE; (* Ativação da função *)
FILE_FD : INT; (* Descritor do arquivo a ser escrito *)
WRITE_FILE : HILS.FS_WRITE_DATA_FILE; (* Instância do bloco "FS_WRITE_DATA_FILE" *)
END_VAR
//======================================================
// Exemplo de escrita de uma variável REAL
//======================================================
// Preenche parâmetro a ser salvo no arquivo
TEMPERATURA := 25.5; // [REAL]
// Preenche parâmetros para a chamada do bloco de função
FILE_FD := 0; // Descritor do arquivo
MY_START := TRUE; // Ativação do bloco da função
(* ... *)
// Exemplo de ativação do bloco de função FS_WRITE_DATA_FILE
WRITE_FILE(
START := MY_START, // [BOOL] Ativação da função
FD := FILE_FD, // [INT] Descritor do arquivo
DATA_LEN := 4, // [INT] Tamanho de dados a serem escritos no arquivo (bytes)
DATA_VALUE := TEMPERATURA // [ANY] Base de dados p/ obter os dados a serem salvos no arquivo
);
// Aguarda término da execução da função do sistema de arquivos
if (WRITE_FILE.DONE) then
MY_START := FALSE; // Reseta ativação da função
// Testa código de retorno da execução da função
if (WRITE_FILE.RESULT = HILS.SUCCESS) then
// ... Função executada com sucesso
else
// ... Erro na execução da função
end_if;
end_if;
(* ... *)
//======================================================
// Exemplo de escrita de um vetor de INT
//======================================================
// Preenche parâmetro a ser salvo no arquivo
//
// OBS.: Este vetor possui um tamanho de 8 bytes
ACIONAMENTO[0] := 100; // [INT]
ACIONAMENTO[1] := 200; // [INT]
ACIONAMENTO[2] := 300; // [INT]
ACIONAMENTO[3] := 400; // [INT]
// OBS: Todos os valores dentro da estrutura são escritos no arquivo
(* ... *)
// Preenche parâmetros para a chamada do bloco de função
FILE_FD := 0; // Descritor do arquivo
MY_START := TRUE; // Ativação do bloco da função
(* ... *)
// Exemplo de ativação do bloco de função FS_WRITE_DATA_FILE
WRITE_FILE(
START := MY_START, // [BOOL] Ativação da função
FD := FILE_FD, // [INT] Descritor do arquivo
DATA_LEN := 8, // [INT] Tamanho de dados a serem escritos no arquivo (bytes)
DATA_VALUE := ACIONAMENTO // [ANY] Base de dados p/ obter os dados a serem salvos no arquivo
);
// Aguarda término da execução da função do sistema de arquivos
if (WRITE_FILE.DONE) then
MY_START := FALSE; // Reseta ativação da função
// Testa código de retorno da execução da função
if (WRITE_FILE.RESULT = HILS.SUCCESS) then
// ... Função executada com sucesso
else
// ... Erro na execução da função
end_if;
end_if;
(* ... *)
//=========================================================
// Exemplo de escrita de uma estrutura criada pelo usuário
//=========================================================
// Preenche parâmetros a serem salvos no arquivo
//
// OBS.: Esta estrutura possui um tamanho de 32 bytes
DATA_USER.ALARME := TRUE; // [BOOL]
DATA_USER.RUN := TRUE; // [BOOL]
DATA_USER.MODO_OPERACAO := 1; // [INT]
DATA_USER.CICLO_CORRENTE := 1; // [INT]
DATA_USER.CICLO_TOTAL := 1; // [INT]
DATA_USER.ORDEM_SERVICO := 10; // [UINT]
DATA_USER.CODIGO_PRODUTO := 10; // [UINT]
DATA_USER.TEMPERATURA := 1.11; // [REAL]
DATA_USER.UMIDADE := 1.11; // [REAL]
DATA_USER.PRESSAO := 1.11; // [REAL]
DATA_USER.VAZAO := 1.11; // [REAL]
DATA_USER.VELOCIDADE := 1.11; // [REAL]
(* ... *)
// Preenche parâmetros para a chamada do bloco de função
FILE_FD := 0; // Descritor do arquivo
MY_START := TRUE; // Ativação do bloco da função
(* ... *)
// Exemplo de ativação do bloco de função FS_WRITE_DATA_FILE
WRITE_FILE(
START := MY_START, // [BOOL] Ativação da função
FD := FILE_FD, // [INT] Descritor do arquivo
DATA_LEN := 32, // [INT] Tamanho de dados a serem escritos no arquivo (bytes)
DATA_VALUE := DATA_USER // [ANY] Base de dados p/ obter os dados a serem salvos no arquivo
);
// Aguarda término da execução da função do sistema de arquivos
if (WRITE_FILE.DONE) then
MY_START := FALSE; // Reseta ativação da função
// Testa código de retorno da execução da função
if (WRITE_FILE.RESULT = HILS.SUCCESS) then
// ... Função executada com sucesso
else
// ... Erro na execução da função
end_if;
end_if;
(* ... *)
//======================================================================
// Exemplo de escrita de um vetor de uma estrutura criada pelo usuário
//======================================================================
// Preenche parâmetros a serem salvos no arquivo
//
// OBS.: Cada estrutura possui um tamanho de 32 bytes, e portanto um vetor
// de 4 estruturas possui tamanho total de 128 bytes
VET_USER[0].ALARME := TRUE; // [BOOL]
VET_USER[0].RUN := TRUE; // [BOOL]
VET_USER[0].MODO_OPERACAO := 1; // [INT]
VET_USER[0].CICLO_CORRENTE := 1; // [INT]
VET_USER[0].CICLO_TOTAL := 1; // [INT]
VET_USER[0].ORDEM_SERVICO := 10; // [UINT]
VET_USER[0].CODIGO_PRODUTO := 10; // [UINT]
VET_USER[0].TEMPERATURA := 1.11; // [REAL]
VET_USER[0].UMIDADE := 1.11; // [REAL]
VET_USER[0].PRESSAO := 1.11; // [REAL]
VET_USER[0].VAZAO := 1.11; // [REAL]
VET_USER[0].VELOCIDADE := 1.11; // [REAL]
VET_USER[1].ALARME := TRUE; // [BOOL]
VET_USER[1].RUN := TRUE; // [BOOL]
VET_USER[1].MODO_OPERACAO := 2; // [INT]
VET_USER[1].CICLO_CORRENTE := 2; // [INT]
VET_USER[1].CICLO_TOTAL := 2; // [INT]
VET_USER[1].ORDEM_SERVICO := 20; // [UINT]
VET_USER[1].CODIGO_PRODUTO := 20; // [UINT]
VET_USER[1].TEMPERATURA := 2.22; // [REAL]
VET_USER[1].UMIDADE := 2.22; // [REAL]
VET_USER[1].PRESSAO := 2.22; // [REAL]
VET_USER[1].VAZAO := 2.22; // [REAL]
VET_USER[1].VELOCIDADE := 2.22; // [REAL]
VET_USER[2].ALARME := TRUE; // [BOOL]
VET_USER[2].RUN := TRUE; // [BOOL]
VET_USER[2].MODO_OPERACAO := 3; // [INT]
VET_USER[2].CICLO_CORRENTE := 3; // [INT]
VET_USER[2].CICLO_TOTAL := 3; // [INT]
VET_USER[2].ORDEM_SERVICO := 30; // [UINT]
VET_USER[2].CODIGO_PRODUTO := 30; // [UINT]
VET_USER[2].TEMPERATURA := 3.33; // [REAL]
VET_USER[2].UMIDADE := 3.33; // [REAL]
VET_USER[2].PRESSAO := 3.33; // [REAL]
VET_USER[2].VAZAO := 3.33; // [REAL]
VET_USER[2].VELOCIDADE := 3.33; // [REAL]
VET_USER[3].ALARME := TRUE; // [BOOL]
VET_USER[3].RUN := TRUE; // [BOOL]
VET_USER[3].MODO_OPERACAO := 4; // [INT]
VET_USER[3].CICLO_CORRENTE := 4; // [INT]
VET_USER[3].CICLO_TOTAL := 4; // [INT]
VET_USER[3].ORDEM_SERVICO := 40; // [UINT]
VET_USER[3].CODIGO_PRODUTO := 40; // [UINT]
VET_USER[3].TEMPERATURA := 4.44; // [REAL]
VET_USER[3].UMIDADE := 4.44; // [REAL]
VET_USER[3].PRESSAO := 4.44; // [REAL]
VET_USER[3].VAZAO := 4.44; // [REAL]
VET_USER[3].VELOCIDADE := 4.44; // [REAL]
// OBS: Todos os valores dentro da estrutura são escritos no arquivo
(* ... *)
// Preenche parâmetros para a chamada do bloco de função
FILE_FD := 0; // Descritor do arquivo
MY_START := TRUE; // Ativação do bloco da função
(* ... *)
// Exemplo de ativação do bloco de função FS_WRITE_DATA_FILE
WRITE_FILE(
START := MY_START, // [BOOL] Ativação da função
FD := FILE_FD, // [INT] Descritor do arquivo
DATA_LEN := 128, // [INT] Tamanho de dados a serem escritos no arquivo (bytes)
DATA_VALUE := VET_USER // [ANY] Base de dados p/ obter os dados a serem salvos no arquivo
);
// Aguarda término da execução da função do sistema de arquivos
if (WRITE_FILE.DONE) then
MY_START := FALSE; // Reseta ativação da função
// Testa código de retorno da execução da função
if (WRITE_FILE.RESULT = HILS.SUCCESS) then
// ... Função executada com sucesso
else
// ... Erro na execução da função
end_if;
end_if;
(* ... *)