Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
' schrieb:Die Bedienelemente sollen automatisiert (in den verschiedenen states) angesteuert werden damit man Dauertestzyklen programmieren kann. also sollte das ganze auch recht flexibel sein, je nach dem was man testen will.
Dann würde ich das so machen: Einen Datensatz aufbauen, der ein Abblild des Ablaufes ist. Also z.B. ein Script. Dieses Script steuert dann sowohl die Bildschirmelemente an (zum Sehen) also auch den Profibus (zum Arbeiten). Eine verbindung zwischen Profibus und Anzeigeelemente gibt es dann nicht mehr.
Zitat:hmm ok dann werd ich mich mal in klassen und co einarbeiten hab damit noch nie was gemacht,...
Ich nenne das immer nur Klasse, weil dieses LV-Konstrukt eine Daten- und Code-Kapselung wie eine OOP-Klasse hat. Es ist aber keine Klasse im Sinne des LV-OOP.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
' schrieb:Dann würde ich das so machen: Einen Datensatz aufbauen, der ein Abblild des Ablaufes ist. Also z.B. ein Script. Dieses Script steuert dann sowohl die Bildschirmelemente an (zum Sehen) also auch den Profibus (zum Arbeiten). Eine verbindung zwischen Profibus und Anzeigeelemente gibt es dann nicht mehr.
Ich nenne das immer nur Klasse, weil dieses LV-Konstrukt eine Daten- und Code-Kapselung wie eine OOP-Klasse hat. Es ist aber keine Klasse im Sinne des LV-OOP.
hast du evtl ein beispiel wie man so ein script benutzt/ einsetzt?
' schrieb:hast du evtl ein beispiel wie man so ein script benutzt/ einsetzt?
Nein.
Ich selbst hab bisher noch kein Script verwendet.
Ich mach das bisher so: Es läuft eine Ausgabetask z.B. AOut, DOut, Can etc. Die hat ein bestimmtes Raster, z.B. 1ms. Jetzt erstelle ich ein Array mit 1000 Werten - das entspricht dann einer Ausgabedauer von einer Sekunde. Dieses Array wird der Ausgabetask übergeben - der Rest geht automatisch oder von von der Klasse gehandelt. Dieses Verfahren geht natürlich nur bis zu einer bestimmten Arraygröße, also bis zu einer bestimmten Zeitspanne. Außerdem besteht keine Möglichkeit eines Online-Eingriffes. Für bestimmte Applikationen ist dieses Verfahren ausreichend. z.B. wenn ein Prüfling eben nur für eine bestimmte Zeit mit irgendwelchen Signalen beaufschlagt werden soll.
Ein Script würde text-gesteuert sein. Es gibt also ein Array of string, in dem die einzelnen Schritte stehen. z.B. WARTE, SETZE etc. Ob das Array nun ein Array of string oder ein Array of cluster ist, ist nebensächlich. Der Cluster könnte zu jedem Befehl (string) noch die Daten enthalten. Dieses Verfahren ist im Prinzip zeitlich unbegrenzt, dafür ist halt keine Auflösung unter 10m möglich. Das Array würde nun der Reihe nach abgearbeitet werden.
Noch zwei Sachen zu deinem Bild mit den vielen Referenzen: Nimm mal anstelle des Warten-VI als Metronom-VI. Und Sequenziere die Case-Seqenz nach dem SubVI Nr. 8. Außerdem kannst du die ganzen Referenzen weg lassen! Beispiel: Einfach den Ausgang HF-Schütze-Led in die Case-Sequenz reinführen eben anstelle des Propertys (was auch gleich eine Sequenzierung wäre). Normalerweise sollte das Abarbeiten der Case-Sequenz keine Auswirkung auf die Dauer der While-Schleife haben.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
' schrieb:Ein Script würde text-gesteuert sein. Es gibt also ein Array of string, in dem die einzelnen Schritte stehen. z.B. WARTE, SETZE etc. Ob das Array nun ein Array of string oder ein Array of cluster ist, ist nebensächlich. Der Cluster könnte zu jedem Befehl (string) noch die Daten enthalten. Dieses Verfahren ist im Prinzip zeitlich unbegrenzt, dafür ist halt keine Auflösung unter 10m möglich. Das Array würde nun der Reihe nach abgearbeitet werden.
Noch zwei Sachen zu deinem Bild mit den vielen Referenzen: Nimm mal anstelle des Warten-VI als Metronom-VI. Und Sequenziere die Case-Seqenz nach dem SubVI Nr. 8. Außerdem kannst du die ganzen Referenzen weg lassen! Beispiel: Einfach den Ausgang HF-Schütze-Led in die Case-Sequenz reinführen eben anstelle des Propertys (was auch gleich eine Sequenzierung wäre). Normalerweise sollte das Abarbeiten der Case-Sequenz keine Auswirkung auf die Dauer der While-Schleife haben.
danke für deine hilfe! und die mühe die du dir machst.
hab aber doch noch die ein oder andere frage
wegen den referenzen, ok die von den LEDs hab ich weg gemacht, aber um die knoten an den eingängen zu sparen muss ich dann dirket auf das eingangs vi (ohne den schalter) oder kann ich da die referenzen lassen? wobei man sie wenn des alles richtig geht wohl eh nicht brauchen wird...
das mit dem text-gesteuerten script klingt ja gut, sowas könnt ich brauchen. denn die programme sollten nicht zeitlich begrenzt sein, zumindest nicht in dem rahmen es sind auf jedenfall dauertests angedacht die mal übers wochenende oder so laufen sollen bzw. einige 1000 ein/aus zyklen haben sollen.
rückfrage zu dem textscript. ich schreib ne datei in der ich alle ein, aus, sollwerte, wartezeiten und co vorgebe und diese datei les ich dann ein, und schreib das ganze in ein cluster array. oder?
aber wie steuer ich das ganze dann das er mir die schritte einzeln macht und dazu immer das array entlang wandert? da brauch ich ja wieder so ne art state machine die dann in jedem case ein array wert ließt? oder hab ich das falsch verstanden?
das ändern der verzögerungen hat keine veränderung hinsichtlich der ausführzeit gebracht die schleife ruckelt immer noch.
' schrieb:danke für deine hilfe! und die mühe die du dir machst.
Ach, mach ich doch gerne.
Zitat:aber um die knoten an den eingängen zu sparen muss ich dann dirket auf das eingangs vi (ohne den schalter) oder kann ich da die referenzen lassen?
Das verstehe ich jetzt nicht.
Welche Knoten (also Eigenschaftsknoten) an welchen Eingängen?
Den einen Eigenschaftsknoten, den ich gemeint habe, lässt du einfach weg. Dafür muss du natürlich den grünen Draht, der aus SubVI 9 herauskommt, direkt dort anschließen, wo jetzt der Ausgang des Propertys hingeht.
Zitat:das mit dem text-gesteuerten script klingt ja gut, sowas könnt ich brauchen. denn die programme sollten nicht zeitlich begrenzt sein, zumindest nicht in dem rahmen es sind auf jedenfall dauertests angedacht die mal übers wochenende oder so laufen sollen bzw. einige 1000 ein/aus zyklen haben sollen.
Auch mit meiner Methode kann man unendlich viele Zyklen fahren. Indem man ganz einfach einen Zyklus, der z.B. nur 30 Sekunden dauert, wiederholt.
Für sinnvoll halte ich es - ob nach meiner bisherigen Methode oder mit Script - dass man eine Schrittkette aufbaut, die genau einen Zyklus macht. Diese Schrittkette wird dann wiederholt.
Zitat:ich schreib ne datei in der ich alle ein, aus, sollwerte, wartezeiten und co vorgebe und diese datei les ich dann ein, und schreib das ganze in ein cluster array. oder?
Ja. Im Prinzip so.
Es würde folgende Möglichkeit geben: Jedes Array-Element enthält die für einen bestimmten Zeitpunkt notwendigen Daten. Ist der Zeitpunkt für dieses Array-Element gekommen, werden genau diese Daten ausgegeben.
Hinweis: Was ich hier geschrieben habe, ist ein prinzielles Vorgehen. Wie die genaue progammtechnische Ausführung aussieht, steht hier noch nirgends.
Zitat:aber wie steuer ich das ganze dann das er mir die schritte einzeln macht und dazu immer das array entlang wandert? da brauch ich ja wieder so ne art state machine die dann in jedem case ein array wert ließt? oder hab ich das falsch verstanden?
Das hast du genau richtig verstanden.
Ich gehe immer so vor. Ich überlege mir, wie der Ablauf ist: Zuerst das, dann das, dann das, dann das, usw. Genau in dieser Reihenfolge mach ich dann eine Statemachine mit genau dem Inhalt pro Case, der eben dem DAS entspricht. Jeder Case darf aber nur solchen Code enthalten, der innerhalb allerkürzester Zeit abarbeitbar ist. Ein Raster wird nicht innerhalb der Statemachine gemacht, sondern außerhalb. Dann kann man nämlich parallel zur Statemachine Sachen machen, die dann bei jedem Case gemacht werden (z.B. Daten lesen). Was tun bei einem Schritt, der 1 Sekunde warten soll? Diesen einen Case sooft durchlaufen (z.B. Schiebregister in While-Schleife) bis x mal das externe Raster die Wartezeit ergibt.
Zitat:die schleife ruckelt immer noch.
Das soll nicht sein. Es muss ohne ruckeln gehen.
Wie groß ist denn die Wiederholzeit in der While-Schleife? Wie lange deuern denn die beiden SubVIs? Die Ausführungsdauer des gesamten Codes in der While-Schleife sollte 50% der Schleifendauer (siehe Wait-VI) nicht überschreiten.
Zeitmessung kannst du so machen: Millisekundenzeitwert lesen, SubVI ausführen, Millisekundenzeitwert lesen, beide Zeiten subtrahieren und anzeigen. Diese vier Schritte mit einer Sequenzstruktur sequenzieren.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
' schrieb:Das verstehe ich jetzt nicht.
Welche Knoten (also Eigenschaftsknoten) an welchen Eingängen?
Den einen Eigenschaftsknoten, den ich gemeint habe, lässt du einfach weg. Dafür muss du natürlich den grünen Draht, der aus SubVI 9 herauskommt, direkt dort anschließen, wo jetzt der Ausgang des Propertys hingeht.
Ich schalte in jedem case ja auch einen eingang der dann auf den profibus gelegt wird in den fall auf dem bild leg ich mit dem eigenschaftsknoten ein TRUE auf mein HF-Schütze Schalter, damit die maschinensteuerung die Schütze anzieht.
' schrieb:Das hast du genau richtig verstanden.
Ich gehe immer so vor. Ich überlege mir, wie der Ablauf ist: Zuerst das, dann das, dann das, dann das, usw. Genau in dieser Reihenfolge mach ich dann eine Statemachine mit genau dem Inhalt pro Case, der eben dem DAS entspricht. Jeder Case darf aber nur solchen Code enthalten, der innerhalb allerkürzester Zeit abarbeitbar ist.
da fehlt mir wohl einfach noch die erfahrung das man die schritte und co alle richtig aneinander bekommt, aber ich hoff des wird noch bis ich mit dem projektchen hier fertig bin...
' schrieb:Das soll nicht sein. Es muss ohne ruckeln gehen.
Wie groß ist denn die Wiederholzeit in der While-Schleife? Wie lange deuern denn die beiden SubVIs? Die Ausführungsdauer des gesamten Codes in der While-Schleife sollte 50% der Schleifendauer (siehe Wait-VI) nicht überschreiten.
Zeitmessung kannst du so machen: Millisekundenzeitwert lesen, SubVI ausführen, Millisekundenzeitwert lesen, beide Zeiten subtrahieren und anzeigen. Diese vier Schritte mit einer Sequenzstruktur sequenzieren.
die wiederholzeit in der schleife is 10ms, aber ein durchlauf dauert momentan 1822ms also nicht wirklich gut für ne "echtzeitanwendung" da komische is einfach das sobald die case struktur weg is läuft es gut.
die beiden vi (7 und 8) sind nur dazu da die boolschen ein und ausgangswerte in ein byte zu schreiben und das dann in einen string zu wandeln und den dann auf den bus zu legen bzw. an vi 4 zu geben das legt den string dann auf den bus.
vi7 und 8 haben also keine spezielle zykluszeit die legen die werte 1 zu 1 auf den string,...
' schrieb:Ich schalte in jedem case ja auch einen eingang der dann auf den profibus gelegt wird in den fall auf dem bild leg ich mit dem eigenschaftsknoten ein TRUE auf mein HF-Schütze Schalter, damit die maschinensteuerung die Schütze anzieht.
Ach so.
Heißt das jetzt: In einigen Cases liegt ein SubVI, das auf den Bus schreibt?
Bus schreiben kannst du wie folgt machen: In der While-Schleife hast du einen Cluster in Schieberegister liegen. Das Cluster enthält nur die Daten, die auf den Bus sollen. Der Wire vom Cluster geht durch die Statemachine durch. In bestimmten Cases kannst du nun diesen Cluster manipulieren. Ist der Case beendet, wird nach der Statemachine der Inhalt des Clusters auf den Bus gegeben - und gleichzeitig auf Anzeigeelemente am Bildschirm.
Zitat:die wiederholzeit in der schleife is 10ms, aber ein durchlauf dauert momentan 1822ms also nicht wirklich gut für ne "echtzeitanwendung" da komische is einfach das sobald die case struktur weg is läuft es gut.
Dann hast du in der Case-Struktur was drinnen, das so lange wartet - oder braucht.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
' schrieb:Ach so.
Heißt das jetzt: In einigen Cases liegt ein SubVI, das auf den Bus schreibt?
Bus schreiben kannst du wie folgt machen: In der While-Schleife hast du einen Cluster in Schieberegister liegen. Das Cluster enthält nur die Daten, die auf den Bus sollen. Der Wire vom Cluster geht durch die Statemachine durch. In bestimmten Cases kannst du nun diesen Cluster manipulieren. Ist der Case beendet, wird nach der Statemachine der Inhalt des Clusters auf den Bus gegeben - und gleichzeitig auf Anzeigeelemente am Bildschirm.
Dann hast du in der Case-Struktur was drinnen, das so lange wartet - oder braucht.
nein in den cases liegt kein subvi, im prinzip sieht schon jeder case so aus wie der auf dem bild, nur das dort eben ein anderer eingang auf TRUE gesetzt wird der davorige auf FALSE.
auf den bus geschrieben wird nur von vi4 aber wie schon gesagt is das ein gekaufes vi, das bei der hardware dabei war und was das genau wie macht weiss ich nicht ich seh auch nur die anschlüsse.
das mit dem cluster versteh ich jetzt net so genau, weil ich das ja im prinzip in vi 7 und 8 mach, da zerlege ich ja die bus daten bzw. setzte sie zusammen,.... hab das unten auch nochmal angehängt vi8 is das gleiche nur eben das ich den string zerlege und dann die einzelnen bits aus den bytes ziehe,...
ach ja, die subvis in vi7 wandeln nur das bit-cluster in ein string haben aber keine schleifen oder verzögerungen ect,..
n muster vi kann ich dir leider nicht richtig machen, weil der effekt nur aufftritt, bei dem vi wenn ich mir ein "kleines" bastel, läuft es schön durch und hakt auch net und das "problem"-vi ohne state läuft ja auch,...