Step 7 Viele Fragen zum Rundtisch...

Zuviel Werbung?
-> Hier kostenlos registrieren
Also im Grunde für jedes Tray, das am RT befestigt ist, richtig?


Ok, d.h. es muss aus dem Laufzettel (UDT11) ersichtlich sein, ob eine Station arbeiten muss oder nicht und evtl. wie oft hintereinander? Wenn also z.B. bei Index1 an erster Stelle eine 1 steht, dann muss Station1 arbeiten, usw.
Meinst du das so?


Sorry, aber ich habe hier noch ein Verständnisproblem!
Dieses Konstrukt hat ja jetzt nichts mit dem Laufzettel (UDT11) zu tun, oder? Hier trägst du ja nur ein, wenn eine Aufgabe erledigt ist. Sehe ich das richtig, dass dieser Schiebespeicher nichts mit dem Array [1..12] of UDT11 zu tun hat?


Danke für eure Geduld... ;)

Ich versuchs mal einfacher auszudrücken, dein UDT ist eine Vorlage/Struktur, die alles behinhaltet was du auf deinem Tisch für jedes Werkstück benötigst. Man kann die ja noch später erweitern, aber hier mal simple.

das UDT nennen wir Tisch
1. Werkstücknummer
2. Rezeptdaten als Array
Station 1 bearbeiten: ja
Station 2 bearbeiten: ja
Station 3 bearbeiten: nein

Jetzt machst du in einem DB ein Array of Tisch mit 10 Positionen.
Wenn ein neues Werkstück ankommt, wird in Position 0 die Nummer und die Rezeptdaten angelegt. Dann fährts auf Position 1 und das ganze Array wird um eins nach hinten geschoben, unser Datensatz liegt dann auf 1, da fragt ein FC/FB die Rezeptdaten ab und macht was oder halt nicht, wenn nicht wird Freigabe zum Drehen gegeben und beim nächsten Drehen wird der Datensatz auf 2 geschoben usw usf. bis das Teil durch ist und der Datensatz "hinten runterfällt".
 
Ich würde es wie folgt lösen:

UDT: Name Teil
0.0; ID als String für eindeutige Rückverfolgbarkeit
10.0; Pos0; INT; Pos0 ist Station 1
12.0; Pos1; INT; Pos1 ist zwischen Station 1 und Station 2
14.0; Pos2; INT; Pos2 ist zwischen Station 1 und Station 2
16.0; Pos3; INT; Pos3 ist Station 2
17.0; Pos4; INT; Pos4 ist Station 3
20.0; Pos5; INT; Pos5 ist zwischen Station 3 und Kamerastation
22.0; Pos6; INT; Pos6 ist Kamerastation
24.0; Pos7; INT; Pos7 ist Druckerstation
26.0; Pos8; INT; Pos8 ist zwischen Druckerstation und Ausschleußstation
28.0; Pos9; INT; Pos9 ist Ausschleußstation
30.0; Pos10; INT; Pos10 ist Ausgabestation
32.0; Teil_vorhanden; Bit; wird TRUE, wenn ein Teil vorhanden ist(im Normalfall, wenn es an Position 0 beladen wurde)
32.1; Teil_iO; Bit; jede Station, die fertig ist schreibt das Bit auf TRUE, wenn der Arbeitsschritt korrekt durchgeführt wurde
32.2; Teil_niO als Bit; jede Station, die fertig ist, schreibt das Bit auf TRUE, wenn der Arbeitsschritt nicht korrekt durchgeführt wurde
bis 39.7 Reserve

Die Bedeutung eines INT:
0: Station fertig/Station überspringen
1: Station einmal bearbeiten
2: Station zweimal bearbeiten
...

Dies muss am Anfang beschrieben werden. Im Normalfall wäre Pos0=1, Pos1=0, Pos2=0, Pos3=2, Pos4=1, Pos5=0, Pos6=1, Pos7=1, Pos8=0, Pos9=1, Pos10=1

DB11: array[0..10] of UDT11; Name RTT

Takten: wenn jede Station fertig ist darf weiter getaktet werden
U(
L RTT[0].Teil.Pos0
L 0
==I
)
U(
L RTT[1].Teil.Pos1
L 0
==I
)
U(
L RTT[2].Teil.Pos2
L 0
==I
)
...
U(
L RTT[10].Teil.Pos10
L 0
==I
)
= Freigabe_Takten

Bei jedem Takt wird ein Blockmove von n auf n+1 gemacht, wobei angefangen wird 10 löschen/ID weitergeben an nächste Station, 9 auf 10, 8 auf 9, ..., 0 auf 1, 0 löschen

PosX: Soll eine Station nicht bearbeitet werden muss einfach eine 0 eingetragen werden.
Die Nummer wird an die jeweilige Station übergeben, bei 0 muss die Station nichts machen.
Bei 1 wird die z.B. Schrittkette der Station einmal durchlaufen. Am Ende der Schrittkette wird die Nummer um eins reduziert und das Bit Teil_iO oder Teil_niO gesetzt.

Teil_vorhanden: Wenn ein Teil vorhanden ist das Bit TRUE. So können z.B. auch Teile ein- und ausgeschleust werden

Teil_iO / Teil_niO: Am Ende der Bearbeitung einer Station wird eins der beiden Bits geschrieben.
Man könnte noch realisieren, dass wenn eine Station ein Teil_niO einträgt, die nächsten Stationen(z.B. Druckerstation) nicht mehr arbeiten braucht.
Entweder durch Eintragen von 0 in RTT[x].Teil.Pos7, wobei x die aktuelle Position ist.
Oder durch Prüfen einer jeden Station bei start nicht nur auf ungleich 0 sondern auch auf NOT Teil_niO als Startbedingung.

Ausschleußstation:
Wenn ein Teil_niO = TRUE wird es hier ausgeschleust und Teil_vorhanden=FALSE und/oder Pos10=0. Geschmackssache



Ich hoffe, ich habe nichts vergessen. War doch etwas länger als gedacht.

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Bapho:
ich würde den UDT gerade NICHT Tisch nennen.

Vom Verständnis her würde ich den DB Tisch nennen und den UDT Teil.
Ich verstehe es so, dass der UDT ein Bauteil wiederspiegelt und alle Informationen hat, die es auf dem Tisch benötigt.

Jetzt taktet der Tisch weiter, d.h. der UDT wird um eins im DB verschoben.

Ansichtssache eben ;)
 
Code:
Bit 0 : Station 01 hat Leergehäuse in Tray eingelegt
Bit 1 : Station 02 hat 1. Kontakt in Gehäuse eingelegt
Bit 2 : Station 02 hat 2. Kontakt in Gehäuse eingelegt
Bit 3 : Station 04 hat 3. Kontakt in Gehäuse eingelegt
Bit 4 : Station 06 hat die eingelegten Kontakte im Gehäuse verpresst
Bit 5 : Station 07 hat das Fertigteil mittels Kamera kontrolliert
Bit 6 : Station 09 hat ein defektes Fertigteil ausgeschleust
Bit 7 : Station 10 hat ein korrektes Fertigteil bedruckt
Bit 8 : Station 11 hat ein korrektes Fertigteil in einen Palettierer gelegt

Die dargestellten Bits werden also immer dann gesetzt, wenn die Aufgabe(n) an den einzelnen Plätzen am RT erledigt sind.

Nun müssen aber doch die einzelnen Stationen noch wissen, dass sie mit der Bearbeitung an der Reihe sind...

Du siehst an den Beiträgen vor meinem, dass es viele Möglichkeiten für die Lösung gibt.
Ich bleibe mal bei meinem Vorschlag (warum auch nicht 8)):

Die Stationen erfahren, dass sie an der Reihe sind in dem du ein "Teil_OK_fuer_Bearbeitung" bildest. Im Falle von St.02 hättest du dero dann sogar gleich 2 ...
Dein "Teil_OK" für die St.01 wäre : keins der Bits ist gesetzt. Wenn du nun Ablauf-Freigabe für die Station hast (also Automatik und Drehtisch hat Takt gemacht) und das Teil_OK dann startest du den Zyklus der Station. In dem Zyklus (so nahe wie möglich an der Realität im Ablauf) setzt du dann das betreffende Bit im Schiebespeicher - damit hast du dann auch gleich bewirkt, dass die Station das erstmal nicht wieder machen würde (der Platz ist ja nun nicht mehr leer).

Bei St.02 müßtest du in der Schrittkette 3 verschiedenene Einsprungbedingungen haben - einmal, wenn kein Kontakt eingelegt ist, dann wenn der erste Kontakt drin ist, aber nicht der zweite und für die Sicherheit mußt du die Alternative Kontakt 2 ist da aber nicht Kontakt 1 auch haben. Entsprechend des Arbeitsfortschritts setzt auch diese Station dann den Schiebespeicher.

Etwas tricky wird es bei der Kamera-Prüfung. Die kann ja auch ein NIO produzieren. Dieses Merkmal solltest du auch im Schiebespeicher haben - damit kannst du dann die Entnahme NIO steuern. Außerdem solltest du auch berücksichtigen, dass einige der Stationen einen Ablauf-Fehler produzieren könnten (z.B. die Station, die das Ganze verpresst). Ablauf-Fehler heißt (bei mir), dass die Station aus irgend einem Grund ihren Zyklus nicht beenden kann. In dem Fall setze ich den ZSB auf NIO und schleuse ihn dann aus.

Willst du nun die ggf. mehreren NIO-Gründe unterscheiden können (unterschiedliche Zählung oder Sortierung) dann brauchst du entweder einen NIO-Code, den du schreibst oder du hast mehrere NIO-Bits.

Bitte beachten (meißt ist es so) : hat eine Station NIO geschrieben dann müssen meißt die folgenden Bearbeitungs-Stationen nicht mehr arbeiten.

Hilft dir das etwas weiter ?

Gruß
Larry
 
Ein UDT Tisch ist doch doof.
Was interessiert der Tisch und wie der konfiguriert ist?
Das BT ist doch ausschlaggebend.

Ich suche dir ein Beispiel für eine Fahrplan und schick den dir dann.


bike
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dies muss am Anfang beschrieben werden. Im Normalfall wäre Pos0=1, Pos1=0, Pos2=0, Pos3=2, Pos4=1, Pos5=0, Pos6=1, Pos7=1, Pos8=0, Pos9=1, Pos10=1

DB11: array[0..10] of UDT11; Name RTT

Bei jedem Takt wird ein Blockmove von n auf n+1 gemacht, wobei angefangen wird 10 löschen/ID weitergeben an nächste Station, 9 auf 10, 8 auf 9, ..., 0 auf 1, 0 löschen

PosX: Soll eine Station nicht bearbeitet werden muss einfach eine 0 eingetragen werden.
Die Nummer wird an die jeweilige Station übergeben, bei 0 muss die Station nichts machen.
Bei 1 wird die z.B. Schrittkette der Station einmal durchlaufen. Am Ende der Schrittkette wird die Nummer um eins reduziert und das Bit Teil_iO oder Teil_niO gesetzt.

Teil_vorhanden: Wenn ein Teil vorhanden ist das Bit TRUE. So können z.B. auch Teile ein- und ausgeschleust werden

Teil_iO / Teil_niO: Am Ende der Bearbeitung einer Station wird eins der beiden Bits geschrieben.
Man könnte noch realisieren, dass wenn eine Station ein Teil_niO einträgt, die nächsten Stationen(z.B. Druckerstation) nicht mehr arbeiten braucht.
Entweder durch Eintragen von 0 in RTT[x].Teil.Pos7, wobei x die aktuelle Position ist.
Oder durch Prüfen einer jeden Station bei start nicht nur auf ungleich 0 sondern auch auf NOT Teil_niO als Startbedingung.

Ausschleußstation:
Wenn ein Teil_niO = TRUE wird es hier ausgeschleust und Teil_vorhanden=FALSE und/oder Pos10=0. Geschmackssache

Ich hoffe, ich habe nichts vergessen. War doch etwas länger als gedacht.

Gruß

Lieben Dank für dieses Beispiel netsroht!

Ich weiß nicht warum, aber ich habe teilweise noch immer Probleme es zu verstehen... aber ich glaube viel ausführlicher kann man es wohl nicht mehr beschreiben, so dass ich es auch komplett verstehe!

Mir ist z.B. nicht klar:

1)
Warum ist "Pos1 ist zwischen Station 1 und Station 2" und nicht exakt Station 2? Gleiches gilt für Pos2, Pos5 und Pos8.

2)
Du schreibst: Im Normalfall wäre Pos0=1, Pos1=0, Pos2=0, Pos3=2, Pos4=1, Pos5=0, Pos6=1, Pos7=1, Pos8=0, Pos9=1, Pos10=1

Ist Pos1=0, weil es nicht exakt die Station 2 ist, oder warum steht hier z.B. eine Null? Wenn man an mehrere Varianten denkt, dann könnte dieses Vorbelegen von Pos doch durch die Auswahl der Variante geschehen, oder?

3)
ID als String; ist es hier so gedacht, dass nacheinander hier steht: 1, dann 2, dann 3, usw. für jedes Teil? Also, damit man weiß es handelt sich um Teil1, Teil2, usw. Und wird das durch die Einlegestation beschrieben?
 
Du siehst an den Beiträgen vor meinem, dass es viele Möglichkeiten für die Lösung gibt.
Ich bleibe mal bei meinem Vorschlag (warum auch nicht 8)):

Die Stationen erfahren, dass sie an der Reihe sind in dem du ein "Teil_OK_fuer_Bearbeitung" bildest. Im Falle von St.02 hättest du dero dann sogar gleich 2 ...
Dein "Teil_OK" für die St.01 wäre : keins der Bits ist gesetzt. Wenn du nun Ablauf-Freigabe für die Station hast (also Automatik und Drehtisch hat Takt gemacht) und das Teil_OK dann startest du den Zyklus der Station. In dem Zyklus (so nahe wie möglich an der Realität im Ablauf) setzt du dann das betreffende Bit im Schiebespeicher - damit hast du dann auch gleich bewirkt, dass die Station das erstmal nicht wieder machen würde (der Platz ist ja nun nicht mehr leer).


Hilft dir das etwas weiter ?

Gruß
Larry


Also ganz ehrlich, ich glaube ich gebe an dieser Stelle auf!

Nun habe ich den Ablauf nach deinem Beispiel erstellt - d.h. ein fertiger Platz hat ein Bit im Schiebespeicher gesetzt. Soweit ok!

Wo bilde ich jetzt "Teil_OK_fuer_Bearbeitung" und wo schreibe ich das hin? Das muss doch alles passieren, bevor die Bits im Speicher (wie von mir dargestellt) gesetzt werden können.

Es muss doch erst eine Station wissen ob sie arbeiten muss, bevor sie ein Bit im Speicher setzen kann... :confused:
 
@Bapho:
ich würde den UDT gerade NICHT Tisch nennen.

Vom Verständnis her würde ich den DB Tisch nennen und den UDT Teil.
Ich verstehe es so, dass der UDT ein Bauteil wiederspiegelt und alle Informationen hat, die es auf dem Tisch benötigt.

Jetzt taktet der Tisch weiter, d.h. der UDT wird um eins im DB verschoben.

Ansichtssache eben ;)

Mir ging es eher um Prinzip, ich glaube spirit wird von den ganzen Varianten eher überfordert und ich wollte nur die Geschichte mit dem UDT verständlich darstellen.
Wie man das nun alles nennt und was man wo zählt ist glaube ich in diesem Stadium nicht relevant. Imho geht darum spirit das Prinzip step by step verständlich zu erklären. Bei den Details gibt es dann immer 2 Programmierer und 3 Meinungen.. :D

Mal so als Ansatz:
- Datenschubserei, FIFO usw.
- Abarbeitung der einzelnen Stationen
- Drehen des Tisches
- Schnittstellen, was ist davor oder danach...
- das alles unter einen Hut bringen und sinnvoll strukturiert verknüpfen
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Also ganz ehrlich, ich glaube ich gebe an dieser Stelle auf!
Gute Einstellung : Resignieren statt lesen, was geschrieben wurde und ein bißchen mitdenken ...

Die Frage :
Wo bilde ich jetzt "Teil_OK_fuer_Bearbeitung" und wo schreibe ich das hin? Das muss doch alles passieren, bevor die Bits im Speicher (wie von mir dargestellt) gesetzt werden können.

Es muss doch erst eine Station wissen ob sie arbeiten muss, bevor sie ein Bit im Speicher setzen kann... :confused:

... und die Antwort :
Dein "Teil_OK" für die St.01 wäre : keins der Bits ist gesetzt. Wenn du nun Ablauf-Freigabe für die Station hast (also Automatik und Drehtisch hat Takt gemacht) und das Teil_OK dann startest du den Zyklus der Station. In dem Zyklus (so nahe wie möglich an der Realität im Ablauf) setzt du dann das betreffende Bit im Schiebespeicher - damit hast du dann auch gleich bewirkt, dass die Station das erstmal nicht wieder machen würde (der Platz ist ja nun nicht mehr leer).

Bei St.02 müßtest du in der Schrittkette 3 verschiedenene Einsprungbedingungen haben - einmal, wenn kein Kontakt eingelegt ist, dann wenn der erste Kontakt drin ist, aber nicht der zweite und für die Sicherheit mußt du die Alternative Kontakt 2 ist da aber nicht Kontakt 1 auch haben. Entsprechend des Arbeitsfortschritts setzt auch diese Station dann den Schiebespeicher.

wie geht es nun weiter ?

Gruß
Larry
 
Lieben Dank für dieses Beispiel netsroht!

Ich weiß nicht warum, aber ich habe teilweise noch immer Probleme es zu verstehen... aber ich glaube viel ausführlicher kann man es wohl nicht mehr beschreiben, so dass ich es auch komplett verstehe!

Mir ist z.B. nicht klar:

1)
Warum ist "Pos1 ist zwischen Station 1 und Station 2" und nicht exakt Station 2? Gleiches gilt für Pos2, Pos5 und Pos8.

2)
Du schreibst: Im Normalfall wäre Pos0=1, Pos1=0, Pos2=0, Pos3=2, Pos4=1, Pos5=0, Pos6=1, Pos7=1, Pos8=0, Pos9=1, Pos10=1

Ist Pos1=0, weil es nicht exakt die Station 2 ist, oder warum steht hier z.B. eine Null? Wenn man an mehrere Varianten denkt, dann könnte dieses Vorbelegen von Pos doch durch die Auswahl der Variante geschehen, oder?

3)
ID als String; ist es hier so gedacht, dass nacheinander hier steht: 1, dann 2, dann 3, usw. für jedes Teil? Also, damit man weiß es handelt sich um Teil1, Teil2, usw. Und wird das durch die Einlegestation beschrieben?


Zu 1)
Der Tisch darf ja immer nur genau eine Position takten und dann müssen die Stationen arbeiten.
Wenn nur genau ein Teil im Rundtakttisch liegt könnte von Station 1 gleich zu Station 2 durchgetaktet werden.
Wenn aber mehr als ein Teil vorhanden ist, z.B. an Pos0 und an Pos6. Jetzt darf der RTT nur genau einmal takten, nämlich von Pos6 auf Pos7. Und jetzt steht das andere Teil an Pos1. Und das Teil muss ja wissen, wo es steht.

Zu 2)
Ja

Zu 3)
Hier ist gedacht, dass Du eine Rückverfolgbarkeit machen kannst. D.h. von der vorgelagerten Anlage wird eine ID übergeben. Oder der Benutzer scannt einen Barcode ein. Oder Du lässt es weg, wenn Du es nicht brauchst. Für die Funktionalität ist es nicht notwendig.
 
Gute Einstellung : Resignieren statt lesen, was geschrieben wurde und ein bißchen mitdenken ...

wie geht es nun weiter ?

Gruß
Larry

Na Augen zu und durch Larry! ;)

Also ganz ehrlich - ich war gestern total geschafft von den vielen Möglichkeiten und Variablen - ist echt totales Neuland für mich. Und doch bin ich euch sehr dankbar für die zahlreichen Anregungen. Habe mich abends dann nochmals in Ruhe hingesetzt und bin mit Blatt und Stift nochmals alles durchgegangen. Was macht frau abends sonst auch schon? :p

Und bis jetzt habe ich (dank eurer Hilfe) jedes Projekt verwirklichen können; ich lasse aber sicherheitshalber jede fertige "Maschine" von einem Elektriker abnehmen...


Wollte jetzt einfach nochmals bei einem Beispiel bleiben - wenn ich das ganz verstanden habe, dann verstehe ich evtl. auch die anderen...

Habe jetzt mal aus dem Beispiel von netsroht so ein Array of UDT konstruiert; könntet ihr bitte mal schauen, ob der Ausschnitt daraus so ok ist?

Darin sind jetzt allerdings nicht die Trays zwischen den Stationen aufgeführt; würde ich im realen Projekt dann aber noch nachholen:

DB11.jpg


Nun noch ein Problemchen; ich muss ja bei jedem Takten einen Blockmove von n auf n+1 machen. Die Fkt. kann ich ja durch einen Merker aufrufen, der beim Takten gesetzt wird. Aber was genau muss ich hinter Quelle/Ziel schreiben, um z.B. den DB-Inhalt von ZWEI nach DREI zu kopieren?

Blockmove.jpg

Achja, netsroht hatte noch geschrieben, dass zunächst die Pos10 gelöscht und die ID an die nächste Station weitergegeben werden muss. Ist der Grund dafür der, dass man ansonsten die ID überschreibt?

Lieben Dank euch!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das zweite Problemchen ist relativ einfach. In AWL rufst du den Blockmove sooft auf wie du Plätze auf dem RT hast - 1. Beim ersten Aufruf kopierst du den vorletzen Platz auf den letzten. Beim zweiten Aufruf kopierst du den vorvorletzen auf den vorletzen usw.

In SCL läst sich das auch bequem im einer Schleife erschlagen.
 
Habe jetzt mal aus dem Beispiel von netsroht so ein Array of UDT konstruiert; könntet ihr bitte mal schauen, ob der Ausschnitt daraus so ok ist?

Hat so ja schonmal viel schönes. Das gute, wenn du es mit UDTs machst. Du kannst jederzeit was nachrüsten und es wird überall nachgeführt.
Es ist also nicht nötig alles aufzublasen weil man es vielleicht mal brauchen könnte.

Nun noch ein Problemchen; ich muss ja bei jedem Takten einen Blockmove von n auf n+1 machen. Die Fkt. kann ich ja durch einen Merker aufrufen, der beim Takten gesetzt wird. Aber was genau muss ich hinter Quelle/Ziel schreiben, um z.B. den DB-Inhalt von ZWEI nach DREI zu kopieren?

Das würde ich in SCL machen. Also ohne blockmove.

Code:
ArrayofUDT[10] := ArrayofUDT[9];

Etwas übersichtlicher und du kannst den Platz über einen Index zuweisen und z.B. mit ner for Schleife abarbeiten.
Also einen FIFO direkt mit der ganzen Struktur des UDT abarbeiten. Spart n haufen Tiparbeit.

Achja, netsroht hatte noch geschrieben, dass zunächst die Pos10 gelöscht und die ID an die nächste Station weitergegeben werden muss. Ist der Grund dafür der, dass man ansonsten die ID überschreibt?

Es wird nicht nur die ID überschrieben sondern die ganze Struktur von Index 10 das heisst man muss den Inhalt dieser Struktur zur nächsten Station retten bevor man den Fifo weiterschiebt.

mfG René
 
Das zweite Problemchen ist relativ einfach. In AWL rufst du den Blockmove sooft auf wie du Plätze auf dem RT hast - 1. Beim ersten Aufruf kopierst du den vorletzen Platz auf den letzten. Beim zweiten Aufruf kopierst du den vorvorletzen auf den vorletzen usw.

In SCL läst sich das auch bequem im einer Schleife erschlagen.

Danke Aventinus.

1)
Aber vor dem mehrmaligen Anwenden von Blockmove muss ich schon zuerst die ID "retten" und die Pos10 löschen, oder?

2)
Und was müsste beim Kopieren in der SFC20 hinter Quelle/Ziel geschrieben werden, um z.B. den DB11-Inhalt (aus meinem Thread #31) von ZWEI nach DREI zu kopieren?
 
Danke Aventinus.

1)
Aber vor dem mehrmaligen Anwenden von Blockmove muss ich schon zuerst die ID "retten" und die Pos10 löschen, oder?

2)
Und was müsste beim Kopieren in der SFC20 hinter Quelle/Ziel geschrieben werden, um z.B. den DB11-Inhalt (aus meinem Thread #31) von ZWEI nach DREI zu kopieren?

Zu 1)
vollmi schrieb:
Es wird nicht nur die ID überschrieben sondern die ganze Struktur von Index 10 das heisst man muss den Inhalt dieser Struktur zur nächsten Station retten bevor man den Fifo weiterschiebt.

Zu 2)
Basierend auf einem DB mit einem Array aus UDT
CALL "BLKMOV"
SRCBLK :="DB_Rundtakttisch".Index[2]
RET_VAL:=#retvalue
DSTBLK :="DB_Rundtakttisch".Index[3]
 
Das würde ich in SCL machen. Also ohne blockmove.

Code:
ArrayofUDT[10] := ArrayofUDT[9];

Etwas übersichtlicher und du kannst den Platz über einen Index zuweisen und z.B. mit ner for Schleife abarbeiten.
Also einen FIFO direkt mit der ganzen Struktur des UDT abarbeiten. Spart n haufen Tiparbeit.


Es wird nicht nur die ID überschrieben sondern die ganze Struktur von Index 10 das heisst man muss den Inhalt dieser Struktur zur nächsten Station retten bevor man den Fifo weiterschiebt.

mfG René

Vielen Dank René,

jetzt also auch noch SCL! ;)

Ok, dann müsste ich aber diesen Code

Code:
ArrayofUDT[10] := ArrayofUDT[9];

x-mal (entsprechend der Anzahl der Plätze) in SCL schreiben, richtig?


Nochmals zum Verständnis:

Die Struktur von Index10 ist ja identisch mit der von Index9. Insofern ist es doch ok, wenn Index9 auf Index10 kopiert wird, nachdem die ID aus Index10 "gesichert" wurde, oder habe ich da schon wieder einen Denkfehler?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
x-mal (entsprechend der Anzahl der Plätze) in SCL schreiben, richtig?

entweder das (bei 10 plätzen noch okay)

oder so

Code:
FOR index := 10 TO 1 BY -1 DO    ArrayofUDT[index] := ArrayofUDT[index - 1];
END_FOR;

das macht dann grundsätzlich das gleiche. Braucht auch genausoviel Zykluszeit, aber ist halt lesbarer als 1000 mal.
Code:
[COLOR=#333333]ArrayofUDT[10] := ArrayofUDT[9];[/COLOR]

Die Struktur von Index10 ist ja identisch mit der von Index9. Insofern ist es doch ok, wenn Index9 auf Index10 kopiert wird, nachdem die ID aus Index10 "gesichert" wurde, oder habe ich da schon wieder einen Denkfehler?

Die Struktur ist identisch ja. Aber der Inhalt natürlich nicht.
An jeder Station wird der Inhalt ja verändert und die nächste Station welche ja nur ihren Index des Arrays sieht muss doch wissen was am aktuellen Werkstück getan wurde und noch getan werden muss.
Darum wird der komplette Inhalt weitergeschoben.

Du hast dir für den Start nicht gleich die einfachste Aufgabe ausgesucht. Aber das wird schon ;)

mfG René
 
Die Struktur ist identisch ja. Aber der Inhalt natürlich nicht.
An jeder Station wird der Inhalt ja verändert und die nächste Station welche ja nur ihren Index des Arrays sieht muss doch wissen was am aktuellen Werkstück getan wurde und noch getan werden muss.
Darum wird der komplette Inhalt weitergeschoben.

Du hast dir für den Start nicht gleich die einfachste Aufgabe ausgesucht. Aber das wird schon ;)

mfG René

Lieben Dank René;

ja ein wahres Wort! Darf hier ja nicht zuviel schreiben; Chef "könnte" ja mitlesen...

Ich finde es nur etwas schade, wenn bei einer Energieanlagenelektronikerin die Kenntnisse eines Programmierers vorausgesetzt werden. Damals als unser Programmierer gegangen war, hieß es nur: "Das können Sie ja jetzt mitübernehmen - ist ja nicht so schwierig! Soviel dazu...

Ok, ist klar - Struktur ist identisch, aber der Inhalt natürlich nicht. Ich glaube ich habe den Satz von User netsroht falsch verstanden, als er geschrieben hat: "..., wobei angefangen wird 10 löschen/ID weitergeben an nächste Station, ..."

War das einfach nur so gemeint?

Kopiere Index9 auf Index10, Index8 auf Index9, Index7 auf Index8, Index6 auf Index7, Index5 auf Index6, Index4 auf Index5, Index3 auf Index4, Index2 auf Index3, Index1 auf Index2, Index0 auf Index1.

1)
Dann entsteht ja nach einem Drehtakt die Situation, dass in Index0 und Index1 der gleiche Inhalt steht. Dann muss ja jetzt Index0 nach dem Kopiervorgang mit der Ursprungskonfiguration neu beschrieben werden, oder?

2)
Es ist schon so, dass z.B. Station1 immer nur auf Index[1].Position1, Station2 immer nur auf Index[2].Position2, usw. schauen, wenn es darum geht wie oft sie arbeiten müssen?


Und noch zu SCL:

"ArrayofUDT" muss ich schon als VAR_IN_OUT deklarieren, richtig? Aber als welchen Datentyp?

"index" kann ja vermutlich als VAR deklariert werden.
 
Kopiere Index9 auf Index10, Index8 auf Index9, Index7 auf Index8, Index6 auf Index7, Index5 auf Index6, Index4 auf Index5, Index3 auf Index4, Index2 auf Index3, Index1 auf Index2, Index0 auf Index1.

Genau so ist das gedacht. Je nach grösse des Arrays frisst das aber natürlich auch zykluszeit. GGF muss man das auf mehrere Zyklen aufteilen. Du jetzt nicht, aber halt im Hinterkopf behalten.

Dann entsteht ja nach einem Drehtakt die Situation, dass in Index0 und Index1 der gleiche Inhalt steht. Dann muss ja jetzt Index0 nach dem Kopiervorgang mit der Ursprungskonfiguration neu beschrieben werden, oder?

Das ist korrekt auf Index0 kommt dann entweder eine Grundkonfiguration mit ner neuen ID (optional) oder wenn der Drehtisch einen Vorgänger hat kriegt das Array.Index[0] von diesem Drehtisch den Inhalt von der Vorgängerstation Array.Index[10]

Es ist schon so, dass z.B. Station1 immer nur auf Index[1].Position1, Station2 immer nur auf Index[2].Position2, usw. schauen, wenn es darum geht wie oft sie arbeiten müssen?

Korrekt

Und noch zu SCL:

"ArrayofUDT" muss ich schon als VAR_IN_OUT deklarieren, richtig? Aber als welchen Datentyp?

"index" kann ja vermutlich als VAR deklariert werden.

"ArrayofUDT" muss ein als VAR_IN_Out deklariert sein,

Code:
   ArrayofUDT : ARRAY[0..100] OF testudt ;
testudt wäre jetzt dein UDT das du definiert hast und die Arraygrösse muss mindestens so gross sein wie das Array das du anhängen willst.

Index kann in VAR oder Temp. da in einem Zyklus abgearbeitet.
Wenn man dass dann z.B. mit WHILE über mehrere Zyklen verteilt muss dass beachtet werden. Wird dann aber eh aufwändiger.

mfG René
 
Zurück
Oben