TIA Richtungswahl in SCL

ben90

Level-1
Beiträge
7
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich soll eine Richtungswahl für ein Ziffernrad (0-9) in SCL programmieren. Ich soll das Ziffernrad vom jeweiligen IST Wert auf dem schnellsten Weg zum Sollwert drehen. Dazu gibt es ein altes Programm in AWL als Vorlage, welches auf einer S7 300 lief. Ich habe jetzt eine S7 1214C, die kein AWL kann, und habe keinen Plan wie ich diesen Teil des Programms umsetzen soll.
Code:
 L     #setpoint
      L     #actual_value
      <I    
      SPBB  m001
      -I                                //check if more or less as 5 positions
      L     5
      >I    
      SPBB  m006                        //if more than 5 positions > direction -
      SPA   m003                        //if less than 5 positions > direction +
m001: NOP   0
      L     #setpoint
      L     #actual_value
      -I    
      L     5
      >I    
      SPBB  m003
//If the result is a negative number and direction must be +
      L     #setpoint
      L     #actual_value
      -I    
      L     L#65532
      <I    
      SPBB  m003
m006: NOP   0
      S     #backwards                  //direction -
      SPA   m002
m003: NOP   0
      R     #backwards                  //no direction -
m002: NOP   0
      UN    #home                       //if wheel is not homeposition
      SPBB  m010                        //jump to end
      L     0
      T     #actual_value
m010: NOP   0

Kann mir da jemand weiterhelfen?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hatte versucht den AWL Code genau so in SCL umzusetzen. Ich habs mit Case of und If Verknüpfungen versucht aber am Ende wenn ich IST und SOLL Werte zum testen eingegeben habe, hat es bei manchen Werten funktioniert und bei anderen nicht.


Gesendet von iPhone mit Tapatalk
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich würde spontan so vorgehen:

Istposition (2) - sollpositon (9) = -7

Quadrieren und die Wurzel ziehen um das Vorzeichen zu eliminieren ->
Vergleichen mit größer 5 -> rechtslauf, wenn kleiner/gleich linkslauf

Ich hoffe ich habe jetzt keinen Denkfehler, aber ich denke es sollte so funktionieren.
 
Das Quadrieren und die Wurzel ziehen kann man sich sparen wenn man den Betrag mit der funktion ABS (Absolutwert) bildet.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe eben mal mein SCL in Codesys eingetippt. TIA habe ich nicht da.

Code:
VAR
    soll:            INT;
    ist:            INT;
    richtungswahl:    INT;
    rueckwaerts:    BOOL;
END_VAR

IF
    soll < ist
THEN
    richtungswahl := 1;
ELSIF
    (soll - ist) > 5
THEN
    richtungswahl := 6;
ELSE
    richtungswahl := 3;
END_IF;


CASE richtungswahl OF
    1:
        IF
            (soll - ist) > 5
        THEN
            richtungswahl := 3;
        ELSIF
            (soll - ist) < 65532
        THEN
            richtungswahl := 3;
        ELSE
            richtungswahl := 6;
        END_IF;
    3:
        rueckwaerts := FALSE;
    6:
        rueckwaerts := TRUE;
END_CASE;

Ich denke irgendwie so müsste man das zum laufen bekommen. Nur so wie es da steht hatte ich es auf der 1214C laufen und habe über die Beobachtungstabelle die Were vorgegeben. Die Richtung über die Variable 'rueckwaerts' beobachtet und bei manchen Kombinationen hat es funktioniert und bei anderen wieder nicht.

Ich gehe auch mal stark davon aus, dass es für mein abgekupfertes AWL Programm auch ne saubere Lösung in SCL gibt aber ich komme irgendwie nicht drauf.
 
Stimmt. Wie gesagt spontan, samstags morgens. Funktionieren sollte es trotzdem :grin:
Erfüllt aber nicht die Anforderung -> kürzester Weg.:grin:

Ich würde es so lösen:
den Absolutwert der Diff. von Soll und ist nehmen.
Code:
 Ergebnis=ABS(Soll-Ist)
Als zweites die Ist und Soll Pos zu 10 / 0
Code:
If Ist => 5 then X =10 Else X=0
If Soll => 5 then Y=10 Else Y=0
Ergebnis1= ABS(X-ist) + ABS(Y-Soll)

Im Vergleich von Ergebnis und Ergebnis1 weist du jetzt, ob du von Ist nach Soll direkt wählen musst oder über Null
Wenn Direkt dann
Code:
Soll > Ist -> rechts, Soll < Ist -> links.
Wenn über Null
Code:
 Ist < Soll -> links, Ist > Soll -> rechts.

Nachtrag:
Als aller erstes prüfen ob Soll = Ist :ROFLMAO:
Holger
 
Zuletzt bearbeitet:
Im Vergleich von Ergebnis und Ergebnis1 weist du jetzt, ob du von Ist nach Soll direkt wählen musst oder über Null

Also wenn Ergebnis dann größer Ergebnis1 ist muss ich über Null. Seh ich das richtig?

Ich hab schon ein paar Sachen programmiert und kann mich normal da ganz gut rein denken aber bei dem Problem klappt das irgendwie gar nicht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ganz allgemein sollte das wenn die Zahlen wie auf einem Uhrenzifferblatt angeordnet sind folgendermaßen funktionieren:
Code:
delta := ist - soll;
dli := (ANZAHL + delta) MOD ANZAHL;
rechts := dli > (ANZAHL / 2);
links := NOT rechts AND delta <> 0;

ANZAHL ist die Anzahl der Schritte die du hast, bei 0-9 wäre dafür 10 einzusetzen, bei einer Uhr wäre das 12 (0-11).
Rechts ist im Uhrzeigersinn, links gegen den Uhrzeigersinn.
 
Werde ich am Montag gleich als erstes auf der Arbeit testen. Und mich dann nochmal melden.

Habe es programmiert und getestet. Läuft.

Danke für die Hilfe...
 
Zuletzt bearbeitet:
Zurück
Oben