Step 7 Zwei Strukturen [Bool] vergleichen

Hausen

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

ich habe in einem Baustein zwei Strukturen die ich verunden möchte. Die erste Struktur sind Störmeldungen eines Aggregats.
Die zweite Struktur eine Konfiguration Der Störmeldungen.
Zweck ist über die Konfiguration festzulegen ob es sich um einen Störung (Bit in der Struktur Konfiguration = True) oder um
eine Warnung (Bit in der Struktur Konfiguration = False) handelt.

Ist eigentlich keine große Sache, jedoch waren bisher die Strukturen nur 32Bit lang, was also relativ einfach über einen Befehl
UD verwirklicht werden konnte. Bei meinem neuen Projekt sind diese jetzt jedoch 352Bit lang und ich würde das gerne anders
lösen damit der Baustein nicht so groß wird.

Hat da vielleicht jemand eine Idee? Anbei ein Screenshot wie der Baustein aufgebaut ist. Strukturen sind beide Identisch über
UDT´s aufgebaut.

Gruß Hausen
 

Anhänge

  • Störkonfig.jpg
    Störkonfig.jpg
    111,2 KB · Aufrufe: 72
Ich muß zugeben, das ist ein wenig "Quick and Dirty", aber mit fällt auf die Schnelle nichts Besseres ein.

Code:
FUNCTION FC 1001 : VOID
TITLE =
{ S7_language := '9(1) Englisch (USA)  22.04.2013  12:03:17' }
VERSION : 0.1




VAR_INPUT
  FRG : BOOL ;    
  Stoerungen : UDT 1001;    
  Konfiguration : UDT 1001;    
END_VAR
VAR_OUTPUT
  Ergebnis : UDT 1001;    
END_VAR
VAR_TEMP
  Source1_Len : WORD ;    
  Source1_DB : WORD ;    
  Source1_Adr : DWORD ;    
  Source2_Len : WORD ;    
  Source2_DB : WORD ;    
  Source2_Adr : DWORD ;    
  Dest_Len : WORD ;    
  Dest_DB : WORD ;    
  Dest_Adr : DWORD ;    
  Zaehler : WORD ;    
END_VAR
BEGIN
NETWORK
TITLE =


      U     #Stoerungen.Bit0; //Anfangsadresse laden
      TAR1  ; 
      L     DW#16#FFFFFF; 
      UD    ; 
      T     #Source1_Adr; 
      L     DBNO; 
      T     #Source1_DB; 


      U     #Konfiguration.Bit0; //Anfangsadresse laden
      TAR1  ; 
      L     DW#16#FFFFFF; 
      UD    ; 
      T     #Source2_Adr; 
      L     DBNO; 
      T     #Source2_DB; 


      U     #Ergebnis.Bit0; //Anfangsadresse des laden
      TAR1  ; 
      L     DW#16#FFFFFF; 
      UD    ; 
      T     #Dest_Adr; 
      L     DBNO; 
      T     #Dest_DB; 
NETWORK
TITLE =




      L     11; 
STRT: T     #Zaehler; 


      AUF   DB [#Source1_DB]; 
      L     DBD [#Source1_Adr]; 
      AUF   DB [#Source2_DB]; 
      L     DBD [#Source2_Adr]; 
      UD    ; 
      AUF   DB [#Dest_DB]; 
      T     DBD [#Dest_Adr]; 


      L     P#4.0; 
      L     #Source1_Adr; 
      +D    ; 
      T     #Source1_Adr; 


      L     P#4.0; 
      L     #Source2_Adr; 
      +D    ; 
      T     #Source2_Adr; 


      L     P#4.0; 
      L     #Dest_Adr; 
      +D    ; 
      T     #Dest_Adr; 


      L     #Zaehler; 
      LOOP  STRT; 
END_FUNCTION

Das Ganze kannst du in eine Quelle einfügen und dann übersetzen.

Wenn jemand was Besseres weiß, um in einem FC an die Adresse der IN-Variablen heranzukommen, nur her damit, eine bessere Lösung würde mit gefallen. Besonders an die Länge komme ich so nicht heran. Aber direkt über "LAR1 P##Input" kommt man den Any nicht heran.
 

Anhänge

  • Test_Bit.AWL.txt
    44,1 KB · Aufrufe: 12
Zuviel Werbung?
-> Hier kostenlos registrieren
Für mich zum Lernen bzw. Verständnis des Hintergrunds:

Wenn das nur BOOLs sind, warum verwendest Du dann kein ARRAY statt des STRUCTs?
:confused:
Das Array könntest Du ja in SCL mit 'ner Schleife durchrattern.
Alternativ könnte ich mir ein Array of Structs vorstellen, bei dem halt immer die max. 32 BOOLs in jedem STRUCT stecken, bei denen Du mit der DWORD-Verknüpfung klar kamst. Und dann wieder 'ne Schleife über das ARRAY.
 
Hallo Ralle, Hallo Hucki,

@Ralle: Ich würde das gerne nur in einem FC ohne DB realisieren.


Für mich zum Lernen bzw. Verständnis des Hintergrunds:

Wenn das nur BOOLs sind, warum verwendest Du dann kein ARRAY statt des STRUCTs?
:confused:

Es ist so das ich in dem Programm die Störmeldungen des Aggregats als UDT angelegt habe.
Dieses UDT nutze ich dann mehrfach in DB´s. Diese sind vom Typ Bool damit ich jede Störmeldung
symbolisch im Programm verwenden kann.

In dem FC zur Auswertung wäre es mir sogar egal, nur möchte ich von Außen an den FC auch
die Variable symbolisch eintragen können.

Ich habe mal meine Bausteine in ein kleines Programm gepackt, es ist etwas schwierig das zu erklären
finde ich.

Würde mich freuen wenn Ihr Euch das mal anschaut. In Sachen SCL bin ich völlig Ahnungslos. :-(

Gruß Hausen
 

Anhänge

  • Störmeldung.zip
    438,6 KB · Aufrufe: 7
Hallo Ralle, Hallo Hucki,

@Ralle: Ich würde das gerne nur in einem FC ohne DB realisieren.

Diese Aussage verstehe ich nicht.
Der FC nutzt ja nur die an ihn angelegten Struct und die sind ja schließlich in einem DB oder?
Man könnte natürlich auch mit einem Blockmove alles in Temp umkopieren und dann damit arbeiten. Lösungen gibt es wie immer mehrere. :)
Da ich indirekt darauf zugreife muß ich mir die DB-Nummer irgendwo herholen und den DB öffnen, bevor ich den Zugriff mache.
Da i.M. 3 Structs am FC angelegt werden können und diese theoretisch auch in verschiedenen DB liegen, gibt es hat auch 3 DB-Variablen.
Ich hab halt zum "Zeigen" noch eine Ausgangsstruct genutzt, das muß nicht sein, wenn man die Daten intern nutzt, z.Bsp. mit einer Temp.

Für SCL geht auch der Vorschlag von Hucke, aber dann läuft man durch einer Schleife mit 352 Wiederholungen, in meinem Baustein sind es nur 11.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn das nur BOOLs sind, warum verwendest Du dann kein ARRAY statt des STRUCTs?
:confused:
Das Array könntest Du ja in SCL mit 'ner Schleife durchrattern.

In SCL kannst du dir auch mit AT ein Array über die Structur legen.

Gruß
Dieter
 
Diese Aussage verstehe ich nicht.
Der FC nutzt ja nur die an ihn angelegten Struct und die sind ja schließlich in einem DB oder?
Man könnte natürlich auch mit einem Blockmove alles in Temp umkopieren und dann damit arbeiten. Lösungen gibt es wie immer mehrere. :)
Da ich indirekt darauf zugreife muß ich mir die DB-Nummer irgendwo herholen und den DB öffnen, bevor ich den Zugriff mache.
Da i.M. 3 Structs am FC angelegt werden können und diese theoretisch auch in verschiedenen DB liegen, gibt es hat auch 3 DB-Variablen.
Ich hab halt zum "Zeigen" noch eine Ausgangsstruct genutzt, das muß nicht sein, wenn man die Daten intern nutzt, z.Bsp. mit einer Temp.

Für SCL geht auch der Vorschlag von Hucke, aber dann läuft man durch einer Schleife mit 352 Wiederholungen, in meinem Baustein sind es nur 11.


Ah, jetzt habe ich das verstanden! Sorry! Werde mich Montag weiter damit beschäftigen und mich dann nochmal melden!

Danke auf jeden Fall schon mal für Deine / Eure Hilfe.

Gruß Hausen
 
Ungetestet, in etwa so:

Code:
FUNCTION "ONKEL" : VOID
TITLE =
AUTHOR : ONKEL
VERSION : 0.1

VAR_INPUT
  IN_Freigabe : BOOL ; //Freigabe / release
  IN_Stoermeldungen : ANY ; //Störmeldewort / disturbance word
  IN_Konfiguration : ANY ; //Störmeldekonfiguration / configuration disturbances
END_VAR

VAR_OUTPUT
  OUT_Warnung : BOOL ; //Warnung / warning
  OUT_Alarm : BOOL ; //Alarm / disturbance
  ERROR : INT ; //0-kein Fehler, ....
END_VAR

VAR_TEMP
  AR1_TEMP : DWORD ; 
  TEMP_INT : WORD ; 
  LOOP : INT ; 
END_VAR

BEGIN
NETWORK
TITLE =
      NOP   0; 

//*** Ergebnisse initialisieren
      L     B#16#0; 
      T     #ERROR; 
      CLR   ; 
      =     #OUT_Warnung; 
      =     #OUT_Alarm; 

//*** Freigabe
      UN  IN_Freigabe;
      BEB ;

//*** AR1 sichern
      TAR1  #AR1_TEMP; 
      SET   ; 
      SAVE  ; 

//*** AR2 auf Stoermeldungen
      L     P##IN_Stoermeldungen; 
      LAR2  ; 

//*** AR1 auf Konfiguration
      L     P##IN_Konfiguration; 
      LAR1  ; 

//*** Prüfe, ob IN_Stoermeldungen vom Typ=Byte
      L     W [AR2,P#0.0]; // Typ 
      L     W#16#1002; 
      ==I   ; 
      L     1; // Fehler 1: IN_Stoermeldungen nicht vom Typ Byte
      SPBN  ERR; 

//*** Prüfe, ob IN_Konfiguration vom Typ=Byte
      L     W [AR1,P#0.0]; // Typ 
      L     W#16#1002; 
      ==I   ; 
      L     2; // Fehler 2: IN_Konfiguration nicht vom Typ Byte
      SPBN  ERR; 

//*** Prüfe, ob Datenbereiche gleich groß
      L     W [AR2,P#2.0]; // Anzahl Typ in IN_Stoermeldungen
      L     W [AR1,P#2.0]; // Anzahl Typ in IN_Konfiguration
      T     #LOOP; // Schleifenzähler initialisieren
      ==I   ; 
      L     3; // Fehler 3: Bereiche unterschiedlich groß
      SPBN  ERR; 

//*** DB's öffnen und Adressregister auf Bereichszeiger
      L     W [AR2,P#4.0]; 
      T     #TEMP_INT; 
      AUF   DB [#TEMP_INT]; 
      L     D [AR2,P#6.0]; 
      LAR2  ; // Stoermeldungen
      L     W [AR1,P#4.0]; 
      T     #TEMP_INT; 
      AUF   DI [#TEMP_INT]; 
      L     D [AR1,P#6.0]; 
      LAR1  ; // Konfiguration

//*** Schleife zur Auswertung
      L     #LOOP; 
LOOP: T     #LOOP; 
      L     B#16#0; 
      L     DBB [AR2,P#0.0]; // Stoermeldungen
      <>I   ; 
      S     #OUT_Warnung; // mind. einen Eintrag gefunden (Warnung)
      L     DIB [AR1,P#0.0]; // Konfiguration
      UW    ; 
      L     B#16#0; 
      <>I   ; 
      S     #OUT_Alarm; // mind. einen konfigurierten Eintrag gefunden (Störung)
      +AR1  P#1.0; // Pointer erhöhen
      +AR2  P#1.0; // Pointer erhöhen
      L     #LOOP; 
      LOOP  LOOP; 

//*** AR1-Register wiederherstellen
      LAR1  #AR1_TEMP; 
      BEA   ; 

//*** Fehler
ERR:  T     #ERROR; 

//*** AR1-Register wiederherstellen
      LAR1  #AR1_TEMP; 
      BE    ; 

END_FUNCTION

Man beachte auch die Bausteingröße (im Vergleich zu der deinigen)!
236/51598=0,00457382069072444668397999922478


Gruß, Onkel
 
Zuletzt bearbeitet:
Hallo Onkel,

ich habe den Baustein mal ausprobiert. Der Ausgang Warnung funktioniert, jedoch der Ausgang Alarm
wird nicht gesetzt. So wie ich das sehe wird das AR1 nicht richtig ausgelesen. Kann das sein?

Habe mal einen Screenshot gemacht. Vielleicht kannst Du Dir das nochmal anschauen?

Gruß Hausen
 

Anhänge

  • Störkonfig (Onkel).jpg
    Störkonfig (Onkel).jpg
    113,6 KB · Aufrufe: 27
Das war ein typischer Fehler von mir.
Ändere die folgenden zwei Zeilen wie folgt. Habe es oben schon korrigiert.

Code:
      L     [U][B][COLOR=#ff0000]DB[/COLOR][/B][/U]B [AR2,P#0.0]; // Stoermeldungen
      ...
      L     [COLOR=#ff0000][U][B]DI[/B][/U][/COLOR]B [AR1,P#0.0]; // Konfiguration
 
Zurück
Oben