Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 5 von 5

Thema: Allen Bradley / RSLogix5000 / 2x SINT in 1x INT kopieren

  1. #1
    Registriert seit
    18.07.2006
    Beiträge
    68
    Danke
    1
    Erhielt 2 Danke für 2 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Moin,

    hat jemand eine Lösung wie ich 2x SINT (2x8Bit) zu einem INT (16Bit) zusammenfassen kann. Leider kann ich nicht wie bei S7 die Bytes absolut, sondern nur symbolisch ansprechen.
    Ich glaube mit Move wird SINT automatisch nach INT konvertiert. Damit kann ich aber nur das eine Byte nutzten -->MOV(SINT[0],INT[0])

    Hintergrund ist, dass ich meine Daten (2x8Bit) auf eine Kommunikationsschnittstelle (16Bit) zusammenfassen muss.

    Gruss Handyman
    Denkt immer daran, die „dümmsten Programmierer“ haben die „dicksten Programme“ ……
    Zitieren Zitieren Allen Bradley / RSLogix5000 / 2x SINT in 1x INT kopieren  

  2. #2
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.218
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard

    Eine SINT mit 255 multiplizieren, dann beide addieren und in die INT ist fertig. (Gegebenfalls, wenn nötig, beide vorher zu INT konvertieren. Zerlegen geht dann z.Bsp. mit MOD bzw. dem entsprechenden Befehl in der AB.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  3. #3
    Registriert seit
    18.07.2006
    Beiträge
    68
    Danke
    1
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Moin,

    habe es jetzt so versucht zu lösen .... Habe ein Add-ON Instruction erstellt. Kann ich leider nicht testen, da ich keine CPU mehr im Büro habe. Sollte funzen ???
    VAR_INPUT
    b_Byte_1 : SINT;
    b_Byte_2 :SINT;
    END_VAR
    VAR_OUTPUT
    w_word :INT;
    END_VAR

    w_word.0 := b_Byte_1.0;
    w_word.1 := b_Byte_1.1;
    w_word.2 := b_Byte_1.2;
    w_word.3 := b_Byte_1.3;
    w_word.4 := b_Byte_1.4;
    w_word.5 := b_Byte_1.5;
    w_word.6 := b_Byte_1.6;
    w_word.7 := b_Byte_1.7;

    w_word.8 := b_Byte_2.0;
    w_word.9 := b_Byte_2.1;
    w_word.10 := b_Byte_2.2;
    w_word.11 := b_Byte_2.3;
    w_word.12 := b_Byte_2.4;
    w_word.13 := b_Byte_2.5;
    w_word.14 :=b_Byte_2.6;
    w_word.15 :=b_Byte_2.7;
    Denkt immer daran, die „dümmsten Programmierer“ haben die „dicksten Programme“ ……

  4. #4
    Registriert seit
    14.10.2005
    Beiträge
    110
    Danke
    2
    Erhielt 4 Danke für 4 Beiträge

    Standard

    Hi,
    also ich habe das mit dem Befehl BTD (BIT FIELD DISTRIBUTE) gelöst. Diesen Befehl ruf ich zweimal auf. Das erste SINT wird bei dem INT über das DestBit an die Bitadresse 0 geschrieben. Das zweite SINT wird mit dem zweiten Aufruf über das Destbit 8 an die Bitadresse 8 des selben INT geschrieben.
    So hast du aus zwei SINT ein INT gemacht.
    Gruß
    HolleHonig

  5. #5
    Registriert seit
    11.07.2004
    Beiträge
    1.597
    Danke
    10
    Erhielt 213 Danke für 183 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    eine weitere Möglichkeit ist die Verwendung des Befehls "COP". Hier wird (ähnlich einem MOVE bei der S7) Bit für Bit kopiert. Voraussetzung dafür ist, dass die beiden SINT Variablen hintereinander im Speicher liegen. Am sichersten geht das wenn die beiden SINTs in einem Array liegen(alternativ ein einem UDT), es reicht ein SINT-Array mit zwei Mitgliedern. Die Länge des COP Befehls richtet sich nach dem Datentyp des Ziels (Destination). Würde folgendes bedeuten:

    Code:
    Source: MeinSintArray[0]
    Destination: MeineIntegerVariable
    Length: 1
    Auf diese Art und Weise können natürlich auch ganze Blöcke von SINT auf INT umkopiert werden (vergleichbar dem Blockmove).

    Und für diejenigen, die ganz schmutzige Programmierung bevorzugen und verhindern wollen dass der Kunde jemals die CPU tauschen kann und die Kiste wieder ohne weiteres zum Laufen bekommen soll:

    Die Variablen liegen auch hintereinander im Speicher wenn sie Namen haben, die alphabetisch gesehen hintereinander liegen und vor dem Programmdownload angelegt wurden.

    Würde bedeuten wenn die erste Variable MeinSint_01 heißt und die zweite MeinSint_03 würde es auch funktionieren, wenn man die erste Variable als Source definiert, solange alphabetisch gesehen nichts wie MeinSint_02 existiert. Wenn man nun nachträglich Online eine Variable MeinSint_02 anlegt, würde die im Speicher sonstwo stehen, die Funktion wäre erstmal noch gegeben. Wenn allerdings der Kunde dann das Programm (inclusive MeinSint_02) in eine neue CPU laden würde, würde der Inhalt von MeinSint_02 anstatt MeinSint_03 in den oberen 8 Bits der Integervariable landen.
    Auf die Art und Weise beschreibt man allerdings auch Adressen die per Crossreferenz nicht gefunden werden, also Finger weg von so einem Scheiß!

Ähnliche Themen

  1. Allen Bradley - RSLogix5000 - SFC
    Von IBFS im Forum Sonstige Steuerungen
    Antworten: 7
    Letzter Beitrag: 08.12.2015, 08:05
  2. Allen Bradley CompactLogix REAL in SINT umwandeln
    Von bartsim im Forum Sonstige Steuerungen
    Antworten: 1
    Letzter Beitrag: 17.08.2012, 23:04
  3. Allen Bradley Word in Bool-Array kopieren
    Von mazoellner im Forum Sonstige Steuerungen
    Antworten: 14
    Letzter Beitrag: 11.07.2011, 09:50
  4. Allen Bradley?
    Von Flo im Forum Sonstige Steuerungen
    Antworten: 1
    Letzter Beitrag: 18.05.2010, 08:19
  5. Allen Bradley
    Von Anonymous im Forum Sonstige Steuerungen
    Antworten: 4
    Letzter Beitrag: 15.04.2005, 22:30

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •