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

handyman

Level-1
Beiträge
68
Reaktionspunkte
2
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
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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;
 
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.
 
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ß!
 
Zurück
Oben