DATA_COMM
Encaminha um serviço de comunicação genérico (agnóstico ao protocolo) para ler ou escrever dados em um dispositivo remoto por qualquer canal de comunicação do equipamento. É um bloco de função (requer instância).
Aviso
Função obsoleta, mantida apenas para compatibilidade com aplicações legadas.
Para novos projetos use COMM_SEND_REC, COMM_REC_SEND, STR_SEND_REC
ou ASCII_SR (biblioteca HI_STD).
Biblioteca: HI_STD · Namespace: HILS · Tipo: bloco de função · Status: obsoleto
Bloco de função
DATA_COMM
+------------------+
| |
BOOL ---| EN ENO |--- BOOL
| |
BOOL ---> START READY |--- BOOL
| |
UINT ---| COMM_SRC RESULT |--- INT
| |
UINT ---| DEV_ADDR |
| |
BOOL ---| RD_WR |
| |
UINT ---| DT_TYPE |
| |
UINT ---| DT_SIZE |
| |
UINT ---| REM_VAR |
| |
ANY ---| DATA-------------|--- ANY
| |
+------------------+
A transação é iniciada por transição de subida em START e roda ao longo de
múltiplos scans; aguarde READY = TRUE para então avaliar RESULT e os dados
em DATA.
Parâmetros
Nome |
Direção |
Tipo |
Padrão |
Faixa / Unidade |
Descrição |
|---|---|---|---|---|---|
EN |
IN |
BOOL |
TRUE |
— |
Habilitação de entrada. |
START |
IN |
BOOL |
FALSE |
— |
Inicia uma transação de comunicação (transição de subida). |
COMM_SRC |
IN |
UINT |
0 |
|
Identificador do canal de comunicação (ver Canais de comunicação). |
DEV_ADDR |
IN |
UINT |
0 |
— |
Endereço de comunicação do equipamento remoto. |
RD_WR |
IN |
BOOL |
FALSE |
— |
Tipo de transferência: FALSE = leitura (RD), TRUE = escrita (WR). |
DT_TYPE |
IN |
UINT |
0 |
|
Tipo do dado transferido (ver Tipos de dado). |
DT_SIZE |
IN |
UINT |
1 |
— |
Quantidade de variáveis do tipo especificado a transferir (ver limites em Observações). |
REM_VAR |
IN |
UINT |
0 |
— |
Variável inicial no equipamento remoto. |
ENO |
OUT |
BOOL |
FALSE |
— |
Saída de habilitação (ativa se |
READY |
OUT |
BOOL |
FALSE |
— |
TRUE indica transação concluída; |
RESULT |
OUT |
INT |
0 |
RET_CODE |
Código de retorno da última transação (ver Códigos de retorno). |
DATA |
IN_OUT |
ANY |
— |
— |
Dado transferido (recebido se |
Canais de comunicação (COMM_SRC)
Use os identificadores do tipo COMM_CHAN_ID (namespace HILS). Cada equipamento
suporta apenas um subconjunto — consulte o manual do equipamento.
Identificador |
Ident. |
Descrição |
|---|---|---|
|
0 .. 7 |
Canais seriais COM1 a COM8. |
|
8 .. 15 |
Controlador Ethernet 1: sockets 0 a 7. |
|
16 .. 23 |
Controlador Ethernet 2: sockets 0 a 7. |
Tipos de dado (DT_TYPE)
Identificadores do tipo TYPE_LEN_ID (namespace HILS) e o mapeamento Modbus:
ID |
Identificador |
Mapeamento Modbus |
|---|---|---|
1 |
DTL_BIT_ID |
COIL |
2 |
DTL_BYTE_ID |
n.d. |
3 |
DTL_WORD_ID |
HOLDING REGISTER |
4 |
DTL_DWORD_ID |
HOLDING REGISTER × 2 |
5 |
DTL_LWORD_ID |
HOLDING REGISTER × 4 |
6 |
DTL_STRING_ID |
HOLDING REGISTER × 123 (246 caracteres) |
7 |
DTL_DIG_IO_ID |
DISCRETE INPUTS |
8 |
DTL_ANA_IO_ID |
INPUT REGISTER |
Códigos de retorno
RESULT é do tipo RET_CODE: 0 (HILS.SUCCESS) indica transação bem-sucedida;
qualquer valor diferente de 0 indica falha na comunicação (consulte o catálogo de
códigos RET_CODE do ambiente, tipicamente da família CO_*).
Observações
O total de dados não pode exceder um pacote do protocolo selecionado. Em Modbus: leitura de até 125 HOLDING REGISTER ou 2000 COIL consecutivos; escrita de até 123 HOLDING REGISTER ou 1968 COIL consecutivos.
Aguarde
READYantes de avaliarRESULT.
Ver também
Exemplo
Clique aqui para baixar a tabela de variáveis
Código ST
TYPE
VET_COIL : ARRAY [0..4] OF BOOL; (* Base de status do processo *)
VET_HREG : ARRAY [0..2] OF INT; (* Base de parâmetros de configuração *)
END_TYPE
VAR
my_DATA_COMM : HILS.DATA_COMM; (* Instância do bloco DATA_COMM *)
data_coil : VET_COIL; (* Variável do tipo VET_COIL (usuário) *)
data_hreg : VET_HREG; (* Variável do tipo VET_HREG (usuário) *)
END_VAR
(* Lê os coils 10 a 14 do controlador remoto (COM1, endereço 1) *)
my_DATA_COMM(
EN := TRUE,
START := TRUE,
COMM_SRC := HILS.COM1_PORT_ID,
DEV_ADDR := 1,
RD_WR := FALSE, (* leitura *)
DT_TYPE := HILS.DTL_BIT_ID, (* coil *)
DT_SIZE := 5,
REM_VAR := 10,
DATA := data_coil
);
IF (my_DATA_COMM.READY = TRUE) THEN
IF (my_DATA_COMM.RESULT = HILS.SUCCESS) THEN
(* data_coil[0..4] contêm os coils lidos *)
ELSE
(* tratar falha de comunicação *)
END_IF;
END_IF;
(* Escreve data_coil[0..4] nos coils 10 a 14 do remoto: mesma chamada com RD_WR := TRUE *)
(* Lê os holding registers 100 a 102 do controlador remoto *)
my_DATA_COMM(
EN := TRUE,
START := TRUE,
COMM_SRC := HILS.COM1_PORT_ID,
DEV_ADDR := 1,
RD_WR := FALSE,
DT_TYPE := HILS.DTL_WORD_ID, (* holding register *)
DT_SIZE := 3,
REM_VAR := 100,
DATA := data_hreg
);
IF (my_DATA_COMM.READY = TRUE) THEN
IF (my_DATA_COMM.RESULT = HILS.SUCCESS) THEN
(* data_hreg[0..2] contêm os registradores lidos *)
END_IF;
END_IF;