![]() |
Waagenwerte über com-Schnittstelle einlesen
Hallo,
ich bin neu hier und habe ein Problem die Werte aus meiner Waage einzulesen. Ich suche schon seit Tagen nach dem richtigem ansatz, komme aber nich drauf. Ich benutze Delphi 7 und möchte über die USB-Schnittstelle (com7) die Werte die mir die Waage gibt auslesen. Nur wie komme ich an die Werte dran? |
AW: Waagenwerte über com-Schnittstelle einlesen
Hast Du eine Dokumentation des Protokolls der Waage?
Oder bestehende Software, die mit der Waage kommuniziert, bei der Du die Kommunikation überwachen und daraus auf das Protokoll schließen könntest? |
AW: Waagenwerte über com-Schnittstelle einlesen
Empfehlenswert ist TComport von
![]() die Komponenten installieren, Parameter einstellen und wahrscheinlich in OnDataAvail an einen Puffer anhängen und den Puffer auswerten, ausgewertetes aus dem Puffer schmeißen. |
AW: Waagenwerte über com-Schnittstelle einlesen
Nun zunächst solltest Du das Protokoll kennen, mit dem man die Waage ansprechen kann.
Ohne das stehst du auf recht verlorenem Posten. (ob man bei USB-Schnittstellen noch 7/8 Bit bautrate xon/xoff.... einstellen muß kann weiß ich leider nicht.) Gruß K-H |
AW: Waagenwerte über com-Schnittstelle einlesen
@p80286
üblicherweise simulieren diese Teile im Gerätemanager eine virtuelle serielle Schnittstelle mit allem was dazugehört, welche der Parameter intern ignoriert werden wird von der Implementierung abhängen. Mit den Standardeinstellungen (gegf. Baudraten durchprobieren) bekommt man meist eine String in der Art 123.45#13#10 bei jeder Änderung des Gewichtes ... zu beachten ist dass auch so etwas kommen kann 12 34. 45#13 #10 234.34 #13#10 daher alles was kommt zusammenbauen und nacheinander auswerten ... |
AW: Waagenwerte über com-Schnittstelle einlesen
Ich hatte schon mal eine Waage, da musste das Gewicht angefragt werden, von alleine kam da nix.
Es sollte dazu aber eine Schnittstellen- / Protokollbeschreibung geben. |
AW: Waagenwerte über com-Schnittstelle einlesen
Die Dokumentation der Waage liegt vor, ich gehe aber von der Waage auf die Rx Anschlüsse eines Konverters.
Dieser Konverter soll dann über Windows-API mit der com-Scnittstelle komminizieren |
AW: Waagenwerte über com-Schnittstelle einlesen
Wenn du COM7 hast, dann ist die Schnittstelle voll emulierend. Du kannst darauf zugreifen wie auf einen normalen physikalischen COM-Port. Von sich aus bietet Delphi da keine komfortablen Lösungen an, aber es gibt eine Reihe von Komponenten, die das erledigen. Eine wurde oben bereits genannt, eine andere wäre noch TurboPower Async Pro (setzen wir oft ein, auch mit emulierten COMs via TCP/IP).
Diese bieten dann je nach dem diverse Methoden zum Empfang von Daten an, sei es ein einfaches Event mit einem Stück Buffer, oder wie bei TPAPro bereits mit ein wenig einbaubarer Semantik (Trigger auf bestimmte Zeichen oder Inhalte usw.). Bevor wir hier konkreter werden können, müsstest du dich also zunächst für eine COM-Komponente entscheiden. Sobald die da ist, kannst du dank vorhandener Doku im Grunde aber auch gleich los legen, die Protokolle sind in der Regel ja recht simpel. Daher bin ich grad unsicher, an welcher Stelle es bei dir hakt. |
AW: Waagenwerte über com-Schnittstelle einlesen
Warum gibt es plötzlich so viele Fragen, die das Auslesen von Waagen betreffen?
Habe ich etwas verpasst? Meine Waage hat noch keinen USB-Anschluss. Ich glaube, ich muss aufrüsten!!! |
AW: Waagenwerte über com-Schnittstelle einlesen
Da fängt es bei mir ja eigentlich schon an, also ich weiß nich wie ich auf einen physikalischen COM-Port zugreifen kann.
Habe leider keine Schulung oder so in Software-Programmierung bekommen, sprich ich habe mir alles was ich kann selber beigebracht. |
AW: Waagenwerte über com-Schnittstelle einlesen
Zitat:
Es wurden dir hier schon mindestens zwei Komponenten bzw. Bibliotheken genannt, mit der man COM-Ports ansprechen kann: TComPort und Turbo Power AsynchPro. Schau dir doch die erstmal an. |
AW: Waagenwerte über com-Schnittstelle einlesen
|
AW: Waagenwerte über com-Schnittstelle einlesen
Die TComPorts hatte ich schon runtergeladen, hab sie auch versucht zu installieren, aber irgendwie hat das nich geklappt.
Komonenten => Komponente installieren => Pfad der Datei. ist das richtig? wenn ich da rein schaue habe ich ganz viele Delphi Ordner. welchen muss ich da nehmen? |
AW: Waagenwerte über com-Schnittstelle einlesen
Entpack TComPort in deinen Komponentenordner (bei mir z.B. E:\Delphi Komponenten\TComPort), dann öffnest du die Delphi-IDE. Im Menü "Tools" öffnest du dir die Optionen, unter "Delphi-Optionen" musst du unter den "Bibliothek-Win32", den Bibliothekspfad zu TComPort eintragen. Der sieht bei mir z.B. So aus E:\Delphi Komponenten\Comport4.11\Source.
Dann öffnest du aus dem Source-Ordner die Datei "DsgnCPortD??", wobei ?? für deine Delphiversion steht. In der Projektverwaltung klickst du "DsgnCPortD??.bpl" mit rechts, dann kannst du die Komponente kompilieren und installieren. Edit: Vergessen die "CPortLibD??" muss du auch kompilieren. Sorry. |
AW: Waagenwerte über com-Schnittstelle einlesen
Ich hab grad so was für eine RadWag gemacht. Auch mit TComport und dann die Stringpakete verarbeiten.
|
AW: Waagenwerte über com-Schnittstelle einlesen
Also das installieren hat jetzt schonmal 1A geklappt. danke schonmal dafür.
Jetzt muss ich nur noch rausfinden wie das weitere alles geht |
AW: Waagenwerte über com-Schnittstelle einlesen
jetzt brauchst Du die Schnittstellenbeschreibung DEINER Waage, das ganze muss ~ so aussehen:
![]() |
AW: Waagenwerte über com-Schnittstelle einlesen
Deshalb gibt es auch Komponenten, mit welche man ohne großes Detailwissen über die seriellen Protokolle einfach Werte vom/zum COM-Port lesen/schreiben kann
|
AW: Waagenwerte über com-Schnittstelle einlesen
Das müsste dann ja dieses sein,
![]() habe zwische Waage und PC aber noch diesen ![]() |
AW: Waagenwerte über com-Schnittstelle einlesen
Für den Konverter lieber diesen
![]() |
AW: Waagenwerte über com-Schnittstelle einlesen
Das ist doch völlig egal, da der Treiber PC-Seitig einen einfachen COM-Port emuliert. Für dich sieht das so aus, als wäre die Waage direkt angeschlossen. Anderenfalls wären solche Konverter kaum sinnvoll einsetzbar.
|
AW: Waagenwerte über com-Schnittstelle einlesen
Den Konverter kannst du ignorieren, dich interessiert nur die Com-Schnittstelle im PC.
Edit: Letzte Seite übersehen, Medium hat es ja schon erwähnt. :oops: Hab gerade den Link gesehen, du sprichst ja von einer S7-Baugruppe mit TTY-Ausgang für Siebert-Anzeigen. Da wird es wahrscheinlich kompliziert, hab jetzt nicht weiter gesucht. Vielleicht solltest du mal versuchen die empfangenen Daten mitzuschreiben. Hört sich für mich im Moment wie ein spezielles Protokoll zwischen Siemens und Siebert an. Erläutere doch mal dein Vorhaben, wenn die S7-300/400 (falls es eine ist) nämlich eine Ethernetkarte (CP oder PN-CPU) hat, dann ist es auch über Ethernet möglich an die Gewichtswerte zu kommen und brauchst nicht die serielle Schnittstelle. Mit LibNoDave lässt sich das schnell verwirklichen. :wink: Das soll aber nur ein Vorschlag sein, du kannst natürlich auch den seriellen Weg weiter verfolgen. |
AW: Waagenwerte über com-Schnittstelle einlesen
Also, so viel Drumherum haben wir bei uns an der Arbeit für das Auslesen unserer Waage nicht benötigt. Vielleicht liegt es auch daran, dass es sich dabei um eine Sartorius Waage handelt, die nur eine Textzeile über den COM-Port, respektive USB-Port als Port COM3 schießt.
Wir mussten im Gerätemanager einfach die Eigenschaften des COM-Ports wie folgt einstellen: Baudrate: 9600 Bit/s; Datenbits: 8; Patität: keine; StoppBits: 1; Flusssteuerung: keine. Schließlich haben wir den entsprechenden COM-Port wie eine Datei geöffnet und somit unser Programm in einen Empfangsmodus versetzt. Sobald nun der Wiegende an der Waage auf die "Print-Taste" gedrückt hat wurde das Resultat als Zeichenkette übertragen und wir mussten nur noch das Empfangene in eine Variable Speichern, die wir dann auswerten konnten. Am Ende durfte nicht vergessen werden die "Datei" wieder zu schließen, also dem Computer mitzuteilen das er nicht weiterhin in Empfangsbereitschaft verweilen soll, ansonsten hats mächtig gekracht, wenn man das Programm geschlossen hat (Die Waage musste dann kurz vom Stromnetz genommen werden, damit sie wieder von aussen her ansprech war). Bei der Arbeit direkt mit dem COM-Port 1 oder 2 (also kein USB) war jedoch wichtig, das es bei der Übertragung zu Wartezeiten von bis zu 10 Sekunden kommen konnte, bis auch das letzte Zeichen angekommen ist. Hier haben wir einen Timer verwendet der immer wieder prüft, ob der volle Datensatz (also die erwartetete Zeichenkette) vollständig angekommen ist. Diese Vorgehensweise hat sich wunderbar bewährt, in Delphi genauso wie in der Excel VBA. |
AW: Waagenwerte über com-Schnittstelle einlesen
Hach, endlich mal alles Namen und Bezeichnungen, die mir aus dem Alltag bekannt sind :) Vorhin war noch die Rede davon, dass ein (emulierter) COM 7 bereits eingerichtet wäre. Wenn es jedoch darum geht, Wägedaten aus der SPS zu lesen (SIWAERX oder wat auch immer), dann befinden wir uns auf einem völlig anderen Blatt Papier. Ich glaub, an dieser Stelle haben wir hier genug Verwirrung erreicht, so dass es echt nicht ganz verkehrt wäre, wenn du mal gaaaaanz genau sagst, was genau existiert, woran wie angeschlossen ist, und was von wem wo installiert wurde, und was dies bewirkt hat. Vorausgesetzt, du hast nicht wie eingangs verstanden einfach eine Waage, die via COM Daten ausspuckt, die aber über einen einfachen Konverter+COM-Emulationstreiber am PC hängt - was ich nach wie vor vermute, aber divBy0 hat mich jetzt verunsichert :)
|
AW: Waagenwerte über com-Schnittstelle einlesen
Also jetzt nochmal von Anfang an.
Ich möchte mit meinem Delphi Programm den Waagenwert dieser Siemens Siwarex Waage über den TTY Ausgang auslesen und anzeigen( ![]() ![]() |
AW: Waagenwerte über com-Schnittstelle einlesen
In dem Handbuch stehen ja zumindest schonmal die 9600 baud fest. Die Parität etc. kannst Du über die Kontrollsoftware einstellen, kannst also nur Du nachsehen/ändern.
Dann brauchst Du evtl. noch ![]() Also: geh hin, nimm Dir eine frische Instanz der COM-Port-Komponente, die Du eingerichtet hast, setze 9600 baud und alle weitere Eigenschaften der Verbindung entsprechend Deiner Konfiguration, versuche per Code den Port zu öffnen und dumpe Dir erstmal alles, was Du per Receive-Event bekommst. Dann werte Escape-Sequenzen aus, die das Bild sonst stören würden. |
AW: Waagenwerte über com-Schnittstelle einlesen
Die Com-Port-Komponente habe ich in dem Programm aufgerufen und habe die Einstellungen so gewählt wie in dem Gerätemanager.
9600 baud, Data bits 8, und Stop bits 1. Also ich habe jetzt schonmal einen ähnlichen Quellcode den ich schreiben muss gefunden und auf mich abgewandelt.
Delphi-Quellcode:
type
TForm1 = class(TForm) Button1: TButton; Button2: TButton; ComPort1: TComPort; Edit1: TEdit; procedure FormActivate(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; hcomm : THandle; COM_enum : integer; implementation {$R *.dfm} procedure usbset_data(hcomm : Thandle); begin EscapeCommFunction(hcomm,SETDTR); // DTR auf HIGH setzen sleep(0); end; procedure usbres_data(hcomm : Thandle); begin EscapeCommFunction(hcomm,CLRDTR); // DTR auf LOW setzen sleep(0); end; // Liefert Ergebnis von Handshake-Signalen der COM zurück function GetInCount(hcomm : Thandle):DWORD; var com_status : DWORD; begin Result := 0; if hcomm <> INVALID_HANDLE_VALUE then begin GetCommModemStatus(hcomm,com_status); Result := com_status; end; end; // handle für COM holen function gethdc_comport(xcom:word):Thandle;stdcall;export; var hcomm : Thandle; begin if (xcom = 7) then hcomm:=CreateFile('COM7',GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,0,0); gethdc_comport := Thandle(hcomm); end; procedure TForm1.FormActivate(Sender: TObject); begin hcomm := gethdc_comport(7); COM_enum := 7; end; procedure TForm1.Button2Click(Sender: TObject); begin closeHandle(hcomm); close; end; procedure TForm1.Button1Click(Sender: TObject); begin //Wenn ich diesen Button drücke möchte ich den aktuellen Waagenwert in das edit1 übergeben end; end. |
AW: Waagenwerte über com-Schnittstelle einlesen
Du hast jetzt eine ComPort Kompo, und nutzt diese nicht. Statt dessen hast du Code irgendwo ausm Netz kopiert, der die nackte WinAPI nutzt :? Wenn ich mir bewusst mache, dass es einige gibt, die so "programmieren", und das für die Industrie, dann wird mir echt übel. Wie wäre es denn mal damit, einen Blick in die Doku von TComPort zu werfen, hm? Da sind auch fast sicher Beispiele bei.
|
AW: Waagenwerte über com-Schnittstelle einlesen
Keine angst, das ist nich für die Industrie und ich will so auch eigentlich nicht programmieren. Das Problem ist nur das es relativ schnell fertig sein muss.
|
AW: Waagenwerte über com-Schnittstelle einlesen
schmeiss' eine TComport Komponente auf Dein Form/Datenmodul, stelle die Parameter ein, führe beim Programmstart BaseSerial1.Connected := true; aus
hänge an OnRxChar einen Code in der Art:
Delphi-Quellcode:
wenn Du etwas schreiben musst :
procedure TCPOS.BaseSerial1RxChar(Sender: TObject; Count: Integer);
var s: AnsiString; begin BaseSerial1.ReadStr(s, Count); FInBuffer := FInBuffer + s; InterPretBuffer; end;
Delphi-Quellcode:
BaseSerial1.WriteStr(SendString);
|
AW: Waagenwerte über com-Schnittstelle einlesen
Zitat:
ich bekomme da aber die fehlermeldung [Fehler] Unit1.pas(31): Undefinierter Bezeichner: 'BaseSerial1' |
AW: Waagenwerte über com-Schnittstelle einlesen
An der Stelle ist jetzt aber wirklich erstmal Delphi-Grundwissen gefragt!
Daß sich BaseSerial1 auf den Namen der Komponente bezieht, kann man bereits am Namen des Events erahnen :) |
AW: Waagenwerte über com-Schnittstelle einlesen
Habe den 'BaseSerial' aber leider nicht in meiner Library.
kann man die irgendwo runter laden? |
AW: Waagenwerte über com-Schnittstelle einlesen
Nochmal - BaseSerial1 ist ein Name einer Instanz. Die legst Du fest, wenn Du eine Komponente auf eine Form packst. Die sind selbstverständlich in keiner Library schon vordefiniert.
(ja, ich hätte besser "Name der Instanz der Komponente" statt "Name der Komponente" schreiben sollen, aber wie gesagt - das der Instanzname der erste Teil eines automatisch über die IDE erstellten Events ist, ist eigentlich Grundwissen) In Deinem Beispiel heißt die Instanz ComPort1 statt BaseSerial1. Wenn Du die gleiche Komponente wie Bummi verwendest, verwende doch den. Sonst musst Du halt schauen, welche Komponente er in seinem Kurzbeispiel verwendet, oder die vermutlich nur minimal anderen Property/Methoden-Namen Deiner Komponente anhand von Namensähnlichkeiten erraten. |
AW: Waagenwerte über com-Schnittstelle einlesen
Danke, das hat mir grade richtig geholfen (sorry das ich mich manchmal noch etwas blöde anstelle, bin noch Anfänger und steige grade in die Materie ein)
jetzt habe ich aber noch zwei ander Fehlermeldungen. [Fehler] Unit1.pas(84): Undefinierter Bezeichner: 'FInBuffer' [Fehler] Unit1.pas(85): Undefinierter Bezeichner: 'InterPretBuffer' wie bekomme ich die weg? |
AW: Waagenwerte über com-Schnittstelle einlesen
FInBuffer ist wohl ein Puffer der Form. Im private-Teil der Form-Deklaration, also etwa unter der Zeile mit
Delphi-Quellcode:
, solltest Du eine Zeile mit
{ Private-Deklarationen }
Delphi-Quellcode:
einfügen. Und darunter
FInBuffer: AnsiString;
Delphi-Quellcode:
und dann Strg+Shift+C drücken, das fügt Dir gleich die Implementierung dieser Methode ein.
procedure InterPretBuffer;
|
AW: Waagenwerte über com-Schnittstelle einlesen
FInBuffer ist eine AnsiString den Du irgendwo in Deinem Form deklarierst
InterPretInbuffer ist die Prozedur die Dir FInBuffer auswertet und kürzt. Meine Routinen werden für Dich nicht passen, etwas in der Art könnte Dich gegf. auf den Pfad bringen
Delphi-Quellcode:
Du könntest im ersten Schritt mal etwas in der Art machen:
TForm1 = class(TTForm)
private FInBuffer: AnsiString; procedure InterPretInBuffer; ...... implementation procedure TForm1 .InterpretInbuffer; var i:Integer; part:AnsiString; begin i := Pos(#10,FInBuffer); Memo1.Lines.Add(FInBuffer); while i>0 do begin Part := Copy(FInBuffer,1,i-1); FInBuffer := Copy(FInBuffer,i+1,Length(FInBuffer)); Memo2.Lines.Add(Part); i := Pos(#10,FInBuffer); end; end; |
AW: Waagenwerte über com-Schnittstelle einlesen
Ich habe das jetzt mal auf mich angepasst, jetzt habe ich aber das Problem das mir das Programm beim starten gleich abstürtzt.( bekomme keine Warnung oder Fehlermeldung)muss es dann über 'Start' => 'Programm zurücksetzen' rücksetzten
Delphi-Quellcode:
procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var s: AnsiString; begin ComPort1.ReadStr(s, Count); FInBuffer := FInBuffer + s; InterPretInbuffer; end; procedure TForm1 .InterpretInbuffer; var i:Integer; part:AnsiString; begin i := Pos(#10,FInBuffer); Memo1.Lines.Add(FInBuffer); while i>0 do begin Part := Copy(FInBuffer,1,i-1); FInBuffer := Copy(FInBuffer,i+1,Length(FInBuffer)); Memo2.Lines.Add(Part); i := Pos(#10,FInBuffer); end; end; |
AW: Waagenwerte über com-Schnittstelle einlesen
kenn' ich wenn die Baudrate nicht passt ....
|
AW: Waagenwerte über com-Schnittstelle einlesen
Hi,
dann würde ich im FormCreate einen Breakpoint setzen und dann mit Einzelschritt durchgehen, bis du die Stelle findest, wo es knallt. LG, Frederic |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz