Step 7 HIlfe gesuchte: Array mit Variablen aufrufen

sott

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

ich habe vor ein paar Jahren mal beruflich mit S7 gearbeitet und befasse mich seit ein paar Tagen wieder mit dem Thema, da ich für einen bekannten ein kleine Programmierung machen soll.
Am Anfang dachte ich dass es ja ganz simple ist was er will. Doch nun hänge ich an einem Punkt fest wo ich absolut nicht weiter weiß.
Es ist doch schon zulange her dass ich mich richtig mit der Thematik befasst habe.
Hier nun die Anforderung des Programmes:
es gibt einen Motor der mit verschiedenen Zeiten in einer vordefinierten Reihenfolge an und abgeschaltet wird.
z. B. 5s an, 3s aus, 10s an, 15s aus, usw...
Ich dachte mir das ganze so:
Ich lege einen DB (Typ S5Time)an mit dem Array Motor_AN und Motor_AUS wo ich die entsprechenden Zeiten in Reihenfolge ablege.
Dann nehme ich eine Einschalt- (S_Severz) und Ausschaltverzögerung (S_Averz) in Reihe und zähle nach jedem Durchgang einen Zähler (Z1) um 1 nach oben.
Diesen Zähler verwende ich dann zum Aufruf des Arrays direkt am TW der EV bzw. AV.
Und hier dachte ich dass ich das einfach so verwenden kann: DBx.Motor_AN[Z1]
Nur leider hat das ganze nicht hin.

Wo ist der Fehler bei dem ganzen?
ich vermute mal an der Verendung der Variablen, oder?

Grüße Steffen
 
In SCL würde das funktionieren, daß man den Zählerstand direkt als variablen Array-Index benutzt.
In AWL kann man nicht mit variablen Array-Indizes arbeiten, da muß man indirekte Adressierung benutzen.
In FUP und KOP sind variable Array-Indizes und indirekte Adressierung gar nicht möglich. (man könnte höchstens ANY-Pointer für SFC20 basteln)

Wenn es nicht viele verschiedene Zeiten sind dann kann man mit einer Schrittkette oder Fallunterscheidung arbeiten:
- wenn Zähler = 1 dann kopiere 5s und 3s nach Arbeitsvariablen
- wenn Zähler = 2 dann kopiere 10s und 15s nach Arbeitsvariablen
- wenn Zähler = 3 dann ...
- ...


Beispiel indirekte Adressierung in AWL:
Code:
// Der "DBx"
...
Zeiten ARRAY [0..9] OF STRUCT
 Motor_AN  : S5TIME ;
 Motor_AUS : S5TIME ;
END STRUCT

//----------------------

L    #index            // Zählerstand 0..9
SLD  5                 // * 8 (--> Byte-Adresse.0) * 4 (sizeof Struct Zeiten)
L    P#DBX0.0          // Anfangsadresse des Struct "Zeiten" im "DBx" hier einsetzen
+D
LAR1                   // AR1 enthält nun Pointer auf Zeiten[#index]

Auf  "DBx"
L    DBW [AR1, P#0.0]  // Zeiten[#index].Motor_AN
T    #T_EVerz
L    DBW [AR1, P#2.0]  // Zeiten[#index].Motor_AUS
T    #T_AVerz

Achtung: falls Du einen S7-Zähler benutzt, dann mußt Du den Zählerstand "binär codiert" für die Adressberechnung verwenden.

Harald
 
Zurück
Oben