Você está na página 1de 5

PORTAS DE COMUNICAO SERIE KL6xxx e EL6xxx

KL6001 / KL6031

KL6021 / KL6041

Formato de dados (KL6001/KL6021) : 3 a 5 bytes de dados


Formato de dados (KL6031 / KL6041) : 3 a 22 bytes de dados
CALCULO DAS VELOCIDADES DE TRANSMISSO POR FORMATO DE DADOS (Cartas KL6xxx)
KL6001(RS232),KL6011(TTY),KL6021(RS485/422),KL6031(RS232),KL6041(RS485/RS422)
Bps = (LB x PA) / 3 x T
LB = Largura de banda (1 bit start + n bit de dados + p bits de paridade + m bits de stop) [ Valor de defeito 8N1 = 1+8+0+1 =10]
PA = N de bytes de dados
T = Tempo de ciclo do programa no PLC
O PLC necessita 3 ciclos de operao para trocar dados com os terminais KL6xxxx

Modo de 22 bytes (KL6xxxx)


com T (task) = 10 ms
Bps=(10x22)/3x0.010s=7 333bps

VELOCIDADE MAXIMA DE TRANSFERNCIA POR MODO DE DADOS


Modo de 5 bytes (KL6xxxx)
Modo de 3 bytes (KL6xxxx)
com T (task) = 10 ms
com T(task) = 10 ms
Bps=(10x5)/3x0.010s=1 666bps
Bps=(10x3)/3x0.010s=1 000bps

CALCULO DAS VELOCIDADES DE TRANSMISSO POR FORMATO DE DADOS (Cartas EL6xxx)


EL6001(1xRS232),EL6002(2xRS232),EL6021(1xRS485/422),EL6022(2xRS485/RS422)
Bps = (LB x PA) / 2 x T
O PLC necessita 2 ciclos de operao para trocar dados com os terminais EL6xxxx
VELOCIDADE MAXIMA DE TRANSFERNCIA POR MODO DE DADOS
Modo de 22 bytes (EL6xxxx)
com T (task) = 10 ms
Bps=(10x22)/2x 0.010s=11 000bps

Modo de 64 bytes (PC-Com)


com T(task) = 10 ms
Bps=(10x64)/3x0.010s=21 333bps

CONTROLO Hardware - Comunicao (background) entre o terminal KLxxxx ou COM e o PLC - Funo Bloco SerialLineControl (Tarefa rpida)
ENUMERATION
TYPE ComSerialLineMode_t
(
SERIALLINEMODE_DEFAULT,
SERIALLINEMODE_KL6_3B_ALTERNATIVE,
SERIALLINEMODE_KL6_5B_STANDARD,
SERIALLINEMODE_KL6_22B_STANDARD,
SERIALLINEMODE_PC_COM_PORT
);
END_TYPE

STRUCTURE

(* Estrurura do hardware IO *)
TYPE KL6inData (*KLxx 3 byte *)
TYPE KL6outData (*KLxx 3 byte *)
STRUCT
STRUCT
Status
: BYTE;
Ctrl
: BYTE;
SerStatus : BYTE;
SerCtrl : BYTE;
D
: ARRAY[0..2]OF BYTE;
D
: ARRAY[0..2] OF BYTE;
END_STRUCT
END_STRUCT
END_TYPE
END_TYPE
TYPE KL6inData5B (*KLxx 5 byte*)
TYPE KL6outData5B (*KLxx 3 byte *)
STRUCT
STRUCT
Status : BYTE;
Ctrl
: BYTE;
D
: ARRAY[0..4] OF BYTE;
D
: ARRAY[0..4] OF BYTE;
END_STRUCT
END_STRUCT
END_TYPE
END_TYPE
TYPE KL6inData22B(*KLxx 22b*)
TYPE KL6outData22B(*KLxx 22b*)
STRUCT
STRUCT
Status : BYTE;
Ctrl
: BYTE;
D
: ARRAY[0..21]OF BYTE;
D
: ARRAY[0..21] OF BYTE;
END_STRUCT
END_STRUCT
END_TYPE
END_TYPE
TYPE PcComInData(*PCCom 64b*)
TYPE PcComOutData(*PCCom 64b*)
STRUCT
STRUCT
SerStatus: BYTE;
SerCtrl : BYTE;
D
: ARRAY[0..63]OF BYTE;
D
: ARRAY[0..63] OF BYTE;
END_STRUCT
END_STRUCT
END_TYPE
END_TYPE

STRUCTURE
TYPE ComBuffer
STRUCT
Buffer
: ARRAY[0..300] OF BYTE;
RdIdx
: INT;
WrIdx
: INT;
Count
: INT; (* N de caracteres no buffer *)
FreeByte : INT; (* N de espaos livres no buffer *)
Error
: INT; (* Codigo de erro *)
blocked
: BOOL;
END_STRUCT
END_TYPE

VAR_INPUT
(* Indica o hardware
que est a ser usado *)
Mode :
ComSerialLineMode_t;
(* Aponta para as
variveis de entrada do
hardware *)
pComIn :
POINTER TO ARRAY
[0..65] TO BYTE;

VAR_OUTPUT
(* Indica a existencia de
um erro TRUE *)
Error : BOOL;

(* Indica o tipo de erro


com uma mensagem
enumeration *)
ErrorID : ComError_t;

ADR(estrutura_IO)

(* Aponta para as
variaveis de sada do
hardware *)
pComOut :
POINTER TO ARRAY
[0..65] TO BYTE;

ENUMERATION
TYPE ComError_t
(
COMERROR_NOERROR
:= 0,
COMERROR_PARAMETERCHANGED :=1,
COMERROR_TXBUFFOVERRUN :=2,
COMERROR_STRINGOVERRUN :=10,
COMERROR_ZEROCHARINVALID :=11,
COMERROR_INVALIDPOINTER :=20,
COMERROR_INVALIDRXPOINTER :=21,
COMERROR_INVALIDRXLENGTH :=22,
COMERROR_DATASIZEOVERRUN :=23,
COMERROR_INVALIDBAUDRATE :=16#1001,
COMERROR_INVALIDNUMDATABITS :=16#1002,
COMERROR_INVALIDNUMSTOPBITS :=16#1003,
COMERROR_INVALIDPARITY :=16#1004,
COMERROR_INVALIDHANDSHAKE :=16#1005,
COMERROR_INVALIDNUMREGISTERS :=16#1006,
COMERROR_INVALIDREGISTER :=16#1007,
COMERROR_TIMEOUT :=16#1008,
);
END_TYPE

ADR(estrutura_IO)

(* Indica a quantidade em
bytes das variveis do
processo hardware *)
SizeComIn : UINT;
SIZEOF(estrutura_IO)

VAR_IN_OUT
(* Buffer dos dados a
serem transmitidos pelo
terminal serie *)
TxBuffer : ComBuffer;

VAR_IN_OUT
(* Buffer dos dados a
serem transmitidos pelo
terminal serie *)
TxBuffer ComBuffer;

(* Buffer dos dados


recebidos plo terminal
serie *)
RxBuffer : ComBuffer;

(* Buffer dos dados


recebidos plo terminal
serie *)
RxBuffer :ComBuffer;

Notas : Os dados so colocados no buffer TxBuffer, para serem enviados pelo terminal serie , por FBs do tipo SendByte , SendData ou SendString .
Os dados que foram recebidos plo terminal serie, so lidos do buffer RxBuffer por FBs do tipo ReceiveByte, ReceiveData ou ReceiveString.

STRUCTURE
TYPE ComBuffer
STRUCT
Buffer
: ARRAY[0..300] OF BYTE;
RdIdx
: INT;
WrIdx
: INT;
Count
: INT; (* N de caracteres no buffer *)
FreeByte : INT; (* N de espaos livres no buffer *)
Error
: INT; (* Codigo de erro *)
blocked
: BOOL;
END_STRUCT
END_TYPE

FLUXO DE DADOS - Recepo dos dados recebidos no terminal serie KL6xxx ou COM - Funo Bloco ReceiveString , ReceiveData , ReceiveByte
VAR_INPUT
Prefix : STRING;
Suffix : STRING;
Timeout : TIME;
Reset : BOOL;

VAR_OUTPUT
StringReceived: BOOL;
busy
: BOOL;
Error
: ComError_t;
RxTimeout
: BOOL;

VAR_IN_OUT
ReceivedString : STRING;
RXBuffer
: ComBuffer;

VAR_IN_OUT
ReceivedString : STRING;
RXBuffer
: ComBuffer;

VAR_INPUT
pPrefix : POINTER TO BYTE;

VAR_OUTPUT
DataReceived : BOOL;
busy
: BOOL;
Error
: ComError_t;
RxTimeout
: BOOL;
LenReceiveData: UDINT;

ADR(nome_structure)

LenPrefix: BYTE;
pSuffix : POINTER TO BYTE;
ADR(nome_structure)
LenSuffix: BYTE;
pReceiveData: POINTER TO BYTE;

ENUMERATION
TYPE ComError_t
(
COMERROR_NOERROR
:= 0,
COMERROR_PARAMETERCHANGED :=1,
COMERROR_TXBUFFOVERRUN :=2,
COMERROR_STRINGOVERRUN :=10,
COMERROR_ZEROCHARINVALID :=11,
COMERROR_INVALIDPOINTER :=20,
COMERROR_INVALIDRXPOINTER :=21,
COMERROR_INVALIDRXLENGTH :=22,
COMERROR_DATASIZEOVERRUN :=23,
COMERROR_INVALIDBAUDRATE :=16#1001,
COMERROR_INVALIDNUMDATABITS :=16#1002,
COMERROR_INVALIDNUMSTOPBITS :=16#1003,
COMERROR_INVALIDPARITY :=16#1004,
COMERROR_INVALIDHANDSHAKE :=16#1005,
COMERROR_INVALIDNUMREGISTERS :=16#1006,
COMERROR_INVALIDREGISTER :=16#1007,
COMERROR_TIMEOUT :=16#1008,
);
END_TYPE

ADR(nome_structure)

SizeReceiveData: DINT;
SIZEOF(nome_structure)

Timeout : TIME;
Reset : BOOL;
VAR_IN_OUT
RXBuffer
: ComBuffer;
STRUCTURE
TYPE ComBuffer
STRUCT
Buffer
: ARRAY[0..300] OF BYTE;
RdIdx
: INT;
WrIdx
: INT;
Count
: INT; (* N de caracteres no buffer *)
FreeByte : INT; (* N de espaos livres no buffer *)
Error
: INT; (* Codigo de erro *)
blocked
: BOOL;
END_STRUCT
END_TYPE

VAR_IN_OUT
RXBuffer
: ComBuffer;

VAR_IN_OUT
RXBuffer
: ComBuffer;
VAR_OUTPUT
ByteReceived : BOOL;
ReceivedByte : BYTE;
Error
: ComError_t;
VAR_IN_OUT
RXBuffer
: ComBuffer;

STRUCTURE
TYPE ComBuffer
STRUCT
Buffer
: ARRAY[0..300] OF BYTE;
RdIdx
: INT;
WrIdx
: INT;
Count
: INT; (* N de caracteres no buffer *)
FreeByte : INT; (* N de espaos livres no buffer *)
Error
: INT; (* Codigo de erro *)
blocked
: BOOL;
END_STRUCT
END_TYPE

Notas : A FB ReceiveString recebe string de dados atravs da estrutura RxBuffer. So colocados na string ReceiveString ( que tem um tamanho standard de 80 caracteres) .
Quando se recebe novos dados a FB assinala com a passagem a TRUE (durante 1 ciclo) da varivel booleana StringReceived e tambem a variavel Busy colocado a TRUE logo que sej recebido o 1
caracter e ir a FALSE depois de recebidos todos os dados ou tenha havido um erro ( indicado o tipo em Error) . Caso o intervalo entre dois caracteres ( estipulado em Timeout) seja ultrapassado
assinalado por RxTimeout a TRUE e abortada a recepo de mais caracteres. O inicio da recepo dos dados pode ser inicializada por um Prefix e finalizado com um Suffix . Se nenhum Prefix for
assinalo (empty) a recepo de dados comea quando recebido um 1 caracter . No caso de no ser assinalado um Suffix (empty) teremos obrigatoriamente de atribuir um tempo de Timeout pois
este tempo que vai defenir o fim da recepo dos dados (caso haja um Suffix poderemos por a zero o Timeout) .
A FB ReceiveData recebe dados de qualquer tipo atravs da estrutura RxBuffer. So colocados na estrutura ReceiveData (apontada em pReceiveData ) e com um tamanho de SizeReceiveData .
Quando se recebe novos dados a FB assinala com a passagem a TRUE (durante 1 ciclo) da varivel booleana DataReceived e tambem a variavel Busy colocado a TRUE logo que sej recebido o 1
caracter e ir a FALSE depois de recebidos todos os dados ou tenha havido um erro ( indicado o tipo em Error) . Caso o intervalo entre dois caracteres ( estipulado em Timeout) seja ultrapassado
assinalado por RxTimeout a TRUE e abortada a recepo de mais caracteres . O n de caracteres recebido indicado em LenReceiveData e que igual ou menor que SizeReceiveData. O inicio da
recepo dos dados pode ser inicializada por um Prefix (apontado a uma estrutura de bytes em pPrefix e com um tamanho de LenPrefix) e finalizado com um Suffix (apontado a uma estrutura de
bytes em pSuffix e com um tamanho de LenSuffix) . Se nenhum Prefix for assinalo (null) a recepo de dados comea quando recebido um 1 caracter . No caso de no ser assinalado um
Suffix (null) teremos obrigatoriamente de atribuir um tempo de Timeout pois este tempo que vai defenir o fim da recepo dos dados (caso haja um Suffix poderemos por a zeroo Timeout) .
A FB ReceiveByte recebe um simples carcter atravs da estrutura RxBuffer . colocada em ReceivedByte e assinalado por TRUE em ByteReceived .

FLUXO DE DADOS - Envio dos dados pelo terminal serie KL6xxx ou COM - Funo Bloco SendString , SendData , SendByte
VAR_INPUT
SendString
: STRING;

VAR_OUTPUT
Busy
: BOOL;
Error
: ComError_t;

VAR_IN_OUT
TXBuffer
: ComBuffer;

VAR_IN_OUT
TXBuffer
: ComBuffer;

VAR_INPUT
pSendData : POINTER TO BYTE;

VAR_OUTPUT
Busy
: BOOL;
Error
: ComError_t;

ADR(nome_structure)

Length: UDINT;
SIZEOF(nome_structure)

VAR_IN_OUT
TXBuffer
: ComBuffer;

VAR_IN_OUT
TXBuffer
: ComBuffer;

VAR_INPUT
SendByte : BYTE;

VAR_OUTPUT
Busy
: BOOL;
Error
: ComError_t;

VAR_IN_OUT
TXBuffer
: ComBuffer;

VAR_IN_OUT
TXBuffer
: ComBuffer;

ENUMERATION
TYPE ComError_t
(
COMERROR_NOERROR
:= 0,
COMERROR_PARAMETERCHANGED :=1,
COMERROR_TXBUFFOVERRUN :=2,
COMERROR_STRINGOVERRUN :=10,
COMERROR_ZEROCHARINVALID :=11,
COMERROR_INVALIDPOINTER :=20,
COMERROR_INVALIDRXPOINTER :=21,
COMERROR_INVALIDRXLENGTH :=22,
COMERROR_DATASIZEOVERRUN :=23,
COMERROR_INVALIDBAUDRATE :=16#1001,
COMERROR_INVALIDNUMDATABITS :=16#1002,
COMERROR_INVALIDNUMSTOPBITS :=16#1003,
COMERROR_INVALIDPARITY :=16#1004,
COMERROR_INVALIDHANDSHAKE :=16#1005,
COMERROR_INVALIDNUMREGISTERS :=16#1006,
COMERROR_INVALIDREGISTER :=16#1007,
COMERROR_TIMEOUT :=16#1008,
);
END_TYPE

STRUCTURE

STRUCTURE

TYPE ComBuffer
STRUCT
Buffer
: ARRAY[0..300] OF BYTE;
RdIdx
: INT;
WrIdx
: INT;
Count
: INT; (* N de caracteres no buffer *)
FreeByte : INT; (* N de espaos livres no buffer *)
Error
: INT; (* Codigo de erro *)
blocked
: BOOL;
END_STRUCT
END_TYPE

TYPE ComBuffer
STRUCT
Buffer
: ARRAY[0..300] OF BYTE;
RdIdx
: INT;
WrIdx
: INT;
Count
: INT; (* N de caracteres no buffer *)
FreeByte : INT; (* N de espaos livres no buffer *)
Error
: INT; (* Codigo de erro *)
blocked
: BOOL;
END_STRUCT
END_TYPE

VAR_IN_OUT
Buffer
: ComBuffer;

VAR_IN_OUT
Buffer
: ComBuffer;

Notas : A FB SendString envia string de dados atravs da estrutura TxBuffer. So colocados na string SendString ( que tem um tamanho standard de 80 caracteres) .
Enquanto Busy TRUE a transmisso ainda no foi finalizada . Efectuado o envio com sucesso Busy= FALSE e Error=0 .
A FB SendData envia dados de qualquer tipo atravs da estrutura TxBuffer. So colocados na estrutura apontada em pSendData ) e com um tamanho de Length (ter de ser igual o menor que o
tamanho da estrutura de dados ).
Enquanto Busy TRUE a transmisso ainda no foi finalizada . Efectuado o envio com sucesso Busy= FALSE e Error=0 .
A FB SendByte envia um simples caracter SendByte atravs da estrutura TxBuffer . Enquanto Busy TRUE a transmisso ainda no foi finalizada . Efectuado o envio com sucesso Busy= FALSE
e Error=0 .
A FB ClearComBuffer permite apagar todos os dados guardados no Buffer que usado como interface entre o programa de tratamento de dados e o KL6xxxx ( do tipo estrutura ComBuffer) e que
se encontra no PLC.

CONFIGURAO DO hardware
ENUMERATION
TYPE ComSerialLineMode_t
(
SERIALLINEMODE_DEFAULT,
SERIALLINEMODE_KL6_3B_ALTERNATIVE,
SERIALLINEMODE_KL6_5B_STANDARD,
SERIALLINEMODE_KL6_22B_STANDARD,
SERIALLINEMODE_PC_COM_PORT
);
END_TYPE
TYPE CompParity_t
(
PARITY_NONE,
PARITY_EVEN,
PARITY_ODD
);
END_TYPE
TYPE ComHandshake_t
(
HANDSHAKE_NONE,
HANDSHAKE_RTSCTS,
HANDSHAKE_XONX0FF,
RS485_FULLDUPLEX,
RS485_HALFDUPLEX,
RS485_FULLDUPLEX_XONXOFF,
RS485_HALFDUPLEX_XONXOFF,
);
END_TYPE

STRUCTURE
TYPE ComRegisterData_t
STRUCT
Register
: BYTE;
Value
: WORD;
END_STRUCT
END_TYPE

STRUCTURE
TYPE ComBuffer
STRUCT
Buffer
: ARRAY[0..300] OF BYTE;
RdIdx
: INT;
WrIdx
: INT;
Count
: INT; (* N de caracteres no buffer *)
FreeByte : INT; (* N de espaos livres no buffer *)
Error
: INT; (* Codigo de erro *)
blocked
: BOOL;
END_STRUCT
END_TYPE

VAR_INPUT
Execute
: BOOL;
FirstRegister : UINT;
RegisterCount : UINT;
Mode
:ComSerialLineMode_t;
pComIn :.(igual aos anteriores);
pComOut:.(igual aos anteriores);
SizeComIn:UINT;SIZEOF(estru_IO)
pRegisterList:POINTER TOARRAY
[0..63] OF ComRegisterData_t;
SizeRegisterList : UINT;

VAR_OUTPUT
Done
: BOOL;
Busy
: BOOL;
Error
: BOOL;
ErroriD : ComError_t;

VAR_INPUT
Execute
: BOOL;
Mode
:ComSerialLineMode_t;
pComIn :.(igual aos anteriores);
pComOut:.(igual aos anteriores);
SizeComIn:UINT;SIZEOF(estru_IO)
pRegisterList:POINTER TOARRAY
[0..63] OF ComRegisterData_t;
SizeRegisterList : UINT;

VAR_OUTPUT
Done
: BOOL;
Busy
: BOOL;
Error
: BOOL;
ErroriD : ComError_t;

VAR_INPUT
Execute
: BOOL;
Mode
:ComSerialLineMode_t;
Baudrate
: UDINT;
NoDatabits : BYTE;
Parity
:ComParity_t;
Stopbits
: BYTE;
Handshake :ComHandshake_t;
ContinousMode: BOOL;
pComIn :.(igual aos anteriores);
pComOut:.(igual aos anteriores);
SizeComIn:UINT;SIZEOF(estru_IO)
VAR_INPUT
Execute
: BOOL;
pComIn :.(igual aos anteriores);
pComOut:.(igual aos anteriores);
SizeComIn:UINT;SIZEOF(estru_IO)

VAR_OUTPUT
Done
: BOOL;
Busy
: BOOL;
Error
: BOOL;
ErroriD : ComError_t;

ENUMERATION
TYPE ComError_t
(
COMERROR_NOERROR
:= 0,
COMERROR_PARAMETERCHANGED :=1,
COMERROR_TXBUFFOVERRUN :=2,
COMERROR_STRINGOVERRUN :=10,
COMERROR_ZEROCHARINVALID :=11,
COMERROR_INVALIDPOINTER :=20,
COMERROR_INVALIDRXPOINTER :=21,
COMERROR_INVALIDRXLENGTH :=22,
COMERROR_DATASIZEOVERRUN :=23,
COMERROR_INVALIDBAUDRATE :=16#1001,
COMERROR_INVALIDNUMDATABITS :=16#1002,
COMERROR_INVALIDNUMSTOPBITS :=16#1003,
COMERROR_INVALIDPARITY :=16#1004,
COMERROR_INVALIDHANDSHAKE :=16#1005,
COMERROR_INVALIDNUMREGISTERS :=16#1006,
COMERROR_INVALIDREGISTER :=16#1007,
COMERROR_TIMEOUT :=16#1008,
);
END_TYPE

VAR_OUTPUT
Done
: BOOL;
Busy
: BOOL;
Error
: BOOL;
ErroriD : ComError_t;

Notas : A FB KL6ReadRegisters permite ler diversos registos da tabela parametrizao / configurao dos terminais srie do tipo KL6xxxx . Definimos em FirstRegister o n do registo (0 a 64) da tabela a
partir da qual iniciaremos a leitura . Ser lido um n , definido em RegisterCount , de registos a comear em FirstRegister e guardado numa estrutura do tipo ComRegisterData_t .
A FB KL6WriteRegisters permite escrever dados e um ou em vrios registos da tabela de parametrizao / configurao dos terminais srie do tipo KL6xxxx . Definimos em pRegisterlister o n do
registo em que queremos comear , de uma lista do tipo ComRegisterData_t e que ter um tamanho de SizeRegisterList registos .
A FB KL6Configuratin permite configurar o modo de comunicao ( baudrate , bit de paridade , de stop , etc) dos terminais srie KL6xxxx .
A FB ComReset permite inicializar o hardware dos terminais KL6xxxx ou COM (no apaga o buffer de dados ComBuffer) .