TIA Int in Bool wandeln

Mr. Schinken

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

ich möchte im TIA Portal für eine S7-1200 eine Integerzahl in Boolsche Bits wandeln.
In Classic (AWL) hab ich das immer gemacht wie im Code angezeigt.

Code:
L     #STEP (INT)
LAR1  
SET   
AUF   DB [#Nummer_IDB(INT)]
=     DBX [AR1,P#0.0]

Hat jemand einen Code wie man das in TIA umsetzen kann.
Zur Erklärung: in meiner Schrittkette (Case) will ich die Schrittnummern in Bits für die jeweiligen Schritte wandeln um diese bequem und ohne jegliche Vergleiche außerhalb der Schrittkette weiter zu verwenden. Die Schrittbits liegen in einem DB und wurden aus einem UDT erzeugt.
Wäre super wenn mir da jemand weiter helfen kann!
 
Hallo Mr Schinken,

du du könntest ein Aarray of Bool anlegen Und dann
zuerst alle Bit per For Schleife auf Null Schreiben und dann
sowas meinarray[schrittnummer] := true; hier wird dann das Bit mit der Schrittnummer gesetzt.

Mit freundlichen Grüßen Tia
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja so was ähnliches habe ich mir schon gedacht.
Das Problem ist nur das die Schleife bei mir immer hochzählt bis max. (in meinem Fall 1500).
Anscheinend passt mit dem Nullen etwas nicht.
Hat jemand einen Code wie man das ein meinem Fall aufbauen sollte.
 
Rein symbolisch.

Z.B. im BitArray:
Code:
FOR i:= 0 TO StepMax BY 1 DO
    StepBit[i] := StepInt = i;
END_FOR;

oder mit Bitschieben (DWord = max. 32 Schritte):
Code:
IF StepInt = 0 then
   StepDWord := DW#16#0;
ELSE
   StepDWord := SHL(IN := DW#16#1, N := StepInt - 1);
END_IF;

oder separtat in jedem Schritt, z.B im 2.Schritt:
Code:
StepBit2 := True;
StepBit1 := False;
 
Zuletzt bearbeitet:
Darf man fragen, auf welche?

War ja schließlich nicht gerade umwerfend neu, was ich da gepostet habe.
:p

Folgende Fall war gestern:
Es Rangieren von Modbus Register und sie zu gleiche Zeit Hihg und Low Byte drehen
Auf diese Art und weise
Code:
  #"Modbusregister 40701 bis 40703_Sortiert"[0] := SWAP(#"Modbusregister 40701 bis 40703_ROH"[0]);
    #"Modbusregister 40701 bis 40703_Sortiert"[1] := SWAP(#"Modbusregister 40701 bis 40703_ROH"[1]);
    #"Modbusregister 40701 bis 40703_Sortiert"[2] := SWAP(#"Modbusregister 40701 bis 40703_ROH"[2]);

Dann hatte ich 68 Register so zu machen und hab im Hinterkopf schon gedacht, das würde auch mit eine Schleife gehen.
Da kein Zeit um mich da schlau zu machen (kein Erfahrung auf die Stelle) hab ich 68 Zeilen weggetippt.

Dann nach dein Beitrag dacht ich : ja Moment...

Und dies geschrieben und getestet.
Code:
FOR #i:= 0 TO 68 BY 1 DO
        #"Modbusregister 40301 bis 40369_Sortiert"[#i] := SWAP(#"Modbusregister 40301 bis 40369_ROH"[#i]);
    END_FOR;

Und sehen da.. Geht :p

Durch solche Tipps und lesen im Forum kommt mann weiter. :D

Grüß Bram
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mr.Schinken schrieb:
ich möchte im TIA Portal für eine S7-1200 eine Integerzahl in Boolsche Bits wandeln.
Du könntest auch den Slice Zugriff verwenden
Das wäre ein Möglichkeit, aber dann ohne symbole für jeden BOOL.
oder AT in der Bausteindeklaration
Das ist die eleganteste Lösung.
 
Perfekt!!
Reingetippt und funktioniert.

Die Geschichte mit dem Slice Zugriff ist meiner Ansicht nach schon wieder eher unschön. Da ist das mit der Schleife schon etwas eleganter gelöst.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe es mit der Schleife gelöst!

Code:
FOR #i := 0 TO 1500 BY 1 DO
    #STEP[#i] := #SN = #i;
END_FOR;

#SN ist hierbei mein "Schrittzähler" Int-Variable
#Step ist ein Array of Bool welches ich im Static Bereich meines Schrittketten-FB's definiert habe.
Die maximale Schrittkettenlänge habe ich zum Test erst mal fest angelegt. Wird aber in Folge noch über eine Variable übergeben.

Nun kann ich Außerhalb der Schrittkette bequem via Instanz-DB Zugriff auf die Bits zugreifen und weiterführende Aktionen auslösen.
 
Du solltest das Bitfeld besser in die OUT-Schnittstelle legen und beim Aufruf des FB unbeschaltet lassen, als von außerhalb der Instanz in den nichtöffentlichen privaten Instanzdaten des FB rumzustochern. Änderungen am FB können keine Rücksicht nehmen ob externe Programmteile auf die internen Variablen zugreifen.

Harald
 
Du solltest das Bitfeld besser in die OUT-Schnittstelle legen und beim Aufruf des FB unbeschaltet lassen, als von außerhalb der Instanz in den nichtöffentlichen privaten Instanzdaten des FB rumzustochern. Änderungen am FB können keine Rücksicht nehmen ob externe Programmteile auf die internen Variablen zugreifen.

Harald

Würde ich auch meinen...

Zumal eine Schlaufe mit 1500 Durchläufen je nach Steuerung auch nicht zu unterschätzen ist... Wenn du so viele Bits hast würde ich dir definitiv den AT Befehl empfehlen...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du solltest das Bitfeld besser in die OUT-Schnittstelle legen und beim Aufruf des FB unbeschaltet lassen, als von außerhalb der Instanz in den nichtöffentlichen privaten Instanzdaten des FB rumzustochern. Änderungen am FB können keine Rücksicht nehmen ob externe Programmteile auf die internen Variablen zugreifen.

Aber ich greife ja nur lesend auf die Bits zu. Ich verändere ja in keinem Fall etwas an deren Ergebnis.

Zumal eine Schlaufe mit 1500 Durchläufen je nach Steuerung auch nicht zu unterschätzen ist

Das habe ich ein meiner 1212 Teststeuerung vorhin auch bemerkt.
Werde die Schrittkette Wohl wieder deutlich beschneiden und mich von meinen 10er Schrittsprüngen verabschieden. Habe mir da etwas "Platz" eingebaut falls nachträglich Änderungen kommen und man diese so besser einpflegen kann aber 1. wird es dann ein riesen Baustein und 2. würden es 2-3 Leerschritte vlt. auch tun.
 
Die Schrittkette wird ganz normal mit Sprungverteiler und Int gemacht.
Das mit den Bits ist nur Luxus das ich außerhalb der Schrittkette keinen Vergleich machen muss ob ich in diesem Schritt bin oder in jedem Schritt ein Bit setzen muss.



Gesendet von iPhone mit Tapatalk
 
Du solltest das Bitfeld besser in die OUT-Schnittstelle legen und beim Aufruf des FB unbeschaltet lassen, als von außerhalb der Instanz in den nichtöffentlichen privaten Instanzdaten des FB rumzustochern. Änderungen am FB können keine Rücksicht nehmen ob externe Programmteile auf die internen Variablen zugreifen.
Aber ich greife ja nur lesend auf die Bits zu. Ich verändere ja in keinem Fall etwas an deren Ergebnis.
Es geht weniger darum, daß womöglich Variablenwerte von außen verändert werden, sondern darum, daß der FB-Code unwartbar wird, wenn die Adressen oder Namen von nichtöffentlichen internen Variablen nicht geändert werden dürfen, nur weil faule externe Programme tief in die internen Variablen zugreifen.

Nur weil externe Zugriffe auf die internen Instanzvariablen dank Siemens möglich sind, heißt das nicht, daß das auch ein gutes oder gar empfehlenswertes Vorgehen ist.

Harald
 
Zurück
Oben