Hallo zusammen
Nachdem ich nun seit geraumer Zeit weder bei Google noch anderen Quellen fündig geworden bin und auch Bizerba nicht in der Lage oder besser nicht gewillt ist mit passender Antwort zu helfen, versuche ich es mal hier.
Zum Problem:
Ich habe eine Bizerba CS300 Wägezelle über einen Profilec USB Adapter auf COM 3 und würde diese gerne in Chromis Pos JAVA einbinden.
Ich habe einen passenden und funktionierenen Windows Treiber BDD6.dll über die App dazu kann ich der Waage auch Daten senden und lesen.
Desweiteren habe ich eine Delphi Schnittstelle aber keine Ahnung von Delphi
Ich würde gerne dazu gerne folgenden Code umarbeiten bzw. ergänzen
Nur wo fange ich da an bzw. wie kombiniere ich den Treiber mit dem Scriptteil
Danke für alle Hilfestellungen
Nachdem ich nun seit geraumer Zeit weder bei Google noch anderen Quellen fündig geworden bin und auch Bizerba nicht in der Lage oder besser nicht gewillt ist mit passender Antwort zu helfen, versuche ich es mal hier.
Zum Problem:
Ich habe eine Bizerba CS300 Wägezelle über einen Profilec USB Adapter auf COM 3 und würde diese gerne in Chromis Pos JAVA einbinden.
Ich habe einen passenden und funktionierenen Windows Treiber BDD6.dll über die App dazu kann ich der Waage auch Daten senden und lesen.
Desweiteren habe ich eine Delphi Schnittstelle aber keine Ahnung von Delphi
C:
// Hier stehen die Funktionen, die die Dll bereitstellt
/*
* author Gerd Alber
* version 1.0
* date 01.09.2005
* bug -keine-
* warning -keine-
* todo -keine-
*
* Kurzbeschreibung:
*
* In dieser Header-Datei sind die Funktionen beschrieben, die der Treiber BDD6 zu verfügung stellt.
*
*/
#ifndef __bdd6_c__
#define __bdd6_c__
#ifdef __cplusplus
extern "C" {
#endif
#define MYCONST const
typedef unsigned int MYUINT;
typedef unsigned long MYDWORD;
typedef bool MYBOOL;
#ifdef _UNICODE
typedef unsigned short MYTCHAR;
typedef const unsigned short *MYLPCTSTR;
#else
typedef char MYTCHAR;
typedef const char *MYLPCTSTR;
#endif
// Offnet einen ComPort über den der Datenaustausch mit der Waage statt findet
// Sollte als erstes von der Anwendung aufgerfufen werden
// 1. Parameter: Portnummer
// Return: Errorcode
#if _USRDLL
MYDWORD __declspec(dllexport)OpenComPort(MYUINT);
#else
MYDWORD __declspec(dllimport)OpenComPort(MYUINT);
#endif
// Schliesst den ComPort
// Sollte bevor sich die Anwendung schliesst, aufgerufen werden
// Return: Errorcode
#if _USRDLL
MYDWORD __declspec(dllexport)CloseComPort();
#else
MYDWORD __declspec(dllimport)CloseComPort();
#endif
// Sendet Daten an die Waage (Grundpreis, Tara, Text)
// Ein Grundpreis muss immer angegeben werden. Die anderen Parameter sind optional
// 1. Parameter: Grundpreis
// 2. Parameter: Tara-Wert
// 3. Parameter: Text
// Retrun: Errorcode
#if _USRDLL
MYDWORD __declspec(dllexport)SendData(MYCONST MYTCHAR*, MYCONST MYTCHAR*, MYCONST MYTCHAR*);
#else
MYDWORD __declspec(dllimport)SendData(MYCONST MYTCHAR*, MYCONST MYTCHAR*, MYCONST MYTCHAR*);
#endif
// Ruft Daten von der Waage ab (Gewichtswert, Grundpreis, Verkaufspreis)
// 1. Parameter: Grundpreis
// 2. Parameter: Tara-Wert
// 3. Parameter: Text
// Retrun: Errorcode
#if _USRDLL
MYDWORD __declspec(dllexport)ReceiveData(MYTCHAR*, MYTCHAR*, MYTCHAR*);
#else
MYDWORD __declspec(dllimport)ReceiveData(MYTCHAR*, MYTCHAR*, MYTCHAR*);
#endif
// Schaltet die Logische Versionsnummer der Waage an oder aus
// Wenn TRUE als Übergabeparameter wird die Logische Versionsnummer angeschaltet und bleibt solange
// aktiv bis die Funktion mit dem Übergabeparameter FALSE aufgerufen wird
// 1. Parameter: TRUE = On; FALSE = Off
// Retrun: Errorcode
#if _USRDLL
MYDWORD __declspec(dllexport)LogicalVersN(MYBOOL);
#else
MYDWORD __declspec(dllimport)LogicalVersN(MYBOOL);
#endif
// Setzt die Checksumme und den Korrekturwert der Anwendung im Treiber
// Diese Funktion sollte zyklisch aufgerufen werden, so dass immer eine sinvolle Checksummenprüfung gewährleistet ist
// 1. Parameter: Checksumme
// 2. Parameter: Korrekturwert
// Retrun: Errorcode
#if _USRDLL
void __declspec(dllexport)SetCSKW(MYDWORD, MYDWORD);
#else
void __declspec(dllimport)SetCSKW(MYDWORD, MYDWORD);
#endif
// Die Funktion kann zur Checksummenbildung über eine Datei benutzt werden.
// 1. Parameter: Vollständiger Pfad der Datei über die die Checksumme gebildet werden soll
// Return: Checksumme
#if _USRDLL
MYDWORD __declspec(dllexport)CalcCS(MYTCHAR*);
#else
MYDWORD __declspec(dllimport)CalcCS(MYTCHAR*);
#endif
// Gibt den Korrekturwert zurück
// Der Korrekturwert (Hexwert z.B. F83G) wird in eine mit Zufallszahlen generierte Datei mit einem Byteoffset geschrieben.
// Der KW wird dann mit Hilfe dieser Funktion wieder aus dieser Datei ausgelesen. Wichtig ist hierbei die richtige Angabe
// des ByteOffsets, damit der KW gefunden werden kann
// 1. Parameter Vollständiger Name der Datei, die den KW beinhaltet
// 2. Parameter Gibt an nach wievielen Bytes der KW zu lesen ist, gesehen vom Anfang der Datei
// Return: Gelesener Korrekturwert
#if _USRDLL
MYDWORD __declspec(dllexport)GetKW(MYTCHAR*, MYUINT);
#else
MYDWORD __declspec(dllimport)GetKW(MYTCHAR*, MYUINT);
#endif
// Mit Hilfe dieser Funktion kann ein Fehlercode im Klartext beschrieben werden
// 1. Parameter: Errorcode
// Return: Constanter Zeiger auf Fehlernachricht
#if _USRDLL
MYLPCTSTR __declspec(dllexport)GetErrorString(MYDWORD);
#else
MYLPCTSTR __declspec(dllimport)GetErrorString(MYDWORD);
#endif
#ifdef __cplusplus
}
#endif
#endif
Ich würde gerne dazu gerne folgenden Code umarbeiten bzw. ergänzen
Java:
package uk.chromis.pos.scale;
import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import gnu.io.UnsupportedCommOperationException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.TooManyListenersException;
/**
*
*
*/
public class ScaleComm implements Scale, SerialPortEventListener {
private String m_sPortScale;
private CommPortIdentifier m_PortIdPrinter;
private SerialPort m_CommPortPrinter;
private OutputStream m_out;
private InputStream m_in;
private static final int SCALE_READY = 0;
private static final int SCALE_READING = 1;
private double m_dWeightBuffer;
private int m_iStatusScale;
/** Creates a new instance of ScaleComm
* @param sPortPrinter */
public ScaleComm(String sPortPrinter) {
m_sPortScale = sPortPrinter;
m_out = null;
m_in = null;
m_iStatusScale = SCALE_READY;
m_dWeightBuffer = 0.0;
}
/**
*
* @return
*/
@Override
public Double readWeight() {
synchronized(this) {
if (m_iStatusScale != SCALE_READY) {
try {
wait(1000);
} catch (InterruptedException e) {
}
if (m_iStatusScale != SCALE_READY) {
// bascula tonta.
m_iStatusScale = SCALE_READY;
}
}
// Ya estamos en SCALE_READY
m_dWeightBuffer = 0.0;
write(new byte[] {0x05});
flush();
// Esperamos un ratito
try {
wait(1000);
} catch (InterruptedException e) {
}
if (m_iStatusScale == SCALE_READY) {
// a value as been readed.
double dWeight = m_dWeightBuffer / 1000.0;
m_dWeightBuffer = 0.0;
return new Double(dWeight);
} else {
m_iStatusScale = SCALE_READY;
m_dWeightBuffer = 0.0;
return new Double(0.0);
}
}
}
private void flush() {
try {
m_out.flush();
} catch (IOException e) {
}
}
private void write(byte[] data) {
try {
if (m_out == null) {
m_PortIdPrinter = CommPortIdentifier.getPortIdentifier(m_sPortScale); // Tomamos el puerto
m_CommPortPrinter = (SerialPort) m_PortIdPrinter.open("PORTID", 2000); // Abrimos el puerto
m_out = m_CommPortPrinter.getOutputStream(); // Tomamos el chorro de escritura
m_in = m_CommPortPrinter.getInputStream();
m_CommPortPrinter.addEventListener(this);
m_CommPortPrinter.notifyOnDataAvailable(true);
m_CommPortPrinter.setSerialPortParams(4800, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_ODD); // Configuramos el puerto
}
m_out.write(data);
} catch (NoSuchPortException | PortInUseException | UnsupportedCommOperationException | TooManyListenersException | IOException e) {
}
}
/**
*
* @param e
*/
@Override
public void serialEvent(SerialPortEvent e) {
// Determine type of event.
switch (e.getEventType()) {
case SerialPortEvent.BI:
case SerialPortEvent.OE:
case SerialPortEvent.FE:
case SerialPortEvent.PE:
case SerialPortEvent.CD:
case SerialPortEvent.CTS:
case SerialPortEvent.DSR:
case SerialPortEvent.RI:
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
break;
case SerialPortEvent.DATA_AVAILABLE:
try {
while (m_in.available() > 0) {
int b = m_in.read();
if (b == 0x001E) { // RS ASCII
// Fin de lectura
synchronized (this) {
m_iStatusScale = SCALE_READY;
notifyAll();
}
} else if (b > 0x002F && b < 0x003A){
synchronized(this) {
if (m_iStatusScale == SCALE_READY) {
m_dWeightBuffer = 0.0; // se supone que esto debe estar ya garantizado
m_iStatusScale = SCALE_READING;
}
m_dWeightBuffer = m_dWeightBuffer * 10.0 + b - 0x0030;
}
} else {
// caracteres invalidos, reseteamos.
m_dWeightBuffer = 0.0; // se supone que esto debe estar ya garantizado
m_iStatusScale = SCALE_READY;
}
}
} catch (IOException eIO) {}
break;
}
}
}
Nur wo fange ich da an bzw. wie kombiniere ich den Treiber mit dem Scriptteil
Danke für alle Hilfestellungen