Jump to content
Fivewin Brasil

Pegar peso da balança - Hbcomm.lib - xhb121 (Resolvido)


Ariston Santos

Recommended Posts

Oi, amigos.

Alguém tem um função de captura de peso, compilada com xHarbour 1.2.1, que seja 100% funcional?

O problema é que a que a minha, usando a hbcomm.lib, parou de funcionar. Não lê a balança, não retorna o peso.

Inclusive notei que houve mudança nela, pois a funcão Init_Port(), qua antes retornava nHandle, agora retorna .T. ou .F..

Agradeço.

Link to comment
Share on other sites

Oi, amigos.

Alguém tem um função de captura de peso, compilada com xHarbour 1.2.1, que seja 100% funcional?

O problema é que a que a minha (abaixo), usando a hbcomm.lib, parou de funcionar. Não lê a balança, não retorna o peso.

Inclusive notei que houve mudança nela, pois a funcão Init_Port(), qua antes retornava nHandle, agora retorna .T. ou .F..

Agradeço.

===========

Função anterior que passou a dar erro com xHarbour 1.2.1

FUNCTION LerPesoBalanca(oDlVenda, nBPeso, nBalTry, oTimer) // Funcionando com PIX-III Light
   local cBPort := ALLTRIM(GetPvProfString( "BALANCA", "PortaCOM", "COM1", ".\SISCOM.INI"))
   local cBVelo := VAL(GetPvProfString( "BALANCA", "Valocida", "4800", ".\SISCOM.INI"))
   local cBData := VAL(GetPvProfString( "BALANCA", "DataBits", "8", ".\SISCOM.INI"))
   local cBPari := LEFT(GetPvProfString( "BALANCA", "Paridade", "None", ".\SISCOM.INI"),1)
   local cBStop := VAL(GetPvProfString( "BALANCA", "StopBits", "1", ".\SISCOM.INI"))

   DEFAULT nBalTry := 0

   IF oTimer != NIL ; oTimer:Deactivate() ; ENDIF
   oDlVenda:Update()

   nHandle := Init_Port(cBPort,cBVelo,cBData,cBPari,cBStop,14)
   If nHandle <= 0
      MsgStop("Erro ao abrir a porta: " + cBPort + CRLF+"Verifique se a mesma não está sendo usada por outro programa.", "Alerta!")
      IF oTimer != NIL ; oTimer:Activate() ; ENDIF
      xQtd := 1
      nBPeso := xQtd
      oDlVenda:Update()
      Return xQtd
   Endif

   OutBufClr(nHandle)      // Limpa o Buffer de Saida
   OutChr(nHandle,CHR(5))
   SysWait(0.3)

   Bytes  := InbufSize(nHandle)
   cDados := Space(20)
   Buffer := InChr( nHandle, Bytes, @cDados) //LER BUFFER DE ENTRADA DA BALANCA
   UnInt_Port(nHandle)

   xQtd := (val(substr(cDados,2,5))/1000)
   IF xQtd <= 0
      xQtd := 0
      nBalTry ++
   ENDIF

   IF xQtd = 0
      IF nBalTry > 2
         nBalTry := 0
         xQtd := 1.000
         MsgGet("Não leu a balança. Digite o peso","Não leu a balança. Digite o peso:",@xQtd)
      ENDIF
   ENDIF

   nBPeso := xQtd
   oDlVenda:Update()
   IF oTimer != NIL ; oTimer:Activate() ; ENDIF
RETURN( xQtd )

Olá Ariston , bom dia

Caso vc tenha trocado seu xHarbour com certeza é as sua lib hbcomm.lib que não esta compativel com ele, basta vc procurar por uma para esta versão.

Isso acoteceu comigo tbem sendo que estou tilizando o xHarbour 1.2.3

Link to comment
Share on other sites

Tião, obrigado.

É esta mesmo que uso. Inclusive foi você que me meu ala na última vez que recorri ao forum.

Interessante é que compila sem nenhum erro, mas não lê o peso nem da balança (COM1, via cabo) nem dos simuladores (COM4, via com0com). Antes lia perfeitamente.

Sua função para ler peso aínda é a mesma?

E você usa o xHarbour 1.2.1 ?

Link to comment
Share on other sites

Quando funcionava corretamente, eu chamava a função assim:

   local cBPort := ALLTRIM(GetPvProfString( "BALANCA", "PortaCOM", "COM1", ".\SISCOM.INI"))
   local cBVelo := VAL(GetPvProfString( "BALANCA", "Valocida", "4800", ".\SISCOM.INI"))
   local cBData := VAL(GetPvProfString( "BALANCA", "DataBits", "8", ".\SISCOM.INI"))
   local cBPari := LEFT(GetPvProfString( "BALANCA", "Paridade", "None", ".\SISCOM.INI"),1)
   local cBStop := VAL(GetPvProfString( "BALANCA", "StopBits", "1", ".\SISCOM.INI"))
   nHandle := Init_Port(cBPort,cBVelo,cBData,cBPari,cBStop,1024)

Agora, se fazendo assim, dá esse erro: "abnormal program termination", e fecha o programa.

Vasculhando, descobri que se eu mudar o valor de cBPari para 0 e cBStop para 1, não dá erro, mas também não lê nada.

Alguém mais arrisca um palpite?

Link to comment
Share on other sites

Uso o xharbour que vem com o fivewin, atualmente uso o FWH 13.12.

No caso:

xHarbour 1.2.3 Intl. (SimpLex) (Build 20130903)

Como testo a função a cada nova versão que lanço creio que esta funcionando perfeitamente.

Sim, minha função creio não ter mudado, vou postar aqui novamente para vc comparar:

PegaPeso(@vpeso_balanca)


Static Function PegaPeso(vpeso_balanca)

LOCAL Warea := select(), retorno := .t., vpeso := 0

private nMarca, nComm := 0, cPorta, vlc, ret := .f.
private prtvlc, cParid, nBdado, nBpara, nTamStrP, nTamRet

sele abalanca

nMarca := MARCA
cPorta := "COM"+str(PORTA_SER,1)
vlc := VELOCIDADE

cParid := PARIDADE
nBdado := BITS_DADOS
nBpara := STOP_BITS
nTamStrP := TAM_STRING
nTamRet := TAM_RETORN
cstring_p := STRING_P

select (Warea)

sysrefresh()

Do While .t.

   vpeso := 0

   if !Ativar_Porta(cPorta, vlc, nBdado, cParid, nBpara)
      retorno := .f.
      exit
   endif

   BytesAtPort( nComm, @vpeso )

   Fecha_Porta(nComm)

   IF ret
      vpeso_balanca := vpeso
      Exit
   ELSE
     erro("A Balança não está emitindo sinal de retorno!")
     Exit
   ENDIF

   sysrefresh()
ENDDO

return(retorno)




static Function Ativar_Porta(vPor_,vVel_,vBit_,vPar_,vSto_)

Local vRetApc := .F.

Fecha_Porta(nComm) // Fecha a porta caso esteja aberta

nComm := Init_Port(vPor_, vVel_, vBit_, vPar_, vSto_, if(nMarca == 3, 46, 20))

If nComm > 0 .and. IsWorking(nComm)
   vRetApc:=.T.
Else
   erro("Porta Desconectada!"+CRLF+"Erro ao Abrir a Porta Serial "+vPor_)
EndIf

Return(vRetApc)



//---------------------------------------------------------//
static function BytesAtPort( nStatus, vpeso )

   local cBuffer := space(20), cvar := "", vTenCom := 0, vbytes := 0

   IF nStatus = 0
      erro( "Nao Existe Comunicação com a balança!")
   ENDIF

   //InBufClr(nComm)   // Limpa Buffer Entrada
   OutBufClr(nComm)  // Limpa Buffer Saida
   sysrefresh()

   cBuffer := if(nTamRet == 1 .or. nTamRet == 0, space(20), space(nTamRet))
   cvar := ""

   do while empty(cbuffer)

      //InBufClr(nComm)   // Limpa Buffer Entrada
      OutBufClr(nComm)  // Limpa Buffer Saida
//      OutChr(nComm, if(nMarca == 3, chr(04), Chr(05)))  // Envia Dados
      sysrefresh()

      do While .t.

         cBuffer := if(nTamRet == 1 .or. nTamRet == 0, space(20), space(nTamRet))

         //InBufClr(nComm)   // Limpa Buffer Entrada
         OutBufClr(nComm)  // Limpa Buffer Saida
         OutChr(nComm, if(nMarca == 3, chr(04), Chr(05)))  // Envia Dados
         sysrefresh()

         syswait(.3)

         sysrefresh()

         If (vbytes := InbufSize(nComm)) > 0  // Ler o Buffer da Serial
            InChr(nComm, vBytes , @cbuffer)    // Recebe Dados
         EndIf

         sysrefresh()

         If vTenCom > 3
            cbuffer := "ER"
            Exit
         EndIf

         vTenCom++

         if len(alltrim(cbuffer)) # 0
            exit
         endif

         sysrefresh()
      enddo

      sysrefresh()

      //InBufClr(nComm)   // Limpa Buffer Entrada
      OutBufClr(nComm)  // Limpa Buffer Saida

      sysrefresh()

      if cbuffer == "ER"
         ret := .t.
         erro("Tempo máximo para captura do peso atingido!"+CRLF+ ;
              "Retire e Coloque o produto na balança!")
         exit
      endif

      cbuffer := strtran(cbuffer, chr(02), "")
      cbuffer := strtran(cbuffer, chr(03), "")
      cbuffer := strtran(cbuffer, chr(27), "")

      if nMarca # 3
         if !empty(cstring_p)
            cbuffer := substr(cbuffer, at(alltrim(cstring_p), cbuffer)+len(alltrim(cstring_p))+1, nTamStrP)
         else
            cbuffer := substr(cbuffer,1,nTamStrP)
         endif
      else
         if !empty(cstring_p)
            cbuffer := substr(cbuffer, at(alltrim(cstring_p), cbuffer)+len(alltrim(cstring_p))+1, nTamStrP)
         else
            cbuffer := substr(cbuffer,42,nTamStrP)
         endif
      endif

      cbuffer := alltrim(cbuffer)

      cvar := cBuffer

      if empty(cvar)
         loop
      endif

      if at(".", cvar) # 0 .or. at(",", cvar) # 0
         if at(",", cvar) # 0
            cvar := strtran(cvar, ",",".")
         endif
         vpeso := VAL(cVar)
      else
         vpeso := VAL(cVar) / 1000
      endif

      IF vpeso > .002
         ret:=.t.
         exit
      ENDIF

      cBuffer := if(nTamRet == 1 .or. nTamRet == 0, space(20), space(nTamRet))

      sysrefresh()

   enddo

return nil


Function Fecha_Porta(nComm_)

If !Empty(nComm_)
   UnInt_Port(nComm_) // Fecha a Porta
EndIf

sysrefresh()

Return(.T.)

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...