Hallo, ich möchte mich via TCP zu einer Maschine verbinden und einen Auftrag auslösen. Die Verbindung via TCP hat bereits funktioniert, die Maschine zeigt eine aktive Verbindung zu meinem Rechner/der Software. Nun muss ich ein entsprechendes Telegramm an die Maschine schicken um den Auftrag zu starten. Im Handbuch der Maschine ist der Inhalt des Telegramms angegeben (siehe gelbe Markierung). Offensichtlich handelt es sich um Hex Werte. Nun stehe ich allerdings etwas auf dem Schlauch was die Programmierung angeht. Ich nutze Basic und habe die üblichen Befehle zur Verfügung wie z.B. WriteByte WriteFloat WriteInt WriteLine WriteShort Ich habe folgendes versucht: WriteLine tcp_stream, "‘q’, $19, $00, $0064, $07D0, $2710" Allerdings kommt mit dem Versand der Zeichenkette nicht die richtige Message bei der Maschine an.
Edgar schrieb: > Ich nutze Basic Das wird die Menge der Antworten hier schon mal einschränken. Ich habe ja auch keine Ahnung, aber zwei Fragen: Was kannst du per WriteLine für Daten schicken? Bytes, Words, ... ? Die Beschreibung im Anhang hat im Telegramm auch einen Parameter für die Länge, der fehlt in deinem Code. Warum? Oliver
:
Bearbeitet durch User
Wie immer bei so was: Wireshark installieren https://www.wireshark.org/download.html und nachsehen was wirklich hin und her geht, wenn überhaupt was hin und her geht.
nun es gibt die hton Funktionen die Bytefolgen entsprechend der networkorder umdrehen. z.B msbLong= htonl(LongValue); jetzt must du nur noch rausfinden wie du das in Basic einbauen kannst
Welches Basic denn? Auf welchem System? Kann man beim Öffnen des Socket noch Parameter angeben? Thomas Z. schrieb: > nun es gibt die hton Funktionen Das hton steht für "Host TO Network" byteorder (für die Suche in der Doku)
:
Bearbeitet durch User
Edgar schrieb: > WriteLine tcp_stream, "‘q’, $19, $00, $0064, $07D0, $2710" Ich bezweifele, dass WriteLine einen String parst.
Edgar schrieb: > Ich habe folgendes versucht: WriteLine tcp_stream, "‘q’, $19, $00, > $0064, $07D0, $2710" > Allerdings kommt mit dem Versand der Zeichenkette nicht die richtige > Message bei der Maschine an. Was nicht sehr überraschend ist, da die Maschine ganz sicher keinen String haben will. Was sie haben will, steht in dem Schnipsel Doku, den du gepostet hast. Wie du dein Basic dazu überredest, das Gewünschte zu senden, musst du schon allein herausfinden, da du uns nicht einmal verraten hast, um welches Basic es sich handelt. Kleiner Tip: Es gibt ganz viel mehr als nur eins und die unterscheiden sich voneinander oft ganz erheblich.
c-hater schrieb: > Was nicht sehr überraschend ist, da die Maschine ganz sicher keinen > String haben will. Was sie haben will, steht in dem Schnipsel Doku, den > du gepostet hast. > > Wie du dein Basic dazu überredest, das Gewünschte zu senden, musst du > schon allein herausfinden, da du uns nicht einmal verraten hast, um > welches Basic es sich handelt. Kleiner Tip: Es gibt ganz viel mehr als > nur eins und die unterscheiden sich voneinander oft ganz erheblich. also ich nutze BlitzPlus dafür, das wird den meisten warscheinlich nicht bekannt sein. Ist schon veraltet aber erfüllt seinen zweck und ist halt aus alter Gewohnheit am schnellsten für mich. Stimmt natürlich, die Maschine erwaret keinen String, daher war mein Lösungsansatz falsch. Ich bin nun dazu übergegangen die Hex-Werte in Deizimal umzurchen und dann byte weise zu verschicken: bank=CreateBank (14) PokeInt bank,1, 34765 PokeInt bank,2, 8 PokeInt bank,3, 12 PokeInt bank,4, 1 PokeInt bank,5, 113 PokeInt bank,6, 8 PokeInt bank,7, 21 PokeInt bank,8, 100 PokeInt bank,9, 2000 PokeInt bank,10, 10000 WriteBytes bank, tcp, 0, 14 Funktioniert leider auch nicht.
Edgar schrieb: > also ich nutze BlitzPlus dafür, das wird den meisten warscheinlich nicht > bekannt sein. So ist es wohl. Ich glaube mich erinnern zu können, zumindest den Namen schonmal gehört oder gelesen zu haben, das ist aber auch schon alles. > Ist schon veraltet aber erfüllt seinen zweck Nun, offensichtlich ja wohl doch nicht: Du bekommst dein Problem damit nicht gelöst... > bank=CreateBank (14) > > PokeInt bank,1, 34765 > PokeInt bank,2, 8 > PokeInt bank,3, 12 > PokeInt bank,4, 1 > PokeInt bank,5, 113 > PokeInt bank,6, 8 > PokeInt bank,7, 21 > PokeInt bank,8, 100 > PokeInt bank,9, 2000 > PokeInt bank,10, 10000 > > WriteBytes bank, tcp, 0, 14 Ohne jetzt die Doku zu diesem exotischen Basic-Dialekt gelesen zu haben, würde ich vermuten, dass dies ungefähr in die richtige Richtung geht, aber im Detail noch falsch ist. Insbesondere würde ich mal überprüfen, ob es ausser PokeInt noch irgendwelche anderen Poke*-Instruktionen gibt, insbesondere vielleicht PokeByte. Damit könnte das dann langsam was werden...
Edgar schrieb: > bank=CreateBank (14) > > PokeInt bank,1, 34765 > PokeInt bank,2, 8 > PokeInt bank,3, 12 > PokeInt bank,4, 1 > PokeInt bank,5, 113 > PokeInt bank,6, 8 > PokeInt bank,7, 21 > PokeInt bank,8, 100 > PokeInt bank,9, 2000 > PokeInt bank,10, 10000 > > WriteBytes bank, tcp, 0, 14 Jetzt gibt es auch die Funktion WriteBytes. Ok. Bytes und Werte über 255 sind etwas merkwürdig. (Edit: hab gesehen, dass es PokeInt ist - ist aber auch verkehrt, vor allem die Position wird in Bytes angegeben) (du brauchst wohl undigned 16-Bit Werte. Oft WORD genannt) Versteht das Basic auch Hexzahlen? Ein 80x86 und Nachfolger arbeiten mit Little Endian. Du musst also die Bytes vertauschen. Aber das steht in deinem Bild. Edit:
:
Bearbeitet durch User
Hi , also ich kann mir nicht vorstellen, das die Tüddels da um den Char richtig sind "->‘q’<-, $19, $00, $0064, $07D0, $2710" Mit Basic habe ich vor 30 Jahre das letzt Mal was gemacht und BlitzBasic , nee keine Ahnung ... In Python könnte das man heute eher so machen... msg = b'\x71\x19\x00\x0064\x07d0\x2710' Gruß Ingo
Ingo D. schrieb: > In Python könnte das man heute eher so machen... > > msg = b'\x71\x19\x00\x0064\x07d0\x2710' Auf dem Bild vom Eröffnungsbeitrag kann man sehen, dass auch das 'q' 16 Bit hat und bei den 16-Bit Werten die Bytes vertauscht werden (auf Big-Endian)
Dirk B. schrieb: > bei den 16-Bit Werten die Bytes vertauscht werden (auf > Big-Endian) Wenn das so ist schreibt man halt statt x0064 x6400. Georg
Ach ja, gäbe es doch nur eine Möglichkeit zu sehen was wirklich über das Netzwerk rein und raus geht. So ein Hexenwerk müsste man glatt erfinden [/Ironie]
Hannes J. schrieb: > So ein Hexenwerk müsste man glatt erfinden Aber dann braucht man auch einen Zauberer, der das hexen beherscht. Aber der muss für diese Anwendung gar nicht zaubern - das kann der so.
Hi, ich sehe das Problem nach wie vor so, das niemand weiß wie man diesen Byte-Stream, ob nun big oder little Endian, in dem omninösen Basic-Dialect versendet. Dem TO scheint es auch mittlerweile egal zu sein, der meldet sich nicht ,mehr .....
:
Bearbeitet durch User
Ingo D. schrieb: > das niemand weiß wie man diesen > Byte-Stream, ob nun big oder little Endian, in dem omninösen > Basic-Dialect versendet. Edgar schrieb: > bank=CreateBank (14) > > PokeInt bank,1, 34765 > WriteBytes bank, tcp, 0, 14 Zuerst sollte das Array groß genug sein: 20 Bytes (Kann man im Bild nachzählen) Dann sollten man auch Bytes in das Array schreiben und auch an Position 0 beginnen
1 | rem 20 Bytes reservieren |
2 | bank=CreateBank (20) |
3 | rem $87 |
4 | PokeByte bank,0, 135 |
5 | rem $CD |
6 | PokeByte bank,1, 205 |
7 | ..
|
8 | |
9 | WriteBytes bank, tcp, 0, 20 |
Die Dokumentation da auf dem Bild ist einfach schlecht und es fehlen ein paar Wörter die alles erklären könnten. Das sind eher Notizen für Leute die das schon gemacht haben oder geschult sind.
Genau schrieb: > Die Dokumentation da auf dem Bild ist einfach schlecht und es fehlen ein > paar Wörter die alles erklären könnten. Die Dokumentation ist absolut beispielhaft. Kurz, knapp, mit allem, was man wissen muß, und genau auf den Punkt. Genau schrieb: > Das sind eher Notizen für Leute > die das schon gemacht haben oder geschult sind. Das allerdings könnte so beabsichtigt sein. Oliver
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.