Jump to content
Fivewin Brasil

comunicacao com balanca eletronica


mamp

Recommended Posts

Talves eu esteja enganado, pois nunca usei essa balança, mas a comunicação serial é um padrão em todos os equipamentos eletrônicos, você poderia testar a rotina abaixo, onde não se precisa especificar que balança vc vai usar, mas esta rotina lê a porta serial do equipamento.

Espero ter ajudado.

.

.

.

.

peso:=pegapeso()

.

// aqui vc faz o tratamento da variavel peso, ex.: multiplica por preço unitário, etc. (peso*pu) etc.

.

.

return .t.

function pegapeso()

NHANDLE:=Init_Port("COM1",9600,8,0,1,8000) // conf da porta serial

OutBufClr(NHANDLE) // Limpa o Buffer de Saida

OUTCHR(NHANDLE,CHR(5))

SysWait(0.3)

Bytes := InbufSize(NHANDLE)

DADOS=SPACE(20)

Buffer := InChr( NHANDLE, Bytes, @DADOS) //LER BUFFER DE ENTRADA DA BALANCA

UnInt_Port(nHandle)

dados=alltrim(dados)

** a comando abaixo pega a quantidade lida da balança

Q=val(substr(dados,2,5))/1000

IF Q=0

PU=1

VLU:=TRANSFORM(PU,"@E 9999.99")

ENDIF

RETURN Q //retorna a quantidade para ser manipulada pelo programa

*

Pompeo

Guaratinguetá - SP

(12) 9777-9386

E-Mail: mkyx@ig.com.br

MSN: mkyx@ig.com.br

Skype: pardes.mky

www.adentech.com.br

www.rmahost.com

xH 1.1.0 Hb 8.02 - BCC 55

Link to comment
Share on other sites

obrigado pompeo, vou testar,

obs: Voce é de Guaratingueta?, eu tambem sou de la, mas desde 1989 estou em recife, adione-me no msn pra gente trocar figuras(macedomarcos@hotmail.com)

nao uso WS

Marcos Macedo(Recife-PE)

macedomarcos@hotmail.com

Link to comment
Share on other sites

Caracas, meu, que coincidência, eu sou de Recife, e moro em Guaraginguetá-SP desde 1979.

Blz

Pompeo

Guaratinguetá - SP

(12) 9777-9386

E-Mail: mkyx@ig.com.br

MSN: mkyx@ig.com.br

Skype: pardes.mky

www.adentech.com.br

www.rmahost.com

xH 1.1.0 Hb 8.02 - BCC 55

Link to comment
Share on other sites

  • 1 month later...

pompeo usei a rotina mas da os erros de nao encontrar as funcoes

Init_Port()

OutBufClr()

OUTCHR()

Inchr()

UnInt_Port()

Tem que acrescentar alguma lib ou algum .CH ao meu projeto?

OBS:Joao a fraze correta é.

Um burro carregado de açucar, ate o PEIDO é doce.

(fraze muito usada no jogo de Truco, muito jogado ai em Sao paulo)

nao uso WS

Marcos Macedo(Recife-PE)

macedomarcos@hotmail.com

Link to comment
Share on other sites

Tens que linkar a hbcomm.lib para usar essas funções que citou.

Mas se serve como conselho, sincera mente se vai implantar do zero melhor usa as funções da própria Fivewin para isso que são bem melhores que essas da Hbcomm, as da hbcomm se colocar em loop para buscar o peso varias vez ela da GPF nas da Fivewin não acontece isso mas não funciona via TS e nem a Hbcomm, procure aqui no forum que tem uns post com as funções da Fivewin, procure por:

OPENCOMM()

FlushComm()

BuildCommDcb()

CloseComm()

Agora se você está compilando com a ultima versão do Harbour ai o melhor de todas que está em \harbour\contrib\hbwin que funciona até via TS as porta serial, é simplesmente a melhor para comunicação serial.

Leonardo Machado

Alvorada-RS

Hwgui + x[H]arbour

leonardodemachado@hotmail.com

Link to comment
Share on other sites

  • 7 years later...

Não, mas se for como na lógica abaixo, basta usar a HBCOMM.LIB que vai de boa.

//--iniciando a porta
nPorta=2 //COM2
nVeloc=9600
cParid="N"
nBits=8
nParad=1
cInicia="P"
nTemp=0.5
nTama=15
	DO WHILE .T.
   COM_HARD(.T.)
   
   nConf := Com_Init(nPorta,nVeloc,cParid,nBits,nParad)
	   if .not. nConf
      COM_CLOSE(nPorta)
      Wait "Falha na inicializacao da porta"
      EXIT
      
   endif
	   //--envia o caracter de inicio para a balanca
   nRest= COM_SEND(nPorta,cInicia) //CHR(80))
	   //--aguarda um tempo para a leitura
   inkey(nTemp)
   
   //--recebe os dados da porta COM
   resulta=COM_READ(nPorta,nTama)
   
   //--limpa o buffer
   COM_FLUSH(nPorta)
	   COM_HARD(.F.)
	   //--fecha a porta
   COM_CLOSE(nPorta)
   ? resulta
   wait"Resultado da pesagem"   
EXIT
ENDDO


 

Link to comment
Share on other sites

Boa noite

Eu usei esta rotina para capturar dados da balanca TOLEDO, espero que ajude


//-----------------------------------------------//
//  Modulo      : TOLEDO.PRG                     //
//  Comentário  : Acesso a balanca toledo        //
//  Data        : 24/08/2004 - Sandro            //
//  Atualização :                                //
//  Comentário  : os Parametros Peso e           //
//     Tara devem ser fornecidos por referencia  //
//  Exemplo     :                                //
//  Peso := 0                                    //
//  Tara := 0                                    //
//  Erro := Toledo("9091","COM1",@Peso, @tara)   //
//  Msginfo( "Peso: "+str(Peso) )                //
//-----------------------------------------------//
//#include "fivewin.ch"
//------------------------------------------
FUNCTION Toledo( Modelo, Porta, Peso, Tara )
//------------------------------------------
    STATIC TamPacote := 100
    LOCAL Com, baudRate, databits, parity, stopbit, TamBuff, Bytes, buffer, x, erro
    LOCAL l_Erro := .F., time_out:=0
    LOCAL c_Peso, c_Tara, c_liq, l_tara, l_check, c_check
    LOCAL swa, swa_bit0, swa_bit1, swa_bit2, swa_bit3, swa_bit4, swa_bit5, swa_bit6, swa_bit7
    LOCAL swb, swb_bit0, swb_bit1, swb_bit2, swb_bit3, swb_bit4, swb_bit5, swb_bit6, swb_bit7
    
//----- Se Nao especificar modelo, encerra comunicação
    IF ValType( Modelo ) <> "C"
        //IF isWorking()
//            UnInt_Port()
//        ENDIF
        Peso := NIL
        RETURN( 0 )
    ENDIF

    IF ! Upper( Modelo ) $ '9091,9094,8132,8510,8530,ID1,2090'
        Peso := NIL
        RETURN( - 1 )
    ENDIF

    IF ! Upper( Porta ) $ 'COM1,COM2,COM3,COM4'
        Peso := NIL
        RETURN( - 2 )
    ENDIF

    Com        := Porta  //"COM1"
    baudRate   := 4800
    databits   := 7
    parity     := 2
    stopbit    := 2
    TamBuff    := 8000
    DADOS         :=""
//    NHANDLE:=Init_Port( Porta, baudRate , databits , parity , stopbit , TamBuff  )
    IF EMPTY(NHANDLE)
       Peso := NIL
       UnInt_Port(nhandle)
       RETURN( - 16 )
       ? 'ERRO DE LEITURA NA BALANÇA'
    ENDIF
//    OutBufClr(NHANDLE) // Limpa o Buffer de Saida
    l_Erro   := .T.
    time_out   := 0
    DO WHILE l_ErrO=.T.
        Buffer := ""
        DO WHILE time_out < 100000 //IF(NETNAME()='DAF',60000,40000)
//            Bytes := InbufSize(NHANDLE)
            IF Bytes >= TamPacote
//                Buffer := InChr( NHANDLE, Bytes, @DADOS)
                IF Len( DADOS) - Len( StrTran( DADOS, Chr( 13 ), "" ) ) >= 2
                    EXIT
                ENDIF
            ENDIF
            time_out:= time_out+1
        ENDDO
        IF time_out >= 100000 //IF(NETNAME()='DAF',60000,40000)
            IF TamPacote = 100
                Peso := NIL
                UnInt_Port(nhandle)
                RETURN( - 30 )
            ELSE
                TamPacote := 100
                LOOP
            ENDIF
        ENDIF
        l_Erro  := .F.
        DADOS := SubStr( DADOS, At( Chr( 13 ), DADOS) + 1 )
        TamBuff := At( Chr( 13 ), DADOS)
        IF Upper( Modelo ) $ '9091,8132,8510,2090'
            DO WHILE .T.
                IF SubStr( DADOS, 1, 1 ) <> Chr( 2 ) .and. SubStr( DADOS, 2, 1 ) <> Chr( 2 )
                    Peso := NIL
                    UnInt_Port(nhandle)
                    RETURN( - 34 )
                ENDIF
                IF SubStr( DADOS, 2, 1 ) = Chr( 2 )
                    DADOS:= SubStr( DADOS, 2 )
                    l_check   := .T.
                ELSE
                    l_check   := .F.
                ENDIF
                Bytes   := At( Chr( 13 ), DADOS)
                IF Bytes = 0
                    Peso := NIL
                    UnInt_Port(nhandle)
                    RETURN( - 34 )
                ENDIF
                IF l_check
                    c_check := SubStr( DADOS, Bytes + 1, 1 )
                    IF c_check <> checksum( SubStr( DADOS, 1, Bytes ) )
                        Peso := NIL
                        UnInt_Port(nhandle)
                        RETURN( - 35 )
                    ENDIF
                ENDIF
                DADOS        := SubStr( DADOS, 1, Bytes - 1 )
                swa        := AscBin( Asc( SubStr( DADOS, 2, 1 ) ) )
                swb        := AscBin( Asc( SubStr( DADOS, 3, 1 ) ) )
                swa_bit7   := SubStr( swa, 1, 1 )
                swa_bit6   := SubStr( swa, 2, 1 )
                swa_bit5   := SubStr( swa, 3, 1 )
                swa_bit4   := SubStr( swa, 4, 1 )
                swa_bit3   := SubStr( swa, 5, 1 )
                swa_bit2   := SubStr( swa, 6, 1 )
                swa_bit1   := SubStr( swa, 7, 1 )
                swa_bit0   := SubStr( swa, 8, 1 )
                swb_bit7   := SubStr( swb, 1, 1 )
                swb_bit6   := SubStr( swb, 2, 1 )
                swb_bit5   := SubStr( swb, 3, 1 )
                swb_bit4   := SubStr( swb, 4, 1 )
                swb_bit3   := SubStr( swb, 5, 1 )
                swb_bit2   := SubStr( swb, 6, 1 )
                swb_bit1   := SubStr( swb, 7, 1 )
                swb_bit0   := SubStr( swb, 8, 1 )
                IF Upper( Modelo ) = '2090'
                    IF swa_bit6 <> '0' .or. swa_bit5 <> '1'
                        Peso := NIL
                        UnInt_Port(nhandle)
                        RETURN( - 34 )
                    ENDIF
                ELSE
                    IF swa_bit6 <> '0' .or. swa_bit5 <> '1' .or. swb_bit4 <> '1' .or. swb_bit5 <> '1'
                        Peso := NIL
                        UnInt_Port(nhandle)
                        RETURN( - 34 )
                    ENDIF
                ENDIF
                IF swb_bit2 = '1'
                    Peso := NIL
                    UnInt_Port(nhandle)
                    RETURN( - 32 )
                ENDIF
                c_Peso   := SubStr( DADOS, 5, 6 )
                IF swb_bit0 = '1'
                    c_Tara   := SubStr( DADOS, 11, 6 )
                    IF Empty( c_Tara )
                        c_Tara := '000000'
                    ENDIF
                    l_tara   := .T.
                ELSE
                    c_Tara   := '000000'
                    l_tara   := .F.
                ENDIF
                IF swa_bit2 = '0' .and. swa_bit1 = '0' .and. swa_bit0 = '1'
                    c_Peso := SubStr( c_Peso, 1, 6 )
                    c_Tara := SubStr( c_Tara, 1, 6 )
                ELSEIF swa_bit2 = '0' .and. swa_bit1 = '1' .and. swa_bit0 = '0'
                    c_Peso := SubStr( c_Peso, 1, 6 )
                    c_Tara := SubStr( c_Tara, 1, 6 )
                ELSEIF swa_bit2 = '0' .and. swa_bit1 = '1' .and. swa_bit0 = '1'
                    c_Peso := SubStr( c_Peso, 1, 5 ) + '.' + SubStr( c_Peso, 6, 1 )
                    c_Tara := SubStr( c_Tara, 1, 5 ) + '.' + SubStr( c_Tara, 6, 1 )
                ELSEIF swa_bit2 = '1' .and. swa_bit1 = '0' .and. swa_bit0 = '0'
                    c_Peso := SubStr( c_Peso, 1, 4 ) + '.' + SubStr( c_Peso, 5, 2 )
                    c_Tara := SubStr( c_Tara, 1, 4 ) + '.' + SubStr( c_Tara, 5, 2 )
                ELSEIF swa_bit2 = '1' .and. swa_bit1 = '0' .and. swa_bit0 = '1'
                    c_Peso := SubStr( c_Peso, 1, 3 ) + '.' + SubStr( c_Peso, 4, 3 )
                    c_Tara := SubStr( c_Tara, 1, 3 ) + '.' + SubStr( c_Tara, 4, 3 )
                ELSEIF swa_bit2 = '1' .and. swa_bit1 = '1' .and. swa_bit0 = '0'
                    c_Peso := SubStr( c_Peso, 1, 2 ) + '.' + SubStr( c_Peso, 3, 4 )
                    c_Tara := SubStr( c_Tara, 1, 2 ) + '.' + SubStr( c_Tara, 3, 4 )
                ELSE
                    l_Erro := .T.
                    EXIT
                ENDIF

                IF swb_bit1 = '1'
                    c_Peso := '-' + AllTrim( c_Peso )
                ENDIF
                IF swb_bit0 = '1'
                    c_liq  := c_Peso
                    c_Peso := ""
                ELSE
                    c_liq  := ""
                ENDIF
                EXIT
            ENDDO
            IF ! l_Erro
                c_Peso := AllTrim( c_Peso )
                c_liq  := AllTrim( c_liq  )
                c_Tara := AllTrim( c_Tara )

                IF ! Empty( c_Peso )
                    FOR x = 1 TO Len( c_Peso )
                        IF ! SubStr( c_Peso, x, 1 ) $ '0123456789.-'
                            l_Erro := .T.
                            Erro := - 31
                            EXIT
                        ENDIF
                    NEXT
                ELSE
                    IF ! Empty( c_liq )
                        FOR x = 1 TO Len( c_liq )
                            IF ! SubStr( c_liq, x, 1 ) $ '0123456789.-'
                                l_Erro := .T.
                                Erro := - 31
                                EXIT
                            ENDIF
                        NEXT
                    ELSE
                        l_Erro := .T.
                    ENDIF
                ENDIF
                IF l_tara .and. ! l_Erro
                    FOR x = 1 TO Len( c_Tara )
                        IF ! SubStr( c_Tara, x, 1 ) $ '0123456789.-'
                            l_Erro := .T.
                            Erro := - 31
                            EXIT
                        ENDIF
                    NEXT
                ENDIF
                IF ! Empty( c_liq ) .and. Empty( c_Peso ) .and. ! l_Erro
                    IF ! Empty( c_Tara )
                        c_Peso := AllTrim( Str( Val( c_liq ) + Val( c_Tara ) ) )
                    ELSE
                        c_Peso := c_liq
                    ENDIF
                ENDIF
            ENDIF
        ELSEIF Upper( Modelo ) $ '9096,8530'
            DO WHILE .T.
                IF SubStr( DADOS, 1, 1 ) <> Chr( 2 ) .and. SubStr( DADOS, 2, 1 ) <> Chr( 2 )
                    Peso := NIL
                    UnInt_Port(nhandle)
                    RETURN( - 34 )
                ENDIF
                IF SubStr( DADOS, 2, 1 ) = Chr( 2 )
                    DADOS:= SubStr( DADOS, 2 )
                    l_check   := .T.
                ELSE
                    l_check   := .F.
                ENDIF
                Bytes   := At( Chr( 13 ), DADOS)
                IF Bytes = 0
                    Peso := NIL
                    UnInt_Port(nhandle)
                    RETURN( - 34 )
                ENDIF
                IF l_check
                    c_check := SubStr( DADOS, Bytes + 1, 1 )
                    IF c_check <> checksum( SubStr( DADOS, 1, Bytes ) )
                        Peso := NIL
                        UnInt_Port(nhandle)
                        RETURN( - 35 )
                    ENDIF
                ENDIF
                DADOS      := SubStr( DADOS, 1, Bytes - 1 )
                swa         := AscBin( Asc( SubStr( DADOS, 2, 1 ) ) )
                swb         := AscBin( Asc( SubStr( DADOS, 3, 1 ) ) )
                swa_bit7   := SubStr( swa, 1, 1 )
                swa_bit6   := SubStr( swa, 2, 1 )
                swa_bit5   := SubStr( swa, 3, 1 )
                swa_bit4   := SubStr( swa, 4, 1 )
                swa_bit3   := SubStr( swa, 5, 1 )
                swa_bit2   := SubStr( swa, 6, 1 )
                swa_bit1   := SubStr( swa, 7, 1 )
                swa_bit0   := SubStr( swa, 8, 1 )
                swb_bit7   := SubStr( swb, 1, 1 )
                swb_bit6   := SubStr( swb, 2, 1 )
                swb_bit5   := SubStr( swb, 3, 1 )
                swb_bit4   := SubStr( swb, 4, 1 )
                swb_bit3   := SubStr( swb, 5, 1 )
                swb_bit2   := SubStr( swb, 6, 1 )
                swb_bit1   := SubStr( swb, 7, 1 )
                swb_bit0   := SubStr( swb, 8, 1 )
                IF swa_bit6 <> '1' .or. swa_bit5 <> '1' .or. swb_bit5 <> '1'
                    UnInt_Port(nhandle)
                    RETURN(-33)
                ENDIF
                IF swb_bit2 = '1'
                    UnInt_Port(nhandle)
                    RETURN(-32)
                ENDIF
                c_Peso   := SubStr( DADOS, 6, 5 )
                IF swb_bit0 = '1'
                    c_Tara   := SubStr( DADOS, 11, 5 )
                    IF Empty( c_Tara )
                        c_Tara := '00000'
                    ENDIF
                    l_tara   := .T.
                ELSE
                    c_Tara   := '00000'
                    l_tara   := .F.
                ENDIF
                IF swa_bit2 = '0' .and. swa_bit1 = '0' .and. swa_bit0 = '0'
                    c_Peso := c_Peso + "0"
                    c_Tara := c_Tara + "0"
                ELSEIF swa_bit2 = '0' .and. swa_bit1 = '0' .and. swa_bit0 = '1'
                    c_Peso := SubStr( c_Peso, 1, 5 )
                    c_Tara := SubStr( c_Tara, 1, 5 )
                ELSEIF swa_bit2 = '0' .and. swa_bit1 = '1' .and. swa_bit0 = '0'
                    c_Peso := SubStr( c_Peso, 1, 4 ) + '.' + SubStr( c_Peso, 5, 1 )
                    c_Tara := SubStr( c_Tara, 1, 4 ) + '.' + SubStr( c_Tara, 5, 1 )
                ELSEIF swa_bit2 = '0' .and. swa_bit1 = '1' .and. swa_bit0 = '1'
                    c_Peso := SubStr( c_Peso, 1, 3 ) + '.' + SubStr( c_Peso, 4, 2 )
                    c_Tara := SubStr( c_Tara, 1, 3 ) + '.' + SubStr( c_Tara, 4, 2 )
                ELSEIF swa_bit2 = '1' .and. swa_bit1 = '0' .and. swa_bit0 = '0'
                    c_Peso := SubStr( c_Peso, 1, 2 ) + '.' + SubStr( c_Peso, 3, 3 )
                    c_Tara := SubStr( c_Tara, 1, 2 ) + '.' + SubStr( c_Tara, 3, 3 )
                ELSE
                    l_Erro := .T.
                    EXIT
                ENDIF
                IF swb_bit1 = '1'
                    c_Peso := '-' + AllTrim( c_Peso )
                ENDIF
                IF swb_bit0 = '1'
                    c_liq  := c_Peso
                    c_Peso := ""
                ELSE
                    c_liq  := ""
                ENDIF
                EXIT
            ENDDO
            IF ! l_Erro
                c_Peso := AllTrim( c_Peso )
                c_liq  := AllTrim( c_liq  )
                c_Tara := AllTrim( c_Tara )

                IF ! Empty( c_Peso )
                    FOR x = 1 TO Len( c_Peso )
                        IF ! SubStr( c_Peso, x, 1 ) $ '0123456789.-'
                            l_Erro := .T.
                            Erro := - 31
                            EXIT
                        ENDIF
                    NEXT
                ELSE
                    IF ! Empty( c_liq )
                        FOR x = 1 TO Len( c_liq )
                            IF ! SubStr( c_liq, x, 1 ) $ '0123456789.-'
                                l_Erro := .T.
                                Erro := - 31
                                EXIT
                            ENDIF
                        NEXT
                    ELSE
                        l_Erro := .T.
                    ENDIF
                ENDIF
                IF l_tara .and. ! l_Erro
                    FOR x = 1 TO Len( c_Tara )
                        IF ! SubStr( c_Tara, x, 1 ) $ '0123456789.-'
                            l_Erro := .T.
                            Erro := - 31
                            EXIT
                        ENDIF
                    NEXT
                ENDIF
                IF ! Empty( c_liq ) .and. Empty( c_Peso ) .and. ! l_Erro
                    IF ! Empty( c_Tara )
                        c_Peso := AllTrim( Str( Val( c_liq ) + Val( c_Tara ) ) )
                    ELSE
                        c_Peso := c_liq
                    ENDIF
                ENDIF
            ENDIF
        ELSE
            Peso := NIL
               UnInt_Port(nhandle)            
            RETURN( - 1 )
        ENDIF
    ENDDO
    Peso := Val( c_Peso )
    Tara := Val( c_Tara )
    UnInt_Port(nhandle)

msgalert(peso,tara)

    TamPacote := TamBuff * 2

    RETURN ( 0 )


//----------------------------
FUNCTION Toledo_erro( Erro )
//----------------------------
    LOCAL mens   := ""
    IF Erro = - 1
        mens := 'Erro de parametros (Toledo)'
    ELSEIF Erro = - 2
        mens := 'Canal de comunicacao invalido (Toledo)'
    ELSEIF Erro = - 3
        mens := 'Numero de interrupcao invalido (Toledo)'
    ELSEIF Erro = - 4
        mens := 'Numero de Bits invalido (Toledo)'
    ELSEIF Erro = - 5
        mens := 'Taxa de comunicacao invalida (Toledo)'
    ELSEIF Erro = - 6
        mens := 'Numero de stop Bits invalido (Toledo)'
    ELSEIF Erro = - 7
        mens := 'Paridade invalida (Toledo)'
    ELSEIF Erro = - 8
        mens := 'Tamanho de buffer invalido (Toledo)'
    ELSEIF Erro = - 9
        mens := 'Tipo de controle de fluxo invalido (Toledo)'
    ELSEIF Erro = - 10
        mens := 'Canal de comunicacao ja está aberto (Toledo)'
    ELSEIF Erro = - 11
        mens := 'Canal de comunicacao nao esta aberto (Toledo)'
    ELSEIF Erro = - 12
        mens := 'Memoria insuficiente para a operacao (Toledo)'
    ELSEIF Erro = - 13
        mens := 'Buffer de Transmissao cheio (Toledo)'
    ELSEIF Erro = - 14
        mens := 'Buffer de recepcao vazio (Toledo)'
    ELSEIF Erro = - 15
        mens := 'Estado de sinal invalido (Toledo)'
    ELSEIF Erro = - 16
        mens := 'Porta invalida ou erro de hardware (Toledo)'
    ELSEIF Erro = - 17
        mens := 'Codigo de configuracao invalido (Toledo)'
    ELSEIF Erro = - 18
        mens := 'Erro de recepcao (Toledo)'
    ELSEIF Erro = - 19
        mens := 'Erro no Fechamento do canal (Toledo)'
    ELSEIF Erro = - 20
        mens := 'Erro na transmissao (Toledo)'
    ELSEIF Erro = - 30
        mens := 'Erro de Time-out Balanca (Toledo)'
    ELSEIF Erro = - 31
        mens := 'Erro de Comunicacao na Balanca. Dados nao numericos (Toledo)'
    ELSEIF Erro = - 32
        mens := 'Balanca excedeu a faixa de peso suportada. (Toledo)'
    ELSEIF Erro = - 33
        mens := 'Erro de Comunicacao na Balanca (Toledo)'
    ELSEIF Erro = - 34
        mens := 'Protocolo de balança inválido (Toledo)'
    ELSEIF Erro = - 35
        mens := 'Erro de consistência de CheckSum (Toledo)'
    ELSE
        mens := 'Erro desconhecido (Toledo)'
    ENDIF
    mens := '(' + AllTrim( Str( Erro ) ) + ')' + ' -> ' + mens
    RETURN( mens )

//----------------------------------
STATIC FUNCTION Checksum( Pacote )
//----------------------------------
    LOCAL f_tam := 0, f_asc := 0, f_bin := "", f_co2 := ""   , f_pos
    f_tam := Len( Pacote )

    FOR f_pos = 1 TO f_tam
        f_asc := f_asc + Asc( SubStr( Pacote, f_pos, 1 ) )
    NEXT
    f_bin := AscBin( f_asc )
    f_co2 := f_bin
    f_co2 := StrTran( f_co2, '1', '2' )
    f_co2 := StrTran( f_co2, '0', '1' )
    f_co2 := StrTran( f_co2, '2', '0' )
    f_co2 := AscBin( BinAsc( f_co2 ) + 1 )
    f_co2 := '0' + SubStr( f_co2, ( Len( f_co2 ) - 7 ) + 1, 7 )
    RETURN( Chr( BinAsc( f_co2 ) ) )

//-------------------------------
STATIC FUNCTION ascbin( f_asc )
//-------------------------------
    priv f_bin, f_tam
    IF ValType( f_asc ) # "N"
        msgstop( "erro de parametros. Funcção AscBin" )
        quit
    ENDIF
    IF f_asc < 0
        msgstop( "erro de parametros. Funcção AscBin" )
        quit
    ENDIF
    f_bin = ""
    DO WHILE f_asc >= 2
        f_bin = Str( ( f_asc % 2 ), 1 ) + f_bin
        f_asc = Int( f_asc / 2 )
    ENDDO
    f_bin = Str( f_asc, 1 ) + f_bin

    IF ( Len( f_bin ) % 8 ) <> 0
        f_tam := ( Int( Len( f_bin ) / 8 ) + 1 ) * 8
        f_bin = repl( "0", f_tam - Len( f_bin ) ) + f_bin
    ENDIF
    RETURN( ( f_bin ) )

//-------------------------------
STATIC FUNCTION binasc( f_bin )
//-------------------------------
    PRIVATE f_asc, f_tam, f_pot, p
    IF ValType( f_bin ) # "C"
        msgstop( "erro de parametros. Função BinAsc" )
        quit
    ENDIF
    f_asc := 0
    f_pot := 0
    FOR p = Len( f_bin ) TO 1 STEP - 1
        IF subst( f_bin, p, 1 ) = "1"
            f_asc := f_asc + ( 2 ** f_pot )
        ELSEIF subst( f_bin, p, 1 ) <> "0"
            msgstop( "erro de parametros. Função BinAsc" )
            quit
        ENDIF
        f_pot := f_pot + 1
    NEXT

    RETURN f_asc

//--------------------------- Final da rotina -----------------------------------


 

 

Link to comment
Share on other sites

  • 8 months later...


//--iniciando a porta
nPorta=2 //COM2
nVeloc=9600
cParid="N"
nBits=8
nParad=1
cInicia="P"
nTemp=0.5
nTama=15
	DO WHILE .T.
	   COM_HARD(.T.)
   
   nConf := Com_Init(nPorta,nVeloc,cParid,nBits,nParad)
	   if .not. nConf
	      COM_CLOSE(nPorta)
	      Wait "Falha na inicializacao da porta"
	      EXIT
      
   endif
	   //--envia o caracter de inicio para a balanca
   nRest= COM_SEND(nPorta,cInicia) //CHR(80))
	   //--aguarda um tempo para a leitura
   inkey(nTemp)
   
   //--recebe os dados da porta COM
   resulta=COM_READ(nPorta,nTama)
   
   //--limpa o buffer
   COM_FLUSH(nPorta)
	   COM_HARD(.F.)
	   //--fecha a porta
   COM_CLOSE(nPorta)
	   ? resulta
	   wait"Resultado da pesagem"
	   EXIT
ENDDO


Link to comment
Share on other sites


// TERMINAL.PRG - teste a porta da balança.
// Working sample of a simple ASCII terminal program - Developed by Enrico M. Giordano
	#include "Fivewin.ch" 
	FUNCTION MAIN() 
	    LOCAL oDlg 
	    LOCAL oGet, cTxt := "" 
	    LOCAL nCom 
	    DEFINE DIALOG oDlg; 
           SIZE 500, 500; 
           TITLE "Terminale" 
	    @ 0, 0 GET oGet VAR cTxt MEMO READONLY  // SIZE...
	    oGet:bKeyDown = { | nKey | Tasti( nCom, nKey ) } 
	    ACTIVATE DIALOG oDlg; 
             ON INIT ( oGet:AdjClient(),; 
                       nCom := APRICOM( oDlg, oGet ),; 
                       IF( nCom < 0, oDlg:End(), ) ); 
             CENTER 
	    IF nCom >= 0; CLOSECOMM( nCom ); ENDIF 
	    RETURN NIL 
	
STATIC FUNCTION TASTI( nCom, nKey ) 
	    SENDSTR( nCom, CHR( nKey ) ) 
	    RETURN NIL 
	
STATIC FUNCTION APRICOM( oDlg, oGet ) 
	    LOCAL nCom, cDcb 
	    BEGIN SEQUENCE 
        nCom = OPENCOMM( "COM1", 16384, 16384 ) 
	        IF nCom < 0 
            ? "Errore di apertura della porta di comunicazione." 
            BREAK 
        ENDIF 
	        BUILDCOMMDCB( "COM1:115200,N,8,1", @cDcb ) 
	        IF !SETCOMMSTATE( nCom, cDcb ) 
            ? "Errore di impostazione della porta di comunicazione." 
            BREAK 
        ENDIF 
	        oDlg:bCommNotify = { | nCom | Connect( nCom, oGet ),; 
                                      EnableCommNotification( nCom, oDlg:hWnd, 1, -1 ) } 
	        IF !ENABLECOMMNOTIFICATION( nCom, oDlg:hWnd, 1, -1 ) 
            ? "Errore di abilitazione della notifica." 
            BREAK 
        ENDIF 
    RECOVER 
        nCom = -1 
    END SEQUENCE 
	    RETURN nCom 
	
STATIC FUNCTION CONNECT( nCom, oGet ) 
	    LOCAL cStr 
	    ENABLECOMMNOTIFICATION( nCom, 0, 1, -1 ) 
	    cStr = RECEIVESTR( nCom ) 
	    cStr = STRTRAN( cStr, CHR( 13 ), "" ) 
    cStr = STRTRAN( cStr, CHR( 10 ), CRLF ) 
	    oGet:Append( cStr ) 
	    RETURN NIL 
	
STATIC FUNCTION SENDSTR( nCom, cString ) 
	    LOCAL nBytes := WRITECOMM( nCom, cString ) 
	    RETURN nBytes = LEN( cString ) 
	
STATIC FUNCTION RECEIVESTR( nCom ) 
	    LOCAL cBuf := SPACE( 1000 ) 
	    RETURN LEFT( cBuf, READCOMM( nCom, @cBuf ) )


 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...