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

Seite 5 von 7 ErsteErste ... 34567 LetzteLetzte
Ergebnis 41 bis 50 von 69

Thema: Zugriff auf einen UDT / Array mit Variablen?

  1. #41
    Registriert seit
    23.02.2008
    Beiträge
    45
    Danke
    11
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ja danke, jetzt läuft der Simulator, aber die beiden For-Schleifen werden jetzt
    nicht mehr bearbeitet
    REPEAT
    FOR index1 := 6 TO 0 BY -1 DO
    FOR index2 := 6 TO 0 BY -1 DO
    index3 := index3+1;
    sortierpuffer[index3]:= Matrizze[index1,index2];
    END_FOR;
    END_FOR;
    UNTIL index3>=49
    END_REPEAT;
    und die Matrizzenwerte bewegen sich nach kurzer Zeit so um die 50 bis 100 (Zufallszahl bei jedem Zyklus)
    aber müssten die durch die Vektorisierung nicht deutlich höher sein.

  2. #42
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.797
    Danke
    398
    Erhielt 2.418 Danke für 2.014 Beiträge

    Standard

    Ich denke schon, dass die "FOR..TO"-Schleifen bearbeitet werden ...

    Meinst du nicht, dass ich es mittlerweile verdient hätte, mal dein ganzes SCL-Script zu sehen ? Vielleicht hast du ja noch irgendwo eine nette kleien Gemeinheit versteckt ...

    Gruß
    LL

  3. #43
    Registriert seit
    23.02.2008
    Beiträge
    45
    Danke
    11
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo, die Forschleifen wurden nicht abgezählt,
    jetzt habe ich die erste Forschleife durch eine While-Schleife ersetzt
    jetzt geht der Simulator wieder un Stopp (Bereichslängenfehler)

    FUNCTION_BLOCK FB1
    var_input
    zahl : DINT;
    Takt,Sortieren,sort : BOOL;
    END_VAR
    VAR_TEMP
    shrhilf1: DWORD;
    shrhilf2: DWORD;
    index3 : INT;
    index4 : DINT;
    index5 : DINT;
    hilfs: DINT;
    tauschen:BOOL;
    puffer1,puffer2WORD;
    END_VAR
    VAR
    Matrizze : ARRAY[0..6,0..6] OF DINT;
    sortierpuffer : ARRAY[0..48]OF DINT;
    index1 : INT;
    index2 : INT;
    hilf: BOOL:=false ;
    flanke:BOOL:=false;
    END_VAR
    BEGIN
    IF Takt=true then
    IF hilf = false THEN
    hilf:= true;
    ELSE
    hilf:=false;
    END_IF;
    IF hilf = true THEN
    index1:=DINT_TO_INT(zahl);
    ELSE
    index2:=DINT_TO_INT(zahl);
    IF Matrizze[index1,index2] = 0 THEN
    index4:=INT_TO_DINT(index1);
    index5:=INT_TO_DINT(index2);
    shrhilf1:=DINT_TO_DWORD(index4);
    shrhilf2:=DINT_TO_DWORD(index5) ;
    Matrizze[index1,index2]:=DWORD_TO_DINT(SHR(in:=shrhilf1, N:=16)
    OR SHR(in:=shrhilf2, N:=24));
    END_IF;
    Matrizze[index1,index2]:=Matrizze[index1,index2] +1;
    index1:=index2;
    hilf:=true;
    END_IF;
    END_IF;
    IF Sortieren=true then
    index3:=49;
    index1:= 7;
    WHILE index1 >= 0 DO
    index1:=index1-1;
    FOR index2 := 6 TO 1 BY -1 DO
    index3 := index3-1;
    sortierpuffer[index3]:= Matrizze[index1,index2];
    END_FOR;
    END_WHILE;
    END_IF;
    IF sort=true THEN
    REPEAT
    tauschen:= false;
    FOR index3:=48 TO 1 BY -1 DO
    puffer1:=DINT_TO_DWORD(sortierpuffer[index3]);
    puffer2:=DINT_TO_DWORD(sortierpuffer[index3-1]);
    sortierpuffer[index3]:= DWORD_TO_DINT(puffer1 AND 16#0000FFFF);
    sortierpuffer[index3-1]:= DWORD_TO_DINT(puffer2 AND 16#0000FFFF);
    IF sortierpuffer[index3-1] > sortierpuffer[index3] THEN
    sortierpuffer[index3-1]:=DWORD_TO_DINT(puffer1);
    sortierpuffer[index3]:= DWORD_TO_DINT(puffer2);
    tauschen:= true;
    ELSE sortierpuffer[index3]:= DWORD_TO_DINT(puffer1);
    sortierpuffer[index3-1]:=DWORD_TO_DINT(puffer2);
    END_IF;
    END_FOR;
    UNTIL NOT tauschen
    END_REPEAT;
    END_IF;

    End_function_block

  4. #44
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.797
    Danke
    398
    Erhielt 2.418 Danke für 2.014 Beiträge

    Standard

    ... ich mußte ein bißchen suchen ... aber wieder der gleiche Fehler :
    Code:
    WHILE index1 >= 0 DO
    index1:=index1-1;
    FOR index2 := 6 TO 1 BY -1 DO 
    index3 := index3-1; 
    sortierpuffer[index3]:= Matrizze[index1,index2]; 
    END_FOR;
    END_WHILE;
    index1 kann kleiner als "0" werden ...
    Das ist in deinem ARRAY nicht definiert ...

    Ich würde hier aber auf jeden Fall bei Schleifen bleiben und die indexe nicht einfach nur inkrementieren oder dekrementieren, sondern ausrechnen :
    Code:
    Index3 := Index2 + Index1 * 7 ;
    Ist aber nur ein Vorschlag ...

    Gruß
    LL

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

    Wolflesch (06.05.2008)

  6. #45
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.269
    Danke
    537
    Erhielt 2.708 Danke für 1.957 Beiträge

    Standard

    Außerdem wären Einrückungen in deinem Code und Codetags hier im Forum nicht schlecht, das sieht dann so aus:

    Code:
    FUNCTION_BLOCK FB1
    
    var_input
      zahl: DINT;
      Takt,Sortieren,sort: BOOL;
    END_VAR
    
    VAR_TEMP
      shrhilf1: DWORD;
      shrhilf2: DWORD;
      index3: INT;
      index4: DINT;
      index5: DINT;
      hilfs: DINT;
      tauschen: BOOL;
      puffer1,puffer2: WORD;
    END_VAR
    
    VAR
      Matrizze: ARRAY[0..6,0..6] OF DINT;
      sortierpuffer: ARRAY[0..48]OF DINT;
      index1: INT;
      index2: INT;
      hilf: BOOL:=false ;
      flanke: BOOL:=false;
    END_VAR
    
    BEGIN
    
    IF Takt=true then
      IF hilf = false THEN
        hilf:= true;
      ELSE
        hilf:=false;
      END_IF;
      IF hilf = true THEN
        index1:=DINT_TO_INT(zahl);
      ELSE
        index2:=DINT_TO_INT(zahl);
        IF Matrizze[index1,index2] = 0 THEN
          index4:=INT_TO_DINT(index1);
          index5:=INT_TO_DINT(index2);
          shrhilf1:=DINT_TO_DWORD(index4); 
          shrhilf2:=DINT_TO_DWORD(index5) ;
          Matrizze[index1,index2]:=DWORD_TO_DINT(SHR(in:=shrhilf1, N:=16) OR SHR(in:=shrhilf2, N:=24));
        END_IF;
        Matrizze[index1,index2]:=Matrizze[index1,index2] + 1;
        index1:=index2;
        hilf:=true;
      END_IF;
    END_IF;
    
    IF Sortieren=true then
      index3:=49;
      index1:= 7;
      WHILE index1 >= 0 DO
        index1:=index1-1;
        FOR index2 := 6 TO 1 BY -1 DO
          index3 := index3-1;
          sortierpuffer[index3]:= Matrizze[index1,index2];
        END_FOR;
      END_WHILE;
    END_IF;
    
    IF sort=true THEN
      REPEAT
        tauschen:= false;
        FOR index3:=48 TO 1 BY -1 DO
          puffer1:=DINT_TO_DWORD(sortierpuffer[index3]);
          puffer2:=DINT_TO_DWORD(sortierpuffer[index3-1]);
          sortierpuffer[index3]:= DWORD_TO_DINT(puffer1 AND 16#0000FFFF);
          sortierpuffer[index3-1]:= DWORD_TO_DINT(puffer2 AND 16#0000FFFF);
          IF sortierpuffer[index3-1] > sortierpuffer[index3] THEN
            sortierpuffer[index3-1]:=DWORD_TO_DINT(puffer1);
            sortierpuffer[index3]:= DWORD_TO_DINT(puffer2);
            tauschen:= true;
          ELSE 
            sortierpuffer[index3]:= DWORD_TO_DINT(puffer1);
            sortierpuffer[index3-1]:=DWORD_TO_DINT(puffer2);
          END_IF;
        END_FOR;
      UNTIL NOT tauschen
      END_REPEAT;
    END_IF;
    
    End_function_block
    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. Folgender Benutzer sagt Danke zu Ralle für den nützlichen Beitrag:

    vierlagig (06.05.2008)

  8. #46
    Registriert seit
    23.02.2008
    Beiträge
    45
    Danke
    11
    Erhielt 0 Danke für 0 Beiträge

    Standard

    danke, ich wollte noch fragen wie man einen DB in der Variablentabelle beobachtet bei mir zeigt es immer nur ungültiger Operand an.
    Kann man einen ARRAY Wert auch auf ein MW oder AW legen.

  9. #47
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.797
    Danke
    398
    Erhielt 2.418 Danke für 2.014 Beiträge

    Standard

    DB beobachten geht genauso wie bei den anderen Variablen ...
    Du schreibst in das Variablen-Feld z.B. "DB100.DBW10" ... geht auch bei einem I-DB ...

  10. #48
    Registriert seit
    23.02.2008
    Beiträge
    45
    Danke
    11
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo ich habe nochmal ein Problem, jetzt habe ich das Programm noch etwas umgeändert, Ausrechnen der prozentzualen Abweichung vom Mittelwert, und schreiben in einen DB, es zeigt jetzt wieder Bereichslängenfehler an
    kann das mit den Negativen Werten zusammenhängen.


    IF zaehler=5000 THEN
    mittelwert:=5000/49;
    index3:=0;
    FOR index1 := 7 TO 2 BY -1 DO
    FOR index2 := 7 TO 2 BY -1 DO
    index3 := index3+1;
    sortierpuffer1[index3]:=DINT_TO_DWORD(matrizze[index1,index2]);
    sortierpuffer[index3]:=DWORD_TO_DINT(sortierpuffer1[index3] AND 16#0000FFFF);
    sortierpuffer[index3]:=REAL_TO_DINT((DINT_TO_REAL(sortierpuffer[index3])-mittelwert/mittelwert)*100);
    sortierpuffer[index3]:=DWORD_TO_DINT(SHR(IN:=((DINT_TO_DWORD(sortierpuffer[index3]))AND 16#F0000000),N:=16)
    OR sortierpuffer1[index3] AND 16#FF000000);
    WORD_TO_BLOCK_DB(5).DD[index3*4]:=DINT_TO_DWORD(sortierpuffer[index3]);
    END_FOR;
    END_FOR;
    zaehler:=0;
    END_IF;

    END_FUNCTION_BLOCK

  11. #49
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.797
    Danke
    398
    Erhielt 2.418 Danke für 2.014 Beiträge

    Standard

    ...an welcher Stelle in deinem Konstrukt entsteht den der Bereichslängenfehler ...? Das wäre vielleicht interessant zu wissen ...

    Ansonsten ... wie groß sind denn die ARRAY's dimensioniert ? Das sollte man bei so etwas IMMER mit angeben. Einen negativen Index sehe ich erstmal nicht ...

    Gruß
    LL

  12. #50
    Registriert seit
    23.02.2008
    Beiträge
    45
    Danke
    11
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    danke für die schnelle Antwort, Bausteinadresse 148,instanz-DB Doppelwort- Zugriff , Zugriffsadresse 0.
    Wie zählt man denn die Bausteinadresse, ist das Schieben des Vorzeichenbits
    richtig

Ähnliche Themen

  1. Zugriff auf OPC Variablen
    Von mariobc im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 10.10.2011, 19:33
  2. Zugriff auf einen Array eines UDT`s
    Von Andreas- im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 04.09.2009, 19:02
  3. Array mit Variablen adressieren
    Von Jens im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 13.12.2006, 20:57
  4. Hardwarenaher Zugriff durch einen FC / FB
    Von mclear im Forum Simatic
    Antworten: 0
    Letzter Beitrag: 10.07.2006, 15:53
  5. Antworten: 1
    Letzter Beitrag: 24.06.2003, 22:14

Lesezeichen

Berechtigungen

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