Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Zwei Strukturen [Bool] vergleichen

  1. #1
    Registriert seit
    10.06.2010
    Beiträge
    65
    Danke
    9
    Erhielt 3 Danke für 3 Beiträge

    Standard


    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
    Angehängte Grafiken Angehängte Grafiken
    Zitieren Zitieren Zwei Strukturen [Bool] vergleichen  

  2. #2
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    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.
    Angehängte Dateien Angehängte Dateien
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  3. Folgender Benutzer sagt Danke zu Ralle für den nützlichen Beitrag:

    Hausen (21.01.2014)

  4. #3
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.717
    Danke
    443
    Erhielt 919 Danke für 740 Beiträge

    Standard

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

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

    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.

  5. #4
    Hausen ist offline Benutzer
    Themenstarter
    Registriert seit
    10.06.2010
    Beiträge
    65
    Danke
    9
    Erhielt 3 Danke für 3 Beiträge

    Standard

    Hallo Ralle, Hallo Hucki,

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


    Zitat Zitat von hucki Beitrag anzeigen
    Für mich zum Lernen bzw. Verständnis des Hintergrunds:

    Wenn das nur BOOLs sind, warum verwendest Du dann kein ARRAY statt des STRUCTs?
    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
    Angehängte Dateien Angehängte Dateien

  6. #5
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    Zitat Zitat von Hausen Beitrag anzeigen
    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.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  7. #6
    Registriert seit
    17.07.2009
    Ort
    Am Rande der Ostalb
    Beiträge
    5.480
    Danke
    1.141
    Erhielt 1.242 Danke für 973 Beiträge

    Standard

    Zitat Zitat von hucki Beitrag anzeigen
    Wenn das nur BOOLs sind, warum verwendest Du dann kein ARRAY statt des STRUCTs?

    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

  8. #7
    Hausen ist offline Benutzer
    Themenstarter
    Registriert seit
    10.06.2010
    Beiträge
    65
    Danke
    9
    Erhielt 3 Danke für 3 Beiträge

    Standard

    Zitat Zitat von Ralle Beitrag anzeigen
    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

  9. #8
    Registriert seit
    06.10.2003
    Beiträge
    3.412
    Danke
    451
    Erhielt 506 Danke für 408 Beiträge

    Standard

    Zitat Zitat von hucki Beitrag anzeigen
    .. warum verwendest Du dann kein ARRAY statt des STRUCTs?..
    Ich würde die Datenbereiche als ANY übergeben. Damit ist man in der FC unabhängig von jeglichen Strukturen oder Datengrößen und die Nummern der DBs sind inclusive.
    Es gibt viel mehr Leute, die freiwillig aufgeben, als solche, die echt scheitern.
    Henry Ford

  10. #9
    Hausen ist offline Benutzer
    Themenstarter
    Registriert seit
    10.06.2010
    Beiträge
    65
    Danke
    9
    Erhielt 3 Danke für 3 Beiträge

    Standard

    Zitat Zitat von Onkel Dagobert Beitrag anzeigen
    Ich würde die Datenbereiche als ANY übergeben. Damit ist man in der FC unabhängig von jeglichen Strukturen oder Datengrößen und die Nummern der DBs sind inclusive.
    Wie würde denn dann die Funktion in dem FC denn dann aussehen?

    Gruß Hausen

  11. #10
    Registriert seit
    06.10.2003
    Beiträge
    3.412
    Danke
    451
    Erhielt 506 Danke für 408 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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
    Geändert von Onkel Dagobert (21.01.2014 um 16:29 Uhr) Grund: IN_Freigabe
    Es gibt viel mehr Leute, die freiwillig aufgeben, als solche, die echt scheitern.
    Henry Ford

  12. Folgender Benutzer sagt Danke zu Onkel Dagobert für den nützlichen Beitrag:

    Hausen (20.01.2014)

Ähnliche Themen

  1. Strukturen Vergleichen in denen Arrays vorkommen
    Von SteffenD im Forum CODESYS und IEC61131
    Antworten: 3
    Letzter Beitrag: 31.07.2013, 09:18
  2. TwinCAT V2.11: Vergleichen von Strukturen
    Von Chräshe im Forum CODESYS und IEC61131
    Antworten: 8
    Letzter Beitrag: 10.08.2011, 15:28
  3. Array of Bool auf 0 vergleichen
    Von Nordischerjung im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 02.07.2010, 09:25
  4. zwei DB´s direkt vergleichen
    Von Grimsey im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 07.12.2007, 15:21
  5. zwei DB-S vergleichen
    Von puehri im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 06.02.2006, 13:00

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •