integer im negativen Bereich definieren

  • Hallo Leute,


    ich versuche über die SPS_Steuerung 4 Werte als Gruppeneingangssignal an den Roboter zu schicken, die 4 INT-Variablen zugewiesen sein sollten.

    Diese Werte können positiv oder negativ sein.

    Es handelt sich um KUKA KRC4.

    Ich habe das folgendermaßen gemacht.


    Config:


    INT mass_x=0

    INT mass_z=0

    INT ref_x=0

    INT ref_z=0


    SIGNAL GI_Mass_X $IN[265]  TO $IN[280]

    SIGNAL GI_Mass_Z $IN[281] TO $IN[296]

    SIGNAL GI_ref_x $IN[297] TO $IN[312]

    SIGNAL GI_ref_x $IN[313] TO $IN[328]



    SPS:

    mass_x = GI_Mass_X - 32737


    mass_z = GI_Mass_Z - 32737

    ref_x = GI_ref_x - 32737

    ref_z = GI_ref_z - 32737




    Problem:

    nur der erste Wert kann zugewiesen werden und wurde übernommen.

    negative werte konnte ich nicht angeben. sie wurden von der Steuerung nicht übernommen.


    habt ihr eine Idee, wie das funktionieren sollte.

    Vielen Dank im Voraus

  • Schritt für Schritt zum Roboterprofi!
  • Servus,


    probier erst mal einlesen und dann berechnen.


    SPS:

    mass_x = GI_Mass_X

    mass_x = (mass_x - 32737)


    Berechnungen samt Einlesen von Gruppeneingängen machen Probleme. Hatte ich auch schon mal.

    Ich setze auch immer schön Klammer, notwendig oder nicht. (da streiten sich die Gelehrten) :)

    BTW:

    schon mal in der Variablenanzeige geprüft ob die Werte richtig kommen (Stichwort Motorola/Intel)


    Gruss

    Martl

  • Code
    PG1_Offset.x=WordToInt1(giPG1_Offset_X)
    
    DEFFCT int WordToInt1(Wert :IN)
       DECL INT Wert
       IF Wert > 'H7F' THEN
          RETURN WERT - ('HFF')-1
       ELSE
          RETURN WERT
       ENDIF
    ENDFCT


    Einfach ausprobieren was raus kommt und anpassen bis es passt.

  • 32Bit Signalvereinbarungen in KRL unterstützen eigentlich Positiv wie Negative Integerwerte.

    Evtl. einfacher, dies gleich so zu Lösen.

    Manche Maenner bemuehen sich lebenslang, das Wesen einer Frau zu verstehen. Andere befassen sich mit weniger schwierigen Dingen z.B. der Relativitaetstheorie.

  • ja, am einfachsten auf 32-bits umwandeln...


    also 32737 ist falsch...


    fuer n=16 bits

    2^(n-1) -1 = 32767


    mit 16-bit, Werte sind interpretiert als


    (-32768)..(+32767) ; mit Vorzeichen

    order

    [0]..[65535] ; ohne Vorzeichen



    (+0)..(+32767) ist binaer wie [0]..[32767]

    und

    (-32768)..(-1) ist binaer wie [32768]..[65535]


    oder:


    (+32767) ~ [32767]

    (+32766) ~ [32766]

    (+32765) ~ [32765]

    ...

    (+2) ~ [2]

    (+1) ~ [1]

    (+0) ~ [0]

    (-1) ~ [65535]

    (-2) ~ [65534]

    (-3) ~ [65533]

    (- 4) ~ [65532]

    ...

    (-32768) ~ [32768]



    also, mit 16-bit SPS Wert

    GI_Mass_X = -1


    und KRC sieht

    GI_Mass_X = 65535


    deshalb KRC braucht so was:

    Code
    IF GI_Mass_X <32768 THEN ; 16 bit conversion
       mass_x = GI_Mass_X
    ELSE
      mass_x = GI_Mass_X - 65536
    ENDIF
  • Du solltest dir zunächst auch den Wert, der von der SPS kommt, anschauen.


    Negative Zahlen sind hier dadurch gekennzeichnet, dass das höchstwertige Bit 1 ist. In diesem Fall wird das Zweierkomplement zurückgegeben (was macht die SPS?).


    Bei KUKA hat INT eine Bitbreite von 32 und da nur 16 Eingänge verwendest, kann die Zahl nie automatisch ausgegeben werden


    panic mode hat in post #5 die korrekte Umrechnung beschrieben, die Funktion in post #3 ist insofern falsch als hier nicht 'H7F' sondern 'H7FF' und anstatt 'HFF' 'HFFFF' verwendet werden muss

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