Ariston Santos Posted August 8, 2014 Report Share Posted August 8, 2014 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. Quote Link to comment Share on other sites More sharing options...
Marca Posted August 8, 2014 Report Share Posted August 8, 2014 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 Quote Link to comment Share on other sites More sharing options...
tiaoFW Posted August 8, 2014 Report Share Posted August 8, 2014 Bom dia. Tente essa: http://www.salc.com.br/atual/hbcomm.lib Att. Quote Link to comment Share on other sites More sharing options...
tiaoFW Posted August 8, 2014 Report Share Posted August 8, 2014 Bom dia. Tente essa: http://www.salc.com.br/atual/hbcomm.lib Att. Quote Link to comment Share on other sites More sharing options...
Ariston Santos Posted August 8, 2014 Author Report Share Posted August 8, 2014 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 ? Quote Link to comment Share on other sites More sharing options...
kapiaba Posted August 8, 2014 Report Share Posted August 8, 2014 Veja se a sua é essa: 07/10/2013 17:18 25.600 hbcomm.lib Quote Link to comment Share on other sites More sharing options...
Ariston Santos Posted August 8, 2014 Author Report Share Posted August 8, 2014 É essa mesmo. Quote Link to comment Share on other sites More sharing options...
Ariston Santos Posted August 8, 2014 Author Report Share Posted August 8, 2014 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? Quote Link to comment Share on other sites More sharing options...
tiaoFW Posted August 8, 2014 Report Share Posted August 8, 2014 Uso o xharbour que vem com o fivewin, atualmente uso o FWH 13.12. No caso: xHarbour 1.2.3 Intl. (SimpLex) (Build 20130903) Copyright 1999-2013, http://www.xharbour.org http://www.harbour-project.org/ 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.) Quote Link to comment Share on other sites More sharing options...
Ariston Santos Posted August 8, 2014 Author Report Share Posted August 8, 2014 Tião, aproveitei parte do teu código para corrigir o problema e deu certo. Muito obrigado a todos. Quote Link to comment Share on other sites More sharing options...
tiaoFW Posted August 8, 2014 Report Share Posted August 8, 2014 Otimo. Parabens! Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.