# For- Schleife mit Arrays



## CNC840D (30 Oktober 2015)

Hallo liebe Codesys - Gemeinde,

ich bin gerade dabei in Codesys einzusteigen ...davor habe ich schon fast 20 Jahre S7 auf dem Buckel
und stell mich gerade wahrscheinlich etwas doof an.

Ich Versuche gerade einen Array mit dem Wert der laufvariable auszufüllen, der Wert von i wird aber immer in das erste Element des Arrays eingetragen,
mit SCL vom BigS funktioniert der Code einwandfrei.

Ich arbeite gerade mit Codesys V2.3 in Verbindung mit Bosch Indralogic und versuche den Baustein zu simulieren mit dem Simulator

Könntet Ihr mir ein bisschen auf die Sprünge helfen hab echt ein Brett vorm Kopf.

Vielen Dank

FUNCTION_BLOCK Indirekt

VAR_INPUTStart:BOOL;​END_VAR

VARFM   :BOOL;​FP   :BOOL;​Daten :ARRAY [0..100] OF INT;​END_VAR

VAR_TEMPi   :INT;​END_VAR

(*Flanke Start*)FM:=Start AND NOT FP;​FP:=Start;​
(*Array ausfüllen*)IF FM THEN​FOR i:= 0 TO 100 BY 1 DO​Daten_:=i;_​_
END_FOR;​END_IF;​_


----------



## excelite (30 Oktober 2015)

Hallo,

der Code muss so funktionieren wenn du ein Array willst, dass den Inhalte 0,1,2,3... hat. Wenn ich dich richtig verstanden habe hast du nur im ersten Element einen Wert?

Die Variable FM kannst du dir sparen. Ändert zwar nicht an der Funktion aber ist etwas kompakter:

IF Start AND NOT FP THEN
     FOR i := 0,...

     END_FOR;
END_IF;
FP := Start;


----------



## CNC840D (30 Oktober 2015)

...genau ich will eigentlich nur den Array mit 0,1,2,3 usw. ausfüllen, bei mir trägt es aber nur den letzten Wert nach dem Schleifendurchlauf in Daten[0] ein.


----------



## shrimps (30 Oktober 2015)

Hi
Bin mir nicht sicher aber ist i in var-temp gut aufgehoben ?
Muss die nicht auch nach var ?
Sorry, ich setze Temp selten ein ...
LG
Shrimps


----------



## CNC840D (30 Oktober 2015)

...das hab ich auch schon veruscht, leider ohne Verbesserung.
Kann das vielleicht an der Simulation liegen ??


----------



## Larry Laffer (30 Oktober 2015)

@Shrimps:
Nein ... mit der Laufvariablen (i) ist das schon korrekt so. Die würde ich auch immer im TEMP anlegen.

@TE:
Änder doch mal deine Flanke wie von excelite vorgeschlagen.
Aber wie auch schon geschrieben : der Code sollte so funktionieren (wie gewünscht).
Was passiert denn außerhalb des Baustein noch so ?


----------



## CNC840D (30 Oktober 2015)

.... hab die Flanke mal geändert ...alllerdings ohne Erfolg
Ausserhalb des Bausteins passiert eigentlich nichts...hab ihn nur im PLC_PRG aufgerufen als Instanz (siehe Screenshot)


----------



## excelite (30 Oktober 2015)

sehr merkwürdig,... in so einem Fall würde ich:

a) Alles bereinigen, neu übersetzen,... 
b) mit einem Breakpoint Zeile für Zeile durchlaufen und das Programm bewerten


----------



## PN/DP (30 Oktober 2015)

Beobachte mal Array-Werte im Programm nach der FOR-Schleife:

```
[COLOR="#A9A9A9"]...
    END_FOR;
END_IF;
FP:=Start;[/COLOR]

[B]i:=Daten[0] + Daten[1] + Daten[99] + Daten[100];[/B]
```

Du könntest auch mal das IF.. deaktivieren und die FOR-Schleife immer ausführen.

Harald


----------



## CNC840D (30 Oktober 2015)

...hab die Anweisung von PN/DP mal hinten angehängt sieht dann wie im Screenshot aus.
Das ganze ist irgendwie mysteriös.
Kann jemand von euch mal versuchen wie das ganze sich in der Simulation verhält??


----------



## excelite (30 Oktober 2015)

Funktioniert natürlich einwandfrei bei mir...auch unter Simulation ohne HW


----------



## CNC840D (2 November 2015)

...sowas hab ich mir fast schon gedacht :-( 
Ich hab jetzt mal das Ganze ins PLC_PRG direkt geschrieben ...ohne Veränderung.....kann man vielleicht im Simulator was falsch einstellen oder hab ich die falschen Variablen verwendet??


----------



## excelite (2 November 2015)

Eine Idee habe ich noch. Die Simulation ist eigentlich nur eine Krücke man kann zwar Kleinigkeiten testen aber mehrere Tasks kann das Ding normalerweise nicht. Ich nutze das wirklich nur für Kleinigkeiten (... sowas was du da eigentlich machen willst). Was immer wieder zu großen Problemen führt ist wenn man mit der PLC_PRG arbeitet und diese trotzdem in einer Task aufruft. PLC_PRG wird normalerweise implizit aufgerufen wenn man diese dennoch in einer Task anhängt kann es Probleme geben. Ich nutze deshalb nie den Standardnamen PLC_PRG, sondern PRC_MAIN oder so ähnlich und hänge diese explizit in der Taskverwaltung an.

Ich weiß nicht ob dein Bosch IndraPLC auch eine SoftSPS mitliefert. Die meisten Hersteller bieten die als 2h Demo Version an. Super für Tests da das dann auf einer "echten" PLC läuft und nicht nur in der IDE. Schau mal nach ob evtl. eine SoftPLC installiert wurde dann starte die, ändere dein Zielsystem und lasse es darauf laufen. Falls nichts installiert ist kannst du das von der 3S Seite runterladen (evtl. mit Registrierung,...). Dann kannst du nochmal testen.

Bei mir heißt die Verknüpfung: CoDeSys SP PLCWinNT V2.4


----------



## CNC840D (2 November 2015)

Hallo excelite,

der letzte Tipp hats gebracht....hab die Soft SPS eine CNC- Steuerung der Bosch MTX, die sowieso mal später das Ziel meines Projekts wird angewählt, und siehe da es funktioniert.
Danke das Ihr soviel Geduld mit mir hattet 
Ich hoffe ich muss euch nicht allzu oft belästigen.

Viele Grüße


----------

