Negative Zahlen empfangen

  • Hallo Leute
    Wollte wissen ob man über einen seriellen Kanal negative Zahlen empfangen kann?
    Mein Kanal: Open "COM1:",channel\Bin;
    So lese ich: Prozedur:=ReadBin(channel);
    Danke im voraus für eure Hilfe!
    Schönen Tag

  • ANZEIGE
  • Hallo mani,


    Also datenmäßig kannst du prinzipiell alles empfangen was nicht bei drei auf den Bäumen ist, sind eh alles nur Bits und Bytes... 8)
    Die Frage ist vielmehr wie du und die Gegenstelle diese Daten interpretierst.


    Vorzeichenbehaftet Ganzzahlen (Integer) werden fast ausschließlich im Zweierkomplement gespeichert/verwendet/berechnet/bla...
    Grundlagen hierzu findest du unter: http://de.wikipedia.org/wiki/Zweierkomplement


    Solange du nur mit einem Byte (0-255) arbeitest, sieht das also folgendermaßen aus:
    Bin.       Dez.    Zw.-Kompl.11111111 = 255 =   -111111110 = 254 =   -211111101 = 253 =   -3...10000001 = 129 = -12710000000 = 128 = -12801111111 = 127 =  127...00000001 =   1 =    100000000 =   0 =    0
    Vorausgesetzt die Gegenstelle schickt dir die Daten im Zweierkomplement (!) und du willst lediglich mit einem Byte arbeiten, mußt du das empfangene Byte entsprechend umrechnen, da die ReadBin-Funktion (laut Doku) nur eine positive Ganzzahl als NUM liefert.
    Für die Umrechnung könntest du die Bit-Funktionen verwenden, die sind allerdings nur in der (kostenpflichtigen) Software-Option "Developer's Function" enthalten (glaub ich).


    Bei Byte-Daten sollte es aber auch ausreichen vom Absolutwert 256 abzuziehen, wenn dieser >= 128 ist.
    Sieht dann in etwa so aus:

    Code
    nVal := ReadBin(channel);
    if nVal >= 128 nVal := nVal - 256;


    Bei größeren Zahlenbereichen muß du das Konzept entsprechend erweitern.
    Viel Spaß dabei.... :mrgreen:


    Gruß
    Rainer

  • Hallo Mani,


    mit der Funktion ReadBin empfängt man den ASCII-Code eines Zeichen (0-255). Den ASCII-Code kannst Du mit der Funktion ByteToStr in ein Zeichen umwandeln.


    :meld:


    Beispiel:


    Var byte btInput;
    VAR string stValue;


    btInput:= ReadBin(deRS232);
    stValue:=ByteToStr(btInput\Char)


    Bei der Übertragung eines Minus-Zeichens wird der ASCII-Code 45 übertragen und in die Variable btInput gespeichert. Durch Umwandlung in ein Zeichen mit der Funktion ByteToStr wird der ASCII-Code 45 in ein Minus-Zeichen umgewandelt.



    Da ReadBin Zeichenweise arbeitet, musst du bei einer vierstelligen Zahl 4 Zeichen mit ReadBin empfangen, diese umwandeln in ein String, die Strings zusammenbauen und dann mit StrToVal in eine Zahl umwandeln.


    Alternativ solltest Du Dir auch mal die Instruktionen ReadStr, ReadNum, ReadStrBin anschauen, den diese beinhalten bereits die Umwadlung in einen String oder einen Zahlenwert.


    Gruß
    Micky

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind. (Albert Einstein)

  • Hallo,
    fuer Integer wuerde sich die Darstellung im zweierkomplement anbieten, als Ultraprimitivloessung ein einfaches Vorzeichenbit.
    Willst du Gleitkommazahlen darstellen, gibt es die Moeglichkeit deinen Integer einfach durch z.B. 1000 zu teilen (drei Nachkommastellen).
    Aufwaendiger ist die normierte Darstellung in Exponentialschreibweise nach IEEE IEEE 754 - ausfuehrliche Beschreibung bei Wikipedia zu finden.
    Gruss Stefan

Hilfe und Support für ABB Roboter Programmierung, Konfiguration, Inbetriebnahme finden Sie hier im ABB Roboter Forum. ABB Rapid Programmierung ist einfach, die Roboterforum Community hilft sehr gerne.

Erstelle ein Benutzerkonto oder melde dich an um zu kommentieren

Du musst ein Benutzerkonto haben um einen Kommentar hinterlassen zu können

Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Geht einfach!
Neues Benutzerkonto erstellen
Anmelden
Du hast bereits ein Benutzerkonto? Melde dich hier an.
Jetzt anmelden