TIA Bits hochzählen bei "slice" Befehl möglich?

Tuc_Tuc

Level-1
Beiträge
21
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ist es möglich die Bits beim Slice-Befehl hochzuzählen.

Also quasi so etwas:

FOR #j := 1 TO 5 DO
#DeData.MoData[#j].Status.%X4 := vartemp.%X[j];
END_FOR;

Hier sollen die Bits von vartemp genommen werden und jeweils das 4 bit des Status beschreiben.

Diese Syntax "vartemp.%X[j]" funktioniert natürlich nicht. Ich habe aber noch nicht rausgefungen, ob und wie so etwas möglich ist.

Habe das Problem mit "At" gelöst, würde es aber auch anderst gehen?

Vielen Dank für eure Hilfe.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Sind beides Bytes.

Der Code sieht natürlich in meinem Projekt anderst aus. In dem hier dargestellten "vartemp" ist eine Portabfrage vom PCT-Tool realisiert. Die Information über den Ports gebe ich dann wieder an die einzelnen Geräte zurück.

Wie geschrieben ich habe das mit meinem gefährlichen TIA Halbwissen jetzt mit "At" Sicht gelöst.

vartemp Byte
atvartemp at "vartemp" Array[0...7] of Bool

FOR #j := 1 TO 5 DO
#DeData.MoData[#j].Status.%X4 := atvartemp[#j];
END_FOR;

So in etwa sieht das jetzt aus.

Nur müsste ich mit dem slice keine at variable anlegen und hätte das schneller runtergetippt. Jetzt frage ich mich aber auch, was das für die Laufzeit/Speicher bringt. Bzw. wann ist "At" sinnvoll, wann slice. Und geht das was ich im ersten Post geschrieben habe überhaupt irgendwie mit slice?
 
Zuletzt bearbeitet:
Was hast du für eine Steuerung?

Es sind keine Array nur Bytes?

Code:
[COLOR=#333333]#DeData.MoData.Status.%X4 := vartemp.%X4;[/COLOR]
 
Ja sind es. darum ja auch der Slice Befehl. Ist eine 1500er CPU

Slice mal kurz erklärt:
vartemp.x0 ein Zugriff auf das 1. Bit in der Variable
vartemp.b0 ein Zugriff auf das 1. Byte in der Variable usw.

Ist jetzt neu in Tia, darum wollte ich es mal versuchen, habs aber noch nicht 100% durchschaut.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich weis was Slice sind trotzdem danke.

Der AT Befehl mach bei den 1500 meiner Meinung nach keinen Sinn da es den Slice befehl gibt!

Und was ist jetzt deine Frage? Hab ich sie bereits beantwortet?
 
Die Frage ist, wie ich den Slice Befehl in eine Schleife packe, damit er mir die einzelnen Bits abläuft.

Zum Beispiel:

FOR #j := 1 TO 5 DO
#DeData.MoData[#j].Status.%X4 := vartemp.%X[#j];
END_FOR;

Hier sollen die Bits von vartemp genommen werden und jeweils das 4 bit des Status beschreiben.

Diese Syntax "vartemp.%X[#j]" funktioniert nicht. Ich habe aber noch nicht rausgefungen, ob und wie so etwas möglich ist.
 
du brauchst doch keine Schleife und ein einzelnes Bit in ein Byte zu kopieren!

Du willst das 4 bit von vartemp in den Status kopieren und fertig?

Es ist kein Array nichts nur ein einziges bit?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Doch die linke Seite ist ein Doppel-Array.
Du sieht das bei MoDatea[#j] die Klammer ist. Nur der Status dort ist keins.

Ich versuche es nochmal anschaulicher zu machen.

UDT Bla:
"Wert" Word
"Status" Bool


MoData Array[1...10] of bla

FOR #j := 1 TO 5 DO
#MoData[#j].Status := vartemp.%X[#j];
END_FOR;

So jetzt will ich mit dem Slice Befehl jeweils die Bits von Vartemp auf die verschiedenen "Status" übertragen.

Wie ist das ohne At-Sicht möglich?
 
Ein doppel Array... was auch immer das ist.. Du meinst wahrscheinlich ein Array mit einem UDT indem ein Wort und ein Bit ist!

Schreib deinen Code bitte so:
Code:
[code]
[/code] Dann kann man ich auch lesen..

Hast du den Code den du im TIA hast? Kopier den bitte hier mal rein. Ich denke du weiss selber nicht ganz was du brauchst...

Code:
[COLOR=#333333]#MoData[#j].Status.%X4 := vartemp.%X4;
[/COLOR]
 
Machen wirs doch so, mit "At" funktioniert es, ich soll aber kein At nehmen. wie realisiere ich das mit slice.

Code:
bla Array (0...10) of Byte
vartemp Byte
Atvartemp at "vartemp" Array(0..7) of Bool

FOR #j := 1 TO 5 DO
#bla[#j].%X4 := Atvartemp[#j];
END_FOR;
 
PCT-Tool füllt mir das hier als "Vartemp" beschriebene Byte mit der Portdiagnose. Port 1 auf bit 0, Port 2 auf 1... . Ich möchte aber den Status für jedes Gerät als Byte ausgeben. Darum Spalte ich das vartemp in den Status der einzelnen Geräte auf. Jetzt hatte ich den Slice entedeckt und dachte das wäre eine gute Anwendung hierfür. Aber wie ich sehe seh ich nix :D
 
FOR #j := 1 TO 5 DO
#DeData.MoData[#j].Status.%X4 := vartemp.%X[j];
END_FOR;
Den Slice kannst du nicht variabel gestalten. Man könnte es aber ganz klassisch machen.
Code:
FOR #j := 1 TO 5 DO
          #DeData.MoData[#j].Status.%X4 := (vartemp AND INT_TO_WORD(2**(j-1))) > 0;
END_FOR;
Oder die Maske über 1 mit SHL.
So habens schon die alten Römer gemacht, sogar voll-symbolisch. ;)


@RogerSchw85: Die [NOPARSE][/NOPARSE] sind ganz praktisch: [CODE][/CODE]
 
Zuletzt bearbeitet:
@Thomas: Haste recht, hatte ich vergessen. Aber lustig ist's trotzdem... ;)

INT_TO_WORD würde dann auch nicht passen.... ich Dummkopf.
 
Zuletzt bearbeitet:
Zurück
Oben