Step 7 Bits zu Word Convertieren in Step7 v13

MarkusSether

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

ich habe das Problem das ich mir einen FB basteln will der aus 16 Bits ein Word macht. Andersherum ist mir dies schon gelungen.


Mit Step7 v5.4 ging es unkompliziert und schnell, ich habe einfach ein Lokales Word angelegt, per direktadressierung die Bits hineingeschrieben und dann das ganze rausgemoved.
Mit Step7 v13 geht das nicht mehr. Ich kann mich verbiegen wie ich will, direktadressierungen an eine Lokale adresse funktionieren nicht.

Jetzt ist die Frage wie kann ich es dennoch schaffen ?

Meine versuche waren wie folgt:

Ich habe Eingangsbits festgelegt und ein Ausgangsword.
Dann habe ich mit decode die Eingangsbits auf EN gelegt und die jeweilige Zahl als int in den IN.
Das mit allen bits. Raus kam nur Blödsinn da in Step7 v13 die Word's nurnoch mit Hexzahlen geschrieben werden können und selbst der Baustein der dafür da ist es nicht hinbekommt das Bitweise reinzuschreiben.

Als nächstes habe ich mir 16 Words geschrieben welche ungefähr so aussahen : 0000_0000_0000_0001, 0000_0000_0000_0010, 0000_0000_0000_0100 ... usw. diese habe ich dann mit Word-Oder mit dem Eingangsword verodert. So hätte eigendlich am Ende ein Korrekt geschriebenes Word rauskommen müssen. Allerdings ging auch das in die Hose da diese Variante nur Byteweise funktioniert.

Am Ende habe ich vorherige variante versucht mit einem Rotate-Left befeht zwischen allen vier Bits. Das hat fast funktioniert aber das zweite Byte belegte am ende das erste und letzte Byte und nicht nur seines.



Weiss irgendwer wie man das Einfach und Effizient hinbekommt ?


PS: Fettgeschriebenes ist das Relevante
Kursives ist geschwafel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das habe ich versucht.
Diese Variante ist ja fast das selbe wie ich es auch Step7 v5.4 kenne, weswegen ich es versucht habe. Allerdings sagt mir Step7 dann das dass so nicht geht.
Dazu sollte ich sagen das ich CPU 300 Programmiere und ich glaube dies geht nur mit den 1200ern ...
 
Ich hab das gerade mal probiert. Man kann z.B. M0.0 bis M1.7 benutzen und dann MW0 in einen DB schreiben. Der DB darf nicht für Zugriffe optimiert sein, aber generell geht das aus 16 Bits ein Word zu machen auch in TIA Portal.
€: Das geht wohl auch mit optimierten Zugriffen.

War es das was du meintest?
 
Zuletzt bearbeitet:
Im Prinzip ja. Um Ehrlich zu sein ich habe die Variante mit einer Externen DB oder einem FUB in meinen Überlegungen von vornherein ausgeschlossen. Am liebsten hätte ich eine Funktion. Das ist ein Baustein der nicht noch 1000 andere sachen mitinstalliert so wie der FUB oder wo ich nicht Extern noch 1000 Sachen anschliessen muss so wie bei einer DB das Extra Word.
Aber wenn keiner ne bessere Idee hat dann hab ich jetzt wohl genug Optionen um mein Problem zu Lösen =D ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Darf's in SCL sein, ist leicht zu posten:
Code:
FUNCTION "Bits_To_Word" : Void
TITLE = Bits_To_Word
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : hucki
VERSION : 0.1

   VAR_INPUT 
      Bit_0 : Bool;
      Bit_1 : Bool;
      Bit_2 : Bool;
      Bit_3 : Bool;
      Bit_4 : Bool;
      Bit_5 : Bool;
      Bit_6 : Bool;
      Bit_7 : Bool;
      Bit_8 : Bool;
      Bit_9 : Bool;
      Bit_10 : Bool;
      Bit_11 : Bool;
      Bit_12 : Bool;
      Bit_13 : Bool;
      Bit_14 : Bool;
      Bit_15 : Bool;
   END_VAR

   VAR_OUTPUT 
      WordOut : Word;
   END_VAR

   VAR_TEMP 
      BitsTmp : Struct
         Bit_8 : Bool;
         Bit_9 : Bool;
         Bit_10 : Bool;
         Bit_11 : Bool;
         Bit_12 : Bool;
         Bit_13 : Bool;
         Bit_14 : Bool;
         Bit_15 : Bool;
         Bit_0 : Bool;
         Bit_1 : Bool;
         Bit_2 : Bool;
         Bit_3 : Bool;
         Bit_4 : Bool;
         Bit_5 : Bool;
         Bit_6 : Bool;
         Bit_7 : Bool;
      END_STRUCT;
      WordTmp AT BitsTmp : Word;
   END_VAR



BEGIN

    #BitsTmp.Bit_0 := #Bit_0;
    #BitsTmp.Bit_1 := #Bit_1;
    #BitsTmp.Bit_2 := #Bit_2;
    #BitsTmp.Bit_3 := #Bit_3;
    #BitsTmp.Bit_4 := #Bit_4;
    #BitsTmp.Bit_5 := #Bit_5;
    #BitsTmp.Bit_6 := #Bit_6;
    #BitsTmp.Bit_7 := #Bit_7;
    #BitsTmp.Bit_8 := #Bit_8;
    #BitsTmp.Bit_9 := #Bit_9;
    #BitsTmp.Bit_10 := #Bit_10;
    #BitsTmp.Bit_11 := #Bit_11;
    #BitsTmp.Bit_12 := #Bit_12;
    #BitsTmp.Bit_13 := #Bit_13;
    #BitsTmp.Bit_14 := #Bit_14;
    #BitsTmp.Bit_15 := #Bit_15;

    #WordOut := #WordTmp;

END_FUNCTION
 
Zuletzt bearbeitet:
Also genaugenommen brauchst du den DB eigentlich nicht.

Wenn du die Merker M0.0 bis M1.7 alle zugewiesen hast, ist das MW0 bereits dein Word was du wolltest.
Du brauchst dafür nichtmal einen FC.
 
Wenn du die Merker M0.0 bis M1.7 alle zugewiesen hast, ist das MW0 bereits dein Word was du wolltest.
Ist halt heutzutage nicht mehr so gern gesehen, da so entweder die Bit- oder die Wordübertragung unsymbolisch erfolgen muss.


PS: Diese Aussage stimmt ja gar nicht mehr, denn TIA lässt die überlappende Symbolisierung ja zu.
:oops:
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
In Step7 kann ich sowohl den Merkern als auch dem Merkerwort eine Symbolik zuweisen.

Somit kann ich doch dann alle Variablen auch symbolisch erreichen.

Geht in TIA das gleiche nicht auch? Oder Irre ich mich?
 
Ja, hab' ich auch gerade gemerkt, dass die Aussage zum Einen überholt ist und zum Anderen ich für das System- und Taktmerkerbyte der S7-1200 selber schon Gebrauch davon gemacht habe.

Fall von Alzheimer.
:ROFLMAO:


PS:
Hab' gerade gegrübelt, wie ich zu dieser Überzeugung gekommen bin. Muss noch von MicroWin stammen, denn selbst in Classic (hab' ich nur wenig mit gemacht) geht das ja schon. :eek:
 
Zuletzt bearbeitet:
Oh my... Hast du mit TIA angefangen oder Quereinstieg von woanders?

Ich hab jetzt keine Ahnung wie das auf der S5 war, damals hab ich mich für solche Feinheiten nicht interessiert.
Aber auf der S7 war das eigentlich schon immer so. Kann mich an meinen Grundlehrgang erinnern, da bin ich am Anfang zu oft in die Falle getappt, Merker aus einem ebenfalls aufgerufenen Merkerwort zu verwenden und mich dann zu wundern dass nichts läuft.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Problem bei der uralten Methode mit den Schmiermerkern ist nicht die überlappende Symbolik, sondern daß es globale Variablen benutzt und deshalb nicht Multitasking-fähig ist und auch nicht wirklich bibliothekfähig/wiederverwendbar ist. Wenn schon im Speicher 'rumgepoked wird, dann sollte man wenigstens Lokalvariablen/TEMP benutzen. Irgendwo hier im Forum gibt es schon einen fertigen Code von mir dafür, den ich aber jetzt mit dem Handy nicht finde. Er funktioniert so, daß in TEMP eine Struktur aus 16 Bits liegt, die bitweise beschrieben und dann mithilfe von AR1 als Word gelesen wird.

Will man die Aufgabe hardware-unabhängig lösen, so gibt es die bewährten Methoden der wordweisen Bit-Maskierung, die auf jeder SPS/Mikroprozessor funktionieren.

Harald
 
Wie kann ich denn im Tia Portal auf SCL umschalten ? Das sieht mir sehr schön nach Java aus, eine Programmiersprache die ich sehr gut beherrsche. Kann ich das auch nur in einzelnen Funktionen benutzen ?
Ich hab Step7 v13 Professional. Da sollte das dabei sein. ich finde aber nirgends einen Knopf dafür.
 
Zurück
Oben