Anfängerfrage über array

noeppkes

Level-1
Beiträge
150
Reaktionspunkte
5
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe im FC2 2 temp-Variablen angelegt.
Die erste:
Hilfsmerker_array[1..40] of BOOL
Die zweite:
loop INT

Nun will ich darauf in AWL zugreifen
Ich habe es folgendermaßen gemacht:

FP #Hilfsmerker_array[#loop]

Das geht aber nicht:
Syntaxfehler.

Was mache ich falsch ?
Muss loop eine globale Variable sein ?

Danke für euere Hilfe
noeppkes
...
 
Nein.
Siemens erlaubt keine Variablen als Indexzeiger.
Also „Loop“ kann nur eine Konstante sein.
Schleifbearbeitungen bei Siemens sehen darum immer so kompliziert aus.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Um auf ein einzelnes Bit in Deinem Array zuzugreifen müsstest Du z.B. schreiben:

FP #Hilfsmerker_array[2]

Wobei allerdings temporäre Variablen nicht zur Flankenauswertung geeignet sind.

Was Du aber mit Deiner Int-Var #loop in Zusammenhang mit einer positiven Flankenauswertung anstellen willst raff´ich nicht.:confused:
 
@OHGN

Setzen 5 :ROFLMAO:, Thema verfehlt.

@noeppkes

Hier mal ein Code zum testen:

Code:
//Welches Bit soll indirekt gelesen werden
      L     38                          //das Bit 38 im Array soll abgefragt werden
      L     1                           //nur zur Veranschaulichung
      -I                                //da das Array bei 1 beginnt, der Pointer aber bei 0
      T     #MyInt

//erstmal das ganze Array auf Null
      L     P##BitArray
      LAR1  
      L     0
      T     LW [AR1,P#0.0]
      T     LW [AR1,P#2.0]
      T     LW [AR1,P#4.0]

//Ein Bit zum Testen setzen
      SET   
      S     #BitArray[38]               //Das Bit 38 wird auf 1 gesetzt

//Ein Bit indirekt auslesen
      L     P##BitArray                 //Pointer auf Adresse
      L     #MyInt                      //Offset 
      +D                                //addieren
      LAR1                              //Ins Adressregister 1

      U     L [AR1,P#0.0]
      =     M      0.0                  //der Merker geht auf 1, wenn das Bit 1 ist
 
Ich sehe schon... es wurde schon fleißig geantwortet.

Loop sollte DWORD sein. Achte darauf, dass der Temp Bereich nach verlassen des Bausteins wieder freigegeben wird.


Code:
      LAR1  P##Hilfsmerker_arry
      L     #loop
      +AR1  

      U ...
      FP    L [AR1,P#0.0]
      ...

      L     #loop
      L     P#0.1
      +D    
      T     #loop
 
Wenn andere Bausteine ebenfalls den TEMP Bereich nutzen, so wird dieser mit den neuen Daten überschrieben. Die Daten sind also nur lokal aktuell. Wenn du den Baustein vor Ende der Schleife verlässt, musst du die Daten als "Globale" Daten festlegen z.B. Merker oder Datenbaustein.

Hatte mich wohl nicht soooo deutlich ausgedrückt.
 
Zuletzt bearbeitet:
Zur Info

Hallo,

es wurde die Frage gestellt, warum ich FP und Hilfsmerker nehmen.
Ich arbeite mit mehreren Tastern.
Um nicht jedesmal im Programm die Flanke (positiv sowie auch negativ)abfragen zum müssen, wollte ich das über die hilfsmerker machen.
D.h. der jeweilige Merker ist für einen Takt auf High.
Das lässt sich meiner Meinung nach im Programm sehr gut auswerten.

Des weiteren ist der Programmteil für mehrere Taster ( 2 Taster a 10 Loop's) identisch, so dass ich das ganze mit einer Loop 1 .. 10 versehen wollte.
Die Hilfsmerker über ein Array, und das Resultat auch über ein Array.

Ich hoffe es wird so funktionieren.

Bin für weitere Informationen sehr dankbar.

Eigentlich ist da ganze mal wieder eine so oft diskutierte Rolladensteuerung.
Taste < 500 msec. gedrückt: Rolladen fahren entsprechend dem Taster (AUF- oder AB) in die Richtung auf Endanschlag.
Taster > 500 msec. Gedrückt: Manuell. Rolladen fährt nur solange wie auch der Taster gedrückt ist.

Ich habe erst einmal 10 Rolladen im Untergeschoss. d.h. 20 Taster für auf und Ab.
Es gibt aber auch noch Sammeltaster (an der Haustüre, alle runter bitte).
Somit muss ich die Funktion, welche mir die Logik für die einzelnen Rolladen steuert, von mehreren Stellen aus steueren können.
Somit der Gedanke mit den Hilfsmerkern.
Diese kann ich ja auch von einer anderen Seite aus setzen.
Somit läuft der Rolladen wieder.

Bei Regen z.B. sollen auch alle zumaschen (per IR-Fernbedienung kann ich sie wieder öffen).

Ihr seht , das ganze ist sehr aufwendig.

Dies sind nur ein paar Gedanken, die ich habe.

noeppkes ...
 
Temp-Bereich freigeben ?

Hallo Rumo,

warum und vor allen Dingen WIE gebe ich den Temp-Bereich bei verlassen Funktion wieder frei ?

noeppkes ...
 
Das war der Punkt den Ralle angesprochen hat.
Du musst ihn nicht ausdrücklich freigeben.
Nach verlassen des Bausteins, ist der Berich automatisch für den nächsten Baustein freigegeben.
Werden die Daten nicht in deinem Baustein vorbelegt, so wirst du einen Zufallsgenerator erhalten, dessen Inhalt sich mit beschreiben des TEMP Bereichs ändert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Schleife als Index

Hallo,

das verstehe ich jetzt nicht,

gerade eine Schleife macht doch Sinn.
Warum kann ich solch eine Schleife nur mit konstanten (ansprechen des Array's) machen.
Eigentlich wollte ich nur folgendes:

(Ich schreibe es mal in C, das ist für mich wesentlich einfacher.
In AWL bräcuhte ich wahrscheinlich ein paar Tage dazu.)

temp FP_hilfsmerker[1..40] as BOOL
temp hilfsmerker[1..40] as BOOL
loop as integer

U "TASTER_Roll_Kueche_Ab"
FP #FP_Hilfsmerker_array[1] // Hilfsmerker
= #Hilfsmerker_array[1] // Positive Flanke des Tasters

U "TASTER_Roll_Kueche_Ab"
FN #FP_Hilfsmerker_array[2] // Hilfsmerker
= #Hilfsmerker_array[2] // Negative Flanke des Tasters

U "TASTER_Roll_Kueche_Auf"
FP #FP_Hilfsmerker_array[3] // Hilfsmerker
= #Hilfsmerker_array[3] // Positive Flanke des Tasters

U "TASTER_Roll_Kueche_Auf"
FN #FP_Hilfsmerker_array[4] // Hilfsmerker
= #Hilfsmerker_array[4] // Negative Flanke des Tasters

...

for (loop = 1; loop <= 10; loop+=4)
{
if (hilfsmerker[loop])
{
... blablabla
}
...
if (hilfsmerker[loop + 1])
{
... blablabla
}
...
if (hilfsmerker[loop + 2])
{
... blablabla
}
...
if (hilfsmerker[loop + 3])
{
... blablabla
}
...
}

Über Konstante bringt mir das gar nichts.

noeppkes ...
 
Du musst doch nicht auf deine Variablen verzichten. Du solltest nur dein Array und die Variable Loop in den Daten oder Merkerbereich legen.
Damit bist du auf der sicheren Seite.
Wenn Du nicht gerade eine Flankenauswertung machen würdest, welche sich über mehrere Zyklen der CPU hinzieht, kannst du die Lokalen Variablen ja auch lassen.
Aber in diesem Fall, wirst du zwangsweise irgendwann deinen FC verlassen müssen, damit die Zykluszeit nicht überschritten wird. Somit können die Lokalvariablen (Tempvariablen) von jedem folgenden Baustein beschrieben werden.
 
Oder nimm einen FB und Statische Variablen für die Flanken, mit Temp funktionieren Flanken nicht!
 
Zurück
Oben