Sprungmarken in AWL ?

noeppkes

Level-1
Beiträge
150
Reaktionspunkte
5
Zuviel Werbung?
-> Hier kostenlos registrieren
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 ...
 
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.
 
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.
 
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)

Code:
// 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 ...
 
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 ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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 ...
 
Hier mal ein kleines Beispiel:

Code:
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:

Code:
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.
 
Zuletzt bearbeitet:
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:
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
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:

Glaub habe was flasch verstanden.
Für was die unterschiedlichen Instanz DB`s?
Probier es mal mit immer den gleichen aus :)
Spart enorm Speicherplatz
 
Zuletzt bearbeitet:
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.

Code:
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 ...
 
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.

Code:
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 ...

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

Code:
     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
 
@noeppkes

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

PS: Ich meine den selben Instanz-DB für alle Rollo-FB.
 
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 ...
 
Zurück
Oben