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 ID e inicializa todas as receitas com o registro DATA.

  • 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 ID do arquivo DATA_FILE para o registro DATA.

  • 4 — Escreve o registro DATA na receita de índice ID do arquivo DATA_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 / (raiz).

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_FILE deve 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), ID deve ser maior que zero.

Observações

  • Após o pulso de DONE, consulte RESULT para 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

FS_LOG_FILE, FS_READ_DATA_FILE, FS_WRITE_DATA_FILE

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;