# Sprungmarken in AWL ?



## noeppkes (20 September 2007)

Hallo,

sobald ma viele Sprungmarken in einem Programmablauf hat, finde ich, wird es sehr unübersichtlich.
Gibt es eine Möglichkeit auf Sprungmarken zu verzcihten.
Hier ein Beispiel in AWL:

      U     "FP_Tast_Roll_Kueche_Ab"
      SPBN  W1

      SET   
      R     "Roll_Kueche_abgebrochen"
      L     0
      T     "ergebnis RollEssKuAuf"
      L     1                           // 1 in Akku-1
      L     "C_ Roll_Kueche_Auf"        // Relais-Counter in Akku-2
      >I                                // Akku-1 > Akku-2
      SPBN  W3                          // Ja, dann auf W8
// Rolladenzeit in den Counter laden
      L     "Zeit_Roll_Auf"             // Lade 1600 * 20msec. = 32 Sekunden
      T     "C_ Roll_Kueche_Auf"        // In den Relais-Counter schieben
// Gegenseitig verriegeln
      L     0                           // Lade 0
      T     "C_ Roll_Kueche_Ab"         // In den Relais-Counter schieben
WT1:  U     "M_Roll_Kueche_Ab"
      SPBN  W2

in der Programmiersprache C würde das wesentlich einfacher aussehen, da man dort keine Sprungmarken benötigt, sondern mit geschweiften Klammern arbeitet.
      U     "FP_Tast_Roll_Kueche_Ab"
      SPBN  W1

      SET   
      R     "Roll_Kueche_abgebrochen"
z.B.
if (!FP_Tast_Roll_Kueche_Ab)
{
  ...
}
else
{
  ...
}
usw.

Somit lassen sich auch ganze Programmteile, die eignetlich identisch sind (etwas andere Merker etc) einfach kopieren und die Merker austauschen.
Hingegen bei Sprungmarken muss ich auch noch diese neu vergeben.
Da macht man schnell einen Fehler 

noeppkes ...


----------



## Ralle (20 September 2007)

In AWL läßt sich das kaum umgehen, man muß ordentlich strukturieren und Kommentare einfügen, auch mal ne Leerzeile lassen!

Versuchs mal mit SCL, das wäre für dich dann eher etwas.


----------



## vierlagig (20 September 2007)

ST - Strukturierter Text - ist das was du suchst ...mit awl wird das nix, also nicht so wie du es dir wünschst..

heißt, wie ralle bemerkte bei siemens SCL


----------



## zotos (20 September 2007)

Ja ST/SCL wird Dir mehr Spaß machen.

Aber wenn es darum geht das Du eh viel mit Copy/Paste Programmierst. Würde es auch schon viel Bringen das ganz mit klaren Schnittstellen in FCs und FBs zu verpacken anstatt mit Merkern sich die Finger wund zu tippen.


----------



## noeppkes (20 September 2007)

*Danke*

Vielen Dank für euere Vorschläge.
Ich probiere dann mal bei Gelegenheit SCL.
Aber das von Zotos habe ich nicht ganz verstanden.
Wie habe ich das zu verstehen mit mehreren FC/FB's.

Hier mal ein Ausschnitt, den ich 16 mal benötige. (8 Rolläden a Auf + Ab
Jeweils nur mit anderen anzusteuernden Ausgängen, sowie mit anderen Merkern und Eingängen.
(Kann noch etwas kompliziert und aufwendig programmiert sein, aber es funktioniert)


```
// Rolladensteuerung Küche Ab
// M_Roll_Kueche_Ab bitte entsprechend setzen. Kürzer als 400msec. Rolladen läuft in endrichtung, länger: Steuerung per Länge der Tastfunktion
Roll: U     "M_Roll_Kueche_Ab"
      FP    "FPM_Tast_Roll_Kueche_Ab"   //[MW34]       // Hilfsmerker
      =     "FP_Tast_Roll_Kueche_Ab"    // Positive Flanke des Tasters

      U     "M_Roll_Kueche_Ab"
      FN    "FNM_Tast_Roll_Kueche_Ab"   // Hilfsmerker
      =     "FN_Tast_Roll_Kueche_Ab"    // Negative Flanke des Tasters

      U     "FP_Tast_Roll_Kueche_Ab"
      SPBN  W1

      SET   
      R     "Roll_Kueche_abgebrochen"
      L     0
      T     "ergebnis RollEssKuAuf"
      L     1                           // 1 in Akku-1
      L     "C_ Roll_Kueche_Auf"        // Relais-Counter in Akku-2
      >I                                // Akku-1 > Akku-2
      SPBN  W3                          // Ja, dann auf W8
// Rolladenzeit in den Counter laden
      L     "Zeit_Roll_Auf"             // Lade 1600 * 20msec. = 32 Sekunden
      T     "C_ Roll_Kueche_Auf"        // In den Relais-Counter schieben
// Gegenseitig verriegeln
      L     0                           // Lade 0
      T     "C_ Roll_Kueche_Ab"         // In den Relais-Counter schieben
WT1:  U     "M_Roll_Kueche_Ab"
      SPBN  W2
      L     "ergebnis RollEssKuAuf"
      L     1
      +I    
      T     "ergebnis RollEssKuAuf"
      SPA   W4

W2:   U     "FN_Tast_Roll_Kueche_Ab"
      SPBN  W4
      L     "ergebnis RollEssKuAuf"
      L     25                          // 20 * 20 msec = 400 msec.
      <=I                               // <= 400msec. ?
      SPBN  W3                          // Nein, dann auf W3
// Wenn der Rolladen schon lief, dann abbrechen und ausschalten
      U     "Roll_Kueche_abgebrochen"
      SPB   W_1                         // Zum Ende springen
      L     "Zeit_Roll_Auf"             // Lade 1600 * 20msec. = 32 Sekunden
      T     "C_ Roll_Kueche_Auf"        // In den Relais-Counter schieben
      SPA   W4                          // Weiter auf W4
      L     "Zeit_Roll_Auf"             // Lade 1600 * 20msec. = 32 Sekunden
      T     "C_ Roll_Kueche_Auf"        // In den Relais-Counter schieben
      SPA   W4                          // Weiter auf W4
W3:   SET   
      S     "Roll_Kueche_abgebrochen"
      L     0                           // Lade 0
      T     "C_ Roll_Kueche_Auf"        // In den Relais-Counter schieben
// Neu eingefügt
W4:   L     "C_ Roll_Kueche_Auf"
      L     0
      ==I   
      SPB   W_1
      L     "C_ Roll_Kueche_Auf"
      L     1
      -I    
      T     "C_ Roll_Kueche_Auf"
 
// Gegeneinander verriegeln
W_1:  U     "M_Roll_Kueche_Auf"
      SPBN  W_4
      L     0
      T     "C_ Roll_Kueche_Auf"

W_4:  L     "C_ Roll_Kueche_Auf"
      L     0
      ==I   
      SPB   W5
      SET   
      S     "Roll_Kueche_Ab"        // Dann Relais setzen
      SPA   W6
W5:   SET   
      R     "Roll_Kueche_Ab"        // Dann Relais löschen
W6:   NOP   0
```
 

Tja, und genau das benötige ich 16 *

Hat jemand eine Idee, wie ich das einfacher bzw. array-mäßiger machen kann, bevor ich mir die Finger Wund tippssle

Übrigens: Klasse Forum hier. Hier wird schnell geholfen !

noeppkes ...


----------



## zotos (20 September 2007)

Ohne den Code jetzt gelesen zu haben. Pack das ganze in einen FB und rufe den 16 mal auf.


----------



## noeppkes (20 September 2007)

*FB, 16 mal aufrufen ?*

Danke für die Info'S.
Es sind jedoch einige Merker, die speziell für die Blöcke 1 ... 16 sind dann vergeben.
Dies müsste mit einem Array gelöst werden,
Die Ein- bzw. ausgngszuordnung / Übergaben sind mir in etwa klar.

Muss ich dann die Merkerbits, die im FB verwendet werden auch übergeben, oder kann mann diese im FB dann errechnen

z.B

merkerbit_rolladen_läuft_hoch [1 + (Aufruf_nr * 5]
So wäre es in C.

Aufrufnr. wäre dann 1 ... 16 (besser 0 ... 15)

Und genau da scheitert es bei mir.
Wie handle ich das ganze für die Merker.

noeppkes ...


----------



## maxi (20 September 2007)

noeppkes schrieb:


> Und genau da scheitert es bei mir.
> Wie handle ich das ganze für die Merker.
> 
> noeppkes ...


 
In Stat damit


----------



## noeppkes (20 September 2007)

*Hallo Maxi*

Stat habe ich gefunden.
Ich habe bisher nur mit FC's gearbeitet.
Dort gibt es das nicht.

Wenn ich nun für meine 16 Aufrufe 64 Merker benötige, lege ich dann ein Array an und hole die Bits dann aus diesem Array mit dem AR1.
Ich habe schon im Forum gelesen, dass hiermit indirekte Adressierung möglich ist.

Ich würde es folgendermaßen lösen:
Merker_1, Merker_2,Merker_3 und Merker_4 anlegen.
64 Bit als Stat anlegen.

Diese anhand der übergebenen Nummer vor dem Programmteiul füttern.
Dann diese in Programmteil verwenden.
Wäre das ein guter Ansatz ?

noeppkes ...


----------



## Ralle (20 September 2007)

Hier mal ein kleines Beispiel:


```
FUNCTION_BLOCK FB 100
TITLE =
VERSION : 0.1


VAR_INPUT
  Dein_Input : BOOL ;    
END_VAR
VAR_OUTPUT
  Dein_Output : BOOL ;    
END_VAR
VAR
  HM_Flanke : BOOL ;    
  Flanke : BOOL ;    
END_VAR
BEGIN
NETWORK
TITLE =Flanke von deinem Input

      U     #Dein_Input; 
      FP    #HM_Flanke; 
      =     #Flanke; 
NETWORK
TITLE =Diese Flanle als Output

      U     #Flanke; 
      =     #Dein_Output; 
      
END_FUNCTION_BLOCK
```
Aufruf des FB100:


```
CALL FB   100 , DB   100 (
           Dein_Input               := M      1.0,
           Dein_Output              := M      2.0);
```

Dann wird der DB100 automatisch mit angelegt (Für die anderen Rollos nimm z.Bsp. Call FB100, DB101 ; Call FB100, DB102 ...)

Im DB stehen die Statischen Variablen.
Als Input und Output kannst du z.Bsp. deine Eingänge und Ausgänge oder auch MErker nehmen, mit denen du dann die Ausgänge schaltest.


----------



## OHGN (20 September 2007)

Also ich geh mal davon aus dass Du 16 Rolläden hast, die Du Steuern willst.
Also schreibst Du Dir erstmal einen FB für *einen* Rolladen. Dort deklarierst Du dir alles was von Deinen Eingängen kommt (also Taster) als IN-Variablen, dass was die Ausgänge ansteuert als OUT-Variablen und das was Du als Merker brauchst als STAT- Variablen, auf Merker verzichtest Du mal tunlichst. (Wenn Du für alle 16 Rolläden 64 Merker brauchtest wären das also 4 STAT-Var´s).
Deine Logik programmierst Du nun mit den IN, OUT und STAT-Var´s.

Später rufst Du den fertigen Baustein dann einfach so oft auf, so viel Rolläden du eben hast. (Jedes Mal allerdings mit einem anderen Instanz-DB).

Edit: Alles klar, Ralle war schneller!!! (setzen *6* ):sw6:


----------



## maxi (20 September 2007)

OHGN schrieb:


> Also ich geh mal davon aus dass Du 16 Rolläden hast, die Du Steuern willst.
> Also schreibst Du Dir erstmal einen FB für *einen* Rolladen. Dort deklarierst Du dir alles was von Deinen Eingängen kommt (also Taster) als IN-Variablen, dass was die Ausgänge ansteuert als OUT-Variablen und das was Du als Merker brauchst als STAT- Variablen, auf Merker verzichtest Du mal tunlichst. (Wenn Du für alle 16 Rolläden 64 Merker brauchtest wären das also 4 STAT-Var´s).
> Deine Logik programmierst Du nun mit den IN, OUT und STAT-Var´s.
> 
> ...


 
Glaub habe was flasch verstanden.
Für was die unterschiedlichen Instanz DB`s?
Probier es mal mit immer den gleichen aus 
Spart enorm Speicherplatz


----------



## vierlagig (20 September 2007)

das hier könnte dem verständnis dienlich sein http://www.automation.siemens.com/download/internet/cache/3/1309961/pub/de/b05_struktprog.pdf


----------



## noeppkes (20 September 2007)

*verschiedene Instanz's DB's*

Hallo Maxi.
ich brauche ja dann verschiedene Instanz DB'S, da ja dort drin die Laufzeiten und der Status der einzelnen Rolläden abgespeichert ist.

Aber ich versuche es mit einer zu machen.
Ich lege die Bits als Array an.
Die zu verwaltenden Zeiten auch.
Nun hole ich mir aus den Array am Programmstart die richtigen informatioen (Anhand der übergebenen Nummer) und lege diese in Temp-Bit / Int's.

Somit habe ich im Programmablauf selbst immer die gleichen Bezeichnungen, aber eben nur anders gefüttert.

Ich hoffe mal daß das geht.

Hier ein kleiner Auszug meines Vorhabens.


```
Taster ist Eingang Bool
Relais ist Ausgang BOOL
 
Bitmerker_array ist im Stat als Array angelegt:
Bitmeker_array [1..40] as BOOL
 
      LAR1  P##Merkerbit_array
      L     #Nummer_Roll    * 5 , weiss ich aber noch nciht genau wie
      +AR1                   
      U     L [AR1,P#0.0]
      =     #Merker_1
      U     L [AR1,P#0.1]
      =     #Merker_2
      U     L [AR1,P#0.2]
      =     #Merker_3
      U     L [AR1,P#0.3]
      =     #Merker_4
      U     L [AR1,P#0.4]
      =     #Merker_5
 
 
 
 

// Rolladensteuerung
Roll: U     #Taster
      FP    #Merker_1                   //[MW34]       // Hilfsmerker
      =     #Merker_2                   // Positive Flanke des Tasters

      U     #Taster
      FN    #Merker_3                   // Hilfsmerker
      =     #Merker_4                   // Negative Flanke des Tasters
...
 
      U Merker_5
      = #Relais
```
 
Ist das so richtig ?

Übrigens.
Habe das ganze jetzt eingebunden.
DB100 wurde auch angelegt.
Jetzt geht die CPU314 nicht mehr auf RUN, sondern bleibt auf STOP stehen, sobald ich im OB1 den FB100(siehe code oben) aufrufe ?

Woran kann denn das schon wieder liegen ?

noeppkes ...


----------



## OHGN (20 September 2007)

maxi schrieb:


> Glaub habe was flasch verstanden.
> Für was die unterschiedlichen Instanz DB`s?
> Probier es mal mit immer den gleichen aus


Also ehrlich Maxi, das brauch ich nicht erst zu probieren!:s3:


----------



## maxi (20 September 2007)

noeppkes schrieb:


> Hallo Maxi.
> ich brauche ja dann verschiedene Instanz DB'S, da ja dort drin die Laufzeiten und der Status der einzelnen Rolläden abgespeichert ist.
> 
> Aber ich versuche es mit einer zu machen.
> ...


 
Pauschale Antwort ohen nachzusheen,
vielleicht ist es hilfreich.

Lösch mal deinen DB 100 in der SPS und in deinen Prog und mach dann den Call aufruf erneut.

Grüsse


----------



## OHGN (20 September 2007)

noeppkes schrieb:


> Aber ich versuche es mit einer zu machen.
> Ich lege die Bits als Array an.
> Die zu verwaltenden Zeiten auch.
> Nun hole ich mir aus den Array am Programmstart die richtigen informatioen (Anhand der übergebenen Nummer) und lege diese in Temp-Bit / Int's.
> ......


Also Du machst´s auch gerne ein wenig komplizierter, gelle?


> Woran kann denn das schon wieder liegen ?


Hast Du den DB100 auch in die CPU geladen?


----------



## noeppkes (20 September 2007)

*CPU startet nicht mehr. Die Lösung*

Hallo,

ich habe den Fehler in der Zwischenzeit selbst gefunden.

Ich kann anscheinend keine indirekte Adressierung in einem FB mach.
So wie ich das vorhatte funktioniert es nicht.
Muss ich somit mit mehreren DB's arbeiten oder geht das auch mit einer.
Ich wollte folgendes Programmieren.
Die Merker anhand der übergebenen Nummer füttern:


```
LAR1  P##Merkerbit_array
     L     #Nummer_Roll    * 5, aber weiss noch nicht wie?
     +AR1  
     U     L [AR1,P#0.0]
     =     #Merker_1
     U     L [AR1,P#0.1]
     =     #Merker_2
     U     L [AR1,P#0.2]
    =     #Merker_3
    U     L [AR1,P#0.3]
    =     #Merker_4
    U     L [AR1,P#0.4]
    =     #Merker_5
```
 
noeppkes


----------



## Ralle (20 September 2007)

@noeppkes

Mach bitte nicht wörtlich, was maxi sagt, das geht nicht!

PS: Ich meine den selben Instanz-DB für alle Rollo-FB.


----------



## noeppkes (20 September 2007)

*Hallo OHGN (mehrere DB's in eine)*

Hallo OHGN,

wieso mache ich es gerne komplizierter.
Ich will nur nicht so viele DB's (16 Stk. für 16 Rollädenanlegen)
Das ist doch nicht so verkehrt.
Was weiss ich denn, wie viele DB's ich noch für das restliche Haus brauche.
Ich möchte einfach ein wenig "sparen"

noeppkes ...


----------



## Ralle (20 September 2007)

noeppkes schrieb:


> Hallo,
> 
> ich habe den Fehler in der Zwischenzeit selbst gefunden.
> 
> ...



Doch kannst du, aber du machst das falsch!
Schau dir die FAQ im Forum an!


----------



## vierlagig (20 September 2007)

noeppkes schrieb:


> Was weiss ich denn, wie viele DB's ich noch für das restliche Haus brauche.
> Ich möchte einfach ein wenig "sparen"



was haste für ne cpu?

und zum thema sparen...ruf die 16 fbs in einem fb "rolladen" auf und fertig ist der "16-rolläden"-db


----------



## maxi (20 September 2007)

Ralle schrieb:


> @noeppkes
> 
> Mach bitte nicht wörtlich, was maxi sagt, das geht nicht!
> 
> PS: Ich meine den selben Instanz-DB für alle Rollo-FB.


 

Binn ich jetzt doof?
Ich kann doch für mehremalige FB Aufrufe des gleichen FB immer den gleichen DB verwenden.

Da hätte ich ja ansonsten bei 100 Ventilen nach allen skalierungen und offsets etc. 3000 DB`s


----------



## OHGN (20 September 2007)

noeppkes schrieb:


> Hallo OHGN,
> 
> wieso mache ich es gerne komplizierter.
> Ich will nur nicht so viele DB's (16 Stk. für 16 Rollädenanlegen)
> ...


Es geht ja auch mit einem DB, Du musst dann deinen Rolladen FB nur wiederum in einem (ich nenn es mal Main-FB) aufrufen. In Dessen Instanz können dann die Instanzbereiche des Rolladen- FB´s deklariert werden und Du hast nur noch einen DB.


----------



## OHGN (20 September 2007)

maxi schrieb:


> Binn ich jetzt doof?
> Ich kann doch für mehremalige FB Aufrufe des gleichen FB immer den gleichen DB verwenden.
> 
> Da hätte ich ja ansonsten bei 100 Ventilen nach allen skalierungen und offsets etc. 3000 DB`s


Maxi, Maxi, das wäre ja das Gleiche, als wenn Du Merker 3000 mal mit verschiedenen Daten beschreibst. (nun überleg mal!!!)


----------



## Ralle (20 September 2007)

maxi schrieb:


> Binn ich jetzt doof?
> Ich kann doch für mehremalige FB Aufrufe des gleichen FB immer den gleichen DB verwenden.
> 
> Da hätte ich ja ansonsten bei 100 Ventilen nach allen skalierungen und offsets etc. 3000 DB`s



Ich geb dir keine Antwort auf deine Frage .
Aber ja, so ist das mit den 3000 DB, oder du nimmst Multiinstanzen.
Ich nutze meistens FC und schreib mit als IN_OUT ein Word aus einem Globalen DB ran, da spar ich mir die ganzen Instanz-DB.

PS: Laufen deine Programme wirklich?


----------



## maxi (20 September 2007)

Ja, sehr gut.

Ich mache das auch so das ich den FB fütter und dann die Otputs dahin schriebe wo sie hin gehören.

Habe ich mir mal vor etlichen Jahren als ich mit Step7 anfing so angewöhnt.
Hatte mir das von den Combausteinen und den dazugehörigen Siemens Programmbeispielen so abgeguckt.

So ist es manchmal zwar ein bisschen mehr zu tipsseln, dafür aber übersichtlicher und besser zu Komentieren.
Jeder findet sich damit zurecht.


----------



## OHGN (20 September 2007)

Ralle schrieb:


> ..............
> 
> Ich nutze meistens *FB *und schreib mit als IN_OUT ein Word aus einem Globalen DB ran, da spar ich mir die ganzen Instanz-DB.
> ..............


Aber jetzt meintest Du eigentlich FC?


----------



## Ralle (20 September 2007)

OHGN schrieb:


> Aber jetzt meintest Du eigentlich FC?



Ja stimmt, hast du recht, hab mich verschrieben, ich besser das mal gleich aus.


----------



## noeppkes (20 September 2007)

*Vielen Dank*

Hallo an alle Tiplsler,

in der Zwischenzeit funktioniert meine Rolladensteuerung mit 10 DB's.
und einem FB.

Ich habe viel aus eueren Kommentaren rausziehen können.
Deshalb :
Danke noch einmal

noeppkes ...


----------



## zotos (21 September 2007)

noeppkes schrieb:


> ...
> in der Zwischenzeit funktioniert meine Rolladensteuerung mit 10 DB's.
> und einem FB.
> ...



Ich finde es sehr gut das Du Dir die Verwendung eines FBs nun selbst an geigend hast.

Und vergesse nicht Dir SCL anzuschauen ;o)


----------



## Ares (12 Juni 2016)

Hallo was den mit Multiinstans

habe einen baustein dein ich in einem fb aufrufe alles dran was ich so brauche und ende ?
24 rolläden zentral auf ab
etagenweise auf ab 
usw.


----------



## vollmi (13 Juni 2016)

Ares schrieb:


> habe einen baustein dein ich in einem fb aufrufe alles dran was ich so brauche und ende ?
> 24 rolläden zentral auf ab
> etagenweise auf ab
> usw.



Geht das etwas genauer? Wo liegt das Problem? was genau ist die Frage?
Und wieso holst du dafür einen 10 Jährigen Tread wieder hoch?
Mach doch bitte einen neuen Tread mit aussagekräftigem Titel. Ich glaube Sprungmarken haben mit deiner Frage überhaupt nix zu tun.

mfG René


----------



## Carpediem47 (15 September 2016)

Hallo,
auf dem bild sieht man schon. Ich habe was programmiert,und mit Rot geschrieben.  aber ich weiss nicht genau ob es so richtig ist..
ALso zweimal kann ich SPA FERT  schreiben
Danke


----------



## Fabpicard (15 September 2016)

Ich kann in deinem Bild, weder was in rot geschriebenes, noch eine SPA FERN sehen 
Falsches Bild?

MfG Fabsi


----------

