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

Seite 3 von 5 ErsteErste 12345 LetzteLetzte
Ergebnis 21 bis 30 von 47

Thema: Array in DB suchen

  1. #21
    Registriert seit
    23.04.2009
    Ort
    Allgäu
    Beiträge
    3.042
    Danke
    241
    Erhielt 863 Danke für 617 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Tigerente1974 Beitrag anzeigen
    Ich fürchte ich habe immer noch nicht verstanden, was das Ziel ist.
    Vielleicht kannst Du den Anwendungsfall dazu erläutern.
    Geht mir auch so, ein Array entsteht ja nicht einfach so, sonder es wird von irgendeinem eingegeben.
    Somit wäre es eine automatische Suche von einer manuellen Eingabe, macht so etwas Sinn?
    Wenn du das Programm durchsuchen willst, mach aus allen Bausteinen eine Quelle und dann einfach nach dem Text "Array" suchen (STRG+F)
    Gruß
    Paule
    ----------------------------------------------------------------------------
    > manchmal verliert man und manchmal gewinnen die anderen <

  2. #22
    Limette ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.10.2010
    Beiträge
    239
    Danke
    107
    Erhielt 2 Danke für 2 Beiträge

    Standard

    ..ach menno. ich probiers nochmal ...

    es sollte einfach eine funktion von einem größeren programm werden. so ein art datenbank suche. ein array "xyz" steht an und es soll überprüft werden ob es das array "xyz" schon in dem db gibt oder nicht. thats it.

  3. #23
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    das heißt, die arrays kommen a) alle von aussen und werden b) mit einer eindeutigen kennung versehen?
    dann bau dir ein array-verzeichnis, in dem du die einzelnen eindeutigen kennungen der arrays einträgst bzw. löschst.

    dieses verzeichnis kannst du dann mit einer schleife, wie oben erwähnt, ganz einfach nach der eindeutigen kennung des vermeintlich neuen arrays durchsuchen.
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  4. Folgender Benutzer sagt Danke zu vierlagig für den nützlichen Beitrag:

    Limette (19.01.2012)

  5. #24
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard

    ... ich würde es auch so in etwa machen, wie von 4L schon beschrieben ... wobei dieser Vorschlag natürlich noch immer sehr wage bleiben muss, da die Problem-/Aufgabenstellung ja immer noch nicht vernünftig (verständlich) beschrieben ist.

    Allerdings - falls die Aufgabenstellung sein sollte : durchsuche ein Array [1..100] of Array [1..6] of Byte nach einer Sequenz, die dem Baustein selbst als Array[1..6] of Byte vorgegeben worden ist, dann kann man das dann in SCL sehr schön lösen in dem man den Datenbereich, der zu durchsuchen ist über SCL selbst verwaltet (idealerweise sogar schon in der Instanz des Such-FB's hat).

    Gruß
    Larry

  6. #25
    Limette ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.10.2010
    Beiträge
    239
    Danke
    107
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    ... ich würde es auch so in etwa machen, wie von 4L schon beschrieben ... wobei dieser Vorschlag natürlich noch immer sehr wage bleiben muss, da die Problem-/Aufgabenstellung ja immer noch nicht vernünftig (verständlich) beschrieben ist.

    Allerdings - falls die Aufgabenstellung sein sollte : durchsuche ein Array [1..100] of Array [1..6] of Byte nach einer Sequenz, die dem Baustein selbst als Array[1..6] of Byte vorgegeben worden ist, dann kann man das dann in SCL sehr schön lösen in dem man den Datenbereich, der zu durchsuchen ist über SCL selbst verwaltet (idealerweise sogar schon in der Instanz des Such-FB's hat).

    Gruß
    Larry
    Code:
    FUNCTION FC1 : VOID
    VAR_INPUT
        ToCheckARRAY: ARRAY[0..31] OF BYTE;
        
    END_VAR
    VAR_OUTPUT
        Found : BOOL;
        END_VAR
    VAR_TEMP
        i : INT;
    END_VAR
    BEGIN
        
        
         FOR  i:= 1 TO 100 DO 
          IF DB1.Struktur[i].Array = ToCheckArray THEN
           Found := True;
           EXIT;
          ELSE
           Found := false;      
          END_IF;
         END_FOR;
        
        
    END_FUNCTION
    Ich denke wir reden jetzt vom gleichen. meine "lösung" scheitert an "ToCheckArray", ein unzulässiger Operantentyp.
    Kann es so grundsätzlich gehen ? der db1 hat ja nun die entsprechende Struktur.

  7. #26
    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 nutze u.a. DB zur Artikelverwaltung. Jeder Artikel hat z.Bsp. 300 Byte für Daten, am Anfang steht ein String[30] mit dem Artikelnamen. In SCL habe ich eine Funktion, die mehrere DB nach einem bestimmten Artikelnamen durchsuchen kann, wichtig ist nur, dass die DB regelmäßig aufgebaut sind, also die Position der Artikelnamen berechenbar ist. Der Rest ist rel. einfacher Stringvergleich.

    Code:
    FUNCTION FC249 : INT
    
    
    Title = 'Artikel'
    //
    // Zuordnung der Artikelnummer an Hand eines Namens aus DB suchen
    // die Daten der erste Fundstelle werden ausgegeben 
    //
    Version : '1.0'
    author  : ralle
    name    : Artikel
    family  : SYSTEM
    
    
    VAR_INPUT
      // Eingangsparameter
      Artikelname: STRING[30];          //gesuchter Artikelname
      Start_DB_Nummer: INT;             //Beginn der Suche bei DB
      Anzahl_DB: INT;                   //Anzahl der zu durchsuchenden DB
    END_VAR
    
    
    VAR_OUTPUT // Ausgangsparameter
      Artikelnummer: INT;               //Artiklenummer gesamt
      DB_Nummer:   INT;                 //DB-Nummer, in dem der Artikel zu finden ist 
      Artikelnummer_im_DB: INT;         //Artikelnummer im DB
      gefunden: BOOL;                   //Artikel wurde gefunden
    END_VAR
    
    
    VAR_IN_OUT // Durchgangsparameter
      Start: Bool;
    END_VAR
    
    
    VAR_TEMP
        // temporäre Variablen
      I, J, K: INT;
      EQ: BOOL;
      DoExit: BOOL;
      Temp_String1: STRING[30];
      atTemp_String1 AT Temp_String1: ARRAY[0..31] OF BYTE;
      Temp_String2: STRING[30];
      atTemp_String2 AT Temp_String2: ARRAY[0..31] OF BYTE;
      Quell_DB, Quell_DW: INT;  
    END_VAR
    
    
    // Anweisungsteil
    
    
    IF Start THEN
        //Anfangswerte setzen
        FC249 := 0;
        EQ := False;
        Artikelnummer := 0;
        DB_Nummer := 0;
        Artikelnummer_im_DB := 0;
        gefunden := False;
        Temp_String1 := Artikelname;
        Temp_String2 := Artikelname;
        DoExit := False;
    
    
        //Über alle Artikel-DB
        FOR J := 0 TO Anzahl_DB - 1 DO
            
            //je DB 50 Artikel
            FOR I := 0 TO 49 DO
                Quell_DB := Start_DB_Nummer + J;
                Quell_DW := (300 * I) + 366;
            
                //Umkopieren des Artikelnamens aus dem Artikel-DB in den Temp_String2; byteweise mit Kopf
                FOR K := 0 TO 31 DO
                    atTemp_String2[K] := WORD_TO_BLOCK_DB(INT_TO_WORD(Quell_DB)).DB[Quell_DW + K];
    //                DB10.Temp_String2[K] := atTemp_String2[K];  //nur zum Beobachten im DB10, sonst abschalten!!!!!
                END_FOR;    
    
    
                //Länge des gefundenen Strings mit Länge des Suchstrings gleichsetzen,
                //dadurch werden auch Teilstrings gefunden, das erste Vorkommen wird dann ausgegeben
                atTemp_String2[1] := atTemp_String1[1];
                    
                //Stringvergleich    
                EQ := EQ_STRNG(S1 := Temp_String1
                              ,S2 := Temp_String2 
                              );
                              
                //wenn Stringvergleich ok, dann Werte schreiben und Ende der gesamten Funktion über Exit    
                IF EQ THEN
                    Artikelnummer_im_DB := I + 1;
                    DB_Nummer := Quell_DB;
                    Artikelnummer := (J * 50) + Artikelnummer_im_DB;
                    gefunden := True;
                    FC249 := Artikelnummer;
                    Start := False;
                    DoExit := True;
                    EXIT;
                END_IF; 
            END_FOR;
            IF DoExit THEN
                EXIT;
            END_IF; 
        END_FOR; 
        Start := False;   
        DoExit := False;
     END_IF;
     
    END_FUNCTION
    Die Funktion ist natürlich extrem Zykluszeitfressend, wenn man ausgerechnet den letzten Artikel findet, aber da ich diese Suche nur einmalig, bei nicht laufender Automatik (Produktwechsel) durchführe, ist das in diesem Fall zweitrangig. Man kann das natürlich optimieren, indem man die For-Schleife aus mehrere Zyklen verteilt.
    EQ_STRNG ist aus der Siemens-Standard-Library. Den Code hab ich gestern erst geschrieben, er ist also erst einmal nur schnell getestet und verläßt sich darauf, dass die DB auch vorhanden und lang genug angelegt sind!
    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

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

    Limette (19.01.2012)

  9. #27
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard

    Zitat Zitat von Limette Beitrag anzeigen
    Ich denke wir reden jetzt vom gleichen. meine "lösung" scheitert an "ToCheckArray", ein unzulässiger Operantentyp.
    Kann es so grundsätzlich gehen ? der db1 hat ja nun die entsprechende Struktur.
    Schön, wenn wir die Sache nun auf dem Punkt haben ...

    Hast du im DB1 das "Array" in "DB1.Struktur[i]" auch als ARRAY[0..31] of Byte angelegt ?
    Wenn ja, dann hol dir diese IN-Variable, da du ja einen FC erstellst, erstmal in eine interne TEMP-Variable gleichen Typs und Größe und vergeiche dann mit der.

    Falls du aber "im wirklichen Leben" eigentlich an dieser Stelle mit einer Zeichenkette arbeitest, so würde ich dir raten, es als String umzusetzen, da du dann insgesamt bessere Möglichkeiten hast (vorgefertigte FC's) - siehe Beispiel von Ralle.

    Gruß
    Larry

  10. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    Limette (19.01.2012)

  11. #28
    Limette ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.10.2010
    Beiträge
    239
    Danke
    107
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    Schön, wenn wir die Sache nun auf dem Punkt haben ...

    Hast du im DB1 das "Array" in "DB1.Struktur[i]" auch als ARRAY[0..31] of Byte angelegt ?
    Wenn ja, dann hol dir diese IN-Variable, da du ja einen FC erstellst, erstmal in eine interne TEMP-Variable gleichen Typs und Größe und vergeiche dann mit der.

    Falls du aber "im wirklichen Leben" eigentlich an dieser Stelle mit einer Zeichenkette arbeitest, so würde ich dir raten, es als String umzusetzen, da du dann insgesamt bessere Möglichkeiten hast (vorgefertigte FC's) - siehe Beispiel von Ralle.

    Gruß
    Larry

    genau das array im array of struck ist ein 32byte array. Momentan arbeite ich gerade an beiden lösungen, mal sehen welche zuerst klappt.

    Code:
    FUNCTION FC1 : VOID
    
    VAR_INPUT
        ToCheckArray: ARRAY[0..31] OF BYTE;
        ToSearchDB: BLOCK_DB;
    END_VAR
    
    VAR_OUTPUT
        Gefunden : BOOL;
        DBNumber : INT;
    END_VAR
    
    VAR_TEMP
        i : INT;
        temparray: ARRAY[0..31] OF BYTE;
    END_VAR
    
    BEGIN
    temparray := ToCheckArray;
        
        
         FOR  i:= 1 TO 10 DO 
          IF   DB1.Struckt[i].Array=temparray 
          THEN    
          Gefunden := True;
          EXIT;
        ELSE 
            Gefunden := false;      
          END_IF;
         END_FOR;
        
        
    END_FUNCTION
    habe das array zuerst auf ein temparray gelegt. leider mag er den rot makierten ausdruck immer noch nicht. (Operantenfehler)

  12. #29
    Registriert seit
    23.04.2009
    Ort
    Allgäu
    Beiträge
    3.042
    Danke
    241
    Erhielt 863 Danke für 617 Beiträge

    Standard

    Du schreibst doch gar nichts auf das "temparray"
    Gruß
    Paule
    ----------------------------------------------------------------------------
    > manchmal verliert man und manchmal gewinnen die anderen <

  13. #30
    Limette ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.10.2010
    Beiträge
    239
    Danke
    107
    Erhielt 2 Danke für 2 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Paule Beitrag anzeigen
    Du schreibst doch gar nichts auf das "temparray"

    ich dachte hier:
    Code:
    BEGIN
    temparray := ToCheckArray;

Ähnliche Themen

  1. Antworten: 18
    Letzter Beitrag: 21.12.2016, 17:03
  2. FB' in FB's suchen
    Von Poldi007 im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 19.08.2009, 07:30
  3. Suchen Elektroingenieur
    Von WEKO im Forum Suche - Biete
    Antworten: 4
    Letzter Beitrag: 20.09.2007, 08:05
  4. Bool-Array in Byte-Array
    Von Techniker im Forum Sonstige Steuerungen
    Antworten: 10
    Letzter Beitrag: 13.01.2006, 19:12
  5. Perepherie suchen in S5
    Von Anonymous im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 22.03.2005, 15:02

Lesezeichen

Berechtigungen

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