E/A Doppelword nicht gleich !?!?!?!?!?!

  • Hi Leutz.....


    nachdem das geklappt hat ( http://www.roboterforum.de/rob…s_via_cp5614-t6129.0.html ) :danke:
    habe ich jetzt ein anderes Problem.


    Ich beschreibe den Ausgang ( iosys.ini -> OUTDW10=127,0,x1 )
    nach vertauschen des Hi/LO bytes bekomme ich auch in der CPU die Richtige Zahl angezeigt. ( sowohl [+] als auch [-] werte) :ylsuper:



    schiebe ich jetzt in der CPU das E/Doppelword direkt wieder in das A/Doppelword , ohne irgend was zu drehen oder sonstiges. (1:1)
    Ergebnis in der Variablen Anzeige:
    Roboter OUT = 1 <==> Roboter IN 1
    Roboter OUT = -1 <==> Roboter IN 65535 :denk:


    woran liegt das?



    PS.: ach ja der Eingang in der iosys.ini ( INDW10=127,0,x1)

  • Schritt für Schritt zum Roboterprofi!
  • ja das ist richtig..... was ich nur nicht verstehe ist,
    das ich an den Roboter das gleiche bit-muster schicke wie ich es in der CPU bekomme.
    er aber nicht das selbe anzeigt wie ich es schreibe.

  • schätze mal problem mit dem Datenformat, Byteweises vertauschen innerhalb eines Wortes schau mal in die Profibusdokumentation unter dem Kapitel "SWAP"

    Die Abnahme von GOTO Anweisungen verhält sich reziprok zur Qualität einer Programmierung

  • Hallo,
    also ich tippe da eher auf eine falsche Länge des Eingangssignals
    sowas wie:


    signal Edaten $in[81] to $in[96] an Stelle von


    signal Edaten $in[81] to $in[112].


    Das würde das Verhalten erklären.


    Die Sache mit den 65535/32767 gilt bei 16-Bit breiten Werten, hier ist's ein Doppelwort und da wird das
    Vorzeichen im Roboter korrekt behandelt, da braucht man nix selber zu rechnen.


    Hermann

  • hallo....


    also noch mal kurz zu meiner Dekleration:



    in der IOSYS.ini
    :
    INDW10=127,0,x1 also 1Doppelword (( $in[81] to $in[112] ))
    OUTDW10=127,0x1 also das selbe wie oben

    in der Config.dat
    :
    Signal inTemp1_X $in[81] to $in[112]
    Decl Real inTemp1_X = 0.0


    Signal outTemp1_X $out[81] to $out[112]
    Decl Real outTemp1_X = 0.0


    das ganze sollte ja so stimmen!?!?!?!?!


    durch das 2erKompliment wird es ja nur mit 65535 dargestellt, vom Prinzip ist es ja das selbe wie -1 :denk:


    also Punkt 1. : Das Deklarierte Format mit Doppelword wäre ja richtig das heist kein Überlauf oder so etwas.
    Punkt 2. : Das ist richtig das wenn ich Werte die über "65535" liegen im Roboter Programm mit 65535 subtrahiere
    den richtigen minus Wert raus bekomme, damit ist aber das ursprüngliche Problem doch nicht gelöst, sondern nur umgangen.

  • Hallo,
    bleibe dabei, dass da an der Deklaration des IN-Signals was nicht stimmt.
    Evtl. sind die Bits bei den Eingängen um 16 Bit verschoben, entweder auf Roboterseite oder
    auf der CPU.


    Bei einem Doppelwort als Eingang geht der Zahlenwert bis (65536 *65536) / 2 - 1 und nicht nur bis 65535.
    also entspricht -1 so was um die 4249 Millionen.


    Gruss Hermann

  • Hallo,


    da hat Hermann 100% recht.
    In deinem Signal sind nur die ersten 16 bit gesetzt.
    Ich wuerde mir mal die einzelnen Bits auf dem Roboter anschauen.
    Konfiuration falsch, oder es wird was von der PLC wieder ueberschrieben.


    Gruss stefan


  • 0 - 65535 ist nur ein WORD ;)


    Also ich mache das so:



    in der IOSYS.ini
    :
    INB0=127,0
    INB1=127,1 also 1 Word (( $in[81] to $in[96] )) ist das Gleiche wie bei dir, nur kann man so das Word besser drehen
    OUTB0=127,0
    OUTB1=127,1 also das selbe wie oben
    wenn man das Word drehen muß:
    INB0=127,1 ; X-KORD Wortübertragung automatisch gedreht
    INB1=127,0 ; Intergerwert -> HIGH LOW Byte Drehung
    OUTB0=127,1
    OUTB1=127,0



    in der Config.dat
    :
    Signal inTemp1_X $in[81] to $in[96]
    REAL Speicher_inTemp1_X=0.0


    Im Programm:


    ; SCALE ( ) Routine zum Umrechnen der neg.Werte
    Speicher_inTemp1_X=SCALE(inTemp1_X)


    DEFFCT REAL SCALE(ZAHL)
    INT ZAHL
    REAL DUMMY
    ; Umrechnung wenn Negativwert empfangen
    ; 2er Komplement
    ; Wert von 0-32767 = positiver Werte
    ; wert von 32768 - 65535 = negativer Werte


    IF ZAHL>32767 THEN
    DUMMY=ZAHL-65536
    ELSE
    DUMMY=ZAHL
    ENDIF


    DUMMY=DUMMY/ACCURACY


    RETURN DUMMY
    ENDFCT ; of scale


    Im DAT-file:
    ;divisor fuer Korrekturwerte um die Kommastelle richtig zu setzen
    REAL ACCURACY=100.0


    Am Ende kommen dann die richtigen +/- Werte raus!


    Maximal mit meinem Teiler (ACCURACY=100.0) 327,67 oder -327,76


    Teilst du durch 10, halt 3276,7 oder -3277,6 usw.

  • Hallo,


    wenn es nur ein Word sein sollte funktionierts auch mit analogen Ein- und Ausgängen über den Profibus:


    iosys.ini:
    [PBMASL]
    ;------------------------------------------------------------
    ; SPS-Master==> Roboter-Slave-Kommnikation
    ; Das Slavemodul der CP5614 wird fest mit der Slave-Adresse
    ; 127 angesprochen. Unter dieser Slave-Adresse kann IO-System
    ; des Roboters auf das Slave-Modul lesend und schreibend
    ; zugreifen.
    ;------------------------------------------------------------
    ; SPS-Master-Ausgaenge==> IR-Slave-Eingaenge
    ANIN1=127,10,16,1,CAL 10


    $config.dat:
    SIGNAL aiAnalogEingang1 $ANIN[1]


    Genaue Beschreibung der Parameter sind ja am Ende der iosys.ini zu finden.
    Damit erspart man sich die ganze umrechnerei mit den negativen Zahlen und man kann den Wertebereich gleich mit angeben.


    Wenn man jetzt die 16 auf 32 ändert könnte es auch mit einem Doppelword gehen, haben wir aber bis jetzt nicht benötigt.




    Gruß
    Thilbi

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