AWL-Anweisung verstehen

vielleicht. :lol:

schau mal im deklarationsteil unter temp. dort sind die lokaldaten definiert.

L 0.0 ist das erste bit aus den lokaldaten.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
kiestumpe schrieb:
Hallo,

was macht S7 bei folgender AWL-Anweisung in einem FC
Code:
   U     L      0.0                  // Automatikbetrieb
Wird die absolute Adresse M0.0 in den Akku geladen ??

MFG

Franky[/i]

Auf jeden Fall ist das keine saubere Arbeit. Siemens macht sowas gerne beim umschalten von KOP/FUP in AWL, aber ein Programmierer sollte das nicht tun.

pt
 
seh ich auch so. warum nicht?

z.b. ich habe i tempbereich ein word liegen und muss unbedingt daruas den zustand eines bits wissen., ist das super über das L zu erreichen.
 
ich mach das auch manchmal.
aber nur bei kleinen einfachen bausteienen.

ansonsten wird es nämlich pervers wenn später ein kollege die länge eines
arrays ändert, eine structur erweitert oder einfach ein variable davor einfügt....


die sauberste lösung um dies zu verhindern wäre wohl den pointer zu laden:


L P##Word_Var
U L [ar1,P#0.x]


oder meinetwegen noch mit schmiemerkern:

L Word_Var
T MW240

u m240.x


aber direkter zugriff ist böse...
aber hier darf man siemens mal wieder loben, wenn variablen aus dem temp-bereich absolut verwendet werden, dann mekert der editor beim einfügen neuer variablen...
 
Einfach symbolisch arbeiten (zu verwendende Lokalvariablen in Variablentabelle des Bausteins deklarieren), dann ist es kein Problem und harmoniert mit FUP.
Absolute Zugriffe auf Lokaldaten sollte man möglichst vermeiden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
HeizDuese schrieb:
Einfach symbolisch arbeiten (zu verwendende Lokalvariablen in Variablentabelle des Bausteins deklarieren), dann ist es kein Problem und harmoniert mit FUP.
Absolute Zugriffe auf Lokaldaten sollte man möglichst vermeiden.


wenn aber "Word_Var" das LW0 belegt, und ich aus irgendeinem grund (es gibt welche) auf das erste bit dieses wortes zugreifen will, dann kann ich dieses bit nicht auch noch symbolisch adressieren weil alles von l0.0 bis l1.7 bereits von "Word_Var" belegt ist...

dann geht nur noch absolut, oder über schmiermerker oder indirekt wie ich es oben gepostet habe...
 
Markus schrieb:
wenn aber "Word_Var" das LW0 belegt, und ich aus irgendeinem grund (es gibt welche) auf das erste bit dieses wortes zugreifen will, dann kann ich dieses bit nicht auch noch symbolisch adressieren weil alles von l0.0 bis l1.7 bereits von "Word_Var" belegt ist...

dann geht nur noch absolut, oder über schmiermerker oder indirekt wie ich es oben gepostet habe...

klar, es gibt Aufgabenstellungen, zu denen Siemens oder auch die IEC 61131 noch keine Lösung parat hat, wo man aber mit verschiedenen Methoden Abhilfe schaffen kann.

So ist es natürlich schnell und kompakt in diesem Fall absolut zu adressieren.

Man könnte aber selbst hier, mit ein bißchen mehr Code auch noch symbolisch weitermachen:

Code:
L    #Word_Var
L    1    // Bit 0 maskieren
UW
 :
 :

und noch auf ungleich 0 abfragen. Das bläht natürlich den Code auf und man neigt dann doch dazu, die schnelle, absolute Variante zu nutzen.

Wäre ja auch zu schön, wenn so etwas gehen würde:
Code:
U     #Word_Var.0
 :
 :
 
Hallo @

Eine saubere Lösung ergibt sich in SCL (obwohl ich SCL nicht besonders liebe):

Code:
FUNCTION FC111 : VOID

VAR_INPUT
  MyInfo  : WORD;
END_VAR

VAR_TEMP
  WortInfo  : WORD;
  BitInfo AT WortInfo  : STRUCT
    b_00  : BOOL;
    b_01  : BOOL;
    b_02  : BOOL;
    b_03  : BOOL;
    b_04  : BOOL;
    b_05  : BOOL;
    b_06  : BOOL;
    b_07  : BOOL;
    b_10  : BOOL;
    b_11  : BOOL;
    b_12  : BOOL;
    b_13  : BOOL;
    b_14  : BOOL;
    b_15  : BOOL;
    b_16  : BOOL;
    b_17  : BOOL;
  END_STRUCT;
END_VAR
BEGIN
  WortInfo := MyInfo;
  BitInfo.b_00 := BitInfo.b_07;
  BitInfo.b_10 := BitInfo.b_17;
END_FUNCTION

Das war jetzt mal so quick&dirty hingesaut. Den Baustein übersetzen und hernach umbennen und dann mal in AWL anschauen: welche Überraschung!!!!

Gruß Barnee
 
Zurück
Oben