Forms fecha quando chama DLL ( Toledo )

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Bom dia pessoal,

Estamos com um problema sério aqui na empresa e, gostaria de saber se alguém já passou por isso.

Ambiente:
-Microsoft Windows XP + SP2;
-Forms [32 Bit] Version 6.0.8.27.0 (Production);
-DLL Toledo ( pclink6.dll );

Problema:
O forms tem um botão, que chama a DLL através de uma PLL.
Até a parte de leitura de biblioteca, tudo bem (LoadLibrary).
Porém, quando tento fazer a chamada, para uma das funções da DLL, mais especificamente a SETA_IP, passando como parâmetro o IP onde se localiza a balança, o forms fecha, sem causar exception alguma.

Coloquei abaixo, um dos dumps gerados após N tentativas de chamada:

Selecionar tudo

[06/13/08 18:11:04 Hora oficial do Brasil]::Client Status [ConnId=0, PID=1776]
	>> ERROR: Abnormal termination, Error Code: C0000005 ACCESS_VIOLATION

======================= STACK DUMP =======================

Fault address:  0229487F 01:0000387F
Module: c:\windows\system32\pclink6.dll

System Information:
Operating System: Windows NT Version 5.1 Build 2600 Service Pack 2
Command line: IFDBG60 -SsL09@
FORM/BLOCK/FIELD: GVOC0009:EV_CONTR_ITEM_PESAGEM.BT_RECUPERA_TARA
Last Trigger: WHEN-BUTTON-PRESSED - (In Progress)
Msg: <NULL>
Last Builtin: PAUSE - (Successfully Completed)

Registers:
EAX:0012C718
EBX:017C7AD0
ECX:00000000
EDX:00000031
ESI:00000000
EDI:0012C9DC
CS:EIP:001B:0229487F
SS:ESP:0023:0012C6FC  EBP:0012C754
DS:0023  ES:0023  FS:003B  GS:0000
Flags:00010202
------------------- Call Stack Trace ---------------------

Frameptr   RetAddr  Param#1  Param#2  Param#3  Param#4  Function Name       

0x0012c754 004f2ed3 00000031 00000000 00000000 00000000 0x0229487f          

0x0012c868 00430e4e 017be4a8 0231c634 0012c8ec 00000001 0x004f2ed3          

0x0012ca90 00491630 017c7ad0 00000003 01ecc648 00002c01 0x00430e4e          

0x0012dba8 6646452a 017c7ad0 017a5e40 01f036cc 00000008 0x00491630          

0x0012dc10 0049febc 017a5e40 017c7ad0 017be4a8 0173e76c 0x6646452a          

0x017a3edc 0173e76c 00461c70 00461cb0 0066c0e0 00000000 0x0049febc          

0x017be4a8 00000001 0000000a 017be7c8 67fbcf2f 00615492 0x0173e76c          

------------------- End of Stack Trace -------------------
Se alguém já passou por isso, ou , tiver alguma idéia de como resolver, fico agradecido.
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Eae broder

Como você ta fazendo a chamada da DLL ?
Usou a ORA_FFI ?
Sem ser pelo forms funciona a DLL perfeitamente ?
Se tiver o codigo que você usou, manda pra gente ver!! :-D
Avatar do usuário
alef
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 119
Registrado em: Ter, 06 Nov 2007 2:45 pm
Localização: Patos de Minas - MG
Alexandre Matos
Patos de Minas - MG
Do interior de Minas para o resto do Mundo

Trevis, eu faço com que a lePESO.exe execute e grave um txt com o peso. não sei se vai resolver o seu caso, mas pelo menos resolveu, o unico problema é que o codigo so pode ser executado no pc que a balança esta conectada. ou seja outro computador não pode ler o peso a partir da balança.
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Amigos,

Seguinte,

Chamada pelo exemplo que vem nela, pelo Delphi, está tudo ok.
O meu grande problema é quando chamada pelo Forms.

Alef, você poderia me mandar um exemplo deste programa?
Se for o caso, posso fazer um form pra buscar este txt.

Muito obrigado à todos.
Avatar do usuário
alef
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 119
Registrado em: Ter, 06 Nov 2007 2:45 pm
Localização: Patos de Minas - MG
Alexandre Matos
Patos de Minas - MG
Do interior de Minas para o resto do Mundo

posso mandar sim,
mas vai ter de ser pelo msn, porque tem outros detalhes que tenho de passar dai depois montamos um material e colocamos aqui no forum.

beleza?
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother, te mandei um mail, aqui pelo Fórum, contendo meus dados para contato.
Pode confirmar se recebeu?
Muito obrigado,
Bel-Kyor
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Qua, 16 Jul 2008 4:52 pm
Localização: são Paulo - SP
Contato:

Senhores, bom dia
aqui na empresa onde trabalho, utilizamos o Oracle Applications e hoje para ler o peso da balança é utilizado o sistema da Toledo, Guardian.

Surgiu uma necessidade de integrar a leitura de peso dentro do sistema ERP.
porem o forms nesse caso é executado pelo servidor, não existe client instalado no computador da balança.

alguém já teve esse tipo de situação?

também gostaria de pedir um auxilio para transformar a pclink6.dll em pll
se alguém já tiver essa library e puder me fornecer eu agradeço.

Desde já Muito Obrigado
Belks
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother,

Após ajuda de amigos aqui do fórum e, de alguns outros amigos, consegui ler o peso via sistema, através do IP da balança, pois ela não está diretamente ligada no micro.

Eu vou procurar a ordem da chamada da DLL, que é fundamental para o processo, e, posto aqui pra você.

Você possui que versão da balança? É que realizei este trabalho na versão 6 ( uma nova versão da Toledo ).
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Certa vez eu já tive incompatibilidade com chamadas de DLL feitas em DELPHI. Daí, a idéia que solucionou o caso foi criar um DLL em C que chama a função da DLL em Delphi :?

Daí deu certo... Mas era outro ambiente, era Forms 10g rodando Jacob.jar e WebUtil...
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Pessoal, segue uma solução encontrada, abaixo:

SPEC

Selecionar tudo

PACKAGE BL_TOLEDO IS 

-- IP_SETADO    BINARY_INTEGER;
FFI_Error     	BOOLEAN;
FFI_Error_Text	VARCHAR2(2000);
FFI_Error_Code	NUMBER;

FUNCTION Seta_Ip(IPStr IN VARCHAR2) RETURN BINARY_INTEGER;

FUNCTION W9091(IP_SETADO IN BINARY_INTEGER, Canal IN VARCHAR2) RETURN BINARY_INTEGER;

FUNCTION Select_Canal(CANAL_SETADO IN BINARY_INTEGER) RETURN BINARY_INTEGER;

PROCEDURE Close_Canal(CANAL_SETADO IN BINARY_INTEGER);

FUNCTION Update_Canal(CANAL_SETADO IN BINARY_INTEGER) RETURN BINARY_INTEGER;

FUNCTION Gross_Canal(CANAL_SETADO IN BINARY_INTEGER) RETURN VARCHAR2;

FUNCTION Net_Canal(CANAL_SETADO IN BINARY_INTEGER) RETURN VARCHAR2;

FUNCTION Tare_Canal(CANAL_SETADO IN BINARY_INTEGER) RETURN VARCHAR2;

FUNCTION DIO_InPortStr (IP_SETADO IN BINARY_INTEGER) RETURN VARCHAR2;

FUNCTION DIO_InBit (IP_SETADO IN BINARY_INTEGER, ID_ENTRADA IN BINARY_INTEGER) RETURN PLS_INTEGER;

FUNCTION DIO_OutPortStr (IP_SETADO IN BINARY_INTEGER, PALAVRA IN CHAR) RETURN BINARY_INTEGER;

FUNCTION Update_NoMotion (CANAL_SETADO IN BINARY_INTEGER, TEMPO IN BINARY_INTEGER) RETURN BINARY_INTEGER;

-- Procedimento Padrão para leitura de peso
PROCEDURE PR_LER_PESO (peso_bruto   IN OUT BINARY_INTEGER
                     , peso_liquido IN OUT BINARY_INTEGER
                     , peso_tara    IN OUT BINARY_INTEGER
                     , IPStr        IN VARCHAR2
                     , Canal        IN VARCHAR2
                     , p_open       IN VARCHAR2);
                     
PROCEDURE ABREDLL (p_open  VARCHAR2);                     


END BL_TOLEDO;

BODY

Selecionar tudo

-- Conexão por IP 
-- Favor não alterar as informações, nem a ORDEM das chamadas, sem consultar manual ou, o 
-- fornecedor da Balança ( Toledo )
-- Qualquer alteração na ordem das chamadas da DLL, pode acarretar erros e, não trazer o peso da balança.
/* PACKAGE BODY RESPONSÁVEL POR TRABALHAR COM NOVA VERSÃO DA BALANÇA TOLEDO, MODELO 6, FIREX */

PACKAGE BODY BL_TOLEDO IS
  
  retorno1   ora_ffi.libhandletype;   -- Variável utilizada no corpo do pacote
  retorno2   ora_ffi.funchandletype;  -- Seta_Ip
  retorno3   ora_ffi.funchandletype;  -- W9091
  retorno4   ora_ffi.funchandletype;  -- Select_Canal
  retorno5   ora_ffi.funchandletype;  -- Close_Canal
  retorno6   ora_ffi.funchandletype;  -- Update_Canal      
  retorno7   ora_ffi.funchandletype;  -- Gross_Canal
  retorno8   ora_ffi.funchandletype;  -- Net_Canal
  retorno9   ora_ffi.funchandletype;  -- Tare_Canal
  
  retorno10  ora_ffi.funchandletype;  -- DIO_InBit
  retorno11  ora_ffi.funchandletype;  -- Update_NoMotion
  retorno12  ora_ffi.funchandletype;  -- DIO_InPortStr
  retorno13  ora_ffi.funchandletype;  -- DIO_OutPortStr
  retorno14  ora_ffi.funchandletype;  -- Estado_EmMovimento
  
  erro_nulo  EXCEPTION;
  
-- *********************************************************************************  	
 
FUNCTION S_Seta_Ip (TESTE_HANDLE Ora_Ffi.Funchandletype,
                    IPStr IN VARCHAR2)
       RETURN BINARY_INTEGER;
PRAGMA interface(C, S_Seta_Ip, 11265);

FUNCTION Seta_Ip (IPStr IN VARCHAR2)
  RETURN BINARY_INTEGER
  IS
   	  v_identificador    NUMBER;
   	  erro               EXCEPTION;
      
   BEGIN
      
      v_identificador := S_Seta_Ip(retorno2, IPStr);
   
      IF v_identificador = -1 THEN
      	
      	 Message( 'Impossivel setar o IP do Módulo Firex' );
      	 RAISE erro;
   	
      END IF;
      
      RETURN (v_identificador);
   
   EXCEPTION
      	
      WHEN erro THEN
         RAISE erro_nulo;
      
      WHEN OTHERS THEN
         message( 'BL.PLL BALANCA.Seta_Ip: ' || SQLERRM );
         RAISE FORM_TRIGGER_FAILURE;
         
   END;
-- *********************************************************************************  	

-- *********************************************************************************  	
  
FUNCTION S_W9091 (TESTE_HANDLE  Ora_Ffi.Funchandletype,
                          IP_SETADO   IN BINARY_INTEGER,
                          Canal       IN VARCHAR2)
       RETURN BINARY_INTEGER;
PRAGMA interface(C, S_W9091, 11265);

FUNCTION W9091 (IP_SETADO IN BINARY_INTEGER,
                Canal     IN VARCHAR2)
  RETURN BINARY_INTEGER
  IS

   	  v_identificador    BINARY_INTEGER;

   BEGIN

      v_identificador := S_W9091(retorno3, IP_SETADO, Canal);
   
      RETURN (v_identificador);
   
   END;
-- *********************************************************************************  	

-- *********************************************************************************  	
  
FUNCTION S_Select_Canal (TESTE_HANDLE  Ora_Ffi.Funchandletype,
                         CANAL_SETADO IN BINARY_INTEGER)
       RETURN BINARY_INTEGER;
PRAGMA interface(C, S_Select_Canal, 11265);

FUNCTION Select_Canal (CANAL_SETADO IN BINARY_INTEGER)
  RETURN BINARY_INTEGER
  IS
   	  v_identificador    BINARY_INTEGER;

   BEGIN
   	
      v_identificador := S_Select_Canal(retorno4, CANAL_SETADO);
         
      RETURN (v_identificador);
   
   END;
-- *********************************************************************************  	

-- *********************************************************************************  	
  
PROCEDURE S_Close_Canal (TESTE_HANDLE  Ora_Ffi.Funchandletype,
                         CANAL_SETADO IN BINARY_INTEGER);
PRAGMA interface(C, S_Close_Canal, 11265);

PROCEDURE Close_Canal (CANAL_SETADO IN BINARY_INTEGER)
  IS
   BEGIN
      S_Close_Canal(retorno5, CANAL_SETADO);
   END;
-- *********************************************************************************  	

-- *********************************************************************************  	
  
FUNCTION S_Update_Canal (TESTE_HANDLE  Ora_Ffi.Funchandletype,
                         CANAL_SETADO IN BINARY_INTEGER)
       RETURN BINARY_INTEGER;
PRAGMA interface(C, S_Update_Canal, 11265);

FUNCTION Update_Canal (CANAL_SETADO IN BINARY_INTEGER)
  RETURN BINARY_INTEGER
  IS
   	  v_identificador    BINARY_INTEGER;

   BEGIN
      
      v_identificador := S_Update_Canal(retorno6, CANAL_SETADO);
        
      RETURN (v_identificador);
   
   END;
-- *********************************************************************************  	


-- *********************************************************************************  	
  
FUNCTION S_Gross_Canal (TESTE_HANDLE  Ora_Ffi.Funchandletype,
                         CANAL_SETADO IN BINARY_INTEGER)
       RETURN VARCHAR2;
PRAGMA interface(C, S_Gross_Canal, 11265);

FUNCTION Gross_Canal (CANAL_SETADO IN BINARY_INTEGER)
  RETURN VARCHAR2
  IS
   	  v_bruto VARCHAR2(20);

   BEGIN

      v_bruto := S_Gross_Canal(retorno7, CANAL_SETADO);
   
      RETURN (v_bruto);
   
   END;
-- *********************************************************************************  	

-- *********************************************************************************  	
  
FUNCTION S_Net_Canal (TESTE_HANDLE  Ora_Ffi.Funchandletype,
                         CANAL_SETADO IN BINARY_INTEGER)
       RETURN VARCHAR2;
PRAGMA interface(C, S_Net_Canal, 11265);

FUNCTION Net_Canal (CANAL_SETADO IN BINARY_INTEGER)
  RETURN VARCHAR2
  IS
   	  v_liquido VARCHAR2(20);

   BEGIN

      v_liquido := S_Net_Canal(retorno8, CANAL_SETADO);
   
      RETURN (v_liquido);
   
   END;
-- *********************************************************************************  	

-- *********************************************************************************  	
  
FUNCTION S_Tare_Canal (TESTE_HANDLE  Ora_Ffi.Funchandletype,
                         CANAL_SETADO IN BINARY_INTEGER)
       RETURN VARCHAR2;
PRAGMA interface(C, S_Tare_Canal, 11265);

FUNCTION Tare_Canal (CANAL_SETADO IN BINARY_INTEGER)
  RETURN VARCHAR2
  IS
   	  v_tara VARCHAR2(20);

   BEGIN

      v_tara := S_Tare_Canal(retorno9, CANAL_SETADO);
   
      RETURN (v_tara);
   
   END;
-- *********************************************************************************  	


-- *********************************************************************************  	
  
FUNCTION S_DIO_InPortStr (TESTE_HANDLE  Ora_Ffi.Funchandletype,
                          IP_SETADO IN BINARY_INTEGER)
       RETURN VARCHAR2;
PRAGMA interface(C, S_DIO_InPortStr, 11265);

FUNCTION DIO_InPortStr (IP_SETADO IN BINARY_INTEGER)
  RETURN VARCHAR2
  IS
   	  v_identificador VARCHAR2(32000);

   BEGIN

      v_identificador := S_DIO_InPortStr(retorno12, IP_SETADO);
   
      RETURN (v_identificador);
   
   END;
-- *********************************************************************************  	


-- *********************************************************************************  	
  
FUNCTION S_DIO_InBit (TESTE_HANDLE  Ora_Ffi.Funchandletype,
                      IP_SETADO   IN BINARY_INTEGER,
                      ID_ENTRADA  IN BINARY_INTEGER)
       RETURN PLS_INTEGER;
PRAGMA interface(C, S_DIO_InBit, 11265);

FUNCTION DIO_InBit (IP_SETADO IN BINARY_INTEGER, ID_ENTRADA IN BINARY_INTEGER)
  RETURN PLS_INTEGER
  IS

   	  v_identificador    PLS_INTEGER;

   BEGIN

      v_identificador := S_DIO_InBit(retorno10, IP_SETADO, ID_ENTRADA);
   
      RETURN (v_identificador);
   
   END;
-- *********************************************************************************  	


-- *********************************************************************************  	
  
FUNCTION S_DIO_OutPortStr (TESTE_HANDLE  Ora_Ffi.Funchandletype,
                           IP_SETADO IN BINARY_INTEGER,
                           PALAVRA   IN CHAR)
       RETURN BINARY_INTEGER;
PRAGMA interface(C, S_DIO_OutPortStr, 11265);

FUNCTION DIO_OutPortStr (IP_SETADO IN BINARY_INTEGER, PALAVRA IN CHAR)
  RETURN BINARY_INTEGER
  IS
   	  v_identificador BINARY_INTEGER;

   BEGIN

      v_identificador := S_DIO_OutPortStr(retorno13, IP_SETADO, PALAVRA);
   
      RETURN (v_identificador);
   
   END;
-- *********************************************************************************  	


-- *********************************************************************************  	
  
FUNCTION S_Update_NoMotion (TESTE_HANDLE  Ora_Ffi.Funchandletype,
                            CANAL_SETADO IN BINARY_INTEGER,
                            TEMPO        IN BINARY_INTEGER)
       RETURN BINARY_INTEGER;
PRAGMA interface(C, S_Update_NoMotion, 11265);

FUNCTION Update_NoMotion (CANAL_SETADO IN BINARY_INTEGER
                         ,TEMPO        IN BINARY_INTEGER)
  RETURN BINARY_INTEGER
  IS
   	  v_identificador    BINARY_INTEGER;

   BEGIN

      v_identificador := S_Update_NoMotion(retorno11, CANAL_SETADO, 0);
   
      RETURN (v_identificador);
   
   END;
-- *********************************************************************************  	


-- *********************************************************************************  	
  
FUNCTION Estado_EmMovimento (TESTE_HANDLE  Ora_Ffi.Funchandletype,
                             CANAL_SETADO IN BINARY_INTEGER)
       RETURN VARCHAR2;
PRAGMA interface(C, Estado_EmMovimento, 11265);

FUNCTION Estado_EmMovimento (CANAL_SETADO IN BINARY_INTEGER)
  RETURN VARCHAR2
  IS
   	  v_identificador    BINARY_INTEGER;

   BEGIN

      v_identificador := Estado_EmMovimento(retorno14, CANAL_SETADO);
   
      RETURN (v_identificador);
   
   END;
-- *********************************************************************************  


-- ********************************************************************************* 
-- Procedimento Padrão para leitura de peso
PROCEDURE PR_LER_PESO (peso_bruto    IN OUT BINARY_INTEGER
                      ,peso_liquido  IN OUT BINARY_INTEGER
                      ,peso_tara     IN OUT BINARY_INTEGER
                      ,IPStr         IN VARCHAR2
                      ,Canal         IN VARCHAR2
                      ,p_open        IN VARCHAR2)
IS

  IP_SETADO     BINARY_INTEGER;
  CANAL_SETADO  BINARY_INTEGER;
  v_result      BINARY_INTEGER;
  v_estado_mov  VARCHAR2(01);
  v_bruto       VARCHAR2(20);
  v_liquido     VARCHAR2(20);
  v_tara        VARCHAR2(20);
  v_conta       NUMBER := 0;
  
  V_CONTA1 number := 0;
  
  --
  v_sensor_ativo  VARCHAR2(01);
  v_porta_entrada NUMBER;
  VALIDA_SENSOR   VARCHAR2(32000) := NULL;
  ativa_saida_0   BINARY_INTEGER;
  --
  msg_erro        VARCHAR2(1000);
  erro_conexao    EXCEPTION;  
  erro_sensor     EXCEPTION;  
  erro_estado_mov EXCEPTION;
  v_flg_obstaculo VARCHAR2(01);
  --
  v_erro       VARCHAR2(1000);
  erro         EXCEPTION;  
  
BEGIN
  
  ABREDLL(P_OPEN);
  
  -- Executar a conexão
  IP_SETADO := Seta_Ip(IPStr);
  
  IF IP_SETADO >= 0 THEN
  		
  		CANAL_SETADO := W9091(IP_SETADO, Canal);

  		IF CANAL_SETADO < 0 THEN
  			  
  			  CLEAR_MESSAGE;
  			  MESSAGE('ERRO NO MOMENTO DE SETAR O CANAL (W9091)!') ;
  			  
  			  WHILE CANAL_SETADO < 0 AND V_CONTA <= 100 LOOP
  			     CANAL_SETADO := W9091(IP_SETADO, Canal);
  			     v_conta := v_conta + 1;
  			  END LOOP;
  			  
  			  IF CANAL_SETADO < 0 THEN
  			     msg_erro := 'ERRO NO MOMENTO DE SETAR O CANAL (W9091)!: '||CANAL_SETADO;
  	  	     RAISE erro_conexao;
  	  	  END IF;
  	  	  
  	  END IF;  	  


  ELSE
  		 msg_erro := 'ERRO NO MOMENTO DE SETAR O IP (Seta_Ip)!: '||IP_SETADO;
       RAISE erro_conexao;
  END IF;

  -- Limpa campos do peso
  v_bruto   := 0; 
  v_liquido := 0; 
  v_tara    := 0; 
  
  v_result := Select_Canal(CANAL_SETADO);

  IF v_result < 0 THEN
  		msg_erro := 'ERRO NO MOMENTO DE SELECIONAR O CANAL (Select_Canal)!';
    	RAISE erro_conexao;
  END IF;

  V_CONTA1 := 0;

  --
  IF v_erro IS NOT NULL THEN
     RAISE erro;
  END IF;

  -- Se o veículo estiver posicionado corretamente na balança
  IF msg_erro IS NULL THEN

     v_result := Update_Canal(CANAL_SETADO);
     IF v_result < 0 THEN
        msg_erro := 'ERRO NO MOMENTO DE ATUALIZAR O CANAL (Update_Canal)!';
        RAISE erro_conexao;
     END IF;
 
      
 
       v_bruto   := Gross_Canal(CANAL_SETADO);                

       v_tara    := Tare_Canal(CANAL_SETADO);     

     	 v_liquido := 0;

     
	   peso_bruto   := TO_NUMBER(NVL(v_bruto,0));
	   peso_tara    := TO_NUMBER(NVL(v_tara,0));
	   peso_liquido := TO_NUMBER(NVL(v_liquido,0));
     
  END IF;
  
  -- Libera Conexão
  Close_Canal(CANAL_SETADO);
  
EXCEPTION   	 
  WHEN erro_conexao THEN
		MESSAGE('Erro na conexão da Balança: '||msg_erro);
		MESSAGE('Erro na conexão da Balança: '||msg_erro);
		-- Libera Conexão
	  Close_Canal(CANAL_SETADO);
		RAISE FORM_TRIGGER_FAILURE;
  WHEN erro_sensor THEN
    MESSAGE(msg_erro);
    MESSAGE(msg_erro);
    -- Libera Conexão
	  Close_Canal(CANAL_SETADO);
    RAISE FORM_TRIGGER_FAILURE;
  WHEN erro THEN
    MESSAGE(v_erro);
    MESSAGE(v_erro);
    -- Libera Conexão
	  Close_Canal(CANAL_SETADO);
    RAISE FORM_TRIGGER_FAILURE;
  WHEN erro_estado_mov THEN
    MESSAGE(msg_erro);
    MESSAGE(msg_erro);
    RAISE FORM_TRIGGER_FAILURE;
  WHEN OTHERS THEN
    MESSAGE('PR_LER_PESO : ' || SQLERRM);  	   
    MESSAGE('PR_LER_PESO : ' || SQLERRM);
    -- Libera Conexão
	  Close_Canal(CANAL_SETADO);
    RAISE FORM_TRIGGER_FAILURE;
END PR_LER_PESO;    

PROCEDURE ABREDLL (P_OPEN VARCHAR2) 
IS

  vout   VARCHAR2(01);
  
  BEGIN
  	 
  	 -------------------------------------------------------------------------------------------------------------------------------
     /* CONSIDERAÇÕES IMPORTANTÍSSIMAS SOBRE A DLL */                                                                              
     -------------------------------------------------------------------------------------------------------------------------------
     -- DLL À SER UTILIZADA!
     -------------------------------------------------------------------------------------------------------------------------------
     -- UTILIZAR A QUE O PROGRAMA DE INSTALAÇÃO FORNECE. JOGAR EM C:\WINDOWS\SYSTEM32 (PCLINK6.DLL).
     --
     -- ****************************************************************************************************************************
     -- *** NÃO ALTERAR A ORDEM DAS PROCEDURES E FUNÇÕES ABAIXO (PRINCIPALMENTE DAS CHAMADAS) !!!! ***
     -- ****************************************************************************************************************************
     --- Área Global  	
     IF P_OPEN = 'não' THEN
     	
     	  BEGIN  
           retorno1 := Ora_Ffi.Load_Library(:PARAMETER.P_DIRETORIO_padrão_DLL, :PARAMETER.P_NOME_padrão_DLL);
			  -- Place the first error on the TOOL_ERR stack into the package header variables available for it.
     	  EXCEPTION
     	  	WHEN OTHERS THEN  
					  FFI_ERROR	:= TRUE;
					  FFI_Error_Text	:= TOOL_ERR.MESSAGE;
					  FFI_Error_Code	:= TOOL_ERR.CODE;
					  FOR iErrors IN 1..TOOL_ERR.NERRORS LOOP
					  	  Message('1-Erro ao localizar e abrir a DLL('||:PARAMETER.P_NOME_padrão_DLL||'): '||chr(10)||
					  	          'Verifique o caminho informado na FUNÇÃO e, se o arquivo encontra-se no diretório. '||chr(10)||
					  	          'Erro:'||chr(13)||chr(10)||
					  	          TOOL_ERR.MESSAGE);
					  	          TOOL_ERR.POP;
					  END LOOP;
			 		  TOOL_ERR.CLEAR;           
     	  END;
     	  
     ELSE     	
     	  
     	  BEGIN       	  
           retorno1 := ora_ffi.find_library(:PARAMETER.P_NOME_padrão_DLL);
			  -- Place the first error on the TOOL_ERR stack into the package header variables available for it.
     	  EXCEPTION
     	  	WHEN OTHERS THEN  
					  FFI_ERROR	:= TRUE;
					  FFI_Error_Text	:= TOOL_ERR.MESSAGE;
					  FFI_Error_Code	:= TOOL_ERR.CODE;
					  FOR iErrors IN 1..TOOL_ERR.NERRORS LOOP
					  	  Message('2-Erro ao localizar e abrir a DLL('||:PARAMETER.P_NOME_padrão_DLL||'): '||chr(10)||
					  	          'Verifique o caminho informado na FUNÇÃO e, se o arquivo encontra-se no diretório. '||chr(10)||
					  	          'Erro:'||chr(13)||chr(10)||
					  	          TOOL_ERR.MESSAGE);
					  	          TOOL_ERR.POP;
					  END LOOP;
			 		  TOOL_ERR.CLEAR;           
     	  END; 
     	  
     END IF;     

		     
		  -- *********************************************************************************  	
		  -- Utilizado para função Seta_Ip
		  /* Registra a função da DLL. */
		  retorno2 := Ora_Ffi.Register_Function(retorno1, 'Seta_Ip', Ora_Ffi.C_Std);
		
		  /* Registra a variável da função e da DLL. */
		  Ora_Ffi.Register_Parameter (retorno2, Ora_Ffi.C_CHAR_PTR);
		
		  /* Registra o Tipo de Retorno da DLL. */
		  Ora_Ffi.Register_Return (retorno2, Ora_Ffi.C_INT);  	
		  -- *********************************************************************************
		
		
		  -- *********************************************************************************  	
		  -- Utilizado para função W9091  	
		  /* Registra a função da DLL. */
		  retorno3 := Ora_Ffi.Register_Function(retorno1, 'W9091', Ora_Ffi.C_Std);
		
		  /* Registra a variável da função e da DLL. */
		  Ora_Ffi.Register_Parameter (retorno3, Ora_Ffi.C_INT);
		  Ora_Ffi.Register_Parameter (retorno3, Ora_Ffi.C_CHAR_PTR);
		
		  /* Registra o Tipo de Retorno da DLL. */
		  Ora_Ffi.Register_Return (retorno3, Ora_Ffi.C_INT);  	
		  -- *********************************************************************************
		
		
		  -- *********************************************************************************  	
		  -- Utilizado para função Select_Canal  	
		  /* Registra a função da DLL. */
		  retorno4 := Ora_Ffi.Register_Function(retorno1, 'Select_Canal', Ora_Ffi.C_Std);
		
		  /* Registra a variável da função e da DLL. */
		  Ora_Ffi.Register_Parameter (retorno4, Ora_Ffi.C_INT);
		
		  /* Registra o Tipo de Retorno da DLL. */
		  Ora_Ffi.Register_Return (retorno4, Ora_Ffi.C_INT);  	
		  -- *********************************************************************************
		
		  -- *********************************************************************************  	
		  -- Utilizado para função Close_Canal
		  /* Registra a função da DLL. */
		  retorno5 := Ora_Ffi.Register_Function(retorno1, 'Close_Canal', Ora_Ffi.C_Std);
		
		  /* Registra a variável da função e da DLL. */
		  Ora_Ffi.Register_Parameter (retorno5, Ora_Ffi.C_INT);
		  -- *********************************************************************************
		
		  -- *********************************************************************************  	
		  -- Utilizado para função Update_Canal  	
		  /* Registra a função da DLL. */
		  retorno6 := Ora_Ffi.Register_Function(retorno1, 'Update_Canal', Ora_Ffi.C_Std);
		
		  /* Registra a variável da função e da DLL. */
		  Ora_Ffi.Register_Parameter (retorno6, Ora_Ffi.C_INT);
		
		  /* Registra o Tipo de Retorno da DLL. */
		  Ora_Ffi.Register_Return (retorno6, Ora_Ffi.C_INT);  	
		  -- *********************************************************************************
		
		  -- *********************************************************************************  	
		  -- Utilizado para função Gross_Canal  	
		  /* Registra a função da DLL. */
		  retorno7 := Ora_Ffi.Register_Function(retorno1, 'Gross_Canal', Ora_Ffi.C_Std);
		
		  /* Registra a variável da função e da DLL. */
		  Ora_Ffi.Register_Parameter (retorno7, Ora_Ffi.C_INT);
		
		  /* Registra o Tipo de Retorno da DLL. */
		  Ora_Ffi.Register_Return (retorno7, Ora_Ffi.C_CHAR_PTR);  	
		  -- *********************************************************************************
		
			-- *********************************************************************************  	
		  -- Utilizado para função Net_Canal  	
		  /* Registra a função da DLL. */
		  retorno8 := Ora_Ffi.Register_Function(retorno1, 'Net_Canal', Ora_Ffi.C_Std);
		
		  /* Registra a variável da função e da DLL. */
		  Ora_Ffi.Register_Parameter (retorno8, Ora_Ffi.C_INT);
		
		  /* Registra o Tipo de Retorno da DLL. */
		  Ora_Ffi.Register_Return (retorno8, Ora_Ffi.C_CHAR_PTR);  	
		  -- *********************************************************************************
		
			-- *********************************************************************************  	
		  -- Utilizado para função Tare_Canal  	
		  /* Registra a função da DLL. */
		  retorno9 := Ora_Ffi.Register_Function(retorno1, 'Tare_Canal', Ora_Ffi.C_Std);
		
		  /* Registra a variável da função e da DLL. */
		  Ora_Ffi.Register_Parameter (retorno9, Ora_Ffi.C_INT);
		
		  /* Registra o Tipo de Retorno da DLL. */
		  Ora_Ffi.Register_Return (retorno9, Ora_Ffi.C_CHAR_PTR);  	
		  -- *********************************************************************************
		   
		  -- *********************************************************************************  	
		  -- Utilizado para função DIO_InBit	
		  /* Registra a função da DLL. */
		  retorno10 := Ora_Ffi.Register_Function(retorno1, 'DIO_InBit', Ora_Ffi.C_Std);
		
		  /* Registra a variável da função e da DLL. */
		  Ora_Ffi.Register_Parameter (retorno10, Ora_Ffi.C_INT);
		
		  /* Registra o Tipo de Retorno da DLL. */
		  Ora_Ffi.Register_Return (retorno10, Ora_Ffi.C_INT);  	
		  -- *********************************************************************************
		  
		  -- *********************************************************************************  	
		  -- Utilizado para função Update_NoMotion
		  /* Registra a função da DLL. */
		  retorno11 := Ora_Ffi.Register_Function(retorno1, 'Update_NoMotion', Ora_Ffi.C_Std);
		
		  /* Registra a variável da função e da DLL. */
		  Ora_Ffi.Register_Parameter (retorno11, Ora_Ffi.C_INT);
		
		  /* Registra o Tipo de Retorno da DLL. */
		  Ora_Ffi.Register_Return (retorno11, Ora_Ffi.C_INT);  	
		  -- *********************************************************************************
		  
		  -- *********************************************************************************  	
		  -- Utilizado para função DIO_InPortStr
		  /* Registra a função da DLL. */
		  retorno12 := Ora_Ffi.Register_Function(retorno1, 'DIO_InPortStr', Ora_Ffi.C_Std);
		
		  /* Registra a variável da função e da DLL. */
		  Ora_Ffi.Register_Parameter (retorno12, Ora_Ffi.C_INT);
		
		  /* Registra o Tipo de Retorno da DLL. */
		  Ora_Ffi.Register_Return (retorno12, Ora_Ffi.C_CHAR_PTR);  	
		  -- *********************************************************************************
		  
		  -- *********************************************************************************  	
		  -- Utilizado para função DIO_OutPortStr
		  /* Registra a função da DLL. */
		  retorno13 := Ora_Ffi.Register_Function(retorno1, 'DIO_OutPortStr', Ora_Ffi.C_Std);
		
		  /* Registra a variável da função e da DLL. */
		  Ora_Ffi.Register_Parameter (retorno13, Ora_Ffi.C_INT);
		  Ora_Ffi.Register_Parameter (retorno13, Ora_Ffi.C_CHAR_PTR);
		
		  /* Registra o Tipo de Retorno da DLL. */
		  Ora_Ffi.Register_Return (retorno13, Ora_Ffi.C_INT);  	
		  -- *********************************************************************************
		  
		  -- *********************************************************************************  	
		  -- Utilizado para função Estado_EmMovimento
		  /* Registra a função da DLL. */
		  retorno14 := Ora_Ffi.Register_Function(retorno1, 'Estado_EmMovimento', Ora_Ffi.C_Std);
		
		  /* Registra a variável da função e da DLL. */
		  Ora_Ffi.Register_Parameter (retorno14, Ora_Ffi.C_INT);
		
		  /* Registra o Tipo de Retorno da DLL. */
		  Ora_Ffi.Register_Return (retorno14, Ora_Ffi.C_CHAR_PTR);  	
		  -- *********************************************************************************

  exception
      	
      when erro_nulo then
      	 raise form_trigger_failure;

  END;

END BL_TOLEDO;
C H A M A D A

Selecionar tudo

------------------------------------------------------------------------------------
-- FUN_LER_BALANCA_NOVA: Função que busca o peso (tara ou bruto) da balança nova.
------------------------------------------------------------------------------------
/* PTIPO_LEITURA: (B)ruto, (L)iquido ou  (T)ara */
------------------------------------------------------------------------------------
FUNCTION FUN_LER_BALANCA_NOVA 
RETURN NUMBER 
IS

  v_peso_bruto      NUMBER;
  v_peso_liquido    NUMBER;
  v_peso_tara       NUMBER;
  
  v_nome_computador varchar2(80);
  v_tip_proc    VARCHAR2(20);
  v_end_maquina VARCHAR2(20);
  v_canal       VARCHAR2(20);
  v_erro        VARCHAR2(4000);
  
  erro_balancav2 EXCEPTION;
  
BEGIN
     
     -- Não retirar.
     DEFAULT_VALUE('não','GLOBAL.CHAMOU_PCLINK');     
     
     BL_TOLEDO.PR_LER_PESO (PESO_BRUTO    => v_peso_bruto,  
                            PESO_LIQUIDO  => v_peso_liquido, 
                            PESO_TARA     => v_peso_tara, 
                            IPSTR         => :PARAMETER.P_IP_BALANCA_TOLEDO, 
                            CANAL         => :PARAMETER.P_CANAL_BALANCA /*v_canal*/, 
                            P_OPEN        => :GLOBAL.CHAMOU_PCLINK);	

     :GLOBAL.CHAMOU_PCLINK := 'SIM';

     RETURN (NVL(v_peso_bruto,0));	 
 
EXCEPTION

  WHEN OTHERS THEN
     MESSAGE('Erro fun_ler_balanca : '||SQLERRM);
     MESSAGE('Erro fun_ler_balanca : '||SQLERRM);
     RAISE FORM_TRIGGER_FAILURE;
  
END;
esaito
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 8
Registrado em: Qua, 06 Abr 2011 3:56 pm
Localização: Lins-sp

Pessoal boa tarde,

Tenho um problema em um retorno da DLL, estou usando o oracle 10g, jacob.rar webutil.
E quando uso a function invoke_int, o forms fecha e o browser fecha junto.
A DLL recebe os comandos, mas quando tento pegar o retorno da dll, acontece de "crashar" a aplicação.
alguém já passou por isso?
A dll é a DarumaFrameWork, escrita em C.
Estou usando a função webutil_c_api.invoke_int(functionhandle, paramaterlist);
Avatar do usuário
Porva
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 342
Registrado em: Seg, 29 Jan 2007 7:36 am
Localização: São Paulo/SP
Rafael S. Nunes
São Paulo/SP

Trevisolli escreveu:Pessoal, segue uma solução encontrada, abaixo:

SPEC

Selecionar tudo

PACKAGE BL_TOLEDO IS 

-- IP_SETADO    BINARY_INTEGER;
FFI_Error     	BOOLEAN;
FFI_Error_Text	VARCHAR2(2000);
FFI_Error_Code	NUMBER;

FUNCTION Seta_Ip(IPStr IN VARCHAR2) RETURN BINARY_INTEGER;

FUNCTION W9091(IP_SETADO IN BINARY_INTEGER, Canal IN VARCHAR2) RETURN BINARY_INTEGER;

FUNCTION Select_Canal(CANAL_SETADO IN BINARY_INTEGER) RETURN BINARY_INTEGER;

PROCEDURE Close_Canal(CANAL_SETADO IN BINARY_INTEGER);

FUNCTION Update_Canal(CANAL_SETADO IN BINARY_INTEGER) RETURN BINARY_INTEGER;

FUNCTION Gross_Canal(CANAL_SETADO IN BINARY_INTEGER) RETURN VARCHAR2;

FUNCTION Net_Canal(CANAL_SETADO IN BINARY_INTEGER) RETURN VARCHAR2;

FUNCTION Tare_Canal(CANAL_SETADO IN BINARY_INTEGER) RETURN VARCHAR2;

FUNCTION DIO_InPortStr (IP_SETADO IN BINARY_INTEGER) RETURN VARCHAR2;

FUNCTION DIO_InBit (IP_SETADO IN BINARY_INTEGER, ID_ENTRADA IN BINARY_INTEGER) RETURN PLS_INTEGER;

FUNCTION DIO_OutPortStr (IP_SETADO IN BINARY_INTEGER, PALAVRA IN CHAR) RETURN BINARY_INTEGER;

FUNCTION Update_NoMotion (CANAL_SETADO IN BINARY_INTEGER, TEMPO IN BINARY_INTEGER) RETURN BINARY_INTEGER;

-- Procedimento Padrão para leitura de peso
PROCEDURE PR_LER_PESO (peso_bruto   IN OUT BINARY_INTEGER
                     , peso_liquido IN OUT BINARY_INTEGER
                     , peso_tara    IN OUT BINARY_INTEGER
                     , IPStr        IN VARCHAR2
                     , Canal        IN VARCHAR2
                     , p_open       IN VARCHAR2);
                     
PROCEDURE ABREDLL (p_open  VARCHAR2);                     


END BL_TOLEDO;

BODY

Selecionar tudo

-- Conexão por IP 
-- Favor não alterar as informações, nem a ORDEM das chamadas, sem consultar manual ou, o 
-- fornecedor da Balança ( Toledo )
-- Qualquer alteração na ordem das chamadas da DLL, pode acarretar erros e, não trazer o peso da balança.
/* PACKAGE BODY RESPONSÁVEL POR TRABALHAR COM NOVA VERSÃO DA BALANÇA TOLEDO, MODELO 6, FIREX */

PACKAGE BODY BL_TOLEDO IS
  
  retorno1   ora_ffi.libhandletype;   -- Variável utilizada no corpo do pacote
  retorno2   ora_ffi.funchandletype;  -- Seta_Ip
  retorno3   ora_ffi.funchandletype;  -- W9091
  retorno4   ora_ffi.funchandletype;  -- Select_Canal
  retorno5   ora_ffi.funchandletype;  -- Close_Canal
  retorno6   ora_ffi.funchandletype;  -- Update_Canal      
  retorno7   ora_ffi.funchandletype;  -- Gross_Canal
  retorno8   ora_ffi.funchandletype;  -- Net_Canal
  retorno9   ora_ffi.funchandletype;  -- Tare_Canal
  
  retorno10  ora_ffi.funchandletype;  -- DIO_InBit
  retorno11  ora_ffi.funchandletype;  -- Update_NoMotion
  retorno12  ora_ffi.funchandletype;  -- DIO_InPortStr
  retorno13  ora_ffi.funchandletype;  -- DIO_OutPortStr
  retorno14  ora_ffi.funchandletype;  -- Estado_EmMovimento
  
  erro_nulo  EXCEPTION;
  
-- *********************************************************************************  	
 
FUNCTION S_Seta_Ip (TESTE_HANDLE Ora_Ffi.Funchandletype,
                    IPStr IN VARCHAR2)
       RETURN BINARY_INTEGER;
PRAGMA interface(C, S_Seta_Ip, 11265);

FUNCTION Seta_Ip (IPStr IN VARCHAR2)
  RETURN BINARY_INTEGER
  IS
   	  v_identificador    NUMBER;
   	  erro               EXCEPTION;
      
   BEGIN
      
      v_identificador := S_Seta_Ip(retorno2, IPStr);
   
      IF v_identificador = -1 THEN
      	
      	 Message( 'Impossivel setar o IP do Módulo Firex' );
      	 RAISE erro;
   	
      END IF;
      
      RETURN (v_identificador);
   
   EXCEPTION
      	
      WHEN erro THEN
         RAISE erro_nulo;
      
      WHEN OTHERS THEN
         message( 'BL.PLL BALANCA.Seta_Ip: ' || SQLERRM );
         RAISE FORM_TRIGGER_FAILURE;
         
   END;
-- *********************************************************************************  	

-- *********************************************************************************  	
  
FUNCTION S_W9091 (TESTE_HANDLE  Ora_Ffi.Funchandletype,
                          IP_SETADO   IN BINARY_INTEGER,
                          Canal       IN VARCHAR2)
       RETURN BINARY_INTEGER;
PRAGMA interface(C, S_W9091, 11265);

FUNCTION W9091 (IP_SETADO IN BINARY_INTEGER,
                Canal     IN VARCHAR2)
  RETURN BINARY_INTEGER
  IS

   	  v_identificador    BINARY_INTEGER;

   BEGIN

      v_identificador := S_W9091(retorno3, IP_SETADO, Canal);
   
      RETURN (v_identificador);
   
   END;
-- *********************************************************************************  	

-- *********************************************************************************  	
  
FUNCTION S_Select_Canal (TESTE_HANDLE  Ora_Ffi.Funchandletype,
                         CANAL_SETADO IN BINARY_INTEGER)
       RETURN BINARY_INTEGER;
PRAGMA interface(C, S_Select_Canal, 11265);

FUNCTION Select_Canal (CANAL_SETADO IN BINARY_INTEGER)
  RETURN BINARY_INTEGER
  IS
   	  v_identificador    BINARY_INTEGER;

   BEGIN
   	
      v_identificador := S_Select_Canal(retorno4, CANAL_SETADO);
         
      RETURN (v_identificador);
   
   END;
-- *********************************************************************************  	

-- *********************************************************************************  	
  
PROCEDURE S_Close_Canal (TESTE_HANDLE  Ora_Ffi.Funchandletype,
                         CANAL_SETADO IN BINARY_INTEGER);
PRAGMA interface(C, S_Close_Canal, 11265);

PROCEDURE Close_Canal (CANAL_SETADO IN BINARY_INTEGER)
  IS
   BEGIN
      S_Close_Canal(retorno5, CANAL_SETADO);
   END;
-- *********************************************************************************  	

-- *********************************************************************************  	
  
FUNCTION S_Update_Canal (TESTE_HANDLE  Ora_Ffi.Funchandletype,
                         CANAL_SETADO IN BINARY_INTEGER)
       RETURN BINARY_INTEGER;
PRAGMA interface(C, S_Update_Canal, 11265);

FUNCTION Update_Canal (CANAL_SETADO IN BINARY_INTEGER)
  RETURN BINARY_INTEGER
  IS
   	  v_identificador    BINARY_INTEGER;

   BEGIN
      
      v_identificador := S_Update_Canal(retorno6, CANAL_SETADO);
        
      RETURN (v_identificador);
   
   END;
-- *********************************************************************************  	


-- *********************************************************************************  	
  
FUNCTION S_Gross_Canal (TESTE_HANDLE  Ora_Ffi.Funchandletype,
                         CANAL_SETADO IN BINARY_INTEGER)
       RETURN VARCHAR2;
PRAGMA interface(C, S_Gross_Canal, 11265);

FUNCTION Gross_Canal (CANAL_SETADO IN BINARY_INTEGER)
  RETURN VARCHAR2
  IS
   	  v_bruto VARCHAR2(20);

   BEGIN

      v_bruto := S_Gross_Canal(retorno7, CANAL_SETADO);
   
      RETURN (v_bruto);
   
   END;
-- *********************************************************************************  	

-- *********************************************************************************  	
  
FUNCTION S_Net_Canal (TESTE_HANDLE  Ora_Ffi.Funchandletype,
                         CANAL_SETADO IN BINARY_INTEGER)
       RETURN VARCHAR2;
PRAGMA interface(C, S_Net_Canal, 11265);

FUNCTION Net_Canal (CANAL_SETADO IN BINARY_INTEGER)
  RETURN VARCHAR2
  IS
   	  v_liquido VARCHAR2(20);

   BEGIN

      v_liquido := S_Net_Canal(retorno8, CANAL_SETADO);
   
      RETURN (v_liquido);
   
   END;
-- *********************************************************************************  	

-- *********************************************************************************  	
  
FUNCTION S_Tare_Canal (TESTE_HANDLE  Ora_Ffi.Funchandletype,
                         CANAL_SETADO IN BINARY_INTEGER)
       RETURN VARCHAR2;
PRAGMA interface(C, S_Tare_Canal, 11265);

FUNCTION Tare_Canal (CANAL_SETADO IN BINARY_INTEGER)
  RETURN VARCHAR2
  IS
   	  v_tara VARCHAR2(20);

   BEGIN

      v_tara := S_Tare_Canal(retorno9, CANAL_SETADO);
   
      RETURN (v_tara);
   
   END;
-- *********************************************************************************  	


-- *********************************************************************************  	
  
FUNCTION S_DIO_InPortStr (TESTE_HANDLE  Ora_Ffi.Funchandletype,
                          IP_SETADO IN BINARY_INTEGER)
       RETURN VARCHAR2;
PRAGMA interface(C, S_DIO_InPortStr, 11265);

FUNCTION DIO_InPortStr (IP_SETADO IN BINARY_INTEGER)
  RETURN VARCHAR2
  IS
   	  v_identificador VARCHAR2(32000);

   BEGIN

      v_identificador := S_DIO_InPortStr(retorno12, IP_SETADO);
   
      RETURN (v_identificador);
   
   END;
-- *********************************************************************************  	


-- *********************************************************************************  	
  
FUNCTION S_DIO_InBit (TESTE_HANDLE  Ora_Ffi.Funchandletype,
                      IP_SETADO   IN BINARY_INTEGER,
                      ID_ENTRADA  IN BINARY_INTEGER)
       RETURN PLS_INTEGER;
PRAGMA interface(C, S_DIO_InBit, 11265);

FUNCTION DIO_InBit (IP_SETADO IN BINARY_INTEGER, ID_ENTRADA IN BINARY_INTEGER)
  RETURN PLS_INTEGER
  IS

   	  v_identificador    PLS_INTEGER;

   BEGIN

      v_identificador := S_DIO_InBit(retorno10, IP_SETADO, ID_ENTRADA);
   
      RETURN (v_identificador);
   
   END;
-- *********************************************************************************  	


-- *********************************************************************************  	
  
FUNCTION S_DIO_OutPortStr (TESTE_HANDLE  Ora_Ffi.Funchandletype,
                           IP_SETADO IN BINARY_INTEGER,
                           PALAVRA   IN CHAR)
       RETURN BINARY_INTEGER;
PRAGMA interface(C, S_DIO_OutPortStr, 11265);

FUNCTION DIO_OutPortStr (IP_SETADO IN BINARY_INTEGER, PALAVRA IN CHAR)
  RETURN BINARY_INTEGER
  IS
   	  v_identificador BINARY_INTEGER;

   BEGIN

      v_identificador := S_DIO_OutPortStr(retorno13, IP_SETADO, PALAVRA);
   
      RETURN (v_identificador);
   
   END;
-- *********************************************************************************  	


-- *********************************************************************************  	
  
FUNCTION S_Update_NoMotion (TESTE_HANDLE  Ora_Ffi.Funchandletype,
                            CANAL_SETADO IN BINARY_INTEGER,
                            TEMPO        IN BINARY_INTEGER)
       RETURN BINARY_INTEGER;
PRAGMA interface(C, S_Update_NoMotion, 11265);

FUNCTION Update_NoMotion (CANAL_SETADO IN BINARY_INTEGER
                         ,TEMPO        IN BINARY_INTEGER)
  RETURN BINARY_INTEGER
  IS
   	  v_identificador    BINARY_INTEGER;

   BEGIN

      v_identificador := S_Update_NoMotion(retorno11, CANAL_SETADO, 0);
   
      RETURN (v_identificador);
   
   END;
-- *********************************************************************************  	


-- *********************************************************************************  	
  
FUNCTION Estado_EmMovimento (TESTE_HANDLE  Ora_Ffi.Funchandletype,
                             CANAL_SETADO IN BINARY_INTEGER)
       RETURN VARCHAR2;
PRAGMA interface(C, Estado_EmMovimento, 11265);

FUNCTION Estado_EmMovimento (CANAL_SETADO IN BINARY_INTEGER)
  RETURN VARCHAR2
  IS
   	  v_identificador    BINARY_INTEGER;

   BEGIN

      v_identificador := Estado_EmMovimento(retorno14, CANAL_SETADO);
   
      RETURN (v_identificador);
   
   END;
-- *********************************************************************************  


-- ********************************************************************************* 
-- Procedimento Padrão para leitura de peso
PROCEDURE PR_LER_PESO (peso_bruto    IN OUT BINARY_INTEGER
                      ,peso_liquido  IN OUT BINARY_INTEGER
                      ,peso_tara     IN OUT BINARY_INTEGER
                      ,IPStr         IN VARCHAR2
                      ,Canal         IN VARCHAR2
                      ,p_open        IN VARCHAR2)
IS

  IP_SETADO     BINARY_INTEGER;
  CANAL_SETADO  BINARY_INTEGER;
  v_result      BINARY_INTEGER;
  v_estado_mov  VARCHAR2(01);
  v_bruto       VARCHAR2(20);
  v_liquido     VARCHAR2(20);
  v_tara        VARCHAR2(20);
  v_conta       NUMBER := 0;
  
  V_CONTA1 number := 0;
  
  --
  v_sensor_ativo  VARCHAR2(01);
  v_porta_entrada NUMBER;
  VALIDA_SENSOR   VARCHAR2(32000) := NULL;
  ativa_saida_0   BINARY_INTEGER;
  --
  msg_erro        VARCHAR2(1000);
  erro_conexao    EXCEPTION;  
  erro_sensor     EXCEPTION;  
  erro_estado_mov EXCEPTION;
  v_flg_obstaculo VARCHAR2(01);
  --
  v_erro       VARCHAR2(1000);
  erro         EXCEPTION;  
  
BEGIN
  
  ABREDLL(P_OPEN);
  
  -- Executar a conexão
  IP_SETADO := Seta_Ip(IPStr);
  
  IF IP_SETADO >= 0 THEN
  		
  		CANAL_SETADO := W9091(IP_SETADO, Canal);

  		IF CANAL_SETADO < 0 THEN
  			  
  			  CLEAR_MESSAGE;
  			  MESSAGE('ERRO NO MOMENTO DE SETAR O CANAL (W9091)!') ;
  			  
  			  WHILE CANAL_SETADO < 0 AND V_CONTA <= 100 LOOP
  			     CANAL_SETADO := W9091(IP_SETADO, Canal);
  			     v_conta := v_conta + 1;
  			  END LOOP;
  			  
  			  IF CANAL_SETADO < 0 THEN
  			     msg_erro := 'ERRO NO MOMENTO DE SETAR O CANAL (W9091)!: '||CANAL_SETADO;
  	  	     RAISE erro_conexao;
  	  	  END IF;
  	  	  
  	  END IF;  	  


  ELSE
  		 msg_erro := 'ERRO NO MOMENTO DE SETAR O IP (Seta_Ip)!: '||IP_SETADO;
       RAISE erro_conexao;
  END IF;

  -- Limpa campos do peso
  v_bruto   := 0; 
  v_liquido := 0; 
  v_tara    := 0; 
  
  v_result := Select_Canal(CANAL_SETADO);

  IF v_result < 0 THEN
  		msg_erro := 'ERRO NO MOMENTO DE SELECIONAR O CANAL (Select_Canal)!';
    	RAISE erro_conexao;
  END IF;

  V_CONTA1 := 0;

  --
  IF v_erro IS NOT NULL THEN
     RAISE erro;
  END IF;

  -- Se o veículo estiver posicionado corretamente na balança
  IF msg_erro IS NULL THEN

     v_result := Update_Canal(CANAL_SETADO);
     IF v_result < 0 THEN
        msg_erro := 'ERRO NO MOMENTO DE ATUALIZAR O CANAL (Update_Canal)!';
        RAISE erro_conexao;
     END IF;
 
      
 
       v_bruto   := Gross_Canal(CANAL_SETADO);                

       v_tara    := Tare_Canal(CANAL_SETADO);     

     	 v_liquido := 0;

     
	   peso_bruto   := TO_NUMBER(NVL(v_bruto,0));
	   peso_tara    := TO_NUMBER(NVL(v_tara,0));
	   peso_liquido := TO_NUMBER(NVL(v_liquido,0));
     
  END IF;
  
  -- Libera Conexão
  Close_Canal(CANAL_SETADO);
  
EXCEPTION   	 
  WHEN erro_conexao THEN
		MESSAGE('Erro na conexão da Balança: '||msg_erro);
		MESSAGE('Erro na conexão da Balança: '||msg_erro);
		-- Libera Conexão
	  Close_Canal(CANAL_SETADO);
		RAISE FORM_TRIGGER_FAILURE;
  WHEN erro_sensor THEN
    MESSAGE(msg_erro);
    MESSAGE(msg_erro);
    -- Libera Conexão
	  Close_Canal(CANAL_SETADO);
    RAISE FORM_TRIGGER_FAILURE;
  WHEN erro THEN
    MESSAGE(v_erro);
    MESSAGE(v_erro);
    -- Libera Conexão
	  Close_Canal(CANAL_SETADO);
    RAISE FORM_TRIGGER_FAILURE;
  WHEN erro_estado_mov THEN
    MESSAGE(msg_erro);
    MESSAGE(msg_erro);
    RAISE FORM_TRIGGER_FAILURE;
  WHEN OTHERS THEN
    MESSAGE('PR_LER_PESO : ' || SQLERRM);  	   
    MESSAGE('PR_LER_PESO : ' || SQLERRM);
    -- Libera Conexão
	  Close_Canal(CANAL_SETADO);
    RAISE FORM_TRIGGER_FAILURE;
END PR_LER_PESO;    

PROCEDURE ABREDLL (P_OPEN VARCHAR2) 
IS

  vout   VARCHAR2(01);
  
  BEGIN
  	 
  	 -------------------------------------------------------------------------------------------------------------------------------
     /* CONSIDERAÇÕES IMPORTANTÍSSIMAS SOBRE A DLL */                                                                              
     -------------------------------------------------------------------------------------------------------------------------------
     -- DLL À SER UTILIZADA!
     -------------------------------------------------------------------------------------------------------------------------------
     -- UTILIZAR A QUE O PROGRAMA DE INSTALAÇÃO FORNECE. JOGAR EM C:\WINDOWS\SYSTEM32 (PCLINK6.DLL).
     --
     -- ****************************************************************************************************************************
     -- *** NÃO ALTERAR A ORDEM DAS PROCEDURES E FUNÇÕES ABAIXO (PRINCIPALMENTE DAS CHAMADAS) !!!! ***
     -- ****************************************************************************************************************************
     --- Área Global  	
     IF P_OPEN = 'não' THEN
     	
     	  BEGIN  
           retorno1 := Ora_Ffi.Load_Library(:PARAMETER.P_DIRETORIO_padrão_DLL, :PARAMETER.P_NOME_padrão_DLL);
			  -- Place the first error on the TOOL_ERR stack into the package header variables available for it.
     	  EXCEPTION
     	  	WHEN OTHERS THEN  
					  FFI_ERROR	:= TRUE;
					  FFI_Error_Text	:= TOOL_ERR.MESSAGE;
					  FFI_Error_Code	:= TOOL_ERR.CODE;
					  FOR iErrors IN 1..TOOL_ERR.NERRORS LOOP
					  	  Message('1-Erro ao localizar e abrir a DLL('||:PARAMETER.P_NOME_padrão_DLL||'): '||chr(10)||
					  	          'Verifique o caminho informado na FUNÇÃO e, se o arquivo encontra-se no diretório. '||chr(10)||
					  	          'Erro:'||chr(13)||chr(10)||
					  	          TOOL_ERR.MESSAGE);
					  	          TOOL_ERR.POP;
					  END LOOP;
			 		  TOOL_ERR.CLEAR;           
     	  END;
     	  
     ELSE     	
     	  
     	  BEGIN       	  
           retorno1 := ora_ffi.find_library(:PARAMETER.P_NOME_padrão_DLL);
			  -- Place the first error on the TOOL_ERR stack into the package header variables available for it.
     	  EXCEPTION
     	  	WHEN OTHERS THEN  
					  FFI_ERROR	:= TRUE;
					  FFI_Error_Text	:= TOOL_ERR.MESSAGE;
					  FFI_Error_Code	:= TOOL_ERR.CODE;
					  FOR iErrors IN 1..TOOL_ERR.NERRORS LOOP
					  	  Message('2-Erro ao localizar e abrir a DLL('||:PARAMETER.P_NOME_padrão_DLL||'): '||chr(10)||
					  	          'Verifique o caminho informado na FUNÇÃO e, se o arquivo encontra-se no diretório. '||chr(10)||
					  	          'Erro:'||chr(13)||chr(10)||
					  	          TOOL_ERR.MESSAGE);
					  	          TOOL_ERR.POP;
					  END LOOP;
			 		  TOOL_ERR.CLEAR;           
     	  END; 
     	  
     END IF;     

		     
		  -- *********************************************************************************  	
		  -- Utilizado para função Seta_Ip
		  /* Registra a função da DLL. */
		  retorno2 := Ora_Ffi.Register_Function(retorno1, 'Seta_Ip', Ora_Ffi.C_Std);
		
		  /* Registra a variável da função e da DLL. */
		  Ora_Ffi.Register_Parameter (retorno2, Ora_Ffi.C_CHAR_PTR);
		
		  /* Registra o Tipo de Retorno da DLL. */
		  Ora_Ffi.Register_Return (retorno2, Ora_Ffi.C_INT);  	
		  -- *********************************************************************************
		
		
		  -- *********************************************************************************  	
		  -- Utilizado para função W9091  	
		  /* Registra a função da DLL. */
		  retorno3 := Ora_Ffi.Register_Function(retorno1, 'W9091', Ora_Ffi.C_Std);
		
		  /* Registra a variável da função e da DLL. */
		  Ora_Ffi.Register_Parameter (retorno3, Ora_Ffi.C_INT);
		  Ora_Ffi.Register_Parameter (retorno3, Ora_Ffi.C_CHAR_PTR);
		
		  /* Registra o Tipo de Retorno da DLL. */
		  Ora_Ffi.Register_Return (retorno3, Ora_Ffi.C_INT);  	
		  -- *********************************************************************************
		
		
		  -- *********************************************************************************  	
		  -- Utilizado para função Select_Canal  	
		  /* Registra a função da DLL. */
		  retorno4 := Ora_Ffi.Register_Function(retorno1, 'Select_Canal', Ora_Ffi.C_Std);
		
		  /* Registra a variável da função e da DLL. */
		  Ora_Ffi.Register_Parameter (retorno4, Ora_Ffi.C_INT);
		
		  /* Registra o Tipo de Retorno da DLL. */
		  Ora_Ffi.Register_Return (retorno4, Ora_Ffi.C_INT);  	
		  -- *********************************************************************************
		
		  -- *********************************************************************************  	
		  -- Utilizado para função Close_Canal
		  /* Registra a função da DLL. */
		  retorno5 := Ora_Ffi.Register_Function(retorno1, 'Close_Canal', Ora_Ffi.C_Std);
		
		  /* Registra a variável da função e da DLL. */
		  Ora_Ffi.Register_Parameter (retorno5, Ora_Ffi.C_INT);
		  -- *********************************************************************************
		
		  -- *********************************************************************************  	
		  -- Utilizado para função Update_Canal  	
		  /* Registra a função da DLL. */
		  retorno6 := Ora_Ffi.Register_Function(retorno1, 'Update_Canal', Ora_Ffi.C_Std);
		
		  /* Registra a variável da função e da DLL. */
		  Ora_Ffi.Register_Parameter (retorno6, Ora_Ffi.C_INT);
		
		  /* Registra o Tipo de Retorno da DLL. */
		  Ora_Ffi.Register_Return (retorno6, Ora_Ffi.C_INT);  	
		  -- *********************************************************************************
		
		  -- *********************************************************************************  	
		  -- Utilizado para função Gross_Canal  	
		  /* Registra a função da DLL. */
		  retorno7 := Ora_Ffi.Register_Function(retorno1, 'Gross_Canal', Ora_Ffi.C_Std);
		
		  /* Registra a variável da função e da DLL. */
		  Ora_Ffi.Register_Parameter (retorno7, Ora_Ffi.C_INT);
		
		  /* Registra o Tipo de Retorno da DLL. */
		  Ora_Ffi.Register_Return (retorno7, Ora_Ffi.C_CHAR_PTR);  	
		  -- *********************************************************************************
		
			-- *********************************************************************************  	
		  -- Utilizado para função Net_Canal  	
		  /* Registra a função da DLL. */
		  retorno8 := Ora_Ffi.Register_Function(retorno1, 'Net_Canal', Ora_Ffi.C_Std);
		
		  /* Registra a variável da função e da DLL. */
		  Ora_Ffi.Register_Parameter (retorno8, Ora_Ffi.C_INT);
		
		  /* Registra o Tipo de Retorno da DLL. */
		  Ora_Ffi.Register_Return (retorno8, Ora_Ffi.C_CHAR_PTR);  	
		  -- *********************************************************************************
		
			-- *********************************************************************************  	
		  -- Utilizado para função Tare_Canal  	
		  /* Registra a função da DLL. */
		  retorno9 := Ora_Ffi.Register_Function(retorno1, 'Tare_Canal', Ora_Ffi.C_Std);
		
		  /* Registra a variável da função e da DLL. */
		  Ora_Ffi.Register_Parameter (retorno9, Ora_Ffi.C_INT);
		
		  /* Registra o Tipo de Retorno da DLL. */
		  Ora_Ffi.Register_Return (retorno9, Ora_Ffi.C_CHAR_PTR);  	
		  -- *********************************************************************************
		   
		  -- *********************************************************************************  	
		  -- Utilizado para função DIO_InBit	
		  /* Registra a função da DLL. */
		  retorno10 := Ora_Ffi.Register_Function(retorno1, 'DIO_InBit', Ora_Ffi.C_Std);
		
		  /* Registra a variável da função e da DLL. */
		  Ora_Ffi.Register_Parameter (retorno10, Ora_Ffi.C_INT);
		
		  /* Registra o Tipo de Retorno da DLL. */
		  Ora_Ffi.Register_Return (retorno10, Ora_Ffi.C_INT);  	
		  -- *********************************************************************************
		  
		  -- *********************************************************************************  	
		  -- Utilizado para função Update_NoMotion
		  /* Registra a função da DLL. */
		  retorno11 := Ora_Ffi.Register_Function(retorno1, 'Update_NoMotion', Ora_Ffi.C_Std);
		
		  /* Registra a variável da função e da DLL. */
		  Ora_Ffi.Register_Parameter (retorno11, Ora_Ffi.C_INT);
		
		  /* Registra o Tipo de Retorno da DLL. */
		  Ora_Ffi.Register_Return (retorno11, Ora_Ffi.C_INT);  	
		  -- *********************************************************************************
		  
		  -- *********************************************************************************  	
		  -- Utilizado para função DIO_InPortStr
		  /* Registra a função da DLL. */
		  retorno12 := Ora_Ffi.Register_Function(retorno1, 'DIO_InPortStr', Ora_Ffi.C_Std);
		
		  /* Registra a variável da função e da DLL. */
		  Ora_Ffi.Register_Parameter (retorno12, Ora_Ffi.C_INT);
		
		  /* Registra o Tipo de Retorno da DLL. */
		  Ora_Ffi.Register_Return (retorno12, Ora_Ffi.C_CHAR_PTR);  	
		  -- *********************************************************************************
		  
		  -- *********************************************************************************  	
		  -- Utilizado para função DIO_OutPortStr
		  /* Registra a função da DLL. */
		  retorno13 := Ora_Ffi.Register_Function(retorno1, 'DIO_OutPortStr', Ora_Ffi.C_Std);
		
		  /* Registra a variável da função e da DLL. */
		  Ora_Ffi.Register_Parameter (retorno13, Ora_Ffi.C_INT);
		  Ora_Ffi.Register_Parameter (retorno13, Ora_Ffi.C_CHAR_PTR);
		
		  /* Registra o Tipo de Retorno da DLL. */
		  Ora_Ffi.Register_Return (retorno13, Ora_Ffi.C_INT);  	
		  -- *********************************************************************************
		  
		  -- *********************************************************************************  	
		  -- Utilizado para função Estado_EmMovimento
		  /* Registra a função da DLL. */
		  retorno14 := Ora_Ffi.Register_Function(retorno1, 'Estado_EmMovimento', Ora_Ffi.C_Std);
		
		  /* Registra a variável da função e da DLL. */
		  Ora_Ffi.Register_Parameter (retorno14, Ora_Ffi.C_INT);
		
		  /* Registra o Tipo de Retorno da DLL. */
		  Ora_Ffi.Register_Return (retorno14, Ora_Ffi.C_CHAR_PTR);  	
		  -- *********************************************************************************

  exception
      	
      when erro_nulo then
      	 raise form_trigger_failure;

  END;

END BL_TOLEDO;
C H A M A D A

Selecionar tudo

------------------------------------------------------------------------------------
-- FUN_LER_BALANCA_NOVA: Função que busca o peso (tara ou bruto) da balança nova.
------------------------------------------------------------------------------------
/* PTIPO_LEITURA: (B)ruto, (L)iquido ou  (T)ara */
------------------------------------------------------------------------------------
FUNCTION FUN_LER_BALANCA_NOVA 
RETURN NUMBER 
IS

  v_peso_bruto      NUMBER;
  v_peso_liquido    NUMBER;
  v_peso_tara       NUMBER;
  
  v_nome_computador varchar2(80);
  v_tip_proc    VARCHAR2(20);
  v_end_maquina VARCHAR2(20);
  v_canal       VARCHAR2(20);
  v_erro        VARCHAR2(4000);
  
  erro_balancav2 EXCEPTION;
  
BEGIN
     
     -- Não retirar.
     DEFAULT_VALUE('não','GLOBAL.CHAMOU_PCLINK');     
     
     BL_TOLEDO.PR_LER_PESO (PESO_BRUTO    => v_peso_bruto,  
                            PESO_LIQUIDO  => v_peso_liquido, 
                            PESO_TARA     => v_peso_tara, 
                            IPSTR         => :PARAMETER.P_IP_BALANCA_TOLEDO, 
                            CANAL         => :PARAMETER.P_CANAL_BALANCA /*v_canal*/, 
                            P_OPEN        => :GLOBAL.CHAMOU_PCLINK);	

     :GLOBAL.CHAMOU_PCLINK := 'SIM';

     RETURN (NVL(v_peso_bruto,0));	 
 
EXCEPTION

  WHEN OTHERS THEN
     MESSAGE('Erro fun_ler_balanca : '||SQLERRM);
     MESSAGE('Erro fun_ler_balanca : '||SQLERRM);
     RAISE FORM_TRIGGER_FAILURE;
  
END;

Trevis, beleza?

essa solução em PL/SQL foi fornecida pelo fabricante?

até postei em outro tópico http://glufke.net/oracle/viewtopic.php?f=4&t=2374, mencionando que preciso capturar a balança Toledo IND 780 de dentro do Oracle EBS R11, por acaso você tem ideia de como posso proceder ou tenha algum exemplo prático?

dúvidas de como por exemplo o Aplicativo enxergaria a DLL instalada na máquina onde está a balança, já que form no EBS está rodando no servidor e não localmente, etc.

estou um tanto confuso quanto a esse assunto.
Avatar do usuário
Porva
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 342
Registrado em: Seg, 29 Jan 2007 7:36 am
Localização: São Paulo/SP
Rafael S. Nunes
São Paulo/SP

alguém?
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 12 visitantes