ASCII_SR

Envia uma sequência de strings ASCII por um canal de comunicação qualquer e, opcionalmente, recebe os pacotes de resposta de cada comando. É um bloco de função (mantém estado entre scans; requer instância) e exige o recurso PPE desabilitado.

Biblioteca: HI_STD · Namespace: HILS · Tipo: bloco de função

Bloco de função

                ASCII_SR
          +-------------------+
 BOOL ----|START      TRANS_EV|---- BOOL
          |                   |
USINT ----|COMM_SRC    DONE_EV|---- BOOL
          |                   |
 BOOL ----|ADD_CRLF    CUR_LEN|---- UINT
          |                   |
 BOOL ----|REM_CRLF     RESULT|---- INT
          |                   |
 BOOL ----|REPLY              |
          |                   |
 BOOL ----|NEXT               |
          |                   |
  INT ----|REC_TMO            |
          |                   |
USINT ----|PACKS_N            |
          |                   |
  INT ----|CUR_CMD ---------- |----
          |                   |
      ----|PACKS ------------ |----
          |                   |
      ----|T_BUF ------------ |----
          +-------------------+

O bloco envia a sequência de strings especificadas em PACKS ao equipamento conectado no canal de comunicação indicado em COMM_SRC. O processo é iniciado pela ativação da entrada START, que deve permanecer ativa durante todo o tempo de execução.

Para cada string enviada, a saída TRANS_EV gera um pulso notificando o fim da transação — que pode incluir ou não a espera de uma string de resposta. Quando há resposta, o bloco a retorna em T_BUF e aguarda que o usuário sinalize (pela entrada NEXT) para continuar o processo. No evento de TRANS_EV, a saída CUR_CMD retorna o índice do comando executado (iniciando em 0) e, quando especificada a espera por resposta, CUR_LEN retorna o tamanho da string de resposta inserida em T_BUF.

Ao final da execução das PACKS_N transações definidas, um pulso na saída DONE_EV indica o fim do processo. Caso ocorra algum erro, as saídas TRANS_EV e DONE_EV são ativadas retornando em RESULT o código de falha associado.

Durante o envio da string corrente, se ADD_CRLF estiver ativa, o bloco acrescenta os caracteres CR e LF ao final da string antes de enviá-la. Durante a recepção da resposta, se REM_CRLF estiver ativa, o bloco remove da resposta todos os caracteres CR e LF encontrados.

O canal de comunicação (COMM_SRC) é identificado por um valor numérico. Os identificadores disponíveis (do tipo COMM_CHAN_ID) são, por exemplo, HILS.COM1_PORT_ID .. HILS.COM8_PORT_ID para os canais seriais e HILS.SOCK0_PORT_ID .. HILS.SOCK7_PORT_ID para os sockets Ethernet. Cada equipamento suporta apenas um subconjunto desses recursos; consulte o manual do equipamento.

Atenção

O parâmetro PACKS, apesar de ser do tipo ANY, deve ser um vetor de strings para a operação correta do bloco. Pode-se passar um vetor de strings de qualquer tamanho suportado, inclusive um vetor de um único elemento ([0..0]) quando for necessário o envio de uma única string.

Importante

Para a utilização deste bloco, o recurso PPE deve estar desabilitado. Pode-se desabilitar e habilitar esse recurso por meio da variável de sistema F197.

Nota

Após a transição de subida em START, a primeira string do vetor PACKS é enviada. Se REPLY estiver habilitada, o bloco aguarda a resposta com um timeout que pode ser estendido por REC_TMO; T_BUF conterá a resposta e CUR_LEN o seu tamanho (nº de bytes). Se, no ciclo seguinte, NEXT estiver inativa, o bloco aguarda a ativação de NEXT para que a aplicação trate a resposta antes de prosseguir. Independentemente de falhas em uma transação, o bloco prossegue até enviar todas as strings de PACKS_N ou até a aplicação desativar START.

Parâmetros

Nome

Direção

Tipo

Padrão

Faixa / Unidade

Descrição

START

IN

BOOL

FALSE

—

Inicia uma transação de comunicação (ativa na transição de subida) e deve permanecer ativa durante toda a execução.

COMM_SRC

IN

USINT

0

0 .. 23

Canal de comunicação a ser utilizado (identificador COMM_CHAN_ID, ex.: HILS.COM1_PORT_ID).

ADD_CRLF

IN

BOOL

FALSE

—

Adiciona CR-LF ao final de cada comando enviado.

REM_CRLF

IN

BOOL

FALSE

—

Remove CR-LF de cada resposta recebida.

REPLY

IN

BOOL

FALSE

—

Habilita a espera pela resposta do comando corrente.

NEXT

IN

BOOL

FALSE

—

Habilita o tratamento do próximo comando.

REC_TMO

IN

INT

0

0 .. 32767 ms

Timeout aguardado pela resposta (0 = default do canal).

PACKS_N

IN

USINT

0

—

Número de pacotes (strings) a serem enviados.

TRANS_EV

OUT

BOOL

FALSE

—

Pulso gerado quando o comando corrente foi tratado.

DONE_EV

OUT

BOOL

FALSE

—

Pulso gerado no fim do tratamento de todos os comandos ou na ocorrência de falha.

CUR_LEN

OUT

UINT

0

bytes

Tamanho do buffer de resposta do comando corrente.

RESULT

OUT

INT

0

RET_CODE

Código de retorno da transação (ver Códigos de retorno).

CUR_CMD

IN_OUT

INT

0

—

[OUT] Índice do comando corrente tratado (inicia em 0); [IN] índice do comando anterior ao próximo a ser processado.

PACKS

IN_OUT

ANY

—

—

Vetor de strings com os comandos ASCII a serem enviados.

T_BUF

IN_OUT

ANY

—

—

Buffer utilizado na transação corrente (envio do comando e recepção da resposta).

Códigos de retorno

RESULT é do tipo RET_CODE. Use os identificadores com o namespace HILS (ex.: HILS.CO_REC_TMO). Códigos mais comuns deste bloco:

Código

Identificador

Significado

0

SUCCESS

Transação executada com sucesso.

5

GL_INV_PAR

Parâmetro(s) inválido(s).

10

GL_CMD_TMO

Timeout na execução do comando.

68

CO_TRA_BUF_OVL

Overflow no buffer de transmissão.

69

CO_REC_BUF_OVR

Overrun no buffer de recepção.

70

CO_COM_ERR

Erro genérico de comunicação.

74

CO_INV_CHA

Canal de comunicação inválido.

79

CO_REC_TMO

Timeout na recepção da resposta.

87

CO_COM_BRO

Comunicação interrompida.

Lista completa dos códigos de retorno: RET_CODE - Códigos de retorno do firmware G5.

Pré-condições

  • O recurso PPE deve estar desabilitado (variável de sistema F197).

  • O canal indicado em COMM_SRC deve estar configurado e disponível no equipamento.

  • PACKS deve ser um vetor de strings com pelo menos PACKS_N elementos.

Observações

  • TRANS_EV fica ativa por um ciclo ao fim de cada transação, indicando que RESULT, CUR_CMD (e CUR_LEN/T_BUF, quando há resposta) estão atualizados para avaliação.

  • Para executar a próxima transação, ative NEXT; o ciclo se repete até processar as PACKS_N strings.

  • O processo pode ser cancelado a qualquer momento desativando START.

Ver também

COMM_SEND_REC, COMM_REC_SEND, BUF_TO_STRING, CONFIG_SERIAL

Exemplo

Clique aqui para baixar a tabela de variáveis

Código ST

VAR
    AT1        : HILS.ASCII_SR;                                    (* Instância do bloco de envio de comandos AT *)
    MY_RET     : INT := 0;                                        (* Código de retorno do envio do comando *)
    MY_CNT     : USINT := 0;                                      (* Contador de comandos enviados *)
    MY_NEXT    : BOOL := TRUE;                                    (* Habilita envio do próximo comando *)
    MY_START   : BOOL := FALSE;                                   (* Habilita execução do bloco *)
    RDY_CNT    : USINT;                                           (* Contador de transações concluídas *)
    END_CNT    : USINT;                                           (* Contador de ciclos concluídos *)
    CMDS       : ARRAY [0..1] OF STRING[10] := ['AT+CGMM','ATI9'];(* Comandos a serem enviados *)
    BUF        : ARRAY [0..49] OF USINT;                          (* Resposta dos comandos recebidos *)
    CMD_NO     : USINT := 2;                                      (* Quantidade de comandos AT *)
    AT_RESP    : STRING;                                          (* Resposta corrente convertida em string *)
    AT_RESP_VEC : ARRAY [0..1] OF STRING;                         (* Respostas por índice de comando *)
END_VAR

AT1(  (* ASCII_SR *)
  START    := MY_START,
  COMM_SRC := HILS.COM1_PORT_ID,
  ADD_CRLF := TRUE,
  REM_CRLF := FALSE,
  REPLY    := TRUE,
  NEXT     := MY_NEXT,
  REC_TMO  := 3000,
  PACKS_N  := CMD_NO,
  PACKS    := CMDS,
  T_BUF    := BUF
  );

(* Trata fim de transação *)
IF (AT1.TRANS_EV) THEN

  IF (AT1.RESULT = 0) THEN

    RDY_CNT := RDY_CNT + 1;

    (* copia a resposta para uma string de visualização *)
    HILS.BUF_TO_STRING(AT1.CUR_LEN, BUF, AT_RESP);
    AT_RESP_VEC[AT1.CUR_CMD] := AT_RESP;

    MY_RET := AT1.RESULT;
    IF (AT1.CUR_CMD <= (AT1.PACKS_N - 1)) THEN
      MY_NEXT := TRUE;
    END_IF;
    MY_CNT := MY_CNT + 1;
  ELSE
    (* trata erro no processo *)
  END_IF;

  (* Trata fim de execução do ciclo *)
  IF (AT1.DONE_EV) THEN
    MY_START := FALSE;
    MY_CNT   := 0;
    END_CNT  := END_CNT + 1;
  END_IF;

END_IF;