srs
estou trabalhando com a placa de automacao para postos de gasolina company que interliga as bombas ou micro so que nao consegui desenvolver uma funcao para verificar se esta lendo correto ex. a placa me retorna o seguinte string
(TTTTTTLLLLLLPPPPVVCCCCBBDDHHMMNNRRRREEEEEEEEEESSKK)
Cada letra representa um caracter ASCII.
Msb--------lsb
DEC TTTTTT : total a pagar
DEC LLLLLL : litragem
DEC PPPP : preço por litro
HEX VV : código em bits que representam:
bit0 e bit1 : vírgula do total
bit2 e bit3 : vírgula dos litros
bit4 e bit5 : vírgula do ppl
OBS.: Aqui é passado o mesmo código de vírgula que é informado durante a configuração da placa.
HEX CCCC : contador de tempo do abastecimento, está representado
em hexadecimal com teto em FFFF:65535 segundos.
HEX BB : código do bico que gerou o abastecimento,
está montado da seguinte forma:
OBS.:. Usar tabela no software para converter código de bico por número de bico na pista.
MSB 76543210 LSB
bits 1 e 0 : endereço lógico: 0,1,2,3
bits 5,4,3 e 2: canal:1,2,3,4,5.............C.
bits 7 e 6 : posição: 0,1,2,3
DEC DD : o dia que terminou o abastecimento
DEC HH : a hora
DEC MM : o minuto
DEC NN : o mês
DEC RRRR : o número de registro do abastecimento na memória da placa
DEC EEEEEEEEEE : encerrante geral de volume no momento do fechamento do abastecimento.
Aqui é passado o encerrante geral com dez dígitos quando a bomba informar pelo protocolo, caso
contrário, os dígitos 9 e 10 voltarão zeros nos casos em que a bomba só informar oito dígitos.
HEX SS : check de integridade do registro
00 : registro válido
01 : registro corrompido (informa algum problema na memória de dados da placa)
HEX KK : checksum soma hexadecimal dos códigos ASCII de T[1] a S[2]
Adotar mesma forma de cálculo de checksum utilizado no CBC01
ESTE CHECKSUM QUE SAO AS DUACONSIGO LER TODA A STRING ATRAVES DA COM1 MAS AS ULTIMAS POSICOES QUE EU NAO CONSIGO CALCULAR PARA SER COMPARADAS
Algue tem alguma ideia abaixo tem um exemplo da firma que fabrica esta placa, pelo que vi tenho que somar um a um o valor asc de toda a string menos a posicao KK mas mesmo assim nao da o valor
PROTOCOLO CBC04
(&A)
A placa devolve a seqüência :
(0) ** Zero entre parênteses
Se não tiver algum abastecimento disponível na memória, do contrário devolve um trem de informações do
abastecimento como segue:
(TTTTTTLLLLLLPPPPVVCCCCBBDDHHMMNNRRRREEEEEEEEEESSKK)
Cada letra representa um caracter ASCII.
Msb--------lsb
DEC TTTTTT : total a pagar
DEC LLLLLL : litragem
DEC PPPP : preço por litro
HEX VV : código em bits que representam:
bit0 e bit1 : vírgula do total
bit2 e bit3 : vírgula dos litros
bit4 e bit5 : vírgula do ppl
OBS.: Aqui é passado o mesmo código de vírgula que é informado durante a configuração da placa.
HEX CCCC : contador de tempo do abastecimento, está representado
em hexadecimal com teto em FFFF:65535 segundos.
HEX BB : código do bico que gerou o abastecimento,
está montado da seguinte forma:
OBS.:. Usar tabela no software para converter código de bico por número de bico na pista.
MSB 76543210 LSB
bits 1 e 0 : endereço lógico: 0,1,2,3
bits 5,4,3 e 2: canal:1,2,3,4,5.............C.
bits 7 e 6 : posição: 0,1,2,3
DEC DD : o dia que terminou o abastecimento
DEC HH : a hora
DEC MM : o minuto
DEC NN : o mês
DEC RRRR : o número de registro do abastecimento na memória da placa
DEC EEEEEEEEEE : encerrante geral de volume no momento do fechamento do abastecimento.
Aqui é passado o encerrante geral com dez dígitos quando a bomba informar pelo protocolo, caso
contrário, os dígitos 9 e 10 voltarão zeros nos casos em que a bomba só informar oito dígitos.
HEX SS : check de integridade do registro
00 : registro válido
01 : registro corrompido (informa algum problema na memória de dados da placa)
HEX KK : checksum soma hexadecimal dos códigos ASCII de T[1] a S[2]
Adotar mesma forma de cálculo de checksum utilizado no CBC01
Ex: (00299301909915673E001E04201530070085000112127400A9)
002993 : total 29,93
019099 : litros 19,099
1567 : ppl 1,567
3E : código de virgulas 3 2 3
001E : tempo 0x1E = 30 segundos
04 : código de bico
20 : dia 20
15 : hora 15 3 da tarde
30 : minuto 30
07 : mês 07 julho
0085 : registro número 85
0001121274 : encerrante 11.212,74 litros
00 :registro válido
A9 :checksum
Checksum KK do exemplo acima: A9
0x30+0x30+0x32+0x39+0x39+0x33+0x30+0x31+0x39+0x30+0x39+0x39+0x31+0x35+0x36+0x
37+0x33+0x45+0x30+0x30+0x31+0x45+0x30+0x34+0x32+0x30+0x31+0x35+0x33+0x30+0x30
+0x37+0x30+0x30+0x38+0x35+0x30+0x30+0x30+0x31+0x31+0x32+0x31+0x32+0x37+0x34+0
x30+0x30=09A9 (hexadecimal), parte menos significativa = A9
OBS.: Para que a CBC03/CBC04 transmita a string de abastecimento neste novo formato é
necessário que a dip-swith S1, chave 3, esteja na posição ON, caso contrário será transmitida
a string no formato IMS.
placa de automacao company cbc04
Moderador: Moderadores
Caro JMarcelo.
É essa rotina, não achei o seu e-mail, poste ai, tenho sistema para posto de combustivel e podemos trocar algumas informações.
É essa rotina, não achei o seu e-mail, poste ai, tenho sistema para posto de combustivel e podemos trocar algumas informações.
Código: Selecionar todos
* 0 * 1 * 2 * 3
* 1 234567 890123 4567 89 0123 45 678901 23 4
* ( 005408 013420 0403 3A 0CF5 01 012349 61 )'
* TTTTTT LLLLLL PPPP VV CCCC BB DDHHMM KK
* | | | | | | | |---> (HEX) (CheckSum)
* | | | | | | |-------> (DEC) (Data do abast)
* | | | | | |--------------> (HEX) (Bico)
* | | | | |------------------> (HEX) (Contador tempo abast.)
* | | | |----------------------> (HEX) (Virgulas de T, L e P)
* | | |--------------------------> (DEC) (Preco p/ litro)
* | |--------------------------------> (DEC) (Litros do abast.)
* |--------------------------------------> (DEC) (Total a pagar)
*
********* CHECKSUM RECEBIDO
chksum_rec = subs(fretorno,32,2) // CHECKSUM
********* CHECKSUM CALCULADO
w0 = 0
w1 = subs(fretorno,2,30) // RESTANTE DO RETORNO (ANTES DO CHCKSUM)
for i1 = 1 to len(w1) step 2
w2 = substr(w1,i1,2)
w0 = w0 + hex_to_dec(w2)
next
w3 = dec_to_hex(str(w0,6))
w3 = dec_to_hex(val(str(w0,6)))
chksum_calc = right(w3,2)
************ ERRO DE CHECKSUM
if chksum_calc # chksum_rec
?? "Abastecimento com erro de CHEKSUM! Tecle ENTER"
endif

