Step 7 Viele Fragen zum Rundtisch...

Zuviel Werbung?
-> Hier kostenlos registrieren
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é

Ok, vielen Dank!

Habe das mit dem Array in SCL jetzt so gelöst - bekomme jetzt keine Fehlermeldung beim Übersetzen mehr; aber dieses "OF INT" ist noch nicht ok, oder?

Array.jpg
 
Nachtrag...

Glaube so ist es besser:

Array.jpg


Ein Problem (schon wieder eines!) noch beim Aufruf im OB1 von oben dargestelltem FB:

ArrayofUDT:=

Fehler: Aktualdatentyp BLOCK_DB passt nicht zu formalem Typ ARRAY des Formalparameters ArrayofUDT
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
... du mußt das Array natürlich genau so, wie du es als INOUT-Parameter erwartest irgendwo deklariert haben.
Das kannst du dann (am Besten symbolisch) an den Parameter des FB antragen ...

Gruß
Larry
 
Ein Problem (schon wieder eines!) noch beim Aufruf im OB1 von oben dargestelltem FB:

ArrayofUDT:=

Fehler: Aktualdatentyp BLOCK_DB passt nicht zu formalem Typ ARRAY des Formalparameters ArrayofUDT

Am besten gibst du dem UDT11 einen symbolischen namen und in SCL weist du den UDT per symbolischem namen zu.

wo kommt der fehler? Beim Uebersetzen oder beim aufrufen des Bausteins?
 
... du mußt das Array natürlich genau so, wie du es als INOUT-Parameter erwartest irgendwo deklariert haben.
Das kannst du dann (am Besten symbolisch) an den Parameter des FB antragen ...

Gruß
Larry

Nun, ich habe ja ein Array[0..10] of UDT11 deklariert.

Und im FB (SCL) steht (siehe Post #42): ArrayofUDT : ARRAY[0..10] OF UDT11;


@vollmi: Der Fehler kommt beim Aufruf des FB's im OB1...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nun, ich habe ja ein Array[0..10] of UDT11 deklariert.

Wo ?
Davon das du es als IN-OUT-Parameter an dem FB hast ist es noch nicht wirklich irgendwo vorhanden. Du mußt das Gleiche jetzt noch in einem DB deiner Wahl deklarieren und diese Deklaration dann beim Aufruf deines FB (also im OB1 bei dir) an denselben übergeben.
Also vielleicht in etwa so :
Code:
call FB123 , db123[
   ArrayOfUDT := "DB11".meinArray/CODE]

Gruß
Larry
 
Wo ?
Davon das du es als IN-OUT-Parameter an dem FB hast ist es noch nicht wirklich irgendwo vorhanden. Du mußt das Gleiche jetzt noch in einem DB deiner Wahl deklarieren und diese Deklaration dann beim Aufruf deines FB (also im OB1 bei dir) an denselben übergeben.
Also vielleicht in etwa so :
Code:
call FB123 , db123[
   ArrayOfUDT := "DB11".meinArray/CODE]

Gruß
Larry[/QUOTE]

Also den[B] DB11[/B] (Array[0..10] of UDT11) gibt es ja [B]physikalisch[/B] im Bausteinordner!


[CODE]
Call FB123, DB123
[COLOR=#ff0000]ArrayofUDT := DB11[/COLOR][COLOR=#ff0000].INDEX[/COLOR]


DB11.jpg
 
Zuletzt bearbeitet:
Wenn es den DB11 gibt und er den symbolischen Namen DB11 hat dann müßte es dann trotzdem so heißen :

Call FB123, DB123
ArrayofUDT := "DB11".INDEX

Falls der DB11 einen anderen symbolisch Namen hat, dann den zwischen den Gänsefüßchen eintragen. Falls er gar keinen symbolischen Namen hat dann solltest du ihm einen geben ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn es den DB11 gibt und er den symbolischen Namen DB11 hat dann müßte es dann trotzdem so heißen :


quote_icon.png
Zitat von spirit
Call FB123, DB123
ArrayofUDT := "DB11".INDEX

Falls der DB11 einen anderen symbolisch Namen hat, dann den zwischen den Gänsefüßchen eintragen. Falls er gar keinen symbolischen Namen hat dann solltest du ihm einen geben ...

Gruß
Larry

Hm, irgendwie nichts zu machen...

Ja, den DB11 gibt es - war zwar bisher ohne symbol. Namen; aber auch mit symbol. Namen zwischen den Gänsefüßchen ist das Ergebnis dasselbe!

Beim Überfahren mit der Maus kommt die bekannte Meldung: Aktualdatentyp BLOCK_DB passt nicht zu formalem Typ ARRAY des Formalparameters ArrayofUDT


Danke...



Ahhh - Entwarnung!

Habe jetzt mal "Zugriffe prüfen und aktualisieren" geklickt und plötzlich hat es geklappt.

Ein Wunderwerk das Ganze... :confused:
 
Zuletzt bearbeitet:
So, neuer Tag, neues Glück! ;)

Bevor ich noch einige theoretische Fragen anbringe, wollte ich das Ganze jetzt mal im Kleinen probieren. Dazu habe ich mir in einem DB ein Array[1..3] of UDT gebastelt:

DB.jpg

Ferner einen Schleifen-FB zum kopieren:

Schleifen_FB.jpg

Und schließlich der Aufruf im OB1:

OB1.jpg

Hm, und dann war die Enttäuschung groß - da PLCSIM in Stop geht!

Fehler: Bereichslängenfehler beim Lesen

Das muss doch was mit dem Array zu tun haben, oder?

Den UDT kann man ja nicht in die SPS laden, richtig?

Vielen Dank für erneute Hilfe! :p
 
Guten Morgen!

Is doch klar.... bei drei Schleifendurchläufen wird [index-1] irgendwann null. Und das Element null gibts nicht weil Du 1..3 angelegt hast.

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen!

Is doch klar.... bei drei Schleifendurchläufen wird [index-1] irgendwann null. Und das Element null gibts nicht weil Du 1..3 angelegt hast.

Gruß

Ja klar, da habe ich nur abgeschrieben ohne zu ändern -wie doof! D.h. mit eins geht es mit ner Schleife gar nicht, oder?

Nun bekomme ich keinen Fehler mehr; aber es steht in jedem Array der selbe Inhalt...

Und ich habe nochmals die Schleife anders gemacht:

Code:
IF M_Takten THEN
  FOR index := 3 TO 1 BY -1 DO
     ArrayOfUDT[index] := ArrayOfUDT[index - 1];
  END_FOR;
  M_Takten := False;
END_IF;

Müsste jetzt nach drei Durchläufen der Merker nicht automatisch wieder Null werden?
 
Ja klar, da habe ich nur abgeschrieben ohne zu ändern -wie doof! D.h. mit eins geht es mit ner Schleife gar nicht, oder?

Doch natürlich geht das. du musst nur darauf achten dass entweder das Array so gross ist dass darauf zugegriffen werden kann.

Der letzte zugegriffene Index in deiner Schleife wäre ja [1 - 1] (Weil der letzte inhalt der Indexvariable 1 ist) das heisst zugriff auf Arrayvariable [0] die gibts aber nicht weil du ein Array von 1-3 generiert hast. Würdest du ein Array machen von 0-3 dann würds klappen.

Oder du machst nur zwei Schleifendurchläufe 3 to 2. Im letzten Durchlauf wird dann von [1] nach [2] geschoben.

Nun bekomme ich keinen Fehler mehr; aber es steht in jedem Array der selbe Inhalt...

Die Schleife schiebt nur von oben runter. wenn oben nix neues reinkommt bleibt das so wie es ist.

Code:
IF M_Takten THEN
  FOR index := 3 TO 1 BY -1 DO
     ArrayOfUDT[index] := ArrayOfUDT[index - 1];
  END_FOR;
  M_Takten := False;
END_IF;

Müsste jetzt nach drei Durchläufen der Merker nicht automatisch wieder Null werden?

Müsste ja.
Hast du übersetzt und runtergeladen?


mfG René
 
Die Schleife schiebt nur von oben runter. wenn oben nix neues reinkommt bleibt das so wie es ist.

Müsste ja.
Hast du übersetzt und runtergeladen?

mfG René

Danke René,

habe den DB so vorkonfiguriert:

DB.jpg

Jetzt sollte doch nach 1x Schleifendurchlauf nicht überall eine 1 stehen - tut es aber!

Ja, habe übersetzt und in SPS geladen, aber der Merker wird nicht von alleine wieder Null... schönes Beispiel zum Üben übrigens. Stelle mich nur etwas (sagen wir mal) ungünstig an... ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ahh, Fehler gefunden! *freu*

1) Der Merker wurde nicht zurückgesetzt, weil er noch als IN-Parameter deklariert war (hatte da nämlich zuvor einen Eingang dran).

2) Es stand im Array überall ne 1 drin, weil ja (ohne meinen Zusatz, dass der Merker nach einem Durchlauf der Schleife wieder Null wird) die Schleife mit jedem Zyklus aufgerufen wurde...

Na, wie bin ich? :D
 
Macht mit Kanonen auf Spatzen schiessen nicht einen Heidenspass? :ROFLMAO:


Nunja, wenn man einigermaßen treffsicher ist, sicherlich! :p


… also ich hatte nach einer Möglichkeit hier im Forum gefragt, wie ich es angehen könnte so einen Rundtisch zu programmieren, da ich davon echt sehr wenig Ahnung habe. Mein Problem ist natürlich auch, dass ich die Programmiererei (wenn man das, was ich treibe überhaupt so nennen darf) erst seit Ende 2012 betreibe und dann auch nicht ständig – und (wie bereits geschrieben) ja auch nicht freiwillig. Aber ich merke auch, dass das Ganze mit zunehmenden Kenntnissen immer mehr Spaß macht!

Natürlich strebe auch ich immer die einfachste Möglichkeit an; schon deswegen, weil ich mir dadurch einfach leichter tue.

ABER:


Gerade dieses Thema hat mir doch auch gezeigt, dass "ein wenig über den Tellerrand hinauszuschauen" im Hinblick auf die Möglichkeiten einer SPS sowie das "Jonglieren" mit Variablen auch sehr lehrreich (wenn auch sehr fehlerträchtig) sein kann. Obgleich ich schon oft sehr dumm nachfragen muss, um alles zu verstehen, habe ich doch gerade auch durch diese (zugegebenerweise schon recht komplizierte Programmiertechnik) sicherlich mehr gelernt als durch eine vergleichsweise einfachere Variante. Was dann letzten Endes zum Einsatz kommt sei dahingestellt; und vielleicht kann ich diese Art der Programmierung genau für ein anderes Projekt einsetzen – und dann hätte sich der ganze Aufwand ja mehr als nur gelohnt!

Wie auch immer – ich werde zu diesem Thema bestimmt noch die eine oder andere Frage für die Praxis haben – aber ich danke echt jedem "Helfenden", wenn er seine Ideen und Erfahrungen hier kund tut. Seien es einfache oder komplizierte Lösungen! Viele der hier im Forum geposteten Codes übersteigen meine Kenntnisse jedoch bei weitem, so dass ich da (derzeit) noch gar nicht dran gehe... und irgendwie fällt es mir in der Praxis auch schwer zu entscheiden, welcher Aufwand gerechtfertigt und zweckmäßig ist.
 
Zurück
Oben