FS_RECIPE_FILE
Gerencia um arquivo de receitas no sistema de arquivos do SDCARD, permitindo criar o arquivo com uma quantidade fixa de receitas e ler ou escrever receitas individuais por índice; exige suporte a sistema de arquivos no SDCARD. É um bloco de função (mantém estado entre scans; requer instância).
Biblioteca: HI_STD · Namespace: HILS · Tipo: bloco de função
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.
Bloco de função
FS_RECIPE_FILE
+------------------+
INT ----|ID DONE|---- BOOL
| |
| RESULT|---- INT
| |
INT ----|CMD ------------- |----
| |
STRING ----|DATA_FILE --------|----
| |
----|DATA ------------ |----
+------------------+
O comportamento do bloco é selecionado pela entrada CMD:
1 — Força a criação do arquivo de receitas. Se já existir, é eliminado e recriado. Cria o arquivo com o número máximo de receitas indicado em
IDe inicializa todas as receitas com o registroDATA.2 — Cria o arquivo apenas se ele ainda não existir (mesmos parâmetros do comando 1); se já existir, nenhuma operação adicional é realizada.
3 — Lê a receita de índice
IDdo arquivoDATA_FILEpara o registroDATA.4 — Escreve o registro
DATAna receita de índiceIDdo arquivoDATA_FILE.10 — Formata todo o sistema de arquivos do SDCARD (não requer parâmetros adicionais).
20 — Elimina o arquivo de receitas indicado em
DATA_FILE.
Na criação (CMD = 1 ou 2), ID define a quantidade máxima de receitas (mínimo 1).
Na leitura/escrita (CMD = 3 ou 4), ID é o número da receita a acessar; a primeira
receita tem índice 1 e as demais são indexadas sequencialmente. A saída DONE emite um
pulso de um único scan ao término da execução; nesse instante RESULT deve ser
consultado.
Importante
O comando 10 inicializa todo o SDCARD, eliminando todos os seus arquivos.
Nota
Após iniciada, a execução de um comando não pode ser interrompida — prossegue até o
fim independentemente de alterações em CMD. Ao término, CMD é automaticamente
zerado.
Parâmetros
Nome |
Direção |
Tipo |
Padrão |
Faixa / Unidade |
Descrição |
|---|---|---|---|---|---|
ID |
IN |
INT |
0 |
= 1 |
Na criação: quantidade máxima de receitas (mín. 1). Na leitura/escrita: índice da receita (1 = primeira). |
CMD |
IN_OUT |
INT |
0 |
1, 2, 3, 4, 10, 20 |
Comando a executar (ver Bloco de função). Zerado automaticamente ao final. |
DATA_FILE |
IN_OUT |
STRING |
— |
até 64 caracteres |
Caminho completo do arquivo de receita; deve iniciar com |
DATA |
IN_OUT |
ANY |
— |
— |
Registro de dados da receita a ser inicializada, lida ou escrita. |
DONE |
OUT |
BOOL |
FALSE |
— |
Pulso (um scan) indicando o fim da execução do comando. |
RESULT |
OUT |
INT |
0 |
RET_CODE |
Código de retorno da última 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.SUCCESS). Códigos mais comuns deste bloco:
Código |
Identificador |
Significado |
|---|---|---|
0 |
SUCCESS |
Função executada com sucesso. |
5 |
GL_INV_PAR |
Parâmetro(s) inválido(s). |
6 |
GL_INV_CMD |
Comando inválido ou não reconhecido. |
7 |
GL_UNA_CMD |
Comando não disponível ou não implementado. |
10 |
GL_CMD_TMO |
Timeout na execução do comando. |
16 |
GL_CMD_PEND |
Tratamento do comando pendente. |
24 |
RE_NOT_AVA |
Sem suporte a sistema de arquivos ou SDCARD não detectado. |
25 |
RE_INV_LEN |
Índice da receita inválido. |
27 |
RE_RES_EMP |
Buffer do recurso vazio. |
31 |
RE_READ_ERR |
Falha no processo de leitura do recurso. |
32 |
RE_WRITE_ERR |
Falha no processo de escrita do recurso. |
33 |
RE_NOT_INIT |
Recurso não inicializado. |
39 |
RE_INV_ADDR |
Índice da receita não existe no arquivo. |
167 |
FS_CORRUPT |
Sistema de arquivos pode estar corrompido. |
168 |
FS_INV_OPER_MODE |
Modo de operação incompatível com o estado do arquivo. |
170 |
FS_WRITE_LOCK |
Arquivo já está aberto para escrita. |
173 |
FS_INVALIDNAME |
Nome do arquivo inválido. |
174 |
FS_NOTFOUND |
Arquivo não encontrado. |
176 |
FS_OPEN_LIMIT |
Número máximo de arquivos abertos alcançado. |
178 |
FS_INVALID_DIR |
Diretório inválido ou inexistente. |
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 (consulte o manual do controlador).
DATA_FILEdeve conter o caminho completo do arquivo, iniciando com/e com no máximo 64 caracteres (ex.:/Receitas.dat,/Pasta_1/Dados.dat).Na criação (
CMD= 1 ou 2),IDdeve ser maior que zero.
Observações
Após o pulso de
DONE, consulteRESULTpara verificar o êxito do comando.CMDé zerado automaticamente ao término da execução.
Recomendações para nomes de arquivos e diretórios:
Apesar do sistema de arquivos aceitar qualquer caracter para definição de um nome de arquivo ou diretório, recomenda-se utilizar apenas os tipos:
Caracteres alfabéticos de A-Z ou a-z
Caracteres numéricos de 0 - 9
Caracteres especiais . (ponto decimal) ou _ (underline)
O tamanho máximo permitido para nome do arquivo ou diretório é de 64 caracteres.
Apesar de permitir caracteres em minúscula e maiúscula na nomenclatura, o sistema não é “case sensitive”, ou seja, os nomes ‘DADOS.DAT’, ‘Dados.Dat’ e ‘dados.dat’ referem-se ao mesmo arquivo.
Essa recomendação é sugerida, pois quando o arquivo for eventualmente transferido para o computador, o arquivo/diretório deve obedecer as regras de nomeação do sistema operacional do PC.
Exemplos de nomes recomendados:
‘PASTA’
‘/Pasta_1/Pasta_2’
‘dados.dat’
‘abc_123.txt’
Exemplos de nomes não recomendados:
‘teste abc’
‘áãç’
‘abc’ e ‘ABC’ (considerados como o mesmo arquivo pelo sistema operacional windows)
Instruções de acesso para arquivos e diretórios:
O diretório inicial default do sistema de arquivo é o diretório raiz.
Para acessar diretamente o diretório raiz, utilizar ‘/’ antes do nome do arquivo ou diretório.
- Exemplos de caminho completo para diretórios:
‘/’ : Diretório raiz do sistema de arquivo
‘/PASTA_1’ : Diretório “PASTA_1” localizado na raiz do sistema de arquivo
‘/PASTA_1/PASTA_2’ : Caminho completo para diretório “PASTA_2” a partir da “PASTA_1” localizado na raiz do sistema de arquivo
‘/p1/p2/p3’ : Caminho completo para diretório “p3” a partir dos diretórios “/p1/p2”
- Exemplos de caminho completo para arquivos:
‘/dados.dat’ : Arquivo “dados.dat” localizado na raiz do sistema de arquivo
‘/PASTA_1/Log.dat’ : Arquivo “Log.dat” localizado dentro do diretório “/PASTA_1”
‘/DADOS/Jan/Dados.bak’ : Arquivo “Dados.bak” localizado dentro dos diretórios “/DADOS/Jan”
‘/P1/P2/P3/SETUP.CFG’ : Arquivo “SETUP.CFG” localizado dentro dos diretórios “/P1/P2/P3”
Ver também
Exemplo
Clique aqui para baixar a tabela de variáveis
Código ST
TYPE
(* Estrutura criada pelo usuário para mapear o conteúdo de uma receita *)
RECIPE_DATA : STRUCT
SP_TEMPERATURA : REAL := 25.5;
NIVEL_TANQUE : REAL := 90.5;
QUANTIDADE_PRODUTO : REAL := 55.25;
TEMPO_AQUECIMENTO : TIME := T#20M;
TEMPO_MISTURA : TIME := T#20M;
TEMPO_RESFRIAMENTO : TIME := T#20M;
TEMPO_ENXAGUE : TIME := T#20M;
HABILITA_DESCARREGAR : BOOL := TRUE;
HABILITA_LIMPEZA_FINAL : BOOL := FALSE;
END_STRUCT;
END_TYPE
VAR
RECIPE_FILE : HILS.FS_RECIPE_FILE; (* Instância do bloco "FS_RECIPE_FILE" *)
ID_RECIPE : INT; (* Identificador da receita *)
CMD_RECIPE : INT; (* Comando *)
FILE_NAME_RECIPE : STRING := '/Receitas.dat'; (* Nome do arquivo (caminho completo) *)
APP_DATA_RECIPE : RECIPE_DATA; (* Estrutura criada pelo usuário *)
END_VAR
//======================================================
// Exemplo de execução onde CMD = 2
//======================================================
// Preenche parâmetros para a chamada do bloco de função
ID_RECIPE := 20; // [INT] Quantidade de receitas
CMD_RECIPE := 2; // [INT] Verifica se o arquivo já existe; caso não exista, cria
// Neste caso será criado um arquivo FILE_NAME_RECIPE com 20 receitas, tendo como base
// a estrutura e os valores de APP_DATA_RECIPE.
(* ... *)
// Exemplo de ativação do bloco de função FS_RECIPE_FILE
RECIPE_FILE(
EN := TRUE, // [BOOL] Habilitação de entrada
ID := ID_RECIPE, // [INT] Identificador da receita
CMD := CMD_RECIPE, // [INT] Comando
DATA_FILE := FILE_NAME_RECIPE, // [STRING] Nome do arquivo
DATA := APP_DATA_RECIPE // [ANY] Registro com dados da receita
);
// Aguarda término da execução da função do sistema de arquivos
if (RECIPE_FILE.DONE) then
// Testa código de retorno da execução da função
if (RECIPE_FILE.RESULT = HILS.SUCCESS) then
// ... Função executada com sucesso
else
// ... Erro na execução da função
end_if;
end_if;
(* ... *)
//======================================================
// Exemplo de execução onde CMD = 3
//======================================================
// Preenche parâmetros para a chamada do bloco de função
ID_RECIPE := 10; // [INT] Identificador da receita
CMD_RECIPE := 3; // [INT] Comando para ler uma receita
// Neste caso será lido no arquivo FILE_NAME_RECIPE a receita com ID_RECIPE = 10
(* ... *)
// Exemplo de ativação do bloco de função FS_RECIPE_FILE
RECIPE_FILE(
EN := TRUE, // [BOOL] Habilitação de entrada
ID := ID_RECIPE, // [INT] Identificador da receita
CMD := CMD_RECIPE, // [INT] Comando
DATA_FILE := FILE_NAME_RECIPE, // [STRING] Nome do arquivo
DATA := APP_DATA_RECIPE // [ANY] Registro com dados da receita
);
// Aguarda término da execução da função do sistema de arquivos
if (RECIPE_FILE.DONE) then
// Testa código de retorno da execução da função
if (RECIPE_FILE.RESULT = HILS.SUCCESS) then
// ... Função executada com sucesso
// Dados lidos disponíveis na estrutura APP_DATA_RECIPE
else
// ... Erro na execução da função
end_if;
end_if;
(* ... *)
//======================================================
// Exemplo de execução onde CMD = 4
//======================================================
// Preenche parâmetros para a chamada do bloco de função
ID_RECIPE := 15; // [INT] Identificador da receita
CMD_RECIPE := 4; // [INT] Comando para escrever uma receita
// Neste caso será escrito o registro APP_DATA_RECIPE no arquivo
// FILE_NAME_RECIPE na receita com ID_RECIPE = 15
(* ... *)
// Exemplo de ativação do bloco de função FS_RECIPE_FILE
RECIPE_FILE(
EN := TRUE, // [BOOL] Habilitação de entrada
ID := ID_RECIPE, // [INT] Identificador da receita
CMD := CMD_RECIPE, // [INT] Comando
DATA_FILE := FILE_NAME_RECIPE, // [STRING] Nome do arquivo
DATA := APP_DATA_RECIPE // [ANY] Registro com dados da receita
);
// Aguarda término da execução da função do sistema de arquivos
if (RECIPE_FILE.DONE) then
// Testa código de retorno da execução da função
if (RECIPE_FILE.RESULT = HILS.SUCCESS) then
// ... Função executada com sucesso
else
// ... Erro na execução da função
end_if;
end_if;