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

Seite 2 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 11 bis 20 von 38

Thema: Bitmusterüberprüfung mittels Schleife in AWL

  1. #11
    Registriert seit
    03.02.2015
    Ort
    Hatten
    Beiträge
    183
    Danke
    16
    Erhielt 32 Danke für 29 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Rune17,

    ich glaube, es geht nicht ums "nicht helfen wollen"... es hat einige Ansätze in den Antworten gegeben. Nur aus allen Antworten ist ersichtlich, daß das niemand in der SPS machen würde und Dir davon abrät.

    Wenn Du es aber unbedingt machen willst, würde ich mir, da es nur einmal passieren soll, keine großen Gedanken machen und so implementieren, wie es für Dich am schnellsten geht.
    Ich würde in dem Falle die Prüfung von einem unkritischen Anlagezustand abhängig machen und die Zykluszeitüberwachung außer Kraft setzen (z. B. vielleicht mit DIS_IRT), so kann der Vergleich auch gut und gerne mal ein paar Sekunden dauern.

    Gruß
    JS

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

    Standard

    Zitat Zitat von JSEngineering Beitrag anzeigen
    Hallo Rune17,

    ich glaube, es geht nicht ums "nicht helfen wollen"... es hat einige Ansätze in den Antworten gegeben. Nur aus allen Antworten ist ersichtlich, daß das niemand in der SPS machen würde und Dir davon abrät.
    Also ich würde das mit der SPS machen, warum nicht?
    Wenn es für einen Zyklus zu viel wird, teilt man es eben auf.
    Aber die Aufgabe ist komplex, den meisten fehlt wohl eher die Zeit, sich da komplett reinzudenken und mal eben Code zu schreiben. Da gibt es dann eher nur Anregungen.

    @Rune17

    Wenn ihr die Nummern mit Hand eingebt, dann würde ich gar keine Prüfung "Jeder gegen Jeden" machen, sondern automatisch immer den gerade eingegebenen Code gegen alle anderen im DB prüfen.
    Das wäre viel weniger und stellt ebenfalls sicher, dass niemals ein Duplikat im Datenbaustein landet.
    Geändert von Ralle (24.04.2015 um 10:03 Uhr) Grund: Rechtschreibung
    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. #13
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.718
    Danke
    398
    Erhielt 2.400 Danke für 2.000 Beiträge

    Standard

    Hallo,
    ich würde mich mal auf deinen geposteten Code beziehen wollen.
    Wenn du mit Pointern arbeitest dann solltest du dir IMMER vor Augen halten, dass das Doppelworte (gerade im Hinblick auf das Multiplikations-Ergebnis und den Integer-Grenzen) sind. Deshalb in deinem Code 2 Stellen, die ich gesehen habe, die du korrigieren solltest :
    Code:
    MX10: L     #Index_VBasis               // Anfangswert laden in AR1
          L     1274                                   // Startadresse ersten der 10 Byte
          *D    
          SLD   3
          LAR1  
     
    // --- die Passagen dazwischen habe ich mal herausgelassen ...
    
     MX20: L     #Index_VWert                // 2.Wert laden in AR1
          L     1284                        // Startadresse der zweiten 10 Byte
          *D    
          SLD   3
          LAR1
    Gruß
    Larry
    Geändert von Larry Laffer (24.04.2015 um 09:37 Uhr)

  4. #14
    Registriert seit
    30.10.2009
    Ort
    10 km vom Herzen der Natur
    Beiträge
    1.626
    Danke
    120
    Erhielt 340 Danke für 255 Beiträge

    Standard

    Eventuell könnte man zu jedem Datensatz eine Art Prüfsumme erstellen. Dann könnte man das ganze abkürzen, indem man nur solche Datensätze genauer prüft, die die gleiche Prüfsumme haben.
    Gruß
    Michael

  5. #15
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.186
    Danke
    923
    Erhielt 3.291 Danke für 2.660 Beiträge

    Standard

    Zitat Zitat von Rune17 Beitrag anzeigen
    Aber anscheinend möchte mir ja keiner helfen.
    [...]
    Ich hoffe ich habe nun genug erklärt.
    Für weitere Hilfe wäre ich sehr dankbar!
    Wie wäre es, wenn DU uns mal ein bisschen hilfst und die Frage beantwortest, auf welcher CPU Dein Programm laufen soll und wie lange die Prüfung dauern darf/wieviel Zeit sich die CPU nehmen darf? Vielleicht ist das ja so eine Rennmaschine, daß die auch den allerdümmsten Algorithmus in 10ms erledigt? (und solche sinnfreien Vorschläge ala Zykluszeit-Überschreitung unnötig macht)


    Zitat Zitat von Rune17 Beitrag anzeigen
    Dies soll nur eine Prüfung sein wenn jemand 2 gleiche Bitmuster einträgt im DB.
    Tja dann prüfe doch auch nur dann, WENN jemand gleiche Bitmuster einträgt.
    Problem: Woher weiß man vor der Prüfung, ob da jetzt ein gleiches Bitmuster eingetragen wurde

    Vielleicht überdenkst Du nochmal Deine Aufgabenstellung und Deinen Lösungsansatz?


    Zitat Zitat von Rune17 Beitrag anzeigen
    die Bitmuster werden von Hand eingetragen.
    es soll nur einmal eine Überprüfung statt finden ob 2 bitmuster sich gleichen, wenn ja meldung absetzen und prüfung beenden.
    Wenn die Prüfung bei der Eingabe jedes Wertes stattfindet, dann muß der neue Wert nur mit jedem bisher vorhandenen Wert verglichen werden. Ein Vergleichen aller Werte untereinander ist unnötig.

    Ein weiterer Ansatz ist, die Werte zu sortieren, was aber auch wieder nur Sinn macht, wenn bereits beim Eintragen sortiert eingetragen wird. Dann braucht man auch nur höchstens 64 (oder gar nur ca. 8) Vergleiche statt über 2000. Jeder Versuch, nachträglich zu sortieren, hat den gleichen Aufwand wie jeden-gegen-jeden-vergleichen.

    Wie geschickt die Vergleicherei vorzeitig abgebrochen wird spielt eigentlich keine Rolle. Du mußt auf jeden Fall damit rechnen, daß im ungünstigen "guten" Fall die Schleifen maximal durchlaufen werden und die maximale Suchzeit benötigt wird, bis feststeht, daß kein gleicher Wert vorhanden ist.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  6. #16
    Registriert seit
    20.01.2009
    Beiträge
    190
    Danke
    32
    Erhielt 15 Danke für 14 Beiträge

    Standard

    In der StandardLibrary/TI-S7ConvertingBlocks gibt es Tabellenfunktionen.
    Da kann man auch nach Werten suchen.

    Ansonsten würde ich die Liste sortieren.
    Entweder gleich beim Sortieren auf gleiche Werte überprüfen.
    Oder nach dem Sortieren.
    Da muss nur noch jeder Wert mit dem Vorgänger/Nachfolger verglichen werden.


    Zitat Zitat von Rune17 Beitrag anzeigen
    … nicht in SCL (bei uns nicht zugelassen)
    ???


    Zitat Zitat von Rune17 Beitrag anzeigen
    Excel bei uns nicht erlaubt
    Excel nicht erlaubt, oder generell kein Office erlaubt, auch kein anderes Tabellenprogramm (OpenOffice) ?
    Mit was arbeitet Ihr denn?

  7. #17
    Rune17 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    21.04.2015
    Beiträge
    11
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo Hub,
    danke mal für deine Antwort. Du sagt was von Standard Tabellenfunktionen in S7. Was für ein FC ist das??

    Excel ist schon erlaubt bei uns. Die Bitmuster sollen nur geprüft werden wenn ich es anstoße über ein Template geht das.
    Die erste Adresse ist ab 1274 die nächste ab 1284 usw. Bitmuster sind ja sortiert und liegen immer 10 Byte auseinander, bzw. lang.
    Beispiel hier vom DB:

    Hier der DB dazu erste Adresse zum Prüfen ist ab DBX 1274.0 bis DBX1277.7
    2. Adresse geht los ab DBX 1284.0 bis 1287.7 ( Bereich immer gleich 64 mal).

    Typ[1].Typ_Variante[1] CHAR ' ' 'S' !* z.B. "X156, S176, N242, T246"
    Typ[1].Typ_Variante[2] CHAR ' ' '1'
    Typ[1].Typ_Variante[3] CHAR ' ' '7'
    Typ[1].Typ_Variante[4] CHAR ' ' '6'
    Typ[1].Typnummer INT 0 18 *! Typnummer 1 bis 255
    Startadresse1: DBX 1274.0
    Typ[1].Vorwahl_Bit_01 BOOL FALSE TRUE !* Bit Vorwahl 0 oder 1
    Typ[1].Vorwahl_Bit_02 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[1].Vorwahl_Bit_03 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[1].Vorwahl_Bit_04 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[1].Vorwahl_Bit_05 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[1].Vorwahl_Bit_06 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[1].Vorwahl_Bit_07 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[1].Vorwahl_Bit_08 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[1].Vorwahl_Bit_09 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[1].Vorwahl_Bit_10 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[1].Vorwahl_Bit_11 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[1].Vorwahl_Bit_12 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[1].Vorwahl_Bit_13 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[1].Vorwahl_Bit_14 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[1].Vorwahl_Bit_15 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[1].Vorwahl_Bit_16 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[1].Vorwahl_Bit_17 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[1].Vorwahl_Bit_18 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[1].Vorwahl_Bit_19 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[1].Vorwahl_Bit_20 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[1].Vorwahl_Bit_21 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[1].Vorwahl_Bit_22 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[1].Vorwahl_Bit_23 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[1].Vorwahl_Bit_24 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[1].Vorwahl_Bit_25 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[1].Vorwahl_Bit_26 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[1].Vorwahl_Bit_27 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[1].Vorwahl_Bit_28 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[1].Vorwahl_Bit_29 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[1].Vorwahl_Bit_30 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[1].Vorwahl_Bit_31 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[1].Vorwahl_Bit_32 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Endadresse1: DBX1277.7
    Typ[2].Typ_Variante[1] CHAR ' ' 'T' !* z.B. "X156, S176, N242, T246"
    Typ[2].Typ_Variante[2] CHAR ' ' '2'
    Typ[2].Typ_Variante[3] CHAR ' ' '4'
    Typ[2].Typ_Variante[4] CHAR ' ' '6'
    Typ[2].Typnummer INT 0 17 *! Typnummer 1 bis 255
    Startadresse2: DBX 1284.0
    Typ[2].Vorwahl_Bit_01 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[2].Vorwahl_Bit_02 BOOL FALSE TRUE !* Bit Vorwahl 0 oder 1
    Typ[2].Vorwahl_Bit_03 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[2].Vorwahl_Bit_04 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[2].Vorwahl_Bit_05 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[2].Vorwahl_Bit_06 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[2].Vorwahl_Bit_07 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[2].Vorwahl_Bit_08 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[2].Vorwahl_Bit_09 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[2].Vorwahl_Bit_10 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[2].Vorwahl_Bit_11 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[2].Vorwahl_Bit_12 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[2].Vorwahl_Bit_13 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[2].Vorwahl_Bit_14 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[2].Vorwahl_Bit_15 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[2].Vorwahl_Bit_16 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[2].Vorwahl_Bit_17 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[2].Vorwahl_Bit_18 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[2].Vorwahl_Bit_19 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[2].Vorwahl_Bit_20 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[2].Vorwahl_Bit_21 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[2].Vorwahl_Bit_22 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[2].Vorwahl_Bit_23 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[2].Vorwahl_Bit_24 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[2].Vorwahl_Bit_25 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[2].Vorwahl_Bit_26 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[2].Vorwahl_Bit_27 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[2].Vorwahl_Bit_28 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[2].Vorwahl_Bit_29 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[2].Vorwahl_Bit_30 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[2].Vorwahl_Bit_31 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Typ[2].Vorwahl_Bit_32 BOOL FALSE FALSE !* Bit Vorwahl 0 oder 1
    Endadresse2: DBX1287.7

    Usw…. 64 mal gleich aufgebaut!!!!


    Wie müsste das Programm jetzt aussehen bei einer Prüfung der 64 Bitmuster gegeneinander??
    Wenn eine Gleichheit gefunden wird, soll eine Meldung abgesetzt werden und das Programm den Vergleich verlassen und weiter arbeiten.
    Mir geht es hauptsächlich um das richtige laden der Inhalte im DB , mit SLD3 usw, AR1,usw.
    da hab ich weniger Erfahrung.
    Danke und Gruß Rune

  8. #18
    Registriert seit
    20.01.2009
    Beiträge
    190
    Danke
    32
    Erhielt 15 Danke für 14 Beiträge

    Standard

    Es ist die Funktion FC86 (TBL_FIND).

    Dein Begriff „Bitmuster“ hat mich erst etwas verwirrt.
    Ich dachte, dein Bitmuster sind die Bits Bit_01 - Bit_32 (4Bytes/1Doppelwort).
    Jetzt hab ich dein 10Byte-"Bitmuster" verstanden.
    4 Byte Char, 2 Byte INT und 4 Byte Bits

    Da kannst du die FC86 vergessen.

    Sicherlich kann man für dein Problem eine AWL-Routine erstellen. Frage ist, ob sich einer dafür die Zeit nimmt.

    Optional könnt ich mir folgende Alternativen vorstellen:

    1. Der Anstoss zur Prüfung kommt von einem Template. Von einer Visualisierung?
    Wenn ja, würde ich die Prüfung dort erledigen. z. B. mit VB.

    2. Wenn es unbedingt in der SPS erfolgen muss, würde ich einen Baustein erstellen, bzw. erstellen lassen, der in KOP/FUB/AWL aufgerufen werden kann. Der Baustein kann dabei in SCL geschrieben sein, weil dies bei dieser Aufgabe die bessere Sprache ist. Ist im Prinzip vergleichbar mit den geschützten Standard-Bausteinen.

  9. #19
    Rune17 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    21.04.2015
    Beiträge
    11
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hi Hub, gut wenn du es soweit verstanden hast, aber zu prüfen sind jeweils nur die 4 Byte Bits n nix anderes!
    Die anderen Sachen interesieren nicht. Also ab 1274.0 bis 1277.7 ist der erste block dann 1284.0 bis 1287.7 usw..... 64 mal.
    Hast du eine Idee.
    SCL darf ich nicht schreiben, ist bei uns nicht erlaubt: Nur Step7 AWL,KOP FUP.
    Gruß Rune

  10. #20
    Registriert seit
    03.02.2015
    Ort
    Hatten
    Beiträge
    183
    Danke
    16
    Erhielt 32 Danke für 29 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Das hört sich ja schon anders an, als im ersten Post. Es müssen also nicht 10 Byte, sondern 4 Byte ( = 1 Doppelwort) geprüft werden.
    Da kannst Du doch einfach die Doppelwörter vergleichen (==D in AWL) und brauchst nicht jedes einzelne Bit prüfen.
    L DBD1274
    L DBD1284
    ==D

Ähnliche Themen

  1. Step 7 AWL - Schleife mit Array
    Von bo1986 im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 19.06.2013, 12:57
  2. Antworten: 4
    Letzter Beitrag: 17.11.2011, 10:38
  3. awl schleife und pointer
    Von Iserlohner im Forum Simatic
    Antworten: 28
    Letzter Beitrag: 18.02.2011, 09:12
  4. IF oder FOR Schleife in AWL?
    Von motamas im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 21.07.2010, 14:19
  5. AWL Schleife
    Von Anonymous im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 31.07.2003, 07:05

Lesezeichen

Berechtigungen

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