ich habe ein Messgerät mit einem Ethernet-Anschluss. Um das Gerät zu steuern und die Messwerte auszulesen kann dieser verwendet werden. IP und Port hab ich, die stehen im Handbuch. Leider habe ich damit bisher nichts zutun gehabt. Ich nehme an, dass ich eine TServerSocket-Komponente verwenden muss. Oder die TClientSocket? Dort kann man wie ich gesehen hab, den Port festlegen. Wie geb ich die IP bekannt?
Nun müssen an das Gerät 32 Bytes Daten gesendet werden. Daruf hin werden 128 Bytes zurückgesendet. So steht es im Handbuch. Die Messwerte stehen ab Adresse 16 bzw 48. Dazu gibt es auch eine Tabelle mit der relativen Addresse und der Messgröße. Wie sende und empfange ich die Daten? Wie ich gesehen hab gibt es bei TServerSocket auch eine Read- und Write Methode.
_________________ Computer dienen uns zur Lösung von Problemen, die wir ohne sie nicht hätten.
ja ok, das ist klar. Die Frage ist nun was ich senden muss. Folgendes steht im Handbuch:
Schreiben Sie 32 Bytes zu dem Gerät. Falls sie nichts steuern, müssen alle Bytes den Wert 0 enthalten. Falls Sie beispielsweise Messungen auslösen wollen, müssen Sie einen Wert(in der Regel 80), in Byte 14 und 15 (Zählung beginnt bei 0) schreiben und das entsprechende Bit (laut Tabelle) für die Messstelle von 0 auf 1 ändern.
Lesen Sie 128 bytes vom Gerät. Werten Sie Byte 12 und 13 (Lebenszähler) aus. Wenn sich dieser während 5 Minuten nicht ändert, geben Sie einen Alarm aus. Dieser Zähler erhöht sich alle paar Sekunden und kann auch benutzt werden um die Busanbindung zu testen.
Werten SIe Byte 5 (Fehlerbits) aus. Bei unbestätigtem Fehler (Bit5.2) ist gesetzt) den Betreiber alarmieren.
Lesen Sie die Messwerte ab Adresse 16. Diese Werte sind als vorzeichenbehaftete 16-Bit-Integer gespeichert und müssen gegebenfalls durch einen Faktor dividiert werden. (da gibts eine Tabelle mit Nr. (1-30), relative Adresse (byte), Messstelle und Einheit.
Nun möchte ich erst mal eine Einzelmessung auslösen.Dazu muss ich von den 32 Bits bestimmte Bits setzen. Wie mach ich das? Ich nehm an mit dem Befehl SendBuf();
_________________ Computer dienen uns zur Lösung von Problemen, die wir ohne sie nicht hätten.
BTW: Ich würde dir empfehlen das Senden als auch Empfangen in jeweils einer Klasse zu implementieren. Der Sender hat als Member das zu sendende 32-byte-Array, welches im Konstruktor auf 0 gesetzt wird ("Falls sie nichts steuern, müssen alle Bytes den Wert 0 enthalten."). Dann würde ich alle Operationen kapseln: MessungenAuslösen() bekommt einen enum für den Messtyp, die Funktion setzt dann 14b und 15b und versendet dann das Array. Dazu die Methode Send welches dann das Array über den Socket verschickt. Alternativ könnte man sich auch eine Fabrik vorstellen welche je nach Anfragetyp ein vorkonfiguriertes 32b-Array erstellt. Die Empfängerklasse dito mit TestHeartbeat(), LeseMesswert() ...
Nun möchte ich erst mal eine Einzelmessung auslösen.Dazu muss ich von den 32 Bits bestimmte Bits setzen. Wie mach ich das? Ich nehm an mit dem Befehl SendBuf();
SendBuf() wird nur die Daten übertragen und nicht die bits setzten. Du baust dir ein 32byte-Array, setzt dort die entsprechenden bits und verschickst es zum Messgerät und liest im return 128 byte vom Messgerät. Zum Setzen der bits kannst du die bitweisen Logikoperatoren verwenden & | usw oder einzelne Bytes direkt setzen.
Edit: und beachte die Endianness des Messgerätes wenn du shorts etc. schreiben willst (byte 14 + 15 für den Messtyp)
Zuletzt bearbeitet von witte am 11:52:33 11.03.2010, insgesamt 1-mal bearbeitet
char send[32]={0};
send[14] = 0x50; //den int-Wert 80 in das 15.Byte schreiben
send[15] = 0x50; //den int-Wert 80 in das 16.Byte schreiben
C/C++ Code:
char send[32]={0};
send[14] = 0x50; //den int-Wert 80 in das 15.Byte schreiben
send[15] = 0x50; //den int-Wert 80 in das 16.Byte schreiben
C/C++ Code:
char send[32]={0};
send[14] = 0x50; //den int-Wert 80 in das 15.Byte schreiben
send[15] = 0x50; //den int-Wert 80 in das 16.Byte schreiben
bin jetzt grad dabei die Klasse zu erstellen. Kann ich nicht eine Klasse für das Messgerät schreiben und die Sendemethoden und Empfangsmethoden in diese Klasse schreiben?
Zitat:
welches im Konstruktor auf 0 gesetzt wird
wie initialisier ich eigentlich ein Array in der Konstruktorliste?
C/C++ Code:
meineKlasse::meineKlasse() : send[32](0) {} //so gehts ja nicht
C/C++ Code:
meineKlasse::meineKlasse() : send[32](0) {} //so gehts ja nicht
C/C++ Code:
meineKlasse::meineKlasse() : send[32](0) {} //so gehts ja nicht
_________________ Computer dienen uns zur Lösung von Problemen, die wir ohne sie nicht hätten.
Zuletzt bearbeitet von rudpower am 11:09:38 12.03.2010, insgesamt 3-mal bearbeitet
Die Fehlermeldung sagt aus, das es keinen parameterlosen Konstruktor von TClientSocket gibt. Schau in der Builder-Hilfe nach, welcher Parameter noch benötigt wird, und was du daraus schließen kannst.
bis bald
akari
_________________ In der nächsten Version wird alles besser!
owner wird als Parameter erwartet. Da das ja eine Klasse ist weiss ich gar nicht was ich da eintrage. Bei einer Formularanwendung ist ja immer die Form selbst der Eigentümer. Wie ist es hier wo ich keine Form hab sondern eine Klasse schreibe?
Das mit dem enum funktioniert bei mir so auch nicht.
C/C++ Code:
Awi::MessungAusloesen(enum Messkanal)
{
send[14] = 0x50;
send[15] = 0x50;
send [19] = Messkanal; // das funktioniert so nicht
}
C/C++ Code:
Awi::MessungAusloesen(enum Messkanal)
{
send[14] = 0x50;
send[15] = 0x50;
send [19] = Messkanal; // das funktioniert so nicht
}
C/C++ Code:
Awi::MessungAusloesen(enum Messkanal)
{
send[14] = 0x50;
send[15] = 0x50;
send [19] = Messkanal; // das funktioniert so nicht
}
Beim Aufruf der Methode soll als Parameter zB "alle" eingegeben werden und er weist automatisch send[19] den Ausdruck 0x5 zu.
_________________ Computer dienen uns zur Lösung von Problemen, die wir ohne sie nicht hätten.
Zuletzt bearbeitet von rudpower am 13:18:42 12.03.2010, insgesamt 1-mal bearbeitet
Nächstes Thema anzeigen Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums
für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de
Werbekostenerstattung verdient werden kann.
Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de
enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt
(vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in
privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden.
Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere
übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.