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
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)
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:
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)
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 .....
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
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