SIDECC_ITF

Gerencia a interface de publicação de dados de vazão no servidor SIDECC-R, reconfigurando um modem compatível com o módulo Q4GA1 para conectar ao servidor, publicar os valores notificados pela aplicação e, ao ser desativado, restaurar a conexão do modem com o portal de telemetria. É 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

               SIDECC_ITF
           +-----------------+
  BOOL ----|START       READY|---- BOOL
           |                 |
  BOOL ----|PUBLISH        EV|---- BOOL
           |                 |
  BOOL ----|SW_URL     RESULT|---- INT
           |                 |
 USINT ----|COMM_SRC         |
           |                 |
  REAL ----|FLOW             |
           |                 |
    DT ----|TS               |
           |                 |
STRING ----|METER ---------- |----
           |                 |
STRING ----|USER ----------- |----
           |                 |
STRING ----|KEY ------------ |----
           +-----------------+

O bloco pressupõe uma aplicação com modem integrado compatível com o módulo Q4GA1_SIDECC_R, configurado para o portal da HI Tecnologia via MODBUS-TCP com autenticação V0 (porta 16795), em um canal de comunicação cuja cache tenha no mínimo 700 bytes. Quando ativado, o bloco desconecta o modem do portal, reconfigura a URL para o servidor SIDECC-R, abre a conexão, sinaliza prontidão e passa a publicar os valores de vazão/timestamp notificados pela aplicação. Ao ser desativado, fecha a conexão com o SIDECC-R, reconfigura o modem e reabre a conexão com o portal de telemetria.

A entrada START inicia o processo de acesso ao servidor; concluída a inicialização, a saída READY é ativada junto a um pulso em EV, com o resultado em RESULT. Com o bloco pronto, a entrada PUBLISH dispara a publicação do dado corrente e um novo pulso em EV reporta o resultado em RESULT. Após cada evento, a aplicação deve desativar PUBLISH por ao menos um ciclo de scan antes de publicar o próximo dado.

A entrada SW_URL, quando ativa, força a reconfiguração da URL e porta do modem para o servidor SIDECC-R na inicialização do bloco. A entrada COMM_SRC identifica o canal de comunicação associado ao modem por um identificador numérico:

Identificador

Valor

Canal

COM1_PORT_ID .. COM8_PORT_ID

0 .. 7

Portas seriais COM1 a COM8.

SOCK0_PORT_ID .. SOCK7_PORT_ID

8 .. 15

Sockets 0 a 7.

ETH2_SOCK0_PORT_ID .. ETH2_SOCK7_PORT_ID

16 .. 23

Sockets 0 a 7 da segunda interface Ethernet.

As entradas FLOW, TS, METER, USER e KEY são repassadas ao bloco SIDECC_R; consulte FLOW, METER, USER e KEY para detalhes.

Importante

Não altere o valor de SW_URL enquanto START estiver ativada. O canal de comunicação usado para acesso ao servidor SIDECC-R deve ter cache de no mínimo 700 bytes — com o tamanho default gerado pelo ambiente para o canal MODBUS não é possível tratar a conexão.

Nota

Se a inicialização retornar falha (RESULT diferente de zero), a aplicação deve remover o sinal START e aguardar até que READY retorne para inativa; nesta condição o bloco está apto para um novo ciclo de operação.

Parâmetros

Nome

Direção

Tipo

Padrão

Faixa / Unidade

Descrição

START

IN

BOOL

FALSE

—

Habilita a operação do bloco e inicia o acesso ao servidor SIDECC-R.

PUBLISH

IN

BOOL

FALSE

—

Dispara a publicação do dado corrente no servidor SIDECC-R.

SW_URL

IN

BOOL

FALSE

—

Reprograma a URL/porta do servidor no modem durante a inicialização do bloco.

COMM_SRC

IN

USINT

2

0 .. 23

Canal de comunicação associado ao modem (default 2 = COM3).

FLOW

IN

REAL

—

—

Vazão a ser publicada. Repassada ao bloco SIDECC_R.

TS

IN

DT

—

—

Timestamp associado à vazão. Repassado ao bloco SIDECC_R.

METER

IN_OUT

STRING

—

—

Medidor associado à conta SIDECC.

USER

IN_OUT

STRING

—

—

Usuário associado à conta SIDECC.

KEY

IN_OUT

STRING

—

—

Chave de acesso ao SIDECC.

READY

OUT

BOOL

FALSE

—

Sinaliza que o bloco foi inicializado e está apto a operar.

EV

OUT

BOOL

FALSE

—

Pulso de notificação de conclusão de um processo (inicialização ou publicação).

RESULT

OUT

INT

0

RET_CODE

Resultado do processo notificado por EV (ver Códigos de retorno).

Códigos de retorno

RESULT é atualizado a cada pulso de EV e usa os identificadores com o namespace HILS (ex.: HILS.SUCCESS):

  • 0 (HILS.SUCCESS): processo realizado com sucesso.

  • > 0: falha no processamento local para acessar o servidor (falha de comunicação, configuração ou hardware). Consulte a lista de códigos em RET_CODE - Códigos de retorno do firmware G5.

  • < 0: falha reportada pelo próprio servidor SIDECC-R (o código de falha é positivo). Consulte SIDECC_RESP.

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

Pré-condições

  • A aplicação deve usar um módulo de modem integrado compatível com o módulo Q4GA1.

  • O canal de comunicação de acesso ao modem deve estar configurado com protocolo MODBUS-TCP e cache de no mínimo 700 bytes.

  • Por default a aplicação deve estar conectada ao portal da HI Tecnologia via MODBUS com autenticação V0 (porta 16795).

  • METER, USER e KEY devem estar preenchidos com o cadastro do medidor no SIDECC-R.

Observações

  • A saída EV gera um pulso ao final de cada processo: primeiro na conclusão da inicialização (junto de READY) e depois a cada publicação disparada por PUBLISH.

  • Ao final da publicação de todos os dados, desative START e aguarde READY retornar para o estado inativo antes de iniciar um novo ciclo.

  • O resultado da saída SIDECC_RESP do bloco SIDECC_R é refletido internamente: se houver falha antes do acesso ao servidor, RESULT apresenta o código de erro associado; com RESULT = HILS.SUCCESS (0), o resultado corresponde ao processamento efetuado pelo servidor. Consulte SIDECC_RESP.

Ver também

SIDECC_R, Q4GA1_SIDECC_R

Exemplo

Clique aqui para baixar a tabela de variáveis

Código ST

VAR
    START            : BOOL := FALSE;               (* Ativa o processo *)
    CUR_PUB_INX      : USINT := 0;                  (* Indice do valor corrente a ser salvo para posterior publicação *)
    RETCODE          : INT := 0;                    (* Código de retorno do processo de publicação *)
    PUBLISH_COUNT    : UINT := 1;                   (* Nro de valores a serem adquiridos para publicação *)
    SIDEC_MIN_SAMPLE : UINT := 10;                  (* Tempo entre aquisições da vazão *)
    STATE            : USINT := 0;                  (* Maquina de estado interna *)
    TRANS            : TIME := T#0ms;               (* Tempo de inicio de uma transação *)
    TS               : DT;                          (* Timestamp a ser publicado *)
    FLOW             : REAL;                        (* Valor da vazao a ser publicada *)
    TS_VEC           : ARRAY [0..5] OF DT;          (* Vetor de timestamp de publicacao *)
    FLOW_VEC         : ARRAY [0..5] OF REAL;        (* Vetor de vazão a ser publicada *)
    METER            : STRING := '01';              (* Nro do medidor cadastrado no sistema SIDECC-R *)
    USER             : STRING := '400943';          (* Nro do usuário cadastrado no sistema SIDECC-R *)
    KEY              : STRING := 'Ii1uU6cC9Oo4Rr6'; (* Chave fornecida no cadastrado no sistema SIDECC-R *)
    SIDEC            : HILS.SIDECC_ITF;             (* bloco de interface com o sistema SIDECC-R *)
    SID_TIMER        : HILS.SIDECC_TIMER;           (* Timer de evento de captura da vazão *)
END_VAR
VAR_EXTERNAL
    ERR              : UDINT := 0;                  (* Total de erros nos acessos *)
    LAST_ERR         : INT := 0;                    (* Codígo da ultima falha registrada *)
    TOTAL            : UDINT := 0;                  (* Total de acessos ao sistema SIDEC-R *)
    MAX_TRANS        : UDINT := 0;                  (* Maior tempo de acesso ao SIDEC-R em ms *)
    LAST_TRANS       : UDINT := 0;                  (* Tempo da ultima transacao *)
END_VAR

(*
  Esta POU é responsavel por viabilizar a publicação de dados de vazão no
  servidor SIDECC-R do DAEE de São Paulo.

  Este bloco considera que existe um módulo de modem compativel com o
  Q4GA1 presente no equipamento na interface COM3.

  O projeto considera que o modem estara normalmente conectado ao portal
  de telemetria da HI tecnologia (IP '54.227.237.88') em MODBUS TCP com
  autenticação V0 (porta '16795').

  IMPORTANTE:  O tamanho da cache utilizada no canal do modem (COM3) deve ser
               de no mínimo 700 bytes. Com o tamanho default gerado pelo ambiente
               para o canal MODBUS não é possivel tratar a conexão com o
               servidor SIDECC-R
*)

// Identifica o momento de captura um valor para registro no servidor
SID_TIMER(  // SIDECC_TIMER
  START    := START,  // [BOOL] Ativa o bloco
  UTC_TIME := HILS.GET_UTC_SYSTIME(),  // [DT] Hora corrente em UTC
  INTERVAL := SIDEC_MIN_SAMPLE   // [USINT] Intervalo de tempo em minutos entre registros
  );

IF SID_TIMER.EV THEN
  // Guarda em um vetor os valores para publicação
  TS_VEC[CUR_PUB_INX]   := SID_TIMER.OUT_TIME;
  FLOW_VEC[CUR_PUB_INX] := FLOW;

  // Simula um novo valor de vazão (Teste apenas)
  FLOW := FLOW + 1.0;

  CUR_PUB_INX       := CUR_PUB_INX + 1;
  IF CUR_PUB_INX = PUBLISH_COUNT THEN
    // Ativa o processo de pulicação de todos os dados salvos
    CUR_PUB_INX     := 0;
    STATE           := 1; // ATIVA PROCESSO DE PUBLICAÇÃO
  END_IF;
END_IF;

// Maquina de estado de publicação dos valores disponívei no servidor
CASE STATE OF
  0:
    SIDEC.START := FALSE;

  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1:
    SIDEC.START := TRUE;
    TRANS       := HILS.GET_SECTION_TIME();
    STATE       := 2;

  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2: // aguarda o manager iniciar
    IF SIDEC.EV THEN
      RETCODE   := SIDEC.RESULT;
      IF SIDEC.READY AND (RETCODE = 0) THEN
        // Pronto para publicar dados
        CUR_PUB_INX := 0;
        STATE       := 3;
      ELSE
        // Falha na inicialização do gerenciado de acesso ao SIDECC
        STATE     := 10;    // reporta falha e termina
      END_IF;
    END_IF;

  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  3: // ativa o processo de publicação
    TS            := TS_VEC[CUR_PUB_INX];   // Obtem o valor da timestamp
    FLOW          := FLOW_VEC[CUR_PUB_INX]; // Obtem o valor da vazao
    SIDEC.PUBLISH := TRUE;
    STATE         := 4;    // Aguarda publicação do dado

  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  4: // aguarda publicação do dado
    IF SIDEC.EV THEN
      SIDEC.PUBLISH := FALSE;
      RETCODE := SIDEC.RESULT;
      // Neste caso deve-se analisar o erro ocorrido para verificar
      // se o processo deve ser cancelado ou não
      IF (RETCODE = 0) OR     //000 SUCESSO
         (RETCODE = -4) OR     //004 DATA/HORA INVÁLIDA
         (RETCODE = -5) OR     //005 MINUTO/SEGUNDO INVÁLIDO
         (RETCODE = -7) OR     //007 OUTRO VALOR GRAVADO NO MESMO MOMENTO
         (RETCODE = -8) THEN   //008 VAZÃO INFORMADA INVÁLIDA
        STATE := 5; // Se erro ignora o erro e publica o proximo
      ELSE
        //001         SERVIÇO DE ENVIO INATIVO
        //002         USUÁRIO OU CHAVE INVÁLIDO
        //003         MEDIDOR INVÁLIDO
        //006         ERRO REGISTRANDO O VALOR, TENTE MAIS TARDE
        //500         ERRO PROCESSANDO REQUISIÇÃO TENTE NOVAMENTE MAIS TARDE
        //999         ERRO NO PROCESSAMENTO DA REQUISIÇÃO
        STATE := 10; // Cancela o processo com falha
      END_IF;
    END_IF;

  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5: // Avalia se publicou todos os dados
    CUR_PUB_INX := CUR_PUB_INX + 1;
    IF CUR_PUB_INX < PUBLISH_COUNT THEN
      // Publica o proximo dado
      STATE := 3;
    ELSE
      STATE := 6; // Fim do processo de publicação
    END_IF;

  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6: // Aguarda o manager encerrar
    SIDEC.START := FALSE;
    IF NOT SIDEC.READY THEN
      TOTAL := TOTAL + 1;
      STATE := 11; // TERMINA
    END_IF;

  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  10: // reporta condição de falha
    // Falha na inicialização do gerenciado de acesso ao SIDECC
    TOTAL    := TOTAL + 1;
    ERR      := ERR + 1;
    LAST_ERR := RETCODE;
    SIDEC.START   := FALSE; // desativa o manager do SIDEC
    SIDEC.PUBLISH := FALSE;
    STATE         := 11;    // Calcula o tempo de transação e termina

  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  11: // Calcula o tempo de transação e termina
    LAST_TRANS := HILS.TIME_TO_MS(HILS.GET_SECTION_TIME() - TRANS);
    IF LAST_TRANS > MAX_TRANS THEN
      MAX_TRANS := LAST_TRANS;
    END_IF;
    STATE       := 0;     // Aguarda um novo processo de publicação

END_CASE;


SIDEC(  // SIDECC_ITF
  //START    := ,  // [BOOL] Habilita operação do bloco
  //PUBLISH  := ,  // [BOOL] Publica o dado especificado
  SW_URL   := TRUE,  // [BOOL] Reprograma URL do servidor no MODEM na inicializacao do bloco
  COMM_SRC := HILS.COM3_PORT_ID,  // [USINT] Canal de comunicação associado ao modem (default COM3)
  FLOW     := FLOW,  // [REAL] Vazão a ser publicada
  TS       := TS,  // [DT] Timestamp associado à vazão
  METER    := METER,  // [STRING] Medidor associado à conta SIDECC
  USER     := USER,  // [STRING] Usuário associado à conta SIDECC
  KEY      := KEY   // [STRING] Chave de acesso ao SIDECC
  );