Como buscar o peso de uma balança via TCP-IP usando AdvPL

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.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

10 Responses

  1. EULER ELIAS SILVESTRE disse:

    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.

  2. EULER ELIAS SILVESTRE disse:

    Obrigado! vou testar e aviso.

  3. EULER ELIAS SILVESTRE disse:

    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.

  4. EULER ELIAS SILVESTRE disse:

    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.

  5. EULER ELIAS SILVESTRE disse:

    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.

Deixe uma resposta

Terminal de Informação