Task-Problem und Optimierung bei CoDeSys
-
- Null-Leiter
- Beiträge: 4
- Registriert: Mittwoch 2. Oktober 2013, 08:52
Task-Problem und Optimierung bei CoDeSys
Guten Morgen miteinander,
gleich vorweg ich bin noch Anfänger in Sachen Strukturierter Text und bitte um Eure Hilfe, ins besondere im ersten FallDer Anhang müsste die Endung pro haben (leider konnte sie so nicht hochgeladen werden und habe diese dann in .pdf umgewandelt
1.Problem
Ich habe im beigefügten CoDeSys-Programm ein Programm "Werkstueck_Verwaltung" welches ich mit einem weiteren "Visu_Band" in einen Task mit einer Zyklenzeit von 1s und der Priorität 5 (niedrigste meines Programms) eingefügt habe.
Ursprünglich hatte ich die Fehlermeldung beim Starten des Programms, in der Simulation, die Fehlermedlung:Endlos-Schleife (nur bei Priorität:2 nicht bei 5). Ich habe die letzte Anweisung (in Werkstueck_Verwaltung in eine IF-Anweisung (zuvor While) umgeändert und es ging
Mein Problem ist nun, wenn ich die Variable "Stueck-Annahme" auf True setzte/force wird bei Priorität 5 die IF-Anweisung nicht ausgeführt, bei Priorität 2 klappt dies teilweise.
Ich habe bewusst, die zyklische Zeit auf lediglcih 1s gesetzt, da die anderern Programmteile Vorrang haben müssen.
-> Was habe ich falsch gemacht????
2.Frage/Vereinfachung
Auch in diesem Programm "WErkstueck_Verwalt" habe ich versucht, mit den zwei Case-Anwendungen Werte in die Visu zu schreiben und anschließend programminterne Variable wieder mit dem neuen, evtl. durch Eingabe, veränderten Wert, zu beschreiben. Kann man hier evtl. ,.. arbeiten?
Das Ergebnis sollte sein, es gibt ca. 30 verschiedene Werkstücke mit jeweils ca. 12 Parametern (siehe 1. Zeile Case =vollständig), dass diese Variablen über die Visu geändert werden können.
Wird nun in der Visuvalisierung z.B. das Werkstück 15 aufgerufen, so sollen die 12 Parameter in die Visu PLC_VISU geladen werden (alle 12 Variabeln stammen aus z.B.Werkstueck_15 und werden auf die Variable ..._NrX geschrieben).
Wird nun der Wert über die nummerische Anzeige geändert oder boolsche_Elemente angeklickt, müssen anschließend die Änderungen oder einfach alle Parameter wieder in das Programm z.B. Werkstueck_15 geschrieben werden.
3a.Visu-Frage
Ein Linienzug soll mit einem variablen Ende und einem fixen Ende in der Visu angezeigt werden. Wie ist dies möglich, denn das eine Ende darf sich nicht bewegen und das andere Ende bewegt sich lediglich in X-Richtung (Folge: Pfreillänge wird kleiner und gleichzeitg weißt diese dann immer wieder einen anderen Winkel auf +
3b.Visu-Frage
Ein Viereck soll sich in x-richtung bewegen (realisiert) und gleichzeitg soll die X-Länge variabel sein; die y-Richtung jedoch nur eine fixe oder zwei fixe Größen annehmen (=nicht skaliert).
Vielen Dank für Eure Hilfe und Eurer Verständnis, bzgl. der falschen, technischen Ausdrucksweise. Ich freue mich über Eure Ratschläge.
Grüße
Codesys123456
gleich vorweg ich bin noch Anfänger in Sachen Strukturierter Text und bitte um Eure Hilfe, ins besondere im ersten FallDer Anhang müsste die Endung pro haben (leider konnte sie so nicht hochgeladen werden und habe diese dann in .pdf umgewandelt
1.Problem
Ich habe im beigefügten CoDeSys-Programm ein Programm "Werkstueck_Verwaltung" welches ich mit einem weiteren "Visu_Band" in einen Task mit einer Zyklenzeit von 1s und der Priorität 5 (niedrigste meines Programms) eingefügt habe.
Ursprünglich hatte ich die Fehlermeldung beim Starten des Programms, in der Simulation, die Fehlermedlung:Endlos-Schleife (nur bei Priorität:2 nicht bei 5). Ich habe die letzte Anweisung (in Werkstueck_Verwaltung in eine IF-Anweisung (zuvor While) umgeändert und es ging
Mein Problem ist nun, wenn ich die Variable "Stueck-Annahme" auf True setzte/force wird bei Priorität 5 die IF-Anweisung nicht ausgeführt, bei Priorität 2 klappt dies teilweise.
Ich habe bewusst, die zyklische Zeit auf lediglcih 1s gesetzt, da die anderern Programmteile Vorrang haben müssen.
-> Was habe ich falsch gemacht????
2.Frage/Vereinfachung
Auch in diesem Programm "WErkstueck_Verwalt" habe ich versucht, mit den zwei Case-Anwendungen Werte in die Visu zu schreiben und anschließend programminterne Variable wieder mit dem neuen, evtl. durch Eingabe, veränderten Wert, zu beschreiben. Kann man hier evtl. ,.. arbeiten?
Das Ergebnis sollte sein, es gibt ca. 30 verschiedene Werkstücke mit jeweils ca. 12 Parametern (siehe 1. Zeile Case =vollständig), dass diese Variablen über die Visu geändert werden können.
Wird nun in der Visuvalisierung z.B. das Werkstück 15 aufgerufen, so sollen die 12 Parameter in die Visu PLC_VISU geladen werden (alle 12 Variabeln stammen aus z.B.Werkstueck_15 und werden auf die Variable ..._NrX geschrieben).
Wird nun der Wert über die nummerische Anzeige geändert oder boolsche_Elemente angeklickt, müssen anschließend die Änderungen oder einfach alle Parameter wieder in das Programm z.B. Werkstueck_15 geschrieben werden.
3a.Visu-Frage
Ein Linienzug soll mit einem variablen Ende und einem fixen Ende in der Visu angezeigt werden. Wie ist dies möglich, denn das eine Ende darf sich nicht bewegen und das andere Ende bewegt sich lediglich in X-Richtung (Folge: Pfreillänge wird kleiner und gleichzeitg weißt diese dann immer wieder einen anderen Winkel auf +
3b.Visu-Frage
Ein Viereck soll sich in x-richtung bewegen (realisiert) und gleichzeitg soll die X-Länge variabel sein; die y-Richtung jedoch nur eine fixe oder zwei fixe Größen annehmen (=nicht skaliert).
Vielen Dank für Eure Hilfe und Eurer Verständnis, bzgl. der falschen, technischen Ausdrucksweise. Ich freue mich über Eure Ratschläge.
Grüße
Codesys123456
- Dateianhänge
-
- Kopie von Kantenautomat-aktuell-5.pdf
- (370.12 KiB) 529-mal heruntergeladen
-
[Die Dateierweiterung txt wurde deaktiviert und kann nicht länger angezeigt werden.]
-
- Null-Leiter
- Beiträge: 321
- Registriert: Dienstag 6. Februar 2007, 22:55
Wie kommst Du darauf? Da Codesys eine der meistverbreiteten Strukturierter-Text-Varianten zu SPS-Programmierung ist, ist die Frage hier genau richtig.Etrick hat geschrieben:Missglücktes Marketing oder nur im falschen Forum???
Ich bezweifle zwar, dass sie jemand beantworten kann, aber das steht auf einem anderen Blatt
Gruß,
Frank
-
- Null-Leiter
- Beiträge: 49
- Registriert: Mittwoch 28. August 2013, 13:39
Dein erstes Problem klingt nach einem Programm- bzw. Logikfehler,
wenn du mal den Programmteil für deion erstes Problem postest schau ich es mir mal an, ich kann mit deinen Dateien nicht viel anfangen, hab hier kein Codesys und will es auch nicht installieren.
Auch zu zweitens kann ich nur was sagen, wenmn ich es gesehen hab.
Mit der Codesys Visu hab ich noch nie was gemacht, aber bei den anderen Sachen kann ich dir evtl. helfen.
wenn du mal den Programmteil für deion erstes Problem postest schau ich es mir mal an, ich kann mit deinen Dateien nicht viel anfangen, hab hier kein Codesys und will es auch nicht installieren.
Auch zu zweitens kann ich nur was sagen, wenmn ich es gesehen hab.
Mit der Codesys Visu hab ich noch nie was gemacht, aber bei den anderen Sachen kann ich dir evtl. helfen.
Nüchtern betrachtet war es besoffen besser.
-
- Null-Leiter
- Beiträge: 4
- Registriert: Mittwoch 2. Oktober 2013, 08:52
Hallo Bapho,Bapho hat geschrieben:Dein erstes Problem klingt nach einem Programm- bzw. Logikfehler,
wenn du mal den Programmteil für deion erstes Problem postest schau ich es mir mal an, ich kann mit deinen Dateien nicht viel anfangen, hab hier kein Codesys und will es auch nicht installieren.
Auch zu zweitens kann ich nur was sagen, wenmn ich es gesehen hab.
Mit der Codesys Visu hab ich noch nie was gemacht, aber bei den anderen Sachen kann ich dir evtl. helfen.
nochmals ein zweiter Anlauf, bezieht sich nur auf den Punkt Vereinfachung:
Ich möchte kurz erklären, was ich vorhabe]
In der Visuvalisierung (PLC_VISU) habe ich 5 Eingabefelder (Word-Variablen, [%s mm]) und mehrere boolsche "Taster" [Pfeile und Quadrate mit Nummmern].
Diese Eingabefelder und boolschen Taster können bei den bis zu 30 Werkstücken verschiedene Stellungen und Eingaben annehmen, die im jeweiligen Programm Werkstueck_1, Werksteuck_2, ... _30 benötigt und "gespeichert" werden müssen; zur weiteren Berechnung und falls vom Bediener wieder gewünscht, in die VISU geladen werden.
Ich versuchs nun mal mit einem Beispiel:
Wird das Werkstück 1 (blaues Rechteck in der PLC_VISU) angeglickt oder aber die Werkstücknummer bei den drei roten Fragezeichen (beides noch nicht realisiert) eingegeben so sollen die 5 Eingabefelder (Word-Variablen, [%s mm]) und mehrere boolsche "Taster" mit den Werten aus dem Programm des angeklickten Werkstücks (z.B. 8 für Werksteuck_8) "beschrieben werden". Anschließend kann der Benutzer die Werte der Eingabefelder ändern oder boolschen Taster betätigen und dies wird sofort im Werksteuck_8 geändert; innerhalb einer Sekunde (Zyklenzeit, da das Werkstück, bzw. deren Parameter auch eine Stunde lang aufgerufen sein kann.
Wird nun ein anderes Werkstüeck ausgewählt, so muss vom jeweiligen Programm (z.B. Werkstueck_5) die jeweiligen WErte wieder neu geladen werden und anschließend wieder in diesem Programm (z.B. Werkstueck_5) geschieben werden.
Beispiel am Programm:
Ausgangslage, die Variable VISU_WerksteuckNR_Eingabe verändert sich, z.B. in 3 (durch Eingabe ??? = 3, in der VISU).
Zuerst werden die benötigen Variabeln aus dem Programm, hier im Beispiel: Werksteuck_3 [VISU_S1_SX_3] gelesen und zwar nur einmal, deshalb dachte ich an eine Repeat-Schleife und anschließend in der Visu angezeigt [VISU_S1_SX_NrX].
Durch die nachfolgende Gleichsetzung der internen Variable "VISU_WerksteuckNR_Eingabe_Speicherung", wird die Repeat-Schleife nur einmal durchlaufen und anschließend sorgt die IF-Schleife für die Aktualisierung, bei einer Eingabe in der Visu, der jeweiligen Variabeln im Programm Werksteuck_3 [VISU_S1_SX_3], bis sich die VISU_WerksteuckNR_Eingabe ändert.
.
VISU_WerksteuckNR_Eingabe_Speicherung:= VISU_WerksteuckNR_Eingabe;
REPEAT
CASE VISU_WerksteuckNR_Eingabe OF
1:
VISU_S1_SX_NrX := VISU_S1_SX_1;
VISU_Anfangswert_1_NrX := VISU_Anfangswert_1_WzSt_1; (vereinfacht mit nur zwei Variablen, insgesamt pro
Werkstück >10
2: ...
3:
VISU_S1_SX_NrX := VISU_S1_SX_3;
VISU_Anfangswert_1_NrX := VISU_Anfangswert_1_WzSt_3;
END_CASE
UNTIL VISU_WerksteuckNR_Eingabe_Speicherung = VISU_WerksteuckNR_Eingabe END_REPEAT
IF VISU_WerksteuckNR_Eingabe_Speicherung = VISU_WerksteuckNR_Eingabe THEN
CASE VISU_WerksteuckNR_Eingabe OF
1:
VISU_S1_SX_1 := VISU_S1_SX_NrX;
VISU_Anfangswert_1_WzSt_1; := VISU_Anfangswert_1_NrX ;
2: ...
3:
VISU_S1_SX_3; := VISU_S1_SX_NrX;
VISU_Anfangswert_1_WzSt_3;:= VISU_Anfangswert_1_NrX;
END_CASE END_IF
Wie kann man dies nun einfacher realisieren, bzw. überhaupt korrekt realisieren?
Beispiel am Programm:
Zu diesem Auslesen/Anzeigen/Eingeben/Schreiben, oder wie auch immer :roll:
Nun kommt noch eine kleine Nebenbedingung hinzu: Die Werte, wie z.B. [VISU_S1_SX_3] müssen, wenn das Stück aktiviert wird (kein Zusammenhang mit der Visu, sondern eine interne Freigabe des Programms Werstueck_1), einmalig mit dem Wert der boolschen Eingabe in der PLC_VISU (rote Rechtecke, auch mit Zahlen, über dem langen grünen Rechteck) [VISU_Supp_1_AN_Allgm] " nur beschrieben werden" und weitere Werte (deklinierte Word-Variablen) werden genullt.
.
[Werkstueck_1], leicht abgeändert
R_TRIG(CLK: Stueck_3_aktiv = FALSE , Q=
VISU_S1_SX_3 := VISU_Supp_1_AN_Allgm;
VISU_Anfangswert_1_WzSt_3 := 0)
(Problem R_TRIG ist keine Funktion, die Ausführung soll einmalig, bei Wechsel von [Steuck_3_aktiv] vonTrue auf False erfolgen)
Ich habe dies erwähnt, nicht dass hieraus eine unmögliche Abhängigkeit entsteht,...
Würde mich über Eure Rückmeldunge freuen, auch evtl. über die anderen Punkte.
viele GRüße
-
- Null-Leiter
- Beiträge: 49
- Registriert: Mittwoch 28. August 2013, 13:39
Also ich versuch jetzt mal das ganze in eine Struktur zu bringen.
Ich programmiere sonst in SCL und das ganze soll als Weg dienen, ist also kein lauffähiges Programm.
Eins vorneweg, eine SPS läuft immer zyklisch und hat eine Zyklusüberwachung, deswegen immer schön vorsichtig mit Schleifen. Sollte das Programm sich einer verrennen steigt die SPS aus.
Ich mach mal ein Beispiel mit 3 Variablen.
Wenn also durch die Visu die Variable speichern auf true geht und eine Werkstücknummer angegeben ist, werden die 3 Variablen aus der Visu entsprechend umgespeichert, fertig.
Ich programmiere sonst in SCL und das ganze soll als Weg dienen, ist also kein lauffähiges Programm.
Eins vorneweg, eine SPS läuft immer zyklisch und hat eine Zyklusüberwachung, deswegen immer schön vorsichtig mit Schleifen. Sollte das Programm sich einer verrennen steigt die SPS aus.
Ich mach mal ein Beispiel mit 3 Variablen.
Code: Alles auswählen
if speichern = true and nummer <> 0 then
teil[nummer].wert1:=visu.wert1;
teil[nummer].wert2:=visu.wert2;
teil[nummer].wert3:=visu.wert3;
speichern := false;
// hier evtl. noch foglendes
nummer := 0
visu.wert1:=0;
visu.wert2:=0;
visu.wert3:=0;
//damist ist für den Bediener klar, dass seine Eingaben gespeichert wurden.
end_if
Nüchtern betrachtet war es besoffen besser.
-
- Null-Leiter
- Beiträge: 4
- Registriert: Mittwoch 2. Oktober 2013, 08:52
Bapho hat geschrieben:Also ich versuch jetzt mal das ganze in eine Struktur zu bringen.
Ich programmiere sonst in SCL und das ganze soll als Weg dienen, ist also kein lauffähiges Programm.
Eins vorneweg, eine SPS läuft immer zyklisch und hat eine Zyklusüberwachung, deswegen immer schön vorsichtig mit Schleifen. Sollte das Programm sich einer verrennen steigt die SPS aus.
Ich mach mal ein Beispiel mit 3 Variablen.Wenn also durch die Visu die Variable speichern auf true geht und eine Werkstücknummer angegeben ist, werden die 3 Variablen aus der Visu entsprechend umgespeichert, fertig.Code: Alles auswählen
if speichern = true and nummer <> 0 then teil[nummer].wert1:=visu.wert1].wert2:=visu.wert2; teil[nummer].wert3:=visu.wert3; speichern := false; // hier evtl. noch foglendes nummer := 0 visu.wert1:=0; visu.wert2:=0; visu.wert3:=0; //damist ist für den Bediener klar, dass seine Eingaben gespeichert wurden. end_if
Hallo Bapho,, das urdprüngliche Problem mit der Realisierung der austauschbaren Variablen über die Visu und das Programm haben sich erledigt. Da man die Variabeln seitens der Visu und gleichzeitg mit einem Programm "beschreiebn kann" und man somit die Werte nicht in die Visu schreiben und anschließend wieder auslesen muss (geht übrigens auch gar nicht, habe ich feststellen müssen). VIELEN DANK für deine Erklärung, aber vieleicht kannst Du mir beim hierbei einen Tipp geben:
Nachfolgend habe ich einen Programmabschnitt, der sich zwölf mal wiederholen würde und dieses Paket wiederum zwanzig Mal.
Voerst würde ich gerne wissen, kann man diesen nachfolgenden Programmteil (ersichtlich ist 1. und 2., wie gesagt es ginge bis 12.)vereinfachen (z.B. mit Arrays)?
Diese "Abschnitte" sollten jedoch immer parallel bzw. direkt nacheinander abgearbeitet werden, sofern z.B.
1. Stueck_1_aktiv = TRUE AND VISU_S1_SX_[1] = TRUE
2. Stueck_1_aktiv = TRUE AND VISU_S1_SX_[1] = TRUE, ... sind;also in einem Zyklus, nacheinander????
Ich habe nun die Variabeln, die sich zwischen 1. und 2. bzw. bis 12. verändern, orange markiert und die, die bereits ein Array erhalten und dich ändern sowie die bereits vorhandenen Arrys grün, diese verändern sich in 1-12 nicht. Siehe auch nachfolgendes Programm
(*Support 1. Standart-Bearbeitung oder Sonderstück-Bearbeitung*) 1.
IF Stueck_1_aktiv = TRUE AND VISU_S1_SX_[1] = TRUE
THEN IF VISU_S1_SX_AKTIV_[1] = TRUE AND VISU_Anfangswert_1_WzSt_[1] >0
THEN IF VISU_S1_MsNullp + VISU_S1_Start_Sonder + VISU_Anfangswert_1_WzSt_[1] < Anfangspos_Maschine_1 THEN A1 :=TRUE; ELSE A1 :=FALSE; END_IF
ELSE IF VISU_S1_MsNullp - VISU_S1_StRefp < Anfangspos_Maschine_1 THEN A2 :=TRUE; ELSE A2 :=FALSE; END_IF END_IF
IF VISU_S1_SX_AKTIV_[1] = TRUE AND VISU_Anfangswert_3_WzSt_[1] >0
THEN IF VISU_S1_MsNullp - VISU_S1_Ende_Sonder > Anfangspos_Maschine_1 - VISU_Bearbeitungswert_2_WzSt_[1] - VISU_Anfangswert_1_WzSt_[1] THEN B1 :=TRUE; ELSE B1 :=FALSE; END_IF
ELSE IF VISU_S1_MsNullp + VISU_S1_EndRefp > Anfangspos_Maschine_1 - Stuecklaenge_1 THEN B2 :=TRUE; ELSE B2 :=FALSE; END_IF END_IF
IF VISU_S1_SX_AKTIV_[1] = TRUE AND VISU_Bearbeitungswert_4_WzSt_[1] >0
THEN IF VISU_S1_MsNullp + VISU_S1_Start_Sonder + VISU_Anfangswert_3_WzSt_[1] + VISU_Bearbeitungswert_2_WzSt_[1] + VISU_Anfangswert_1_WzSt_[1] < Anfangspos_Maschine_1 THEN C :=TRUE; ELSE C :=FALSE; END_IF END_IF
IF VISU_S1_SX_AKTIV_[1] = TRUE AND VISU_Endwert_5_WzSt_[1] >0
THEN IF VISU_S1_MsNullp - VISU_S1_Ende_Sonder > Anfangspos_Maschine_1 - Stuecklaenge_1 + VISU_Endwert_5_WzSt_[1] THEN D1 :=TRUE; ELSE D1 :=FALSE; END_IF
ELSE IF VISU_S1_MsNullp + VISU_S1_EndRefp > Anfangspos_Maschine_1 - Stuecklaenge_1 THEN D2 :=TRUE; ELSE D2 :=FALSE; END_IF END_IF END_IF
IF (A1 = TRUE OR A2 = TRUE) AND (B1 = TRUE OR B2 = TRUE OR C =TRUE) AND (D1 = TRUE OR D2=TRUE) THEN S1_AN := TRUE; ELSE S1_AN := FALSE; END_IF
(*Support 2. Standart-Bearbeitung oder Sonderstück-Bearbeitung*) -2.
IF Stueck_1_aktiv = TRUE AND VISU_S2_SX_[1] = TRUE
THEN IF VISU_S2_SX_AKTIV_[1] = TRUE AND VISU_Anfangswert_1_WzSt_[1]>0
THEN IF VISU_S2_MsNullp + VISU_S2_Start_Sonder + VISU_Anfangswert_1_WzSt_[1]< Anfangspos_Maschine_1 THEN A21 :=TRUE; ELSE A21 :=FALSE; END_IF
ELSE IF VISU_S2_MsNullp - VISU_S2_StRefp < Anfangspos_Maschine_1 THEN A22 :=TRUE; ELSE A22 :=FALSE; END_IF END_IF
IF VISU_S2_SX_AKTIV_[1] = TRUE AND VISU_Anfangswert_3_WzSt_[1] >0
THEN IF VISU_S2_MsNullp - VISU_S2_Ende_Sonder > Anfangspos_Maschine_1 - VISU_Bearbeitungswert_2_WzSt_[1] - VISU_Anfangswert_1_WzSt_[1] THEN B21 :=TRUE; ELSE B21 :=FALSE; END_IF
ELSE IF VISU_S2_MsNullp + VISU_S2_EndRefp > Anfangspos_Maschine_1 - Stuecklaenge_1 THEN B22 :=TRUE; ELSE B22 :=FALSE; END_IF END_IF
IF VISU_S2_SX_AKTIV_[1] = TRUE AND VISU_Bearbeitungswert_4_WzSt_[1] >0
THEN IF VISU_S2_MsNullp + VISU_S2_Start_Sonder + VISU_Anfangswert_3_WzSt_[1] + VISU_Bearbeitungswert_2_WzSt_[1] + VISU_Anfangswert_1_WzSt_[1] < Anfangspos_Maschine_1 THEN C2 :=TRUE; ELSE C :=FALSE; END_IF END_IF
IF VISU_S2_SX_AKTIV_[1] = TRUE AND VISU_Endwert_5_WzSt_[1] >0
THEN IF VISU_S2_MsNullp - VISU_S2_Ende_Sonder > Anfangspos_Maschine_1 - Stuecklaenge_1 + VISU_Endwert_5_WzSt_[1] THEN D21 :=TRUE; ELSE D21 :=FALSE; END_IF
ELSE IF VISU_S2_MsNullp + VISU_S2_EndRefp > Anfangspos_Maschine_1 - Stuecklaenge_1 THEN D22 :=TRUE; ELSE D22 :=FALSE; END_IF END_IF END_IF
IF (A21 = TRUE OR A22 = TRUE) AND (B21 = TRUE OR B22 = TRUE OR C2 =TRUE) AND (D21 = TRUE OR D22=TRUE) THEN S2_AN := TRUE; ELSE S2_AN := FALSE; END_IF
Bitte um Eure Ratschläge
Vielen Dank
-
- Null-Leiter
- Beiträge: 4
- Registriert: Mittwoch 2. Oktober 2013, 08:52
Hallo miteinander,
ich habe nun, das Ganze in ein Programm integriert, mit einanderverflochtene Arrays. Nun meine Frage, wie kann dieser Komplez am schnellsten abgearbeitet werden, sodass die Berechnung gleich schnell erfolgt, wie wenn man das ganze komplett ausführlich (12*20) aufgliedern würde.
MEines Erachtens ist nun ein Schleife mit:
1. Zähler 1-12 [Supp]
2. Zähler 1-20 [Werks]
einzufügen.
= [Werks]= 1, Zähler 1=+1: [Supp] 1,2,3,...12 , dann Zähler 2+1
dann
= [Werks]= 2, Zähler 1=+1: [Supp] 1,2,3,...12
...
= [Werks]= 12, Zähler 1=+1: [Supp] 1,2,3,...12, dann Zähler 1 und 2 = wieder Reset:1
VAR_GLOBAL RETAIN PERSISTENT
IF1pos_Supp_ay2_vWerk_ay1_On: ARRAY [0..20] OF ARRAY [1..12] OF BOOL;
IF1neg_Supp_ay2_vWerk_ay1_On: ARRAY [0..20] OF ARRAY [0..12] OF BOOL;
IF2pos_Supp_ay2_vWerk_ay1_On: ARRAY [0..20] OF ARRAY [1..12] OF BOOL;
IF2neg_Supp_ay2_vWerk_ay1_On: ARRAY [0..20] OF ARRAY [1..12] OF BOOL;
IF3pos_Supp_ay2_vWerk_ay1_On: ARRAY [0..20] OF ARRAY [1..12] OF BOOL;
IF4pos_Supp_ay2_vWerk_ay1_On: ARRAY [0..20] OF ARRAY [1..12] OF BOOL;
IF4neg_Supp_ay2_vWerk_ay1_On: ARRAY [0..20] OF ARRAY [1..12] OF BOOL;
S_ay2_Werks_ay1AN: ARRAY [0..20] OF ARRAY [1..12] OF BOOL;
VISU_SUP_ay1_MsNullp_: ARRAY [1..12] OF WORD; (*Support 1-12 Maschienennullpunkt*)
VISU_SUP_ay1_StRefp_: ARRAY [1..12] OF BYTE; (*Support 1-12 Startrefernzpunkt* vom Mittelpunkt des Supports + Bearbeitung*)
VISU_SUP_ay1_EndRefp_: ARRAY [1..12] OF BYTE; (*Support 1-12 Endtrefernzpunkt, vom Mittelpunkt des Supports + Bearbeitung*)
VISU_SUP_ay1_Start_Sonder_: ARRAY [1..12] OF BYTE; (*Support 1-12 Startrefernzpunkt, vom Mittelpunkt des Supports - SonderBearbeitung*)
VISU_SUP_ay1_Ende_Sonder_: ARRAY [1..12] OF BYTE; (*Support 1-12 Endtrefernzpunkt, vom Mittelpunkt des Supports - SonderBearbeitung*) VISU_Anfangswert_1_WzSt_: ARRAY [0..20] OF WORD; (*Eingabe in Visu Anfangswert_1_ von Werkstueck 1-20 keine Bearbeitung; Visuvalisierung Stueck-Berabeitungs-Laengen*)
VISU_Bearbeitungswert_2_WzSt_: ARRAY [0..20] OF WORD; (*Eingabe in Visu Bearbeitungswert_2_ von Werkstueck 1-20 Bearbeitun; Visuvalisierung Stueck-Berabeitungs-Laengen*)
VISU_Anfangswert_3_WzSt_: ARRAY [0..20] OF WORD; (*Eingabe in Visu Anfangswert_3_ von Werkstueck 1-20 keine Bearbeitung; Visuvalisierung Stueck-Berabeitungs-Laengen*)
VISU_Bearbeitungswert_4_WzSt_: ARRAY [0..20] OF WORD; (*Eingabe in Visu Bearbeitungswert_4_ von Werkstueck 1-20, keine Bearbeitung; Visuvalisierung Stueck-Berabeitungs-Laengen*)
VISU_Endwert_5_WzSt_: ARRAY [0..20] OF WORD; (*Eingabe in Visu Bearbeitungswert_5_ von Werkstueck 1-20 keine Bearbeitung; Visuvalisierung Stueck-Berabeitungs-Laengen*)
VISU_Stuecklaenge_: ARRAY [0..20] OF WORD; (*Visu-Stuecklänge*)
VISU_SUP_ay2_ST_ay1_: ARRAY [0..20]OF ARRAY [1..12]OF BOOL; (*Support 1-12, für jeweiliges Werkstueck 1-20, Bearbeitung aktiv, Visuvalisierung Support Zustand Bearbeitung aktiv *)
VISU_SUP_SONDERaktiv_ay2_ST_ay1_: ARRAY [0..20]OF ARRAY [1..12]OF BOOL; (*Support 1, füR jeweiliges Werkstueck 1-20, Sonderlaengen-Bearbeitung aktiv, Visuvalisierung Support Zustand Sonderlaengen-Bearbeitung aktiv *)
END_VAR
(*Werkstueck 1 bis 20 für je Support 1-12. Standart-Bearbeitung oder Sonderstück-Bearbeitung*)
FOR Werks:=1 TO 20 DO OR 1 TO (Stueckzahlnummer)
FOR Supp:=1 TO 12 DO
END_FOR
END_FOR
ich habe nun, das Ganze in ein Programm integriert, mit einanderverflochtene Arrays. Nun meine Frage, wie kann dieser Komplez am schnellsten abgearbeitet werden, sodass die Berechnung gleich schnell erfolgt, wie wenn man das ganze komplett ausführlich (12*20) aufgliedern würde.
MEines Erachtens ist nun ein Schleife mit:
1. Zähler 1-12 [Supp]
2. Zähler 1-20 [Werks]
einzufügen.
= [Werks]= 1, Zähler 1=+1: [Supp] 1,2,3,...12 , dann Zähler 2+1
dann
= [Werks]= 2, Zähler 1=+1: [Supp] 1,2,3,...12
...
= [Werks]= 12, Zähler 1=+1: [Supp] 1,2,3,...12, dann Zähler 1 und 2 = wieder Reset:1
- Wäre dies so korrekt? Und was für eine Schleife oder wie wäre der Zählring auzubauen?
Wie sind die Tasks aufzubauen (freilaufend oder zyklisch? des weiteren sind noch andere Programmteile, die die gleiche Priorität haben sowie einige, die z.B. nur jede Sekunde ablaufen brauchen, vorhanden???
VAR_GLOBAL RETAIN PERSISTENT
IF1pos_Supp_ay2_vWerk_ay1_On: ARRAY [0..20] OF ARRAY [1..12] OF BOOL;
IF1neg_Supp_ay2_vWerk_ay1_On: ARRAY [0..20] OF ARRAY [0..12] OF BOOL;
IF2pos_Supp_ay2_vWerk_ay1_On: ARRAY [0..20] OF ARRAY [1..12] OF BOOL;
IF2neg_Supp_ay2_vWerk_ay1_On: ARRAY [0..20] OF ARRAY [1..12] OF BOOL;
IF3pos_Supp_ay2_vWerk_ay1_On: ARRAY [0..20] OF ARRAY [1..12] OF BOOL;
IF4pos_Supp_ay2_vWerk_ay1_On: ARRAY [0..20] OF ARRAY [1..12] OF BOOL;
IF4neg_Supp_ay2_vWerk_ay1_On: ARRAY [0..20] OF ARRAY [1..12] OF BOOL;
S_ay2_Werks_ay1AN: ARRAY [0..20] OF ARRAY [1..12] OF BOOL;
VISU_SUP_ay1_MsNullp_: ARRAY [1..12] OF WORD; (*Support 1-12 Maschienennullpunkt*)
VISU_SUP_ay1_StRefp_: ARRAY [1..12] OF BYTE; (*Support 1-12 Startrefernzpunkt* vom Mittelpunkt des Supports + Bearbeitung*)
VISU_SUP_ay1_EndRefp_: ARRAY [1..12] OF BYTE; (*Support 1-12 Endtrefernzpunkt, vom Mittelpunkt des Supports + Bearbeitung*)
VISU_SUP_ay1_Start_Sonder_: ARRAY [1..12] OF BYTE; (*Support 1-12 Startrefernzpunkt, vom Mittelpunkt des Supports - SonderBearbeitung*)
VISU_SUP_ay1_Ende_Sonder_: ARRAY [1..12] OF BYTE; (*Support 1-12 Endtrefernzpunkt, vom Mittelpunkt des Supports - SonderBearbeitung*) VISU_Anfangswert_1_WzSt_: ARRAY [0..20] OF WORD; (*Eingabe in Visu Anfangswert_1_ von Werkstueck 1-20 keine Bearbeitung; Visuvalisierung Stueck-Berabeitungs-Laengen*)
VISU_Bearbeitungswert_2_WzSt_: ARRAY [0..20] OF WORD; (*Eingabe in Visu Bearbeitungswert_2_ von Werkstueck 1-20 Bearbeitun; Visuvalisierung Stueck-Berabeitungs-Laengen*)
VISU_Anfangswert_3_WzSt_: ARRAY [0..20] OF WORD; (*Eingabe in Visu Anfangswert_3_ von Werkstueck 1-20 keine Bearbeitung; Visuvalisierung Stueck-Berabeitungs-Laengen*)
VISU_Bearbeitungswert_4_WzSt_: ARRAY [0..20] OF WORD; (*Eingabe in Visu Bearbeitungswert_4_ von Werkstueck 1-20, keine Bearbeitung; Visuvalisierung Stueck-Berabeitungs-Laengen*)
VISU_Endwert_5_WzSt_: ARRAY [0..20] OF WORD; (*Eingabe in Visu Bearbeitungswert_5_ von Werkstueck 1-20 keine Bearbeitung; Visuvalisierung Stueck-Berabeitungs-Laengen*)
VISU_Stuecklaenge_: ARRAY [0..20] OF WORD; (*Visu-Stuecklänge*)
VISU_SUP_ay2_ST_ay1_: ARRAY [0..20]OF ARRAY [1..12]OF BOOL; (*Support 1-12, für jeweiliges Werkstueck 1-20, Bearbeitung aktiv, Visuvalisierung Support Zustand Bearbeitung aktiv *)
VISU_SUP_SONDERaktiv_ay2_ST_ay1_: ARRAY [0..20]OF ARRAY [1..12]OF BOOL; (*Support 1, füR jeweiliges Werkstueck 1-20, Sonderlaengen-Bearbeitung aktiv, Visuvalisierung Support Zustand Sonderlaengen-Bearbeitung aktiv *)
END_VAR
(*Werkstueck 1 bis 20 für je Support 1-12. Standart-Bearbeitung oder Sonderstück-Bearbeitung*)
FOR Werks:=1 TO 20 DO OR 1 TO (Stueckzahlnummer)
FOR Supp:=1 TO 12 DO
Code: Alles auswählen
IF Stueck_ay1_aktiv_[Werks] = TRUE AND VISU_SUP_ay2_ST_ay1_[Werks][Supp] = TRUE
THEN
IF VISU_SUP_SONDERaktiv_ay2_ST_ay1_[Werks][Supp] = TRUE AND VISU_Anfangswert_1_WzSt_[Werks] >0
THEN
IF VISU_SUP_ay1_MsNullp_[Supp] + VISU_SUP_ay1_Start_Sonder_[Supp] +
VISU_Anfangswert_1_WzSt_[1] < Anfangspos_Maschine_ay1_[Werks]
THEN
1pos_Supp_ay2_vWerk_ay1_On :=TRUE;
ELSE
1pos_Supp_ay2_vWerk_ay1_On[Werks][Supp] :=FALSE ; END_IF
ELSE
IF VISU_SUP_ay1_MsNullp_[Supp] - VISU_SUP_ay1_StRefp_[Supp]
<Anfangspos_Maschine_ay1_[Werks]
THEN
1neg_Supp_ay2_vWerk_ay1_On :=TRUE;
ELSE
1neg_Supp_ay2_vWerk_ay1_On[Werks][Supp] :=FALSE; END_IF END_IF
IF VISU_SUP_SONDERaktiv_ay2_ST_ay1_[Werks][Supp] = TRUE AND VISU_Anfangswert_3_WzSt_[Werks] >0
THEN
IF VISU_SUP_ay1_MsNullp_[Supp] - VISU_SUP_ay1_Ende_Sonder_[Supp] >
Anfangspos_Maschine_ay1_[Werks] - VISU_Bearbeitungswert_2_WzSt_[Werks] -
VISU_Anfangswert_1_WzSt_[Werks]
THEN
2pos_Supp_ay2_vWerk_ay1_On[Werks][Supp] :=TRUE;
ELSE
2pos_Supp_ay2_vWerk_ay1_On :=FALSE; END_IF
ELSE
IF VISU_SUP_ay1_MsNullp_[Supp] + VISU_SUP_ay1_EndRefp_[Supp] >
Anfangspos_Maschine_ay1_[Werks] - Stuecklaenge_ay1_[Werks]
THEN
2neg_Supp_ay2_vWerk_ay1_On[Werks][Supp] :=TRUE;
ELSE
2neg_Supp_ay2_vWerk_ay1_On :=FALSE; END_IF END_IF
IF VISU_SUP_SONDERaktiv_ay2_ST_ay1_[Werks][Supp] = TRUE AND VISU_Bearbeitungswert_4_WzSt_[Werks] >0
THEN
IF VISU_SUP_ay1_MsNullp_[Supp] + VISU_SUP_ay1_Start_Sonder_[Supp] +
VISU_Anfangswert_3_WzSt_[Werks] + VISU_Bearbeitungswert_2_WzSt_[Werks] +
VISU_Anfangswert_1_WzSt_[Werks] < Anfangspos_Maschine_ay1_[Werks]
THEN
3pos_Supp_ay2_vWerk_ay1_On[Werks][Supp] :=TRUE;
ELSE
3pos_Supp_ay2_vWerk_ay1_On[Werks][Supp :=FALSE; END_IF END_IF
IF VISU_SUP_SONDERaktiv_ay2_ST_ay1_[Werks][Supp] = TRUE AND VISU_Endwert_5_WzSt_[Werks] >0
THEN
IF VISU_SUP_ay1_MsNullp_[Supp] - VISU_SUP_ay1_Ende_Sonder_[Supp] >
Anfangspos_Maschine_ay1_[Werks] - Stuecklaenge_ay1_[Werks] +
VISU_Endwert_5_WzSt_[Werks]
THEN
4pos_Supp_ay2_vWerk_ay1_On[Werks][Supp] :=TRUE;
ELSE
4pos_Supp_ay2_vWerk_ay1_On[Werks][Supp] :=FALSE; END_IF
ELSE
IF VISU_SUP_ay1_MsNullp_[Supp] + VISU_SUP_ay1_EndRefp_[Supp] >
Anfangspos_Maschine_ay1_[Werks] - Stuecklaenge_ay1_[Werks]
THEN
4neg_Supp_ay2_vWerk_ay1_On[Werks][Supp] :=TRUE;
ELSE
4neg_Supp_ay2_vWerk_ay1_On[Werks][Supp] :=FALSE; END_IF END_IF END_IF
IF (pos_Supp_ay2_vWerk_ay1_On[Werks][Supp] = TRUE OR 1neg_Supp_ay2_vWerk_ay1_On[Werks][Supp] = TRUE)
AND
(2pos_Supp_ay2_vWerk_ay1_On[Werks][Supp] = TRUE OR 2neg_Supp_ay2_vWerk_ay1_On[Werks][Supp] = TRUE
OR 3pos_Supp_ay2_vWerk_ay1_On[Werks][Supp] =TRUE)
AND
(4pos_Supp_ay2_vWerk_ay1_On[Werks][Supp] = TRUE OR 4neg_Supp_ay2_vWerk_ay1_On[Werks][Supp=TRUE)
THEN
S_ay2_Werks_ay1AN[Werks][Supp] := TRUE;
ELSE
S_ay2_Werks_ay1AN[Werks][Supp] := FALSE; END_IF[/color]
END_FOR
-
- Null-Leiter
- Beiträge: 49
- Registriert: Mittwoch 28. August 2013, 13:39
Also ehrlich, der Code ist eine Zumutung, cryptische Symbolik und von der Struktur rede wir garnicht, da nützt auch viel bunt nix.
Man wird das sicher irgendwo optimieren können, aber du glaubst doch nicht ernsthaft, dass sich da jetzt einer stundenlang ransetzt und das Kauderwelch aufdröselt. Für sowas müßte man bei Firmen einige Scheine auf den Tisch legen und mir ist da meine Freizeit zu schade.
Bei einem konkreten Problem helfe ich gerne, aber ich mach nicht die Arbeit anderer Leute.
Man wird das sicher irgendwo optimieren können, aber du glaubst doch nicht ernsthaft, dass sich da jetzt einer stundenlang ransetzt und das Kauderwelch aufdröselt. Für sowas müßte man bei Firmen einige Scheine auf den Tisch legen und mir ist da meine Freizeit zu schade.
Bei einem konkreten Problem helfe ich gerne, aber ich mach nicht die Arbeit anderer Leute.
Nüchtern betrachtet war es besoffen besser.