TIA in SCL Schleifen Flankengetriggert ausführen

TinoToni

Level-1
Beiträge
39
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich bin lange in der FUP/AWL-Welt unterwegs gewesen und muss mich nun mit SCL anfreunden.

Auf folgendes Problem bin ich nun gestoßen:

Bei einer Freigabe soll ein Wert in das erste Array-Element geschrieben werden, bei der nächsten Freigabe in das Zweite Array-Element....

In AWL würde meine Lösung dafür so aussehen:

U "A_Kuka_FreigabeScheibeEinlegen"
FP "Flanke_11.1"
SPBN out


L "d_Sickmessung".Analogwert_Sick1_mm
T "d_Sickmessung".Sick1["d_Sickmessung".Counter]


L "d_Sickmessung".Counter
L 1
+I
T "d_Sickmessung".Counter


L "d_Sickmessung".Counter
L 10
>I
SPBN out


L 1
T "d_Sickmessung".Counter


out: NOP 0


Meine Idee in SCL war folgende:

"Flankenmerker" := "A_Kuka_FreigabeScheibeEinlegen" AND NOT "Impulsmerker";
"Impulsmerker" := "A_Kuka_FreigabeScheibeEinlegen";

WHILE Flankenmerker and "d_Sickmessung".Counter < 11 DO
"d_Sickmessung".Sick1["d_Sickmessung".Counter] := "d_Sickmessung".Analogwert_Sick1_mm;
"d_Sickmessung".Counter := "d_Sickmessung".Counter + 1;
END_WHILE;

IF "d_Sickmessung".Counter >= 11 THEN
"d_Sickmessung".Counter := 1;
END_IF;

Das funktioniert natürlich nicht weil die Schleife in einem SPS-Zyklus alle 10 Werte mit einer Freigabe beschreibt.

Leider habe ich keine Idee wie das sonst funktionieren soll. (klar ich könnte mit der Case-Anweisung jeden Wert einzeln zuweisen, aber das ist für größere Arrays keine Option)

hat jemand eine Idee?

Gruß
 
Ich find's so am schönsten:

Code:
[FONT=Verdana]// Impulsbildung
"Flankenmerker" := "A_Kuka_FreigabeScheibeEinlegen" AND NOT "Impulsmerker";
"Impulsmerker" := "A_Kuka_FreigabeScheibeEinlegen";
    
// Umlaufzähler und Wert in ARRAY[1..11] eintragen
IF "Flankenmerker" THEN
   "d_Sickmessung".COUNTER := "d_Sickmessung".COUNTER MOD 11;   // 0..10
   "d_Sickmessung".COUNTER := "d_Sickmessung".COUNTER + 1;      // 1..11
   "d_Sickmessung".Sick1["d_Sickmessung".COUNTER] := "d_Sickmessung".Analogwert_Sick1_mm;
END_IF;
[/FONT]
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
"Impulsmerker" := "A_Kuka_FreigabeScheibeEinlegen" AND NOT "Flankenmerker";
"Flankenmerker" := "A_Kuka_FreigabeScheibeEinlegen";
IF "Impulsmerker" THEN 
    "d_Sickmessung".Sick1["d_Sickmessung".Counter] := "d_Sickmessung".Analogwert_Sick1_mm;
    "d_Sickmessung".Counter := "d_Sickmessung".Counter MOD 10 + 1; // 1 .. 10
    END_IF;
PS:
Habe mir erlaubt, die Begriffe ImpulsMerker und FlankenMerker zu tauschen.
Alternativ, ohne eigenes Bit für ImpulsMerker:
Code:
IF "A_Kuka_FreigabeScheibeEinlegen" AND NOT "Flankenmerker" THEN 
    "d_Sickmessung".Sick1["d_Sickmessung".Counter] := "d_Sickmessung".Analogwert_Sick1_mm;
    "d_Sickmessung".Counter := "d_Sickmessung".Counter MOD 10 + 1; // 1 .. 10
    END_IF;
"Flankenmerker" := "A_Kuka_FreigabeScheibeEinlegen";
 
Zuletzt bearbeitet:
Zurück
Oben