Grundsätzlich: Warum AWL ?

Zuviel Werbung?
-> Hier kostenlos registrieren
- na ja, wenn deine IQ / CPU richtet nur nach 640 Kb - dann natürlich du hast keine Platz mehr was denken oder verstehen.
Ein bischen mit denken bitte.
gruß waldy


He du.... wenn du von Navi und Links abiegen bei ROT auf GRÜNE Linien kommst dann ist das für mich ein bisschen schwer zu verstehen.

und über den Satz daoben denke ich besser gar nicht erst nach :ROFLMAO:
 
Ich bin ganz neu was Step7 angeht und habe mit allem angefangen, was mir zur Verfügung steht. Ich habe als erstes gelernt, dass man in den OB1 Bausteine einfügen kann. Meine nächste Schlussfolgerung war dann, dass ich jetzt jeden Teil meines Programms so schreibe, wie ich es für richtig halte.

Eine Ablaufkette hab ich in Graph7 geschrieben, Regler einfache IF-Anweisungen in SCL, hier und da ein paar Schleifen und alles zusammengefügt habe ich in FUP im OB1, wo jeder Baustein noch ein paar Bedingungen vorgeschaltet bekommen hat etc.

Darin sah ich einen riesigen Vorteil von Step7. Ich kannte bisher nur höhere Programmiersprachen oder Essembler-Code und in beiden fand ich es richtig schlimm, dass manche Dinge einfach, manche kompliziert waren.

Wer in AWL z.B. Werte addiert, der ist kein Crack sondern ein Depp! Nutzt doch die Vielseitigkeit eurer Programmierungeburichtigng. Schreibt euer Programm doch in AWL, aber so richtig einfache Sachen muss man nicht unnötig kompliziert machen.

Das war eigentlich der Grund, warum ich diesen Thread eröffnet habe. Ich lese hier oft wie User fragen stellen und dann 4 Zeilen AWL als Antwort bekommen und da wollte ich mal nachhaken.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Thema

Hallo zusammen,


die Fragestellung, "Warum AWL" wird wohl nicht mehr so richtig bearbeitet.
Ist sie beantwortet?

Jedefalls häufen sich die beleidigenden Aussagen.

Wollen wir den Beitrag doch lieber abschließen!

Gruß Dominik
 
Wollen wir den Beitrag doch lieber abschließen!

NEIN, warum das den.



Wer in AWL z.B. Werte addiert, der ist kein Crack sondern ein Depp! Nutzt doch die Vielseitigkeit eurer Programmierungeburichtigng. Schreibt euer Programm doch in AWL, aber so richtig einfache Sachen muss man nicht unnötig kompliziert machen.

das ist doch auch Quatsch, wo ist den der große unterschied bei
einfachen Funktionen, von AWL zu SCL. Ein Addierer ist ja wohl in
beiden Sprachen nicht sehr kompliziert und dafür schmeiße ich dann
auch nicht den SCL Editor an.

Code:
FUNCTION Add : INT
VAR_INPUT
  wert_1 : INT;
  wert_2 : INT;
END_VAR
BEGIN
  Add := wert_1 + wert_2;
END_FUNCTION

Code:
FUNCTION "Add_AWL" : INT
TITLE =
VERSION : 0.1
 
VAR_INPUT
  Wert_1 : INT ; 
  Wert_2 : INT ; 
END_VAR
BEGIN
NETWORK
TITLE =
      L     #Wert_1; 
      L     #Wert_2; 
      +I    ; 
      T     #RET_VAL; 
 
END_FUNCTION
 
Wer in AWL z.B. Werte addiert, der ist kein Crack sondern ein Depp!
Spinnst du? :sw11:
Was ist denn das für ein doofer Spruch?
Ich lese hier oft wie User fragen stellen und dann 4 Zeilen AWL als Antwort bekommen und da wollte ich mal nachhaken.
Eben!
Da siehst du wie schnell mit 4 Zeilen AWL Probleme gelöst werden. :cool:
Zeichne noch mal deine FUP Bildchen als Erklärung. :rolleyes:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
....
Da siehst du wie schnell mit 4 Zeilen AWL Probleme gelöst werden. :cool:
Zeichne noch mal deine FUP Bildchen als Erklärung. :rolleyes:


geht auch... nur etwas umständlicher..... HIER


und mit 4 Zeilen ist es ja nicht getan. Da gehört dann ja noch der Kommentar dazu... KOP und FUP sind ja selbsterklärend :rolleyes:
 
Die reine Addition ist in FUP doch nur ein Baustein, dafür benutze ich dann auch kein SCL, so sollte das nicht verstanden werden!
Ich benutze eben das, was am einfachsten ist. Und das ist bei dem beispel einer Addition eben FUP.

Und wenn ich in einem Prog. mit mehreren Anweisung addiere dann ist bei SCL ganz klar der Vorteil, dass es in einer einzelnen Zeile passiert, übersichtlicher als AWL. Im Grunde ist ein AWL Code von der Zeilenanzahl am Ende immer länger.
 
Zuletzt bearbeitet:
Die reine Addition ist in FUP doch nur ein Baustein, dafür benutze ich dann auch kein SCL, so sollte das nicht verstanden werden!
Ich benutze eben das, was am einfachsten ist. Und das ist bei dem beispel einer Addition eben FUP.

Und wenn ich in einem Prog. mit mehreren Anweisung addiere dann ist bei SCL ganz klar der Vorteil, dass es in einer einzelnen Zeile passiert, übersichtlicher als AWL. Im Grunde ist ein AWL Code von der Zeilenanzahl am Ende immer länger.

Dieser blöde AWL-Code, ermöglicht aber ein schönes Debuggen und
zeigt mir seine Zwischenergebnisse, was in der Praxis schon einmal
enorme Vorteile hat. Für mich ist eine Verkettung von 10 Variabeln
immer noch nicht Kompliziert. Nocheinmal SCL ist ein tolles Werkzeug,
aber für einfache Sachen ist AWL einfach besser, dazu hören für micht
auch einfache Arithmetische Funktion. Die Darstellung in einer Zeile
ist in meinen Augen nicht vorteilhafter, als wenn es untereinander steht.


Code:
FUNCTION "Add_AWL" : INT
TITLE =
VERSION : 0.1
 
VAR_INPUT
  Wert_1 : INT ; 
  Wert_2 : INT ; 
  Wert_3 : INT ;
  Wert_4 : INT ;  
END_VAR
BEGIN
NETWORK
TITLE =
      L     #Wert_1; 
      L     #Wert_2; 
      +I    ; 
      L     #Wert_3; 
      +I    ; 
      L     #Wert_4; 
      +I    ; 
      T     #RET_VAL; 
 
END_FUNCTION
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die reine Addition ist in FUP doch nur ein Baustein, dafür benutze ich dann auch kein SCL, so sollte das nicht verstanden werden!
Ich benutze eben das, was am einfachsten ist. Und das ist bei dem beispel einer Addition eben FUP.

Und wenn ich in einem Prog. mit mehreren Anweisung addiere dann ist bei SCL ganz klar der Vorteil, dass es in einer einzelnen Zeile passiert, übersichtlicher als AWL. Im Grunde ist ein AWL Code von der Zeilenanzahl am Ende immer länger.

@tymanis
Würdest Du für folgende simple Mittelwertberechnung einen SCL-Baustein schreiben oder das lieber in FUP über 4 Netzwerke hinziehen? :confused:ROFLMAO:
Code:
      L     MW   100                    //Wert1
      L     MW   102                    //Wert2
      +I    
      L     MW   104                    //Wert3
      +I    
      L     MW   106                    //Wert4
      +I    
      L     4
      /I    
      T     MW   200                    //Mittelwert
 
@tymanis
Würdest Du für folgende simple Mittelwertberechnung einen SCL-Baustein schreiben oder das lieber in FUP über 4 Netzwerke hinziehen? :confused:ROFLMAO:
Code:
      L     MW   100                    //Wert1
      L     MW   102                    //Wert2
      +I    
      L     MW   104                    //Wert3
      +I    
      L     MW   106                    //Wert4
      +I    
      L     4
      /I    
      T     MW   200                    //Mittelwert

Und wo ist der Code äquivalent zu der Funktionalität die FUP bietet?
Prüfung ob ein Überlauf stattgefunden hat wie es eine Aneinanderreihung der entsprechenden Bausteine in FUP ergeben würde? Fehlt.

In Helmuts Code fehlt die Ausgabe des BIE Bits. Wenn man das in SCL übersetzt, wird automatisch am BIE-Bit angezeigt ob ein Überlauf an einer Stelle der Berechnung stattgefunden hat (OK-Flag).

In FUP und in SCL habe ich zusätzlich noch eine Typüberprüfung (in FUP/KOP deaktivierbar, in SCL immer vorhanden). Ich nutze zumindest alles was mir die Entwicklungsumgebung hergibt um die gröbsten Fehler beim Programmieren schon zu erkennen.
Aber wenn man die SPS-Götter in diesem Thread so liest machen die eh nie einen Fehler...
 
Eine FC für ne Mittelwertsberechnung, warum nicht ?!
Wenn ich den Editor öffne klicke ich doch im Menü rum bis ich die Vorlage für eine FC habe, muss ich schonmal nichts tippen. Dann eine Zeile:

Mittel := ( IN1 + IN2 + IN3 + IN4)/4

und schon hab ich einen Baustein, den ich geg. häufiger einsetzten kann.

BTW: Ich versteh garnicht, was ihr gegen den Editor habt. Er bietet doch für vieles ein Grundgerüst. Ich tippe ja kaum noch, bei einer IF-Anweisung füge ich alles ein und tippe nurnoch die Platzhalter in den Code.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aber wenn man die SPS-Götter in diesem Thread so liest machen die eh nie einen Fehler...
Diese Aussage ist jetzt wirklich reiner Quatsch!

Überprüfung ob ein Überlauf stattgefunden hat wie es eine Aneinanderreihung der entsprechenden Bausteine in FUP ergeben würde? Fehlt.
Also meistens benötige ich diese Überprüfung nicht. Und wenn doch, muss das eben entsprechend ausprogrammiert werden oder man macht es eben in FUP!
Ich weiß nicht warum hier jetzt schon wieder so eine Grundsatzdiskussion stattfindet....:rolleyes:
Das hat auch nichts mit 'SPS-Göttern' zu tun. Ich selbst programmiere viel in FUP, aber eben nicht alles, und immerhin hat der Themenstarter in diesem Faden die AWL- Anhänger als Deppen bezeichnet und nicht umgekehrt.
.
 
Hallo Leute!
Normalerweise poste ich nicht im Simatic-Board, da ich CoDeSys (TwinCAT) nutze.
Ich würde trotzdem gern mal meine Sicht der Dinge mitteilen.

Vorweg:
Ich nutze zu 95% ST (SCL), manchmal FUP.
Ich habe im Studium zuerst IEC-Programmierung gelernt und erst später Step 7 nutzen müssen. Ich habe nie verstanden, was an AWL so dolle is.

Wenn ich mal zwei Postings der Vorredner vergleiche, sehe ich keinerlei Vorteile von AWL zu ST (oder SCL).
Dieser blöde AWL-Code, ermöglicht aber ein schönes Debuggen und
zeigt mir seine Zwischenergebnisse, was in der Praxis schon einmal
enorme Vorteile hat. Für mich ist eine Verkettung von 10 Variabeln
immer noch nicht Kompliziert. Nocheinmal SCL ist ein tolles Werkzeug,
aber für einfache Sachen ist AWL einfach besser, dazu hören für micht
auch einfache Arithmetische Funktion. Die Darstellung in einer Zeile
ist in meinen Augen nicht vorteilhafter, als wenn es untereinander steht.

Code:
      L     #Wert_1; 
      L     #Wert_2; 
      +I    ; 
      L     #Wert_3; 
      +I    ; 
      L     #Wert_4; 
      +I    ; 
      T     #RET_VAL;
Code:
Mittel := ( IN1 + IN2 + IN3 + IN4)/4
Das Argument des besseren Debuggens, weil AWL untereinander steht, gilt für mich nicht, da ich generell untereinander schreiben in ST:
Code:
Mittel := 
    ( IN1 
    + IN2 
    + IN3 
    + IN4)
    /4
Mit ST ist's für mich kürzer und effizienter zu programmieren. Sei's Logik, Arithmetik, Schleifen, oder sonstwas.
Code:
bOut := 
  In1
  OR In2
  OR In3;
---------------------------------
IF rVar3 > 0 THEN
  rBerechnung :=
   (rVar1
   + INT_TO_REAL(iVar2) )
    / rVar3;
END_IF
---------------------------------------
IF In1 
  AND iVar2 <= 10 THEN
     bOut1 := FALSE;
     iVar2 := iVar2 + 1;
ELSE
  bOut2 := TRUE;
  IF iVar2 > 0 THEN 
    iVar2 := iVar2 - 1;
  END_IF
END_IF
---------------------------------
FOR i := 0 TO iVar2 DO
  fbArray[i](iarrParameter[i]);   (* mehrfacher FB-Aufruf mit ARRAY von FBs *)
END_FOR
Auch Hochsprachenprogrammierer kommen mit ST-Code gut klar, da die Schlüsselwörter meist selbstklärend sind. Bei AWL muss ich immer grübeln, was das nun überhaupt alles bedeutet.

Mag sein, dass bei Siemens das ganze noch etwas erschwert wird, weil SCL scheinbar in einem speziellen Editor untergebracht ist.
Mag vielleicht auch viel Gewohnheit mit im Spiel sein. Aber ich hab damals schon keine Vorteile von AWL gesehen und sehe sie auch heute nicht.
 
@trinitaucher: falls du mal zeit und lust hast, kannste folgendes mal in SCL umsetzen ... würde mich interessieren, hab selber aber leider grad keine zeit.

Code:
*
FUNCTION FC 1710 : VOID
TITLE =READ_CLK
//Funktion zum Lesen und Speichern der Systemzeit im Merker- oder 
//Datenbausteinbereich
//Die Uhrzeit wird fortlaufend ab dem ersten Word am Eingang aDateTime gespeichert
//Jahr,Monat,Tag,Stunde,Minute,Sekunde,Millisekunde,Wochentag
//
//Aufrufbeispiel:
//      CALL  FC     2
//       anyDateTime   :=#OB1_DATE_TIME
//       anyDestination:=DB1.DBW16
//
//DATE:     09.12.2008
//AUTHOR:   4lagig
//VERSION:  V0.1 BasicVer
AUTHOR : '4lagig'
FAMILY : ClockGF
VERSION : 0.1


VAR_INPUT
  anyDateTime : ANY ;	
  anyDestination : ANY ;	
END_VAR
VAR_TEMP
  dwTempAR1 : DWORD ;	
  dwTempAR2 : DWORD ;	
  xDB : BOOL ;	
  wDB : WORD ;	
  tTimeDateTemp : DATE_AND_TIME ;	
  iLoop : INT ;	
END_VAR
BEGIN
NETWORK
TITLE =

      TAR1  #dwTempAR1; // adressregister
      TAR2  #dwTempAR2; // sichern

      L     P##anyDestination; // ziel prüfen
      LAR1  ; 

      L     W [AR1,P#4.0]; // ob DB
      L     0; 
      <>I   ; 
      SPBN  db2; 
      TAK   ; 
      T     #wDB; 
      SET   ; 
      =     #xDB; 
      SPA   ver; 
db2:  CLR   ; 
      =     #xDB; // oder nicht

ver:  L     D [AR1,P#6.0]; // speicherbereich aus ANY
      LAR1  ; // in AR1

      L     P##anyDateTime; // quelle
      LAR2  ; 
      L     D [AR2,P#6.0]; // adressieren
      LAR2  ; 

      U     #xDB; // wenn DB
      SPB   ver2; // die andere schleife nutzen

      L     6; 
nex1: T     #iLoop; // jahr, monat, tag,
      L     B [AR2,P#0.0]; // stunden, minuten, sekunden
      BTI   ; // in integer wandeln
      T     W [AR1,P#0.0]; // und speichern
      +AR1  P#2.0; 
      +AR2  P#1.0; 
      L     #iLoop; 
      LOOP  nex1; 

      L     W [AR2,P#0.0]; // millisekunden
      SRW   4; // filtern
      BTI   ; 
      T     W [AR1,P#0.0]; // und speichern

      L     W [AR2,P#0.0]; // wochentag
      L     W#16#F; // filtern
      UW    ; 
      BTI   ; 
      T     W [AR1,P#2.0]; // und speichern

      SPA   ver3; 

ver2: AUF   DB [#wDB]; 

      L     6; 
nex2: T     #iLoop; 
      L     B [AR2,P#0.0]; 
      BTI   ; 
      T     DBW [AR1,P#0.0]; 
      +AR1  P#2.0; 
      +AR2  P#1.0; 
      L     #iLoop; 
      LOOP  nex2; 

      L     W [AR2,P#0.0]; 
      SRW   4; 
      BTI   ; 
      T     DBW [AR1,P#0.0]; 

      L     W [AR2,P#0.0]; 
      L     W#16#F; 
      UW    ; 
      BTI   ; 
      T     DBW [AR1,P#2.0]; 

ver3: LAR1  #dwTempAR1; // adressregister zurückspeichern
      LAR2  #dwTempAR2; 

      SET   ; //EN0-handling
      SAVE  ; 
END_FUNCTION
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@trinitaucher: falls du mal zeit und lust hast, kannste folgendes mal in SCL umsetzen ... würde mich interessieren, hab selber aber leider grad keine zeit.

Code:
*
FUNCTION FC 1710 : VOID
TITLE =READ_CLK
//Funktion zum Lesen und Speichern der Systemzeit im Merker- oder 
//Datenbausteinbereich
//Die Uhrzeit wird fortlaufend ab dem ersten Word am Eingang aDateTime gespeichert
//Jahr,Monat,Tag,Stunde,Minute,Sekunde,Millisekunde,Wochentag
//
//Aufrufbeispiel:
//      CALL  FC     2
//       anyDateTime   :=#OB1_DATE_TIME
//       anyDestination:=DB1.DBW16
//
//DATE:     09.12.2008
//AUTHOR:   4lagig
//VERSION:  V0.1 BasicVer
AUTHOR : '4lagig'
FAMILY : ClockGF
VERSION : 0.1


VAR_INPUT
  anyDateTime : ANY ;    
  anyDestination : ANY ;    
END_VAR
VAR_TEMP
  dwTempAR1 : DWORD ;    
  dwTempAR2 : DWORD ;    
  xDB : BOOL ;    
  wDB : WORD ;    
  tTimeDateTemp : DATE_AND_TIME ;    
  iLoop : INT ;    
END_VAR
BEGIN
NETWORK
TITLE =

      TAR1  #dwTempAR1; // adressregister
      TAR2  #dwTempAR2; // sichern

      L     P##anyDestination; // ziel prüfen
      LAR1  ; 

      L     W [AR1,P#4.0]; // ob DB
      L     0; 
      <>I   ; 
      SPBN  db2; 
      TAK   ; 
      T     #wDB; 
      SET   ; 
      =     #xDB; 
      SPA   ver; 
db2:  CLR   ; 
      =     #xDB; // oder nicht

ver:  L     D [AR1,P#6.0]; // speicherbereich aus ANY
      LAR1  ; // in AR1

      L     P##anyDateTime; // quelle
      LAR2  ; 
      L     D [AR2,P#6.0]; // adressieren
      LAR2  ; 

      U     #xDB; // wenn DB
      SPB   ver2; // die andere schleife nutzen

      L     6; 
nex1: T     #iLoop; // jahr, monat, tag,
      L     B [AR2,P#0.0]; // stunden, minuten, sekunden
      BTI   ; // in integer wandeln
      T     W [AR1,P#0.0]; // und speichern
      +AR1  P#2.0; 
      +AR2  P#1.0; 
      L     #iLoop; 
      LOOP  nex1; 

      L     W [AR2,P#0.0]; // millisekunden
      SRW   4; // filtern
      BTI   ; 
      T     W [AR1,P#0.0]; // und speichern

      L     W [AR2,P#0.0]; // wochentag
      L     W#16#F; // filtern
      UW    ; 
      BTI   ; 
      T     W [AR1,P#2.0]; // und speichern

      SPA   ver3; 

ver2: AUF   DB [#wDB]; 

      L     6; 
nex2: T     #iLoop; 
      L     B [AR2,P#0.0]; 
      BTI   ; 
      T     DBW [AR1,P#0.0]; 
      +AR1  P#2.0; 
      +AR2  P#1.0; 
      L     #iLoop; 
      LOOP  nex2; 

      L     W [AR2,P#0.0]; 
      SRW   4; 
      BTI   ; 
      T     DBW [AR1,P#0.0]; 

      L     W [AR2,P#0.0]; 
      L     W#16#F; 
      UW    ; 
      BTI   ; 
      T     DBW [AR1,P#2.0]; 

ver3: LAR1  #dwTempAR1; // adressregister zurückspeichern
      LAR2  #dwTempAR2; 

      SET   ; //EN0-handling
      SAVE  ; 
END_FUNCTION
Geht schon los damit, dass ich deinen Code fast überhaupt nicht lesen kann (bzw. verstehe).
Aber du kannst gern mal meine Codebeispiele in AWL umsetzen :ROFLMAO:. Vielleicht verstehe ich AWL dann etwas besser.
 
Geht schon los damit, dass ich deinen Code fast überhaupt nicht lesen kann (bzw. verstehe).
Aber du kannst gern mal meine Codebeispiele in AWL umsetzen :ROFLMAO:. Vielleicht verstehe ich AWL dann etwas besser.

mußt du den code verstehen? da stehen doch kommentare dran!
es ist klar um was es geht, soll doch keine wortwörtliche sondern eine funktionale übersetzung sein. den code hab ich dir nur gegeben, damit du siehst, dass es in AWL kein problem ist, diese funktion zu realisieren.
 
Die aktuelle Systemzeit auslesen ist im TwinCAT jetzt nicht so schwer, da es vorgefertigte Funktionsbausteine gibt. Der Ergebnisdatetyp TIMESTRUCT ist allerdings kein IEC-Typ.

Code:
VAR
    wYear       : WORD;
    wMonth     : WORD;
    wDay        : WORD;
    wHour       : WORD;
    wMinute     : WORD;
    wSecond    : WORD;
    wMilliSec    : WORD;
    wDayOfWeek  : WORD;

    dtDateAndTime : DATE_AND_TIME;
    fbNtGetTime    : NT_GetTime;    (* Systembaustein von TwinCAT *)
    iCyc: INT;
END_VAR
--------------------------------------
fbNtGetTime(
    NETID:= '',
    TMOUT:= DEFAULT_ADS_TIMEOUT );

IF fbNtGetTime.BUSY THEN
    fbNtGetTime.START := FALSE;
ELSE
    iCyc := iCyc +1;     
    IF iCyc = 2 THEN   (* weil der Baustein sich nicht unmittelbar neu triggern lässt *)
        iCyc := 0;
        fbNtGetTime.START := TRUE;
    END_IF
END_IF

(* Das Ergebnis findet sich im FB-Ausgang fbNtGetTime.TIMESTR *)
(* optional kann's weiter rumkopiert werden: *)

wYear     := fbNtGetTime.TIMESTR.wYear;
wMonth    := fbNtGetTime.TIMESTR.wMonth;
wDay      := fbNtGetTime.TIMESTR.wDay;
wHour     := fbNtGetTime.TIMESTR.wHour;;
wMinute   := fbNtGetTime.TIMESTR.wMinute;
wSecond    := fbNtGetTime.TIMESTR.wSecond;
wMilliSec  := fbNtGetTime.TIMESTR.wMilliseconds;
wDayOfWeek:= fbNtGetTime.TIMESTR.wDayOfWeek;

(* Umwandlung in Datentyp DATE_AND_TIME (DT): *)

dtDateAndTime := SYSTEMTIME_TO_DT(fbNtGetTime.TIMESTR);  (* zusatzfunktion von TwinCAT *)
 
Zuletzt bearbeitet:
Zurück
Oben