TIA Input Parameter für FB

Thomas Linke

Level-2
Beiträge
155
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen


Ichbin dabei unsere alte Software komplett zu überarbeiten. Die Verarbeitungder Informationen für die HMI Meldungen will ich zuletzt machen,möchte jedoch den vorhandenen Baustein ein wenig überarbeiten, umein paar Ressourcen freizubekommen. Bei uns wird in AWL Programmiert.In dem FC für die Verarbeitung gibt es viele Netzwerke in denen immer das gleiche gemacht wird Bit ohne Symbolnamen wird auf einen Merker mit Symbolnamen geschrieben. Dasmöchte ich über einen FB vereinfachen.


Bisjetzt ist es so, dass immer ein Dword verarbeitet wird. ImHintergrund werden, zum Teil über Pointer, immer 32 Meldungengeneriert und auf ein Dword geschrieben. Die Adressierung erfolgtTeilqualifiziert, so das kein Symbolname vorhanden ist. Im neuenProgramm sollen die Informationen aber auch einen Symbolnamen haben.Dazu will ich einen FB anlegen, dem ich über Input Parameter den DB und das Dwordzuweise.


Fürden DB lege ich einen Input Parameter an mit dem Datentyp DB_Any. ImFB rufe ich dann den angeschlossenen DB auf und kann damit internweiterarbeiten. Jetzt muss über die Schnittstelle als InputParameter auch noch das Dword angegeben werden. Und da weiß ichnicht weiter. Geht das überhaupt?




FB_Auswertung


Input Datentyp
DB_Nummer DB_Any (DB10)
Dword ??? (DBD0)


Output
Meldung1 Bool
Meldung2 Bool
............. …....
Meldung32 Bool


AufrufDB_Nummer


UDB_NummerDBX0.0 = Meldung 1
usw.



Gruß


Thomas
 
Bei uns wird in AWL Programmiert.In dem FC für die Verarbeitung gibt es viele Netzwerke in denen immer das gleiche gemacht wird Bit ohne Symbolnamen wird auf einen Merker mit Symbolnamen geschrieben. Dasmöchte ich über einen FB vereinfachen.


Bisjetzt ist es so, dass immer ein Dword verarbeitet wird. ImHintergrund werden, zum Teil über Pointer, immer 32 Meldungengeneriert und auf ein Dword geschrieben. Die Adressierung erfolgtTeilqualifiziert, so das kein Symbolname vorhanden ist. Im neuenProgramm sollen die Informationen aber auch einen Symbolnamen haben.Dazu will ich einen FB anlegen, dem ich über Input Parameter den DB und das Dwordzuweise.
Warum soll das anstatt FC ein FB sein? Damit Du nicht alle Outputs beschalten mußt? Oder muß der FB sich was in der Instanz merken? Nur zum Zerlegen eines DWORD muß man sich nichts merken.
Willst Du nun symbolisch oder nicht? Warum willst Du den DB zusätzlich als DB_Any übergeben? Kannst Du nicht direkt das DWord vollqualifiziert vollsymbolisch übergeben, z.B. so:
Code:
CALL FBMyScatter, IDBx
 IN:="MyDB".MyDWord
 Meldung1:=
 Meldung2:=
 ...
 Meldung32:=

Wenn Du sowieso "komplett überarbeiten" willst, warum programmierst Du dann weiter solches AWL-Zeugs? Mach es gleich in SCL dann kannst Du den FB in jeder S7-300/400/1200/1500 verwenden.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald

Vielen Dank erst mal.

Das alte Programm ist "Uralt" und mit wenig Struktur. Ich muss erst einmal die wichtigen Funktionen neu Gliedern und Strukturieren. Und im Bereich der HMI Meldungen ist alles teilqualifiziert und ohne Symbolik. Das möchte ich jetzt schon ändern, damit ich im übrigen Programm überall symbolisch bin. Nur ist das alles auf einmal etwas Zuviel. Obwohl Du mich gerade "überzeugt hast". Ich werde Deinen Vorschlag mal ausprobieren.

FB soll es deswegen sein, damit ich nicht alle Outputs beschalten muss. Es werden nicht immer alle 32 Bits benötigt.

Gruß

Thomas
 
Hier eine Lösung in SCL. Sie gibt die Bits 0 bis 31 des Input-DWords an den FB-Outputs Meldung1..Meldung32 aus. Falls die Bits des Input-DWords anders belegt sind (Bytes vertauscht?), dann die Bit-Reihenfolge entsprechend in der tmpStruct anpassen. Am IN schaltest Du am besten DWords vollsymbolisch an wie in Beitrag #2 gezeigt, z.B. "MyDB".MyDWord
Code:
FUNCTION_BLOCK "FBMyScatter"
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
   VAR_INPUT
      IN : DWord;
   END_VAR

   VAR_OUTPUT
      Meldung1 : Bool;
      Meldung2 : Bool;
      Meldung3 : Bool;
      Meldung4 : Bool;
      Meldung5 : Bool;
      Meldung6 : Bool;
      Meldung7 : Bool;
      Meldung8 : Bool;
      Meldung9 : Bool;
      Meldung10 : Bool;
      Meldung11 : Bool;
      Meldung12 : Bool;
      Meldung13 : Bool;
      Meldung14 : Bool;
      Meldung15 : Bool;
      Meldung16 : Bool;
      Meldung17 : Bool;
      Meldung18 : Bool;
      Meldung19 : Bool;
      Meldung20 : Bool;
      Meldung21 : Bool;
      Meldung22 : Bool;
      Meldung23 : Bool;
      Meldung24 : Bool;
      Meldung25 : Bool;
      Meldung26 : Bool;
      Meldung27 : Bool;
      Meldung28 : Bool;
      Meldung29 : Bool;
      Meldung30 : Bool;
      Meldung31 : Bool;
      Meldung32 : Bool;
   END_VAR

   VAR_TEMP
      tmpDWord : DWord;
      tmpStruct AT tmpDWord : Struct
         Meldung25 : Bool;
         Meldung26 : Bool;
         Meldung27 : Bool;
         Meldung28 : Bool;
         Meldung29 : Bool;
         Meldung30 : Bool;
         Meldung31 : Bool;
         Meldung32 : Bool;
         Meldung17 : Bool;
         Meldung18 : Bool;
         Meldung19 : Bool;
         Meldung20 : Bool;
         Meldung21 : Bool;
         Meldung22 : Bool;
         Meldung23 : Bool;
         Meldung24 : Bool;
         Meldung9 : Bool;
         Meldung10 : Bool;
         Meldung11 : Bool;
         Meldung12 : Bool;
         Meldung13 : Bool;
         Meldung14 : Bool;
         Meldung15 : Bool;
         Meldung16 : Bool;
         Meldung1 : Bool;
         Meldung2 : Bool;
         Meldung3 : Bool;
         Meldung4 : Bool;
         Meldung5 : Bool;
         Meldung6 : Bool;
         Meldung7 : Bool;
         Meldung8 : Bool;
      END_STRUCT;
   END_VAR

BEGIN
   //Eingangs-DWord auf Temp-Struktur kopieren
   #tmpDWord := #IN;
   
   //die einzelnen Bits aus Temp-Struktur in Ausgänge kopieren
   #Meldung1 := #tmpStruct.Meldung1;
   #Meldung2 := #tmpStruct.Meldung2;
   #Meldung3 := #tmpStruct.Meldung3;
   #Meldung4 := #tmpStruct.Meldung4;
   #Meldung5 := #tmpStruct.Meldung5;
   #Meldung6 := #tmpStruct.Meldung6;
   #Meldung7 := #tmpStruct.Meldung7;
   #Meldung8 := #tmpStruct.Meldung8;
   #Meldung9 := #tmpStruct.Meldung9;
   #Meldung10 := #tmpStruct.Meldung10;
   #Meldung11 := #tmpStruct.Meldung11;
   #Meldung12 := #tmpStruct.Meldung12;
   #Meldung13 := #tmpStruct.Meldung13;
   #Meldung14 := #tmpStruct.Meldung14;
   #Meldung15 := #tmpStruct.Meldung15;
   #Meldung16 := #tmpStruct.Meldung16;
   #Meldung17 := #tmpStruct.Meldung17;
   #Meldung18 := #tmpStruct.Meldung18;
   #Meldung19 := #tmpStruct.Meldung19;
   #Meldung20 := #tmpStruct.Meldung20;
   #Meldung21 := #tmpStruct.Meldung21;
   #Meldung22 := #tmpStruct.Meldung22;
   #Meldung23 := #tmpStruct.Meldung23;
   #Meldung24 := #tmpStruct.Meldung24;
   #Meldung25 := #tmpStruct.Meldung25;
   #Meldung26 := #tmpStruct.Meldung26;
   #Meldung27 := #tmpStruct.Meldung27;
   #Meldung28 := #tmpStruct.Meldung28;
   #Meldung29 := #tmpStruct.Meldung29;
   #Meldung30 := #tmpStruct.Meldung30;
   #Meldung31 := #tmpStruct.Meldung31;
   #Meldung32 := #tmpStruct.Meldung32;
   
END_FUNCTION_BLOCK

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Keine Ahnung, welche CPU Du einsetzt -> als Ergänzung für S7-1500 (und S7-1200, aber die hat ja kein AWL:

Die Überlagerung kann auch direkt auf den IN-Parameter angelegt und damit die Zuweisung des IN- an das Temp-WORD eingespart werden.


Der Code von Harald funktioniert ggf. auch in einem optimierten Baustein, wenn Du die Remanenz der mit AT überlagerten Variable (diese darf dafür aber nicht im TEMP-Bereich sein) auf "Im IDB setzen" einstellst.
 
Zurück
Oben