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

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 28

Thema: Positions / Koordinatenabfrage-abfrage in SCL oder auch AWL

  1. #1
    Registriert seit
    26.10.2009
    Ort
    Teltow
    Beiträge
    23
    Danke
    13
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen

    Ich habe folgendes Problem:

    ich soll die Koordinate aus einer Datenbank abhängig von der Istposition auslesen.
    Dazu muß ich aber gleich sagen, ich habe von SCL noch nicht so viel Ahnung, arbeite mich da gerade erst ein.

    In der Tabelle die Entfernung im Verhältnis zur Position:
    Code:
      |        |       |       |       |       |       |       |  
     100      156     219     248     312     366     420     486
      x1      x2      x3      x4      x5       x6      x7      x8
    Aufbau der DB
    DB1
    Code:
    ADRESSE   NAME    TYP       Anfangs...    Komment..
    0.0       X1      DINT      L#100         Platz 1
    4.0       X2      DINT      L#150         Platz 2
    8.0       X2      DINT      L#200         Platz 3 ....
    Istposition wäre z.B 221
    Ergebnis sollte dann logischerweise X3 sein, da 221 näher an 200 als 250 liegt.

    bin gespannt auf eure Ideen bzw Anregungen.

    schon mal Danke

    Sascha

    Änderung: der Abstand zwischen den einzelnen Positionen soll variabel sein
    Geändert von Bonsai-San (03.03.2011 um 15:24 Uhr) Grund: Werte können unterschiedlich sein
    Zitieren Zitieren Positions / Koordinatenabfrage-abfrage in SCL oder auch AWL  

  2. #2
    Registriert seit
    05.10.2005
    Beiträge
    2.373
    Danke
    321
    Erhielt 296 Danke für 266 Beiträge

    Standard

    Hallo,

    Die Auswahl, welcher Wert gebraucht wird machst Du über ein Fenster. Du vergleichst den Wert mit einer Unter/Obergrenze. Wenn er hineinfällt, dann lädst du aus deinem Datenbaustein welchem du noch 2 Zeilen(Wert für Positionsfenster0 und 50) vorannstellst mitttels Pointer, welcher nach folgender Formel im Datenbaustein positioniert wird den Wert.
    Adresse=Positionsfenster/50*4

    Thomas

    Ps: Den Vergleich kannst du dementsprechend kurz in einer Schleife ausführen indem du der UG/OG in jedem Durchlauf 50 addierst.
    Geändert von thomass5 (03.03.2011 um 10:20 Uhr) Grund: PS

  3. #3
    Registriert seit
    17.09.2006
    Beiträge
    136
    Danke
    0
    Erhielt 7 Danke für 7 Beiträge

    Standard

    Ich würde den DB als Struct Array aufbauen, dann kannst du das Array einfach über eine Schleife durchlaufen und musst nicht mit Adressen arbeiten. Dann einfach 25 auf den aktuellen Array-Wert addieren und gucken ob du mit deiner Position grösser oder kleiner bist, daraus ergibt sich dann ob dein Name aus dem aktuellen oder nächsten Array-Element kommt. Sollten in SCL so 5-8 Zeilen sein.

  4. #4
    Avatar von Bonsai-San
    Bonsai-San ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    26.10.2009
    Ort
    Teltow
    Beiträge
    23
    Danke
    13
    Erhielt 0 Danke für 0 Beiträge

    Daumen hoch

    vorgestellt hab ich mir das so auch

    nur das umsetzen ist komisch..

    mmh, könnt ihr mir ein Buch empfehlen wo ich so etwas nachlesen kann ??
    wie gesagt, hab gestern das erste mal etwas mit SCL zu tun gehabt

    MfG
    Sascha

  5. #5
    Avatar von Bonsai-San
    Bonsai-San ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    26.10.2009
    Ort
    Teltow
    Beiträge
    23
    Danke
    13
    Erhielt 0 Danke für 0 Beiträge

    Standard

    mmh, irgendwo muß hier ein Denkfehler sein, wer kann ihn finden

    Code:
    FUNCTION FC100 : void
    VAR_INPUT
        IP: INT;  
        Pos_DB : BLOCK_DB;
        erste_adr: INT;
        letzte_adr: INT;
    END_VAR
    VAR_TEMP
        Pos_dif: DINT ;
        x_1: INT ;
        x: INT ;
        IP_DB: INT ;
        Pos_X: DINT ;
        Pos_Y: DINT ;
    END_VAR
     
    VAR_OUTPUT
            Koordinate: DINT ;
     
    END_VAR
     
    VAR
     
    END_VAR   
     
    BEGIN   
     
    //Schleife hochzählen 
    FOR x :=erste_adr TO letzte_adr BY 4 DO
        IF IP < Pos_DB.Dd[x] THEN IP_DB := 1 ;    
        ELSE IP_DB := 0 ;
     
        END_IF;
    END_FOR;
    IF IP_DB = 1 THEN 
        x_1 := x-4;
        Pos_dif := ((Pos_DB.DD[x] - Pos_DB.Dw[x_1]) / 2);
        Pos_X := Pos_DB.DD[x]-Pos_dif;
    END_IF;
    IF IP < Pos_X THEN 
       Koordinate := x/4;
    ELSIF IP > Pos_X THEN
     Koordinate := x_1/4;
    END_IF;
     
    END_FUNCTION
    Bei der Roten markierung zeigt er mir folgenden Fehler an:
    Code:
    Der Ausdruck muss vom Datentyp BOOl sein

  6. #6
    Registriert seit
    27.08.2003
    Ort
    Schweitenkirchen
    Beiträge
    472
    Danke
    101
    Erhielt 73 Danke für 59 Beiträge

    Standard

    Probier mal Semikolon am ende der zeile mit dem roten THEN wegmachen
    Wenn ich einen meiner Finger in eines deiner Nasenlöcher stecke, haben wir beide nen Finger in der Nase

  7. #7
    Avatar von Bonsai-San
    Bonsai-San ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    26.10.2009
    Ort
    Teltow
    Beiträge
    23
    Danke
    13
    Erhielt 0 Danke für 0 Beiträge

    Standard

    hab ich schon probiert, hat leider nichts geholfen.

    aber danke für den tipp

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

    Standard

    Zitat Zitat von Zefix Beitrag anzeigen
    Probier mal Semikolon am ende der zeile mit dem roten THEN wegmachen
    Ne, das Semikolon ist schon richtig,
    aber (wird wohl auch nichts helfen) das ganze in einer Zeile habe ich so noch nie gesehen und gemacht.
    Ein Versuch ist es ja mal Wert, nach dem "THEN" einen Zeilenumbruch.
    Gruß
    Paule
    ----------------------------------------------------------------------------
    > manchmal verliert man und manchmal gewinnen die anderen <

  9. #9
    Registriert seit
    29.03.2004
    Beiträge
    5.735
    Danke
    143
    Erhielt 1.685 Danke für 1.225 Beiträge

    Standard

    Die Datentypen passen nicht zusammen. Ich kann mir auch nicht vorstellen dass es nur die eine Fehlermeldung gibt.
    Die Variable IP ist ein INT, und Pos_DB.DD[x] ist ein Doppelwort. Verschiedene Datentypen kann man in SCL nur mit einer entsprechenden Konvertierungsfunktion vergleichen.

    Probier mal:
    Code:
    IF IP < DWORD_TO_INT(Pos_DB.DD[x]) THEN

  10. Folgender Benutzer sagt Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    Zefix (04.03.2011)

  11. #10
    Registriert seit
    04.09.2008
    Beiträge
    22
    Danke
    3
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Guten Abend,
    eine Lösung in AWL.


    Im Anhang ist ein S7 Programm, welches in einer Schleife die Koordinaten einliest, mit der Ist-Position vergleicht und die nächst nähere Postion ausgibt.

    Die Koordinaten stehen im DB1.
    Im OB1 wird der Baustein aufgerufen in dem die Schleife abläuft.

    Es können nachträglich die Koordinaten verändert werden da die Schleife flexibel ist.


    Anzahl Koordinaten -1 = Schleifen anzahl

    erste Koordinate = 0
    letze Koordinate = Maximum

    DB1.DBD0 = X1
    DB1.DBD4 = X2
    ...

    MD 4 = Ist-Koordinate
    MD 10 = nächst nähere Koordinate




    Mfg

    Alex
    Angehängte Dateien Angehängte Dateien

  12. Folgender Benutzer sagt Danke zu Alex S. für den nützlichen Beitrag:

    Bonsai-San (04.03.2011)

Ähnliche Themen

  1. Ansteuerung von positions lampen in fup
    Von Manfred_89 im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 03.03.2011, 11:19
  2. Antworten: 10
    Letzter Beitrag: 22.06.2010, 15:10
  3. Antworten: 4
    Letzter Beitrag: 14.10.2009, 13:01
  4. Antworten: 9
    Letzter Beitrag: 16.10.2007, 13:48
  5. Antworten: 10
    Letzter Beitrag: 27.06.2004, 17:17

Lesezeichen

Berechtigungen

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