CODESYS - das IEC 61131-3 Programmiersystem

Willkommen im offiziellen CODESYS - Forum von 3S-Smart Software Solutions | A member of the CODESYS Group
Deutsche Version English version russian version 
Aktuelle Zeit: Mo Sep 16, 2019 6:46 am

Alle Zeiten sind UTC




Ein neues Thema erstellen  Auf das Thema antworten  [ 22 Beiträge ]  Gehe zu Seite 1 2 Nächste
Autor Nachricht
BeitragVerfasst: Mi Okt 02, 2013 6:06 am 
Offline

Registriert: Fr Feb 19, 2010 9:44 am
Beiträge: 39
Guten Morgen miteinander,

gleich vorweg ich bin noch Anfänger in Sachen Strukturierter Text und bitte um Eure Hilfe, ins besondere im ersten Fall

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. [i],.. 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:
Kantenautomat-aktuell-5.pro [370.12 KiB]
105-mal heruntergeladen
Nach oben
   
BeitragVerfasst: Fr Okt 04, 2013 6:59 am 
Offline
Häufiger Nutzer
Häufiger Nutzer
Benutzeravatar

Registriert: Do Apr 07, 2005 1:22 pm
Beiträge: 198
Wohnort: Bei Ulm
Moin

1. ST ist eine Abkürzung für "Structured Text"
Das soll heissen, der Text kann (und sollte) strukturiert werden.
Dann ist das auch lesbar. Ich habe das im angehängten Projekt mal ausgeführt.

2. Wofür soll denn die REPEAT Anweisung in "Werkstueck_Verwalt" gut sein ?
Vor dem REPEAT machst du: VISU_WerksteuckNR_Eingabe_Speicherung:= VISU_WerksteuckNR_Eingabe;
Und REPEATEST dann so lange bis die beiden gleich sind ??? Da werden nicht viele Zyklen raus kommen.
Das selbe mit der untersten IF Anweisung.

3. Ob eine Schleife endlos ist oder nicht hat weder mit der Zykluszeit noch mit der Priorität was zu tun.
Die Schleife ist Endlos wenn die Austrittsbedingung nie erfüllt wird.

4. Warum hast du überhaupt verschiedene Tasks ? Das kann doch alles in einer gemacht werden.

5.
Zitat:
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.

Das würde mir an deiner Stelle sehr zu denken geben.
Wie kann so etwas zustande kommen ? Und was hat das mit der Priorität zu tun ?
Vor allem wenns nur teilweise funktioniert !
Du solltest versuchen zu verstehen was passiert wenn eine Variable in verschiedenen Tasks benutzt und beidseitig geschrieben/gelesen wird.
Was passiert wenn ein Task den anderen aufgrund von Lauzeit / Priorität unterbricht ?
Solange du dir da nicht sicher bist, zurück zu 4.

6.
Zitat:
2.Frage/Vereinfachung

Ich würde zu diesem Zweck ein ARRAY[30] of STRUCT benutzen.
Das ARRAY enthält die Anzahl der Werkstücke und die STRUCT die Parameter.

6.1.
Und du musst überhaupt nichts in die VISU "laden".
Du kannst die Elemente des ARRAYS direkt in der Visu anzeigen und auch beschreiben.

7. So was:
Zitat:
IF %IX8.14 = TRUE THEN
würde ich unter keinen Umständen benutzen !
Leg eine Boolsche Variable auf die Adresse, sonst musst du das an allen Stellen ändern wenn sich die Adresse mal verschiebt.

Gruß Erik


Dateianhänge:
Kantenautomat-aktuell-5.pro [368.9 KiB]
110-mal heruntergeladen

_________________
Wer Rechtschreibfehler findet darf sie behalten...
Nach oben
   
BeitragVerfasst: Sa Okt 05, 2013 10:25 am 
Offline

Registriert: Fr Feb 19, 2010 9:44 am
Beiträge: 39
ACHTUNG: das Problem mit den Arrays für die Visu hat sich erledigt,
ich hatte diesen Programmteil viel zu umständlich erstellt, da mir nicht bewusst war, dass die Variabeln seitens Eingaben durch die Visu und vom Programm geändert werden können (mein Programm funktionierte so dann auch nicht),...


Die anderen Fragen sind noch aktuell, des Weiteren habe ich eine neue Antwort erstellt, bzgl. weiteren Vereinfachungen, siehe weiter unten.


Guten Morgen Erik,

vielen Dank für Deine Bemühungen und der Annahme meines Problems,...

Erik Böhm hat geschrieben:
Moin
1. ST ist eine Abkürzung für "Structured Text"
Das soll heissen, der Text kann (und sollte) strukturiert werden.
Dann ist das auch lesbar. Ich habe das im angehängten Projekt mal ausgeführt.


Jetzt, ist das Ganze auch übersichtlich:D

Erik Böhm hat geschrieben:
Moin
2. Wofür soll denn die REPEAT Anweisung in "Werkstueck_Verwalt" gut sein ?
Vor dem REPEAT machst du: VISU_WerksteuckNR_Eingabe_Speicherung:= VISU_WerksteuckNR_Eingabe;
Und REPEATEST dann so lange bis die beiden gleich sind ??? Da werden nicht viele Zyklen raus kommen.
Das selbe mit der untersten IF Anweisung.


Ich möchte kurz erklären, was ich vorhabe; wahrscheinlich ist mein Ansatz völlig falsch:

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,...

Erik Böhm hat geschrieben:
3. Ob eine Schleife endlos ist oder nicht hat weder mit der Zykluszeit noch mit der Priorität was zu tun.
Die Schleife ist Endlos wenn die Austrittsbedingung nie erfüllt wird.

Lediglich war ein Ablauf des selben Programms mit Priorität 5 möglich und mit 2 nicht, ... An welcher Stelle habe ich eine endlos-Schleife eingebaut und für was dient die Watch-dog-funktion (bzw. wann setzt man diese ein und mit welchem t= und was ist die Folge für diese Programm und die anderen Programme, bzw. die Visu-Variabeln und startet der Controller neu???)


Erik Böhm hat geschrieben:
4. Warum hast du überhaupt verschiedene Tasks ? Das kann doch alles in einer gemacht werden.

Ich dachte mir, wenn es die Möglichkeit, mit verschiedenen Prioritäten gibt, muss man diese auch nutzen, :lol:

Nein, ich habe einen Task der am Wichtigsten ist, da er für alle nachfolgenden Programme die Variabeln setzt/verändert.
Nachfolgend habe ich die Programme, die auf das Wichtigste Programm aufbauen.
Des Weiteren, mit geringster Priorität die Visu-Programme, mit einer Zykluszeit von 1s.


Mein Gedanke war, wenn die Visu-Programme mal übersprungen werden, wenn der Controller (Wago 750-881) mal mit den Programmen ausgelastet ist, sei das nicht so schlimm. Kommen die anderen Programme ins Stocken wäre dies weniger toll.

Und ich habe mir auch die Frage gestellt, wenn ich das Hauptrrogramm (Priorität 2) auf "Freilaufend" setze, ob dies dann "weniger oft" abgearbeitet wird, als Zyklisch t#50ms; bzw. wie man dies feststellen kann.
Die Werkstueck_x -Programme würde ich gerne nur "laufen lassen" wenn diese benötigt werden (Stueck5 = True); aber mit "Ereignisgesteuert" funktioniert dies wohl nicht,...
Ich weis nicht, ob meine Vorgehensweise nur ansatzweise richtig ist, bzw. wie und wann wählt man welche Einstellungen????


Erik Böhm hat geschrieben:

5.
Zitat:
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.

Das würde mir an deiner Stelle sehr zu denken geben.
Wie kann so etwas zustande kommen ? Und was hat das mit der Priorität zu tun ?
Vor allem wenns nur teilweise funktioniert !

Du solltest versuchen zu verstehen was passiert wenn eine Variable in verschiedenen Tasks benutzt und beidseitig geschrieben/gelesen wird.
Was passiert wenn ein Task den anderen aufgrund von Lauzeit / Priorität unterbricht ?
Solange du dir da nicht sicher bist, zurück zu 4.


Das heißt, die Tasks werden dann nicht vollständig durchlaufen; und somit dürfen keine Variabeln, die in zwei verschiedenen Programmen, mit unterschiedlichen Tasks, verwendet werden. Und bei der Variante VAR_IN und VAR_OUT ist das Problem auch nicht gelöst.

Brauch man für dieses kleine Programm (bis jetzt für 1 Werkstück für 1 Teilprogramm, nacher für 30 Werkstücke und 10 Teilprogramme) auf der 750-881 somit gar keine verschiedenen Prioritäten und Zyklenzeiten? Würde das Programm mit dann 30 Werkstücken und 10 Teilprogrammen um das fünfache ansteigen; wäre es dann von Nöten. Oder wieviel Zeilen/Anweisungen (was für Einheiten/Anweisungen) werden pro Sekunde abgearbeitet
Gibt es evtl. hierüber im Netz was zu lesen; über ST ist es schon sehr schwer, etwas zu finden?



Erik Böhm hat geschrieben:

6.
Zitat:
2.Frage/Vereinfachung

Ich würde zu diesem Zweck ein ARRAY[30] of STRUCT benutzen.
Das ARRAY enthält die Anzahl der Werkstücke und die STRUCT die Parameter.


6.1.
Und du musst überhaupt nichts in die VISU "laden".
Du kannst die Elemente des ARRAYS direkt in der Visu anzeigen und auch beschreiben.
[/quote]

Könntest Du mir bitte dies am oberen Beispiel erläutern. Und kann man eigentlich Arrays in einem weiteren Array verschachteln? Werden dann immer alle Werte des Arrays in einem Zyklus abgearbeitet und dauert dies länger, als wenn man es "ausprogrammiert"?

Erik Böhm hat geschrieben:

7. So was:
Zitat:
IF %IX8.14 = TRUE THEN
würde ich unter keinen Umständen benutzen !
Leg eine Boolsche Variable auf die Adresse, sonst musst du das an allen Stellen ändern wenn sich die Adresse mal verschiebt.

Danke. Ist nur zu Testzwecken, die Erfahrung habe ich bereits schon gemacht, eine Klemme hinzu und ...

Noch eine Frage zum Abschluss, wie kann ich im Programm [Werkstueck_Verwalt], die Variable [Steuckzahl_Nummer] beim Hochlauf des Controllers auf 1 setzten; ohne großen Aufwand?
Gruß Erik[/quote]

Danke, auch für die Zeit zum Lesen des ellen-langen Textes, von mir.


Zuletzt geändert von CoDeSys123456 am Mo Okt 07, 2013 5:17 am, insgesamt 1-mal geändert.

Nach oben
   
BeitragVerfasst: Mo Okt 07, 2013 5:09 am 
Offline

Registriert: Fr Feb 19, 2010 9:44 am
Beiträge: 39
HAllo miteinander,

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


Dateianhänge:
Kantenautomat-aktuell-6.pro [381.65 KiB]
115-mal heruntergeladen
Nach oben
   
BeitragVerfasst: Di Okt 08, 2013 5:16 am 
Offline

Registriert: Fr Feb 19, 2010 9:44 am
Beiträge: 39
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

[list=]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???[/list]


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:
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
END_FOR


Dateianhänge:
Kantenautomat-aktuell-6.pro [429.75 KiB]
95-mal heruntergeladen


Zuletzt geändert von CoDeSys123456 am Di Okt 08, 2013 8:46 am, insgesamt 5-mal geändert.
Nach oben
   
BeitragVerfasst: Di Okt 08, 2013 6:45 am 
Offline
Häufiger Nutzer
Häufiger Nutzer
Benutzeravatar

Registriert: Do Apr 07, 2005 1:22 pm
Beiträge: 198
Wohnort: Bei Ulm
Moin

Mal davon abgesehen daß ich deinen Quellcode immer noch nicht lesen kann weils totaler Spaghetti-Code ist, finde ich du gehst die Sache völlig überkompliziert an.

Wo ist denn das Problem ein 2 dimensionales ARRAY[0..20,1..12] in einer Schleife abzuarbeiten ?
FOR i:=1 TO 12 DO
FOR j:=1 TO 20 DO
axArrayName[i,j] := irgendwas;
END_FOR
END_FOR
Was denkst du wie lange das dauern wird ??? In der Zykluszeit wird das kaum bemerkbar sein. Ruf diesen Task im niedrigen ms Zyklus auf (z.B. 5ms) und fertig.

Freilaufende Tasks werden immer aufgerufen wenn kein anderer Task aktiv ist.
Das ist eher selten notwendig.

Die Daten würde ich immer noch in einer Struktur anlegen.
Also z.B.:

TYPE Visu :
STRUCT
Anfangswert_1_WzSt_: ARRAY [0..20] OF WORD;
Bearbeitungswert_2_WzSt_: ARRAY [0..20] OF WORD;
Anfangswert_3_WzSt_: ARRAY [0..20] OF WORD;
Bearbeitungswert_4_WzSt_: ARRAY [0..20] OF WORD;
Endwert_5_WzSt_: ARRAY [0..20] OF WORD;
Stuecklaenge_: ARRAY [0..20] OF WORD;
SUP_ay2_ST_ay1_: ARRAY [0..20]OF ARRAY [1..12]OF BOOL;
SUP_SONDERaktiv_ay2_ST_ay1_: ARRAY [0..20]OF ARRAY [1..12]OF BOOL;
END_STRUCT
END_TYPE

Deklaration des Arrays:
sVisu: ARRAY[1..12] of Visu.

Zugriff z.B:
sVisu.Anfangswert_1_WzSt_[1]

Und warum du getrennte Datensätze für Visu und Ablauf benutzt erschließt sich mir auch nicht.
Wenn du sowieso willst dass die Daten sofort übernommen werden, warum schreibst du dann nicht direkt in die Daten rein ?

Gruß Erik

_________________
Wer Rechtschreibfehler findet darf sie behalten...


Nach oben
   
BeitragVerfasst: Di Okt 08, 2013 8:41 am 
Offline

Registriert: Fr Feb 19, 2010 9:44 am
Beiträge: 39
Erik Böhm hat geschrieben:
Moin

Mal davon abgesehen daß ich deinen Quellcode immer noch nicht lesen kann weils totaler Spaghetti-Code ist, finde ich du gehst die Sache völlig überkompliziert an.


Guten Morgen Erik, vielen Dank für Deine Rückmeldung. Ich habe nun versucht im obrigen Beitrag den Spaghetti-Code zu entschlüsseln. Was meinst Du mit völlig uberkompliziert,

Erik Böhm hat geschrieben:
Wo ist denn das Problem ein 2 dimensionales ARRAY[0..20,1..12] in einer Schleife abzuarbeiten ?
FOR i:=1 TO 12 DO
FOR j:=1 TO 20 DO
axArrayName[i,j] := irgendwas;
END_FOR
END_FOR


Die For-Schleifen habe ich einfach mal über den kompletten "Programmteil" gelegt; ist dies so korrekt?
    Und was passiert wenn die Steuerung "hochfährt" und die For-Schleife ist noch nicht angelaufen, die zwei Variabeln [i,j] zuerst 0 aufweisen?
    Generell die Frage, wie kann man bei einem Steuerungshochlauf, eine Variable dann einmalig einen Start-Wert zuweisen(ander Anwendung)
    Ich habe die VAriabeln so definiert: IF VISU_SUP_SONDERaktiv_ay2_ST_ay1_[Werks][Supp] oder muss [Werks, Supp]; bzw. was ist der Unterschied
      Wäre es auch möglich (z.B. If-Clause, etc.) die einzelnen 20 Schleifen (mit deren jeweiligen 12 Unterschleifen) nur bis zur maximalen Anzahl, aktiver 7 von 20 Werkstücke zu laufen lassen und anschließend wieder bei 1 zu beginnen; mit der For-Schleife?, Wie wäre dies zu realisieren?

    Erik Böhm hat geschrieben:
    Was denkst du wie lange das dauern wird ??? In der Zykluszeit wird das kaum bemerkbar sein. Ruf diesen Task im niedrigen ms Zyklus auf (z.B. 5ms) und fertig.
    Freilaufende Tasks werden immer aufgerufen wenn kein anderer Task aktiv ist.
    Das ist eher selten notwendig.

      Das heißt der Task mit meheren Programmen startet alle 5 ms. Würde das Programm bzw. die Programme nicht in 5 ms komplett abgearbeitet werden, wird der Ablauf dennoch nicht abgebrochen, sondern läuft parallel, zum neuen Start zu Ende?

      Der Controller ist mit dieser kleinen Zykluszeit nicht überfodert???

      Das heißt bis alle Möglichkeiten einmal durch sind, dauert es maximal 5ms *12*20 = 1,2 Sekunden oder wird die For-Schleife in 5 ms für alle Möglichkeiten/Arrays einmal berechnet. Denn 1,2 Sekunden wären zu viel, maximal ca. 100 ms, zur nächsten, vollständigen Berechnung; aller Arrays, wären akzeptabel.




    Erik Böhm hat geschrieben:
    Die Daten würde ich immer noch in einer Struktur anlegen.
    Also z.B.:

    TYPE Visu :
    STRUCT
    Anfangswert_1_WzSt_: ARRAY [0..20] OF WORD;
    Bearbeitungswert_2_WzSt_: ARRAY [0..20] OF WORD;
    Anfangswert_3_WzSt_: ARRAY [0..20] OF WORD;
    Bearbeitungswert_4_WzSt_: ARRAY [0..20] OF WORD;
    Endwert_5_WzSt_: ARRAY [0..20] OF WORD;
    Stuecklaenge_: ARRAY [0..20] OF WORD;
    SUP_ay2_ST_ay1_: ARRAY [0..20]OF ARRAY [1..12]OF BOOL;
    SUP_SONDERaktiv_ay2_ST_ay1_: ARRAY [0..20]OF ARRAY [1..12]OF BOOL;
    END_STRUCT
    END_TYPE

    Deklaration des Arrays:
    sVisu: ARRAY[1..12] of Visu.

    Zugriff z.B:
    sVisu.Anfangswert_1_WzSt_[1]

    Und warum du getrennte Datensätze für Visu und Ablauf benutzt erschließt sich mir auch nicht.
    Wenn du sowieso willst dass die Daten sofort übernommen werden, warum schreibst du dann nicht direkt in die Daten rein ?

    Gruß Erik



Blöde Frage: Dies wäre dann im zweiten Register von CoDeSys (in dem auch Rezepturen eingegebn werden?). Die beiden letzten Aussagen (Deklaration des Array und Zugriff) habe ich leider nicht verstanden, könntest Du mir dies bitte nochamsl erläutern...

Bitte entschuldigt, dass ich mich so umständlich anstelle, es ist für mich das erste Mal, dass ich ein so kompliziertes Programm erstelle (für mein Empfinden,...)


Bitte um Deine Rückmeldung.

Danke


Nach oben
   
BeitragVerfasst: Di Okt 08, 2013 9:17 am 
Offline
Häufiger Nutzer
Häufiger Nutzer
Benutzeravatar

Registriert: Do Apr 07, 2005 1:22 pm
Beiträge: 198
Wohnort: Bei Ulm
Hi

Ja, für mein Empfinden ist das auch kompliziert. Ich denke du schießt mit Kanonen auf Spatzen.

Zu 1.
Eine Variable kann entweder direkt mit der Deklaration initialisiert werden, oder von Hand im Ablauf.

bInit: BOOL := FALSE;

Schau dir mal das Kapitel "Variablendeklaration" in der CoDeSys Hilfe an und für ARRAYs das Unterkapitel "Automatisch deklarieren"

Im Ablauf geht das einfach so:
IF NOT bInit THEN
(* Hier allen Variablen Startwerte zuweisen. *)
bInit := TRUE; (* Verhindert einen 2. Durchlauf *)
END_IF

2.
Zitat:
Die For-Schleifen habe ich einfach mal über den kompletten "Programmteil" gelegt; ist dies so korrekt?

Das hängt davon ab was du in der Schleife machst.
Alles was i und j nicht benutzt, macht keinen Sinn in der Schleife.
Wird dann eben 240 mal aufgerufen und macht immer das selbe.

3. Parallel läuft gar nichts. Im schlimmsten Fall würde der Task von einem höher Priorisierten unterbrochen und läuft dann beim nächsten Aufruf wieder von dort weiter wo unterbrochen wurde.

Siehe hierzu: "Taskkonfiguration" und "Welche Task wird bearbeitet?" in der Hilfe

Ich nehme mal eine die Schleife wird ca. eine 2 stellige Anzahl an µs benötigen. (Man beachte die Einheit µs)
Das kannst du z.B. durch einbinden der SysTaskInfo.lib erkennen.

Siehe: "Taskkonfiguration im Online Modus"

4.
Zitat:
Blöde Frage: Dies wäre dann im zweiten Register von CoDeSys (in dem auch Rezepturen eingegebn werden?). Die beiden letzten Aussagen (Deklaration des Array und Zugriff) habe ich leider nicht verstanden, könntest Du mir dies bitte nochmal erläutern...


Ja, das wäre das Register Datentypen, das hat aber nichts mit Rezepturen zu tun.
Dafür gibts den Watch- und Rezepturverwalter (den ich dir übrigens sehr empfehlen kann).

Deklaration des Arrays:
Wenn du eine Struktur angelegt hast die alle Daten für einen Werkstücktyp enthält, dann musst du ja noch ein ARRAY dieser Struktur anlegen.
Das sieht dann so aus: sVisu: ARRAY[1..12] of Visu sVisu ist der Name des ARRAY of Visu. Visu ist der Name deiner neu angelegten Struktur.

Zugriff z.B:
Wenn du jetzt auf eine Lement dieses ARRAYs zugreifen willst, dann geht das mit Arrayname.Elementname[INDEX]
Also bei unserem Beispiel so:

Arrayname = sVisu
Elementame = Anfangswert_1_WzSt_
INDEX = 1
sVisu.Anfangswert_1_WzSt_[1]

Gruß Erik

_________________
Wer Rechtschreibfehler findet darf sie behalten...


Nach oben
   
BeitragVerfasst: Mi Okt 09, 2013 9:36 am 
Offline

Registriert: Fr Feb 19, 2010 9:44 am
Beiträge: 39
Erik Böhm hat geschrieben:
Hi

Ja, für mein Empfinden ist das auch kompliziert. Ich denke du schießt mit Kanonen auf Spatzen.

Zu 1.
Eine Variable kann entweder direkt mit der Deklaration initialisiert werden, oder von Hand im Ablauf.

bInit: BOOL := FALSE;

Schau dir mal das Kapitel "Variablendeklaration" in der CoDeSys Hilfe an und für ARRAYs das Unterkapitel "Automatisch deklarieren"

Im Ablauf geht das einfach so:
IF NOT bInit THEN
(* Hier allen Variablen Startwerte zuweisen. *)
bInit := TRUE; (* Verhindert einen 2. Durchlauf *)
END_IF



Guten Morgen ERik,

danke für Deine Rückmeldung. Somit kann man wohl wirklich nur eine Variable statisch zuweisen oder aber mit einer IF-Schleife einmailg einen Startwert zukommen lassen.

Erik Böhm hat geschrieben:
2.
Zitat:
Die For-Schleifen habe ich einfach mal über den kompletten "Programmteil" gelegt; ist dies so korrekt?

Das hängt davon ab was du in der Schleife machst.
Alles was i und j nicht benutzt, macht keinen Sinn in der Schleife.
Wird dann eben 240 mal aufgerufen und macht immer das selbe.

Da ja die erste IF-Bedinung darüber entscheidet, ist dies kein Problem, denn der Ganze Progrmmteil wird nur dnn bei True berechnet.

Erik Böhm hat geschrieben:
3. Parallel läuft gar nichts. Im schlimmsten Fall würde der Task von einem höher Priorisierten unterbrochen und läuft dann beim nächsten Aufruf wieder von dort weiter wo unterbrochen wurde.

Siehe hierzu: "Taskkonfiguration" und "Welche Task wird bearbeitet?" in der Hilfe

Ich nehme mal eine die Schleife wird ca. eine 2 stellige Anzahl an µs benötigen. (Man beachte die Einheit µs)
Das kannst du z.B. durch einbinden der SysTaskInfo.lib erkennen.

Siehe: "Taskkonfiguration im Online Modus"

Also ich habe nun mal, so wie ich das uben gemacht habe + am Ende/nach den Schleifen
WErt:=1 und WErt2:=1.
Somit werden die ganze 240 Schleife innerhalb von 5ms durchlaufen und nicht in 1,2 Sekunden???

Diese Datei habe ich bereits gesucht, denn im Hilfe-Text war davon nie die Rede. Nun habe ich Sie implementiert; jedoch gibt es immer noch keine Anzeige, wie muss der Funktionsbaustein angesteuert werden? SysTaskInfo.lib

Erik Böhm hat geschrieben:
4.
Zitat:
Blöde Frage: Dies wäre dann im zweiten Register von CoDeSys (in dem auch Rezepturen eingegebn werden?). Die beiden letzten Aussagen (Deklaration des Array und Zugriff) habe ich leider nicht verstanden, könntest Du mir dies bitte nochmal erläutern...


Ja, das wäre das Register Datentypen, das hat aber nichts mit Rezepturen zu tun.
Dafür gibts den Watch- und Rezepturverwalter (den ich dir übrigens sehr empfehlen kann).

Deklaration des Arrays:
Wenn du eine Struktur angelegt hast die alle Daten für einen Werkstücktyp enthält, dann musst du ja noch ein ARRAY dieser Struktur anlegen.
Das sieht dann so aus: sVisu: ARRAY[1..12] of Visu sVisu ist der Name des ARRAY of Visu. Visu ist der Name deiner neu angelegten Struktur.


Also ich habe nun die Variabeln aus der globalen Variablenliste (nur die Arrays (wie Du oben aufgelistet hast)) in eine neue Stuktur kopiert. Das Programm läuft dann nicht mehr und gibt einen Fehler aus: END_Var fehlt in der Stuktur; ich habe jedoch gar kein Anfang gestzt,...??
Zugriff z.B:

Des Weiteren meine Frage, wie kann ich diese Variablen "Resisten.. und Pariten,..t) als Bedingung hinzufügen (siehe globlae Variablen, beim Herunterfahren speichern)

Erik Böhm hat geschrieben:
Wenn du jetzt auf eine Lement dieses ARRAYs zugreifen willst, dann geht das mit Arrayname.Elementname[INDEX]
Also bei unserem Beispiel so:

Arrayname = sVisu
Elementame = Anfangswert_1_WzSt_
INDEX = 1
sVisu.Anfangswert_1_WzSt_[1]

Gruß Erik


Könntest Du mir dies bitte als Beispiel im Programm als Anhang speichern, das wäre sehr nett von Dir.

Des Weiteren habe ich auch das Problem mit der Alarm-Tabelle (diese hat bei anderen Programmen immer funktioniert) hier kommt teils beim Einloggen dann eine Fehlermeldung (von einer Bibliothek würde eine Variable fehlen). Sofern diese FEhelrmeldung weg ist und das Programm läuft (mit Datenbanken und in der Zielsystemeinstellung aktiviert) wird im PLC_VISu dennoch nichts angezeigt.

Über diese zwei Beispiele wäre ich Dir sehr dankbar; denn im Programm (als Beispiel) ist es für mich einfach verständlicher,....

DAnke Dir sehr.

Grüße
Andreas


Nach oben
   
BeitragVerfasst: Mi Okt 09, 2013 9:45 am 
Offline
Häufiger Nutzer
Häufiger Nutzer
Benutzeravatar

Registriert: Do Apr 07, 2005 1:22 pm
Beiträge: 198
Wohnort: Bei Ulm
Mahlzeit

Kannst du bitte den aktuellen Stand noch hochladen ?
Dann kann ich den Fehler und die Beispiele direkt nachvollziehen.

Gruß
Erik

_________________
Wer Rechtschreibfehler findet darf sie behalten...


Nach oben
   
BeitragVerfasst: Mi Okt 09, 2013 9:53 am 
Offline
Häufiger Nutzer
Häufiger Nutzer
Benutzeravatar

Registriert: Do Apr 07, 2005 1:22 pm
Beiträge: 198
Wohnort: Bei Ulm
Nochmal Hi

Die SysTaskInfo.lib muss überhaupt nicht irgendwie angesteuert werden.
Das macht CoDeSys alles automatisch.
Wenn du nach einbinden der lib keine Anzeige hast, dann unterstützt dein Zielsystem das evtl. nicht.
Da musst du Wago fragen.

Um die Laufzeit der Schleife zu messen kannst du auch ganz einfach die Laufzeit messen.
Vor der Schleife
tStart: TIME;
tEnd: TIME;

tStart := TIME(); <- Das kopiert die aktuelle Systemzeit in die Variable tStart
nach der Schleife
tEnd := TIME();

Die Differenz der beiden ergibt die Laufzeit der Schleife. Ich tippe auf eine Differenz von 0ms.

Gruß Erik

_________________
Wer Rechtschreibfehler findet darf sie behalten...


Nach oben
   
BeitragVerfasst: Mi Okt 09, 2013 11:08 am 
Offline

Registriert: Fr Feb 19, 2010 9:44 am
Beiträge: 39
Erik Böhm hat geschrieben:
Mahlzeit

Kannst du bitte den aktuellen Stand noch hochladen ?
Dann kann ich den Fehler und die Beispiele direkt nachvollziehen.

Gruß
Erik


HAllo Erik,

werde ich gleich heute Abend machen.

Danke Dir.

Grüße


Nach oben
   
BeitragVerfasst: Mi Okt 09, 2013 4:56 pm 
Offline

Registriert: Fr Feb 19, 2010 9:44 am
Beiträge: 39
CoDeSys123456 hat geschrieben:
Erik Böhm hat geschrieben:
Mahlzeit

Kannst du bitte den aktuellen Stand noch hochladen ?
Dann kann ich den Fehler und die Beispiele direkt nachvollziehen.

Gruß
Erik


HAllo Erik,

werde ich gleich heute Abend machen.

Danke Dir.

Grüße


Anbei nun die Zwischenversion,...

Viele Grüße und bitte entschuldige das Durcheinander. bin gerade am sortieren der Variablen,...


Dateianhänge:
Kantenautomat-aktuell-7.pro [385.08 KiB]
98-mal heruntergeladen
Nach oben
   
BeitragVerfasst: Do Okt 10, 2013 2:21 pm 
Offline
Häufiger Nutzer
Häufiger Nutzer
Benutzeravatar

Registriert: Do Apr 07, 2005 1:22 pm
Beiträge: 198
Wohnort: Bei Ulm
Mahlzeit

Ich hatte eigentlich heute früh schonmal geantwortet, aber das ist wohl irgendwie verloren gegangen...

Also nochmal:

1. Compilieren kann ich ohne Fehlermeldung.
Archiv des Projekts anbei. Da sind meine Libs alle mit drin, dann kannst du die falsche austauschen.

2. Du hast zwar einn Typ angelegt, aber nicht benutzt.
Sinn des ganzen ist eine gewisse Objektorientierung der Variablen.
Du erstellst also einen Typ (in diesem Fall VISU), der eine Struktur enthält die alle Eigenschaften des Werkstücks beschreibt.
Von diesem Typ machst du so viele Kopien wie du verschiedene Werkstückdefinitionen brauchst.
In deinem Fall momentan 20.

TYPE VISU:
STRUCT
Anfangswert_1_WzSt_: WORD; (*Eingabe in Visu Anfangswert_1_ von Werkstueck 1-20 keine Bearbeitung; Visuvalisierung Stueck-Berabeitungs-Laengen*)
Bearbeitungswert_2_WzSt_: WORD; (*Eingabe in Visu Bearbeitungswert_2_ von Werkstueck 1-20 Bearbeitun; Visuvalisierung Stueck-Berabeitungs-Laengen*)
Anfangswert_3_WzSt_: WORD; (*Eingabe in Visu Anfangswert_3_ von Werkstueck 1-20 keine Bearbeitung; Visuvalisierung Stueck-Berabeitungs-Laengen*)
Bearbeitungswert_4_WzSt_: WORD; (*Eingabe in Visu Bearbeitungswert_4_ von Werkstueck 1-20, keine Bearbeitung; Visuvalisierung Stueck-Berabeitungs-Laengen*)
Endwert_5_WzSt_: WORD; (*Eingabe in Visu Bearbeitungswert_5_ von Werkstueck 1-20 keine Bearbeitung; Visuvalisierung Stueck-Berabeitungs-Laengen*)
Stuecklaenge_: WORD; (*Visu-Stuecklänge*)
SUP_ay2_ST_ay1_: ARRAY[1..12]OF BOOL; (*Support 1-12, für jeweiliges Werkstueck 1-20, Bearbeitung aktiv, Visuvalisierung Support Zustand Bearbeitung aktiv *)
SUP_SONDERaktiv_ay2_ST_ay1_: ARRAY [1..12]OF BOOL; (*Support 1, füR jeweiliges Werkstueck 1-20, Sonderlaengen-Bearbeitung aktiv, Visuvalisierung Support Zustand *)
END_STRUCT
END_TYPE

Die 20 Kopien werden jetzt so gemacht:

sVisu: ARRAY[1..20] of VISU;

Wenn du jetzt auf eine Werkstückdefinition zugreifen willst, dann geht das so:

sVisu[1].SUP_ay2_ST_ay1_[1];

3. Wie du mehrdimensionale ARRAYs definierst ist Wurscht.
Ob so
aiTest: ARRAY[1..20,1..12] of INT;
oder so
aiTest: ARRAY[1..20] of ARRAY[1..12] of BOOL

Ich bevorzuge Variante 1, der Zugriff sieht dann so aus:
aiTest[1,1];

4. Laufzeit der Schleife.
Ich weiß ja nicht wie langsam deine bisherigen Steuerungen waren, aber ich gehe schwer davon aus daß die Schleife für die kompletten 240 Durchläufe nicht mehr als ein paar µs benötigt.
Mit der von mir beschriebenen Methode wirst du also immer auf eine Laufzeit von 0ms kommen, was ausreichend sein sollte...

5.
Zitat:
Somit kann man wohl wirklich nur eine Variable statisch zuweisen oder aber mit einer IF-Schleife einmailg einen Startwert zukommen lassen.

Was denn sonst ? Dynamisch wirds vor der Laufzeit nicht gehen...

Gruß Erik


Dateianhänge:
Kantenautomat-aktuell-7 EB.zip [96.44 KiB]
105-mal heruntergeladen

_________________
Wer Rechtschreibfehler findet darf sie behalten...
Nach oben
   
BeitragVerfasst: Do Okt 10, 2013 2:22 pm 
Offline
Häufiger Nutzer
Häufiger Nutzer
Benutzeravatar

Registriert: Do Apr 07, 2005 1:22 pm
Beiträge: 198
Wohnort: Bei Ulm
Du könntest mir auch ne mail an: erik.boehm@asys.de schreiben, dann schick ich dir mal meine Telefonnummer zurück.

_________________
Wer Rechtschreibfehler findet darf sie behalten...


Nach oben
   
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen  Auf das Thema antworten  [ 22 Beiträge ]  Gehe zu Seite 1 2 Nächste

Alle Zeiten sind UTC


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.
Sie dürfen keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
Powered by phpBB® Forum Software © phpBB Limited
Deutsche Übersetzung durch phpBB.de