Trago para vocês hoje, um exemplo de como fazer integração com balanças que usam rede com o Protheus.
Esse fonte foi desenvolvido e disponibilizado pelo grande Fernando Oliveira ( LinkedIn ).
Nessa integração, você passa o IP e a porta da balança e assim é criado uma conexão via TSocketClient.
Se a conexão estiver ok, ai é feito um Receive do Buffer para pegar a instrução que estiver na balança.
Abaixo o código fonte desenvolvido pelo grande Fernando:
#INCLUDE 'PROTHEUS.CH' #INCLUDE "RWMAKE.CH" #INCLUDE 'AGRAXFUN.CH' /** {Protheus.doc} Integra com a balança e captura o peso @author Fernando Oliveira @since 11/09/2020 @OBS É necessário o uso de um módulo TCP/IP para fazer a conversão da balança serial para IP @see www.linkedin.com/in/luis-fernando-oliveira-2b6a40a2 */ User Function BALIP() Local cPorta := "Porta da Balança" Local cIPServer := 'IP do módulo TCP/IP' Local cTimeOut := '2000' Local cScript := 'Substr(cConteudo,at(Chr(002) ,cConteudo)+3,7)' Local oSocket Local nSockResp := 0 Local nSockRead := 0 Local cBuffer := '' Local nFor01 := 0 Local nRetorno := 0 Local cConteudo := "" oSocket := tSocketClient():New() //Criando a Clase For nFor01 := 1 to 10 nSockResp := oSocket:Connect( val(cPorta),Alltrim(cIPServer),Val( cTimeOut ) ) //Verificamos se a conexao foi efetuada com sucesso IF !( oSocket:IsConnected() ) //ntSocketConnected == 0 OK Help(,,STR0010,,STR0020 + Chr(10) + Chr(13) + "[ " + StrZero( nFor01,3 ) + " ]" , 1, 0 ) //"Ajuda"####não foi possivel conectar com a balança na Porta# Else nSockResp == 0 // Conexão Ok Exit EndIF Next IF nSockResp == 0 // Indica que Está conectado // Enviando um Get Para Capturar o Peso Sleep (5000) For nFor01 := 1 To 10 cBuffer := "" nSockRead = oSocket:Receive( @cBuffer, Val( cTimeout ) ) IF( nSockRead > 0 ) cConteudo := cBuffer Exit Else cConteudo := '' Endif Next nFor01 Else Help(,,STR0010,,STR0027 + Chr(10) + Chr(13) + "[ " + cIpServer + "/" + cPorta + " ]" , 1, 0 ) //"Ajuda"####não foi possivel conectar com a balança. Tentavia:# ###"Balança: " EndIF oSocket:CloseConnection() //Fechando a Conexão If .Not. Empty( AllTrim( cScript ) ) // Irá Aplicar o Script no cConteudo cScript := "{||" + Alltrim(cScript) + "}" //Transformando o Script em bloco de codigo cConteudo := Eval( &( cScript ) ) nRetorno := Val( cConteudo ) Else nRetorno := 0 EndIf Return(nRetorno)
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Boa tarde,
onde eu encontro essa AGRAXFUN.CH ?
Bom dia Euler, tudo joia?
Acho que nesse exemplo que o Fernando disponibilizou não precisa dessa biblioteca. Faça um teste e comente a linha dela, para ver se o restante do código funciona.
Ai nos dê um feedback.
Tenha uma ótima e abençoada terça feira.
Um grande abraço.
Obrigado! vou testar e aviso.
Bom dia Euler, tudo joia?
Nós que agradecemos pelo comentário.
Tenha uma ótima e abençoada sexta feira.
Um grande abraço.
Boa tarde, fiz um teste aqui
não conecta no ip e porta pra pegar o valor que a Balança esta enviando:
#INCLUDE ‘PROTHEUS.CH’
#INCLUDE “RWMAKE.CH”
//#INCLUDE ‘AGRAXFUN.CH’
/** {Protheus.doc}
Integra com a balança e captura o peso
@author Fernando Oliveira
@since 11/09/2020
@OBS É necessário o uso de um módulo TCP/IP para fazer a conversão da balança serial para IP
@see http://www.linkedin.com/in/luis-fernando-oliveira-2b6a40a2
*/
User Function BALIP()
Local cPorta := “8881”
Local cIPServer := ‘192.168.1.30’
Local cTimeOut := ‘2000’
Local cScript := ‘Substr(cConteudo,at(Chr(002) ,cConteudo)+3,7)’
Local oSocket
Local nSockResp := 0
Local nSockRead := 0
Local cBuffer := ”
Local nFor01 := 0
Local nRetorno := 0
Local cConteudo := “”
oSocket := tSocketClient():New() //Criando a Clase
For nFor01 := 1 to 10
nSockResp := oSocket:Connect( val(cPorta),Alltrim(cIPServer),Val( cTimeOut ) )
//Verificamos se a conexao foi efetuada com sucesso
IF !( oSocket:IsConnected() ) //ntSocketConnected == 0 OK
//Help(,,STR0010,,STR0020 + Chr(10) + Chr(13) + “[ ” + StrZero( nFor01,3 ) + ” ]” , 1, 0 ) //”Ajuda”####não foi possivel conectar com a balança na Porta#
MsgAlert(“teste”)
Else
nSockResp == 0 // Conexão Ok
Exit
EndIF
Next
IF nSockResp == 0 // Indica que Está conectado // Enviando um Get Para Capturar o Peso
Sleep (5000)
For nFor01 := 1 To 10
cBuffer := “”
nSockRead = oSocket:Receive( @cBuffer, Val( cTimeout ) )
IF( nSockRead > 0 )
cConteudo := cBuffer
Exit
Else
cConteudo := ”
Endif
Next nFor01
Else
// Help(,,STR0010,,STR0027 + Chr(10) + Chr(13) + “[ ” + cIpServer + “/” + cPorta + ” ]” , 1, 0 ) //”Ajuda”####não foi possivel conectar com a balança. Tentavia:# ###”Balança: ”
MsgINfo(“teste”)
EndIF
oSocket:CloseConnection() //Fechando a Conexão
If .Not. Empty( AllTrim( cScript ) ) // Irá Aplicar o Script no cConteudo
cScript := “{||” + Alltrim(cScript) + “}” //Transformando o Script em bloco de codigo
cConteudo := Eval( &( cScript ) )
nRetorno := Val( cConteudo )
Else
nRetorno := 0
EndIf
MsgAlert(nRetorno)
Return(nRetorno)
tem alguma ideia do que pode ser ?
Bom dia Euler, tudo joia?
Ele chega a dar a mensagem de help no fonte?
Um teste também, a máquina tem algum firewall? Se você der o ping direto para o IP através da máquina, ela consegue se comunicar?
Tenha uma ótima e abençoada quarta feira.
Um grande abraço.
Daniel bom di,
eu comentei o help pois não tenho a biblioteca que contem essa STR0010,,STR0020.
E sim consigo pingar no ip onde o Adapatado RC-232 esta, Consigo acessa-lo pela rede. tudo certo.
Eu acho que e falta da AGRAXFUN.CH.
Bom dia Euler, tudo joia?
Quanto as STR0*, basta você colocar uma frase no lugar apenas para testar os Helps.
Um grande abraço.
Bom dia de novo!
Consegui. Muito obrigado esse fonte foi de grande ajuda.
basta na linha:
oSocket := tSocketClient():New() //Criando a Clase
informar assim!
oSocket := tSocketClient():New(.T.) //PARA PEGAR OS ENDEREÇOS DO CLIENT E NÃO DO APP Server. Pois a balança esta em uma faixa de rede e o app server em outra.
Bom dia Euler, tudo joia?
Opa, nós que agradecemos pelo feedback.
Tenha uma ótima e abençoada quinta feira.
Um grande abraço.