TIA Slice-Zugriff während Laufzeit ändern

d Martin

Level-2
Beiträge
70
Reaktionspunkte
23
Zuviel Werbung?
-> Hier kostenlos registrieren
Was ich eigentlich möchte geht mit dem Slice Zugriff nicht.

Hier die Problemstellung:
Ich möchte möchte Ein beliebiges Bit eines Word-Variablen ändern (und nur dieses Bit, die anderen sollen alle so bleiben wie sie sind). Die Word-Variable verändert sich unabhängig davon ständig.
jetzt will ich zur Laufzeit über eine Variable auswählen können welches Bit das ist.

Mit AT-Befehl kenn ich mich nicht aus, soweit ich dass jetzt aber verstanden habe geht es damit nicht.

Gibt es da eine einfache Möglichkeit?

Mein momentaner Plan. Wenn ich das Bit im Word überschreiben möchte:
- Überprüfen ob 1 oder 0
- dann ein Word zum Übertragen mit 16#FFFE bei 0
oder 16#0001 bei 1 beschreiben.
- Dann da Word mit Schiebebefehl meine 0 oder 1 auf die Stelle schieben die ich überschreiben möchte.
- bei 1 mit WordOR übertragen bei 0 WordAND übertragen.

Vielleicht hilft jemand anderem diese Lösung ja auch schon.
Über noch einfacher Lösung bin ich auch dankbar

(TIA-Portal 15.1 und soll auf s7-1200 und S7-1500 funktionieren Optimierter Bausteinzugriff)
 
Hi,
also ich habe deine Aufgabenstellung nicht so ganz verstanden. Auch nicht so recht was du damit praktisch erreichen möchtest. Vielleicht kannst du mal den Einsatzzweck erläutern, damit man sich ein besseres bild davon machen kann.


Nur mal so von dem was ich verstanden habe heruntergebrochen:

Ein Bit in einem Wort ändern

Du könntest dein Word in ein Array-of-Bool übertragen.

- Das geht per AT (*LINK*) oder
- über ein Slice-zugriff (*LINK*) Beispiel: MeinBoolArray[0] := MeinWord.%X0, MeinBoolArray[1] := MeinWord.%X1

Mit deiner Variable (Int) kannst du ja nun genau auf ein Bit in deinem Array-of-Bool schauen (Array-Index)

Zum Schluss muss du nur wieder umkompieren.


Also quasi sowas wie:

"MeinWord"> in Array-of-Bool legen > Bit per Indexvariable Adressieren aus Array-of-Bool und Wertigkeit ändern > Array-of-Bool wieder in "MeinWord" kopieren.


-chris
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Word dient als Schieberegister. Dort möchte ich einmal Bit x ändern später Bit y. Welches Bit x und welches Bit y ist wird erst zur Laufzeit ermittelt.

Ja ich kann mein "Word" in ein "Array of Bool" kopieren, dann das Bit ändern und dann das "Array of Bool" wieder in das "Word" kopieren.

Ist die Frage ob das jetzt einfacher ist.

Wahrscheinlich eher Geschmackssache, was man besser findet.

Martin
 
AT und optimierter Baustein funktionieren im Zweifelsfall nicht.

Code:
IF #bSetTrue THEN
    #dwMask := SHL(IN := #Const_1, N := INT_TO_ULINT(#iBitNummer));
    #dwVariable := #dwVariable OR #dwMask;
ELSE
    #dwMask := SHL(IN := #Const_0, N := INT_TO_ULINT(#iBitNummer));
    #dwVariable := #dwVariable AND #dwMask;
END_IF;

Const_1 ist dabei eine Konstante 16#1
Const_0 mit 16#FFFF_FFFE
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hab mal Bausteine in SCL dafür gemacht: Du gibst WORD-Variable und einen Index rein. Bekommst entweder die manipulierte Variable zurück oder ein True/False für die Prüfung.

Ist ohne jegliches Abfangen von Fehlern....

Das TXT aus dem Dateinamen entfernen. Sind SCL-Quellen.

Anhang anzeigen Bit-Operationen.scl.txt
 
Mach doch das Schieberegister als ein Array von Bool von Anfang ab.
Dann wird kein Umwandling zwischen Array un Word benötigt.

Ich gehe davon aus, dass jedes Wort einer Registerpositionn entspricht und jedes Bit im Wort einer Eigenschaft.
 
Zurück
Oben