Jump to content

dev botao

Como Usar O Acbrbalinterop


edsonmoretti
  • Este tópico foi criado há 3269 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Alguem pode me ajudar, não estou conseguindo usar para capturar dados da balança,  inicialmente deu erro de acesso a memória, ai comecei  com alguns prints:

ACBrBALInterop.INSTANCE.BAL_SetModelo(ecf.getHandle(), Integer.parseInt(ConfigPAF.getModeloBalanca()));
            ACBrBALInterop.INSTANCE.BAL_SetPorta(ecf.getHandle(), configuracao.getPortaBalanca());
            ACBrBALInterop.INSTANCE.BAL_Ativar(ecf.getHandle());
            System.out.println("Porta Balança configurada no banco: " + configuracao.getPortaBalanca());
            System.out.println(ecf.getHandle());
            System.out.println(Integer.parseInt(ConfigPAF.getModeloBalanca()));
            System.out.println(ACBrBALInterop.INSTANCE.BAL_GetModelo(ecf.getHandle()));
            System.out.println(ecf.getHandle());

saida:

963576 
2
0
963576

Ou seja,  acho que to fazendo algo errado, não ta setando o modelo.

 

abraços.

Link to comment
Share on other sites

  • 1 year later...

Edson, boa tarde.

 

O post é meio antigo, mas você conseguiu resolver?

Poderia postar um exemplo de como fez?

No exemplo do JACBrFramework só mostra como utilizar ECF.

Claro:

//no Contrutor
private IntByReference handleBalanca = new IntByReference();

private void configuraBalanca() {
        try {
            ACBrBALInterop.INSTANCE.BAL_Create(handleBalanca);
            ACBrBALInterop.INSTANCE.BAL_SetModelo(handleBalanca.getValue(), 2); //2 é toledo
            ACBrBALInterop.INSTANCE.BAL_SetPorta(handleBalanca.getValue(), "COM2");
            ACBrBALInterop.INSTANCE.BAL_Ativar(handleBalanca.getValue());
            System.out.println("Porta Balança configurada no banco: " + "COM2");
            System.out.println(handleBalanca.getValue());
            System.out.println(2);
            System.out.println(ACBrBALInterop.INSTANCE.BAL_GetModelo(handleBalanca.getValue()));
            System.out.println(handleBalanca.getValue());

        } catch (NumberFormatException t) {
            Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, "", t);
            JOptionPane.showMessageDialog(rootPane, "Problema com a balança", "Verificar:", JOptionPane.ERROR_MESSAGE);
        }
    }
    //Depois pegando valor da balança:
    public static Double lePeso(int handle) throws ACBrException {
        DoubleByReference peso = new DoubleByReference(0.0);
        ACBrBALInterop.INSTANCE.BAL_LePeso(handle, 1000, peso);
        return peso.getValue();
    }
    
    // minha chamada
     BigDecimal quantidadeProdutoFormatada = BigDecimal.valueOf(Balanca.lePeso(handleBalanca.getValue()));

 

Também desenvolvi um pequena lib bem tosca que usa a RXTXComm para ler de certos modelos de balança de checkout, tipo aquelas elgin

é só incluir o jar RXTXcomm.jar no seu projeto e adicionar essa classe:

public class Balanca {

    RXTXCommDriver rxtx = new RXTXCommDriver();
    private InputStream in;
    private OutputStream out;
    private int timeout = 100;

    public Balanca() {
        super();
    }

    public void connect(String portName) throws gnu.io.PortInUseException, UnsupportedCommOperationException, NoSuchPortException, IOException {
        Enumeration ports = CommPortIdentifier.getPortIdentifiers();
        CommPortIdentifier portIdentifier = null;
        while (ports.hasMoreElements()) {
            portIdentifier = (CommPortIdentifier) ports.nextElement();
            if (portIdentifier.getName().equalsIgnoreCase(portName)) {
                System.out.println(portIdentifier.getName());
                break;
            }
        }
//        CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
        if (portIdentifier != null) {
            if (portIdentifier.isCurrentlyOwned()) {
                System.out.println("Erro: Porta já está em uso");
            } else {
                CommPort commPort = portIdentifier.open(this.getClass().getName(), 2_000);
                if (commPort instanceof SerialPort) {
                    SerialPort serialPort = (SerialPort) commPort;
                    serialPort.setSerialPortParams(9_600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
                    in = serialPort.getInputStream();
//                out = serialPort.getOutputStream();
                } else {
                    System.out.println("Erro: Somente as portas seriais são tratadas.");
                }
            }
        } else {
            System.err.println("erro porta não encontrada.");
            throw new NoSuchPortException();
        }
    }

    public String getPesoStr() throws IOException {
        return lerPeso().toString();
    }

    public Double getPesoDb() throws IOException {
        return lerPeso().doubleValue();
    }

    public BigDecimal getPesoBd() throws IOException {
        return lerPeso();
    }

    public BigDecimal getPesoBd(int scale) throws IOException {
        return lerPeso();
    }

    public BigDecimal getPesoBd(int scale, RoundingMode roundingMode) throws IOException {
        return lerPeso().setScale(scale, roundingMode);
    }

    public void atribuirPeso(javax.swing.text.JTextComponent tc) throws IOException {
        tc.setText(lerPeso().toString());
    }

    public void atribuirPesoFmt(javax.swing.text.JTextComponent tc) throws IOException {
        tc.setText(String.format("%.2f", lerPeso()));
    }

    public BigDecimal getValorPeso(BigDecimal valorKg, int scale, RoundingMode roundingMode) throws IOException {
        return valorKg.multiply(getPesoBd()).setScale(scale, roundingMode);
    }

    public BigDecimal getValorPeso(String valorKg, int scale, RoundingMode roundingMode) throws IOException {
        return getValorPeso(new BigDecimal(valorKg), scale, roundingMode);
    }

    public BigDecimal getValorPeso(Double valorKg, int scale, RoundingMode roundingMode) throws IOException {
        return getValorPeso(new BigDecimal(String.valueOf(valorKg)), scale, roundingMode);
    }

    private BigDecimal lerPeso() throws IOException {
        int len = -1;
        BigDecimal valor = BigDecimal.ZERO;
        byte[] buffer = new byte[1_024];
        if ((len = in.read(buffer)) > -1) {
            try {
                Thread.sleep(timeout);
            } catch (InterruptedException ex) {
                Logger.getLogger(Balanca.class.getName()).log(Level.SEVERE, null, ex);
            }
            String lido = (new String(buffer, 0, len));
            valor = trataRetorno(lido);
        }
        return valor;
    }

    private BigDecimal trataRetorno(String r) {
        if (r == null) {
            return BigDecimal.ZERO;
        }
        r = r.split("\\r")[0].trim();
        if (r.isEmpty()) {
            return BigDecimal.ZERO;
        }
        try {
            BigDecimal b = new BigDecimal(r);
            //if maior que 15, balanca elgin so permite 15
            if (b.compareTo(new BigDecimal("15")) >= 0) {
                return BigDecimal.ZERO;
            }
            return b;
        } catch (NumberFormatException e) {
            System.err.println(e);
            return BigDecimal.ZERO;
        }
    }

    public void setTimeout(int timeout) {
        this.timeout = timeout;
    }
}

testando:

try {
            Balanca b = new Balanca();
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            System.out.print("Digite a porta da balanca: ");
            String porta = br.readLine();
            b.connect(porta);
//            b.setTimeout(500);
            while (true) {
                System.out.println("STR: " + b.getPesoStr());
//                System.out.println("DB: " + b.getPesoDb());
//                System.out.println("BD: " + b.getPesoBd());
//                System.out.println("BDSc: " + b.getPesoBd(3));
//                System.out.println("BDScRM: " + b.getPesoBd(3, RoundingMode.UP));
//                System.out.println("-------------------------------------------");
//                System.out.println("TOTAL: " + b.getValorPeso("10.100", 3, RoundingMode.UP));
//                System.out.println("-------------------------------------------");
//                System.in.read();
            }
        } catch (gnu.io.PortInUseException | UnsupportedCommOperationException | NoSuchPortException | IOException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }

Espero ter ajudado, abraços.

  • Like 1
Link to comment
Share on other sites

Obrigado Edson.

Você tem usado o JFramework em produção?

Uso ACBr com Delphi a muitos anos (contribuo com código, etc.) mas iniciei os testes com Java a pouco tempo (nosso ERP é Java, mas o PDV é Delphi) e não encontro muitos exemplos.

Edited by welkson

WRMedeiros

Focus

Link to comment
Share on other sites

  • 3 weeks later...

Obrigado Edson.

Você tem usado o JFramework em produção?

Uso ACBr com Delphi a muitos anos (contribuo com código, etc.) mas iniciei os testes com Java a pouco tempo (nosso ERP é Java, mas o PDV é Delphi) e não encontro muitos exemplos.

Sim, em produção, homologamos e usamos em clientes.

Link to comment
Share on other sites

No fórum não tem quase nada sobre essa lib...

Por exemplo, preparei uma VM com Ubuntu x64, instalei Lazarus, Java, etc. tudo x64... consegui gerar o .so, fui testar no Java, e nunca funcionava (erro no método ECF_Create), depois de muito teste, achei em um tópico alguém comentado que x64 não funcionava.

Tentei gerar o .so com x86, mas o FPC não suportava... como era um ambiente de testes, reinstalei todo o sistema operacional com x86, gerei o .so, testei no Java, mesmo erro (ECF_Create)... fiz um svn up no no framework, tinha algumas mudanças, tentei compilar pelo Lazarus uma nova .so, e o projeto reclamou de algumas libs novas do ACBr em Pascal... fiz o svn up no pascal, nada novo... pensei, eles devem está usando trunk2, baixei o trunk2, quando fui compilar está tudo quebrado no projeto do Lazarus (corrigi alguns path's como ACBrEAD, mas já apareceu muitos outros, etc.)... em resumo, acredito que estejam usando o "trunk" (antigo) em vez do trunk2.

Fiz o seguinte:

Repositório JACBrFramework: atualizado (commit dia 03/08/2015 - inclusão do LFD)

Repositório: ACBr (última revisão do "trunk" - como falei, aparentemente o projeto Lazarus não está preparado para trunk2)

Quando tentei gerar o .so, ele reclamou que não encontrava o *LFD.pas, como não vou usar agora, e estou apenas testando, comentei a importação da unit e o .so foi gerado corretamente (CDECL x86).

Copieo a lib para /usr/lib, tentei usar o demo do jACBrFramework para Java, e obtive esse erro:

Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function 'ECF_Create': /usr/lib/libACBrFramework32.so: undefined symbol: ECF_Create
	at com.sun.jna.Function.<init>(Function.java:179)
	at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:391)
	at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:371)
	at com.sun.jna.Library$Handler.invoke(Library.java:205)
	at com.sun.jna.Native$4.invoke(Native.java:857)
	at com.sun.proxy.$Proxy0.ECF_Create(Unknown Source)
	at jACBrFramework.serial.ecf.ACBrECF.onInitialize(ACBrECF.java:2832)
	at jACBrFramework.ACBrClass.<init>(ACBrClass.java:9)
	at jACBrFramework.serial.ecf.ACBrECF.<init>(ACBrECF.java:69)
	at jACBrFramework.Test.Program.main(Program.java:54)
Java Result: 1
BUILD SUCCESSFUL (total time: 8 seconds)

WRMedeiros

Focus

Link to comment
Share on other sites

Eu acredito que o erro no Java está correto, realmente não existe essa função ECF_Create no .so.

Gerei a DLL on Windows, usei o Dependence Walker [1] para debugar, e o mesmo mostra todas as funções (ou seja, foram exportadas corretamente).

No Linux, usando a mesma revisão, sistema x86, gero o .so, listo as funções usando "nm", objdump, readelf, e em nenhum desses aparece as funções (ou seja, por algum motivo no Linux elas não estão sendo exportadas).

Vejam os screenshots no anexo.

As diretivas de compilação do projeto no Linux estão no "default" (ou seja, o padrão que o ACBr usa). O que estou fazendo errado?

 

[1] http://www.dependencywalker.com/

dump_jacbrframework3.png

dump_jacbrframework1.png

dump_jacbrframework2.png

WRMedeiros

Focus

Link to comment
Share on other sites

Nunca compilei o projeto em linux; mas os exports não estão indo.

Pode ser por alguma falha nas configurações dos IFDEF do projeto, que não está setando o padrão CDECL corretamente quando roda em linux, ou pode ser alguma configuração do compilador que não está gerando os exports na lib;

Pesquisei rapidamente no google pra ver se alguém tinha um problema semelhante e não achei nada parecido; portanto minha dica fica pra revisar do mais simples pro mais complicado: primeiro reveja as configurações do projeto procurando por algo anormal, depois teste a hipótese dos IFDEF, declarando algum método sem eles:

Por exemplo, abra o ACBrECFDll.pas original e localize a função ECF_Create

Function ECF_Create(var ecfHandle: PECFHandle): Integer; {$IFDEF STDCALL} stdcall; {$ENDIF} {$IFDEF CDECL} cdecl; {$ENDIF}  export;

Modifique para essa forma, sem os IFDEF

Function ECF_Create(var ecfHandle: PECFHandle): Integer; cdecl;  export;

 

Compile e veja se você consegue ver o ECF_Create no objdump depois dessa modificação, nisso já teremos uma boa pista de por onde seguir.

Rafael Batiati

ACBrFramework - Automação comercial para todos.

MultiClubes - Soluções para a área de clubes, parques, lazer e entretenimento.

Link to comment
Share on other sites

Olá Rafael, 

Eu já havia feito esse teste, não exporta a função (até porque, mesmo no Windows o projeto também usa CDECL).

Fiz a pergunta no fórum do Lazarus, mas também não obtive resposta.

Será que o pessoal está usando o jACBrFramework apenas no Windows?

WRMedeiros

Focus

Link to comment
Share on other sites

Abri meu Lazarus no Windows e no Linux, conferi cada configuração do projeto, tudo igual.

Verificando a versão, percebi que no Windows estou usando Lazarus 1.4.2, e no Linux 1.4.0 (o FPC é o mesmo nos 2 sistemas). Acredito que se a versão do FPC fosse diferente, poderia influenciar... mas o Lazarus provavelmente não. Na dúvida, estou desinstalando o Lazarus, e vou tentar instalar o 1.4.2.

Quando concluir os testes posto os resultados.

Edited by welkson

WRMedeiros

Focus

Link to comment
Share on other sites

Fiz um demo [1], testei pelo Windows (via Dependency Walker), funcionou perfeitamente (a função "Teste" aparece na lista de symbols).

No Linux, usando o mesmo código, mesma versão do FPC + Lazarus, não funciona (via "nm", "readelf" ou "objdump", a função Teste não é exibida).

Da forma como está hoje, o ACBrFramework não funciona no Linux. Estou lendo sobre exportação de símbolos no FPC, mas se alguém souber algo que possa ajudar, agradeço.

WRMedeiros

Focus

Link to comment
Share on other sites

  • Este tópico foi criado há 3269 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.