Step 7 Schieberegister in SCL?

spirit

Level-1
Beiträge
961
Reaktionspunkte
23
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Ihr,

Ich stehe schon vor dem nächsten Problemchen. Und zwar möchte ich mir gerne ein Schieberegister basteln, das mit jedem TAKT (= Impulsoperand) von 0 an um die Zahl 1 erhöht wird bis 13 und dann wieder von vorne beginnt.

Also Ausgangswert = 0 und beim ersten TAKT soll in INDEX 1 stehen, dann 2, usw.

Bei dem Wert 13 soll dann ein Ausgang angesteuert werden...


Meine Überlegung war, das Ganze mit einer For-Schleife zu machen:


Code:
// Schieberegister
 
IF TAKT THEN
  FOR INDEX := 0 TO 13 BY 1 DO
  END_FOR;
END_IF;
 
 
// Abfrage im Programm
 
IF SchiebeRegister [INDEX] = 13 THEN
  Ausgang := 1;
END_IF;

Würde das so klappen?
 
Da zwischen DO und END_FOR nichts steht wird das so mit Sicherheit nicht klappen.

IF TAKT THEN
INDEX := INDEX + 1 ;
END_IF;

Deine Ausgangszuweisung könnte so passen, wobei "Ausgang" dann aber auch 1 bleibt, nachdem "INDEX" mal 1 war.

Falls du etwas anderes meinst musst du dich klarer ausdrücken.

Mfg
Manuel
 
Als SCL-Laie würde ich das z.B. so umsetzen:
Code:
[FONT=Courier New]IF TAKT THEN
    INDEX := INDEX +1;
    CASE INDEX OF
        13:    Ausgang := 1;
        14:    Index := 0;
               Ausgang := 0;    // wenn gewünscht
    END_CASE;
END_IF;[/FONT]
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
In meiner Glaskugel schimmert da ein Rundtisch mit mehreren Bearbeitungsstationen.

Vielleicht erzählst Du etwas mehr über den Anwendungsfall. Das ist vermutlich zielführender, als hier Häppchen mit etwas Code reinzuschmeißen.
 
... wenn du mit dem Rundschalttisch Recht haben solltest (ich könnte mir das auch vorstellen) dann wäre dieser Index-inkrementierer komplett am Ziel vorbei. Dann wäre etwas, das wir bei unseren Anlagen "Schiebespeicher" nennen der richtige Ansatz. Hier würde dann im einfachsten Fall ein Array_of_Byte geschoben, wo jeder Drehtisch-Platz sein eigens Byte für den Bearbeitungsstatus an der Stelle hat ...

Gruß
Larry
 
Ok, ich versuche das Ganze mal etwas zu beschreiben...

Im Grunde handelt es sich um drei hintereinander liegende Bearbeitungsstationen.

Station 1 wird über die Schrittkette 1 versorgt und arbeitet weitgehend losgelöst von den anderen beiden Stationen.

Immer wenn an Station 2 ein Teil erkannt wird, dann soll über den Impulsoperand TAKT das Schieberegister aktiviert und um 1 erhöht werden. Ist die Zahl 13 erreicht, so soll anschließend beim nächsten TAKT wieder von 1 an erhöht werden.

An Station 3 soll, wenn das Schieberegister auf 13 steht, ein Zylinder ausgefahren werden.

Die drei Schrittketten sollen in einem FB programmiert werden. Das Schieberegister wird dann vor Schrittkette 2 eingefügt.


Jetzt bin ich einfach unsicher, wie ich das Schieberegister zu programmieren habe?

Habe dazu nur Folgendes gefunden:

VAR
INDEX : INT;
SchiebeRegister : ARRAY [1..13] of INT;
END_VAR;

Nun müsste halt der Code so werden, dass mit jedem TAKT (pos. Flanke) das Register um 1 erhöht wird, so dass dann in der SK3 bei der Zahl 13 darauf reagiert werden kann.

Lieben Dank!

PS: Ja Larry, genau so etwas hätte es eigentlich werden sollen... also ein Register, das ein Bit mit jedem TAKT um eine Stelle weiterschiebt. In FUP auch als "SHL" bezeichnet... :D
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
... so würde ich das generell nicht machen (sondern so, wie von mir schon beschrieben). Denk mal darüber nach.

Station 1 tut ein Teil auf den Tisch wenn der Schiebespeicher[1] frei ist. Ist das Teil drauf setzt du das erste Bit (Bit0) des Schiebespeichers[1].
Station 2 kann arbeiten wenn im Schiebespeicher[2] nur Bit0 gesetzt ist. Hat sie gearbeitet dann setzt du das Bit 1des Schiebespeichers[2].
Station 3 kann arbeiten wenn im Schiebespeicher[3] nur Bit0+1 gesetzt sind. Hat sie gearbeitet dann setzt du das Bit 2des Schiebespeichers[3].
usw.

Gruß
Larry
 
Ja ok Larry,

aber ich könnte doch auch mittels der Teileerkennung an Station 2 (über TAKT) den Schiebespeicher aktivieren und das erste Bit (Bit0) setzen. Mit jedem TAKT (jeder neuen Teileerkennung) wird dieses Bit dann um eine Stelle nach links geschoben und wenn es 13x geschoben wurde, dann kann in Station 3 der Zylinder aktiv werden.

Na, was meinst du? ;)

In FUP würde ich das mit "schiebe links" machen.
 
Kannst du mal ein Bild von deiner Maschine/Anlage posten ?
Das macht das "Vorschläge machen" leichter ...

Aber generell - wenn es das ist, was ich annehme, dass du es hast, dann solltest du über meinen Vorschlag noch einmal intensiv nachdenken ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mometan geht das leider noch nicht Larry, da es die Maschine noch nicht gibt... es sind erst einmal alles Vorüberlegungen. Deine Lösung wäre wohl die Profilösung... aber mal zum anfangen

vielleicht so?

Code:
Ergebnis:=
SHL(
IN := TAKT
N := 1);

und dann in Station 3 die Abfrage, ob das Bit an Stelle 13 ist...

Das könnte sich dann ja noch durchaus weiter entwickeln.
 
Zuletzt bearbeitet:
Prinzipiell kann man das mit einem "einfachen" Schieberegister so machen. Sowohl Rundtaktmaschinen als auch linear angeordnete Anlagen mit Königswelle habe ich schon betreut, bei denen das dann so gelöst war.

Grundsätzlich ist der von Larry beschriebene Weg mit den Möglichkeiten von SCL aber "eleganter".

Ich würde ein UDT mit den entsprechenden Bits, ggf. Anwesenheitskontrollen oder Prüfergebnissen anlegen. Dieses UDT dann als ARRAY[1..14] deklarieren. (Ich mag die 0 nicht...)
Beim Takten müsste dann das UDT in dem Array "durchgeschoben" werden.

Ich frag mich übrigens gerade ob ich das vorgeben soll...
Ich glaube nämlich Du brauchst etwas Übung :cool:
 
Ich würde ein UDT mit den entsprechenden Bits, ggf. Anwesenheitskontrollen oder Prüfergebnissen anlegen. Dieses UDT dann als ARRAY[1..14] deklarieren. (Ich mag die 0 nicht...)
Beim Takten müsste dann das UDT in dem Array "durchgeschoben" werden.

Ich frag mich übrigens gerade ob ich das vorgeben soll...
Ich glaube nämlich Du brauchst etwas Übung :cool:

Also zweifelsfrei gebe ich dir recht, dass ich Übung brauche... ;)

Ein bisschen Probleme habe ich noch, deinen Ansatz zu verstehen... aber er würde mich schon sehr interessieren! Würde ihn sehr gerne nochmals aufgreifen...

Ich bin jetzt mit meiner SCL-Lösung mittlerweile soweit gekommen:

Code:
TAKT := E0.0 AND NOT FM;
FM := E0.0;

IF TAKT THEN
  SchiebeRegister := SHL(IN := SchiebeRegister, N := 1);
END_IF;

IF SchiebeRegister = 8192 THEN
  A0.1 := 1;
END_IF;

Das Problem jetzt noch, dass sich hier NICHTS schiebt... :p

Finde den begrabenen Hund nur grade nicht...
 
Mit jedem Takt wird eine neue "1" in das Register geschoben - es kann also niemals 8192 werden sondern höchstens
Code:
IF (SchiebeRegister AND 8192) = 8192 THEN
oder ...
Code:
IF (SchiebeRegister AND 8192) <> 0 THEN
... der geschaltete Ausgang würde dann aber ab irgendwann immer an sein ... weil eben nur "1"-en reingeschoben werden.

Welchen Typ's ist übrigens "SchiebeRegister" ?

Gruß
Larry
 
Übrigens :
Das von mir beschriebene Ding ist ein Array_of_Byte in der einfachsten Form - selber nutze ich ein Array_of_Struct (UDT's mache ich nur, wenn ich das mehrfach in Deklarationen brauche) und es funktioniert fast schon so, wie dein erster Ansatz ... ;) - nur eben mit einem Array - und es bildet einen Ringspeicher, wie dein Tisch auch.

Wieviele Plätze hat denn der Tisch nun wirklich ? 13 kann ich mir nicht so recht vorstellen ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hast Du denn Dein Schieberegister irgendwo initialisiert, sprich das erste Bit gesetzt?

Nein, das habe ich natürlich auch vergessen...

Aber hier funktioniert irgendwie NICHTS!

"SchiebeRegister" ist ein WORD (MW200). Nun wollte ich das erste Bit (Bit0) setzen:

Code:
IF E0.1 THEN
  M201.0 := 1;
END_IF;

Dadurch sollte doch M201.0 auf 1 gesetzt werden; klappt aber nicht!


Mit jedem Takt wird eine neue "1" in das Register geschoben - es kann also niemals 8192 werden.
Gruß
Larry

Aber warum das denn? Die Schiebefunktion in FUP (SHL) schiebt doch ein Bit immer nur um eine Stelle nach links ohne ein neues aufzufüllen. Das kann doch in SCL nicht plötzlich anders sein...

Gewünscht ist, dass mit jedem TAKT das Bit um eine Stelle nach links geschoben wird - und das macht doch die Schiebefunktion oder raffe ich hier jetzt gar nichts mehr:confused:
 
Nein, das habe ich natürlich auch vergessen...
:ROFLMAO:



Aber hier funktioniert irgendwie NICHTS!

"SchiebeRegister" ist ein WORD (MW200). Nun wollte ich das erste Bit (Bit0) setzen:

Code:
IF E0.1 THEN
  M201.0 := 1;
END_IF;

Dadurch sollte doch M201.0 auf 1 gesetzt werden; klappt aber nicht!
Nö, M201.0 ist ein Bit das kann nicht (INT) 1 werden, sondern nur TRUE oder FALSE.
Das ganze MW200 könnte 1 werden.
;)
 
Zurück
Oben