TIA Anypointer in AWL / SCL-Code Portierung nach AWL

Nuecke

Level-2
Beiträge
35
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
ich ab folgendes Problem. Kunde will gesamte Programmierung in AWL :sad:, daher muss ich einige Programme, die wir bereits in SCL haben auf AWL portieren. Aktuell scheitere ich jedoch an einer simplen Zuweisung in SCL: #AnyPointer:=#TA.TA;
Ich habe mal einen Screenshot aus dem SCL-Code angehängt um das deutlich zumachen. Durch die Zuweisung habe ich in meinem Anypointer den Zeiger auf mein Array "#TA.TA", welches aus 512 BOOL besteht und im temporären Bereich des FC deklariert ist. Nach der Zuweisung kann ich wunderschön in meinem Anypointer auslesen, wieviel Bytes mein Array umfasst ('AT_AnyPointer.DataCount = 64") oder auch die anderen Dinge wie Bytepointer oder Datentyp.
Wie bekomme ich selbiges nun unter AWL gebacken, also in erster Linie die Zuweisung aus SCL "#AnyPointer:=#TA.TA;" ?? Ich steh voll auf dem Schlauch.....

Grüßle
Günni


APtr_SCL.JPG
 
Naja ... wenn du dir das als AWL-Code mal ansehen möchtest dann könntest du die relevante Sequenz in S7-Classic eingeben, das übersetzen und danach die SCL-Quelle entfernen. Danach hättest du das als AWL-Code.
Das könnte man bei deinen ANY-Pointern sogar so machen ...

Generell ist es hier aber so, dass dir der Compiler einfach manche Dinge (der Eingabe) abnimmt, weil er es weis - siehe z.B. den Inhalt des AnyPointers wo du TA.TA zuweisst. Hier weiß dein Compiler, dass du den Kram in den Vorgänger-Lokaldaten hast ab der Bit-Adresse 268.0 und dass das 64 Byte groß ist. Dieses Wissen mußt du dann in AWL zum Teil selbst leisten - das heißt du mußt dir die Pointer-Adresse deines Datenbereichs ermitteln (hier kannst du in AWL natürlich leider nur die Anfangsadresse deiner Struktur ermitteln) und dann den Offset von .TA (den du selber wissen mußt) daraufaddieren und dann die Bereichbreite (die du auch selber wissen mußt) dazu angeben (also das Byte=64).

Ich befürchte aber, dass du das so nicht hören wolltest ... :(

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Najaaaaa, schönere Antworten sind immer gerne gesehen, aber trotzdem Danke für diese erste Aussage. Aber es gibt doch in AWL diese Anypointer, dann muss ich diese Pointer doch auch "befüllen" können!?? Vielleicht frage ich auch dumm, aber meine AWL-Zeiten sind ziemlich lange her :ROFLMAO:, ich tu mich momentan echt schwer wieder rein zufinden.
Also wenn ich einen Anypointer deklariere (wie eben bei mir "#AnyPointer"), wie kann ich den nun auf eine Struktur oder eine Variable (Byte, INT, ...), ein Array oder was auch immer zeigen lassen? :confused::confused:
 
Was machst Du später mit dem Anypointer? Mit einem BLKMOV verwenden? Vielleicht mußt Du gar nicht stoisch jede einzelne Anweisung in AWL übersetzen (die vielleicht in Eurem SCL bereits eine Krücke ist), sondern kannst sinngemäß einen anderen Weg nutzen. (die gezeigten Zeilen 3 bis 11 sind sowieso unnötig)

Ich kann mir gar nicht vorstellen, daß ein Kunde auf "gesamte Programmierung in AWL" besteht - lautet die Forderung vielleicht eher: FUP oder KOP?
Warum will der Kunde kein SCL? Ist Eure übliche SCL-Programmierung so schlecht verstehbar? Oder erschlagt Ihr jeden Scheixx mit SCL, z.B. die simpelsten logischen Verknüpfungen mit IF..THEN-Orgien, doch der Kunde will was zum Beobachten für Diagnose?
Kann vielleicht ein Kompromiss gefunden werden mit dem Kunde ala "für jede Aufgabe das best-geeignete Werkzeug bzw. die best-geeignete Programmiersprache"?

PS:
Was ist das für eine CPU?
Kann man auch in TIA den erzeugten AWL-Code (den compilierten Baustein) anschauen, wenn man die SCL-Quelle entfernt?

Harald
 
über den Anypointer wird in SCL der erzeugte Bytepointer weiter verwendet um automatisch je nach angewähltem Ventil die dazu gehörenden Fehlermeldungen in einem DB zu setzen/rücksetzen. Nun bin ich daran zu schauen, wie ich mir diese Adresse auf einem anderen Weg erzeugen kann, der Rest ist kann ich relativ einfach umgehen. Ist dann zwar nicht mehr ganz so elegant, da teilweise hart codiert, aber das ist egal....

Die Zeilen 3-11 habe ich nur für anschauungszwecke eingefügt (sind im Originalcode nicht vorhanden)

die SCL-Bausteine wurden alle von meinem Kollegen programmiert, zumindest von diesem kann ich sagen, daß er sehr ordentlich und strukturiert programmiert :ROFLMAO:

Kunde will alles in AWL und hat sogar ein Beispielprojekt geschickt. Oioioiii, echt gruselig das AWL ;) ....

Wir programmieren selbst die simpelsten UND/ODER Verknüpfungen in SCL, da solche einfachen Dinge auch nicht anders aussehen als in AWL.

Das mit dem compilieren und Quelle entfernen testen wir gerade, ist allerdings TIA V13, funktioniert leider nicht so richtig
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also wenn ich einen Anypointer deklariere (wie eben bei mir "#AnyPointer"), wie kann ich den nun auf eine Struktur oder eine Variable (Byte, INT, ...), ein Array oder was auch immer zeigen lassen? :confused::confused:
Falls das eine S7-300/400 ist, da ist "AT" nur in SCL möglich. In AWL müssen Offsets zu Variablen selbst berechnet oder abgezählt werden. Um einen Pointer zu einer Variable zu erhalten, kann man den Offset innerhalb eines Speicherbereichs (z.B. TEMP, VAR) mittels P#Variable angeben. "Halb"-symbolisches "AT": Man kann die Anfangsadresse der Any-Variable in ein Adressregister laden und dann relativ auf die Adressen der Any-Variable zugreifen, um z.B. die Adresse einer Variablen in die Any-Variable einzutragen:
Code:
LAR1 P##AnyPointer  //AR1-Register auf Anfang der Any-Variable setzen

L P##meineVariable  //Adresse von #meineVariable
T DW [AR1, P#6.0]   //in Bereichsadresse im Any eintragen

Harald
 
Wir programmieren selbst die simpelsten UND/ODER Verknüpfungen in SCL, da solche einfachen Dinge auch nicht anders aussehen als in AWL.
Da bin ich aber anderer Meinung. Und beobachten läßt sich das in SCL nur unter aller Sau - oder ist das in TIA nun besser gelöst? So daß ich auf Anhieb sehe, welches Signal fehlt noch damit des Ergebnis TRUE wird?

Hast Du denn mal einen Beispielcode für eine Verknüpfung von ein paar Bools? (am besten im Beobachten-Modus)

Harald
 
Gibt es wirklich professionelle Programmierer, die so programmieren? Ehrlich gesagt, kommt mir da das Mittagessen wieder hoch... da würde ich dem Lieferanten auch verbieten SCL zu benutzen.

Für Harald um noch etwas zu sehen wenn man mehrere Werte in einer Zeile hat. Ich finde das recht gut Gelöst in TIA
Man kann entweder die onlineanzeige mit dem Pfeil aufklappen, dann bleibt sie angezeigt auch wenn der Cursor nicht da ist. Wenn man mit dem Cursor die Zeile belegt wird automatisch alles Dynamische nach unten aufgeklappt.

[FONT=&quot][/FONT]
 
So würde ich auch .....
so sieht das normalerweise aus

IF ( DB_SK.Bit_1
AND DB_SK.Bit_2
AND DB_SK.Bit_3 )
THEN
DB_SK.Bit_4 := TRUE;
ELSE
DB_SK.Bit_4 := FALSE;
END_IF;



Gibt es wirklich professionelle Programmierer, die so programmieren? Ehrlich gesagt, kommt mir da das Mittagessen wieder hoch... da würde ich dem Lieferanten auch verbieten SCL zu benutzen.

Harald
 
Nein ... schön (wenn man bei dieser Binär-Verknüpfung von schön reden kann) sieht es wie in meinem Code aus.
Dann wird daraus beim Übersetzen (zumindestens war es bei S7-Classic so - da konnte man das gut ausprobieren) das exakte AWL-Pendant daraus ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ach übrigens, wollte hier keinen Glaubenskrieg zwischen AWL und SCL auslösen :), schlampig programmieren kann man mit beiden Programmiersprachen.
Meine Umsetzung SCL nach AWL habe ich wohl inzwischen gefunden, falls das noch jemanden interessiert kann ich das später noch posten

Grüßle
Günni
 
Naja ... wenn du dir das als AWL-Code mal ansehen möchtest dann könntest du die relevante Sequenz in S7-Classic eingeben, das übersetzen und danach die SCL-Quelle entfernen. Danach hättest du das als AWL-Code.
Das könnte man bei deinen ANY-Pointern sogar so machen ...

Ich hab das spaßeshalber mal gemacht. Und siehe da Larry hat absolut recht. Macht man im Classic eine Zuweisung für einen ANY
Code:
any := array // mit einem Array von 16 Bools
und löscht anschließend die Quelle und schaut sich den generierten AWL-Code an, dann sieht man das der Compiler die Infos für den Pointer einfach als Konstanten in den ANY schiebt.
Code:
      L     DW#16#10020002  // 10h für S7 | 02h Datentyp Byte | 0002 Wiederholfaktor -> 2 Byte = 16 Bools      
      T     %LD88                  // lokaler Schmierbereich von Compiler
      L     DINO                     // Variable Array war aus dem Static meines FBs, deshalb IDB-Nummer Laden
      T     %LW92                 // lokaler Schmierbereich von Compiler
      TAR2  
      +     DINT#34048         // Speicherbereich -> 8500h Instanz-DB
      T     %LD94                 // lokaler Schmierbereich von Compiler

// und dann kopiert der Compiler den Schmierbereich zurück an den Lokaldatenbereich an dem mein ANY lag
      L     %LD88                 // lokaler Schmierbereich von Compiler
      T     %LD64                 // Anfangsadresse ANY in den Lokaldaten
      L     %LD92                 // usw...
      T     %LD68
      L     %LW96
      T     %LW70
 
Zuletzt bearbeitet:
Zurück
Oben