Brauche Hilfe bei ner SCL -> AWL Übersetzung :-)

So nur noch 4 Fehler siehe Bild wie bekomme ich die noch weg :)

wie muss das vielleicht liegts noch daran?

""DCI_Messages.FLAGMatRecv;
"DCI_Messages".FLAGMatRecv;
DCI_Messages."FLAGMatRecv";
"DCI_Messages.FLAGMatRecv";
 

Anhänge

  • Code.JPG
    Code.JPG
    128,3 KB · Aufrufe: 20
Zuletzt bearbeitet:
schon das mit dem u False durch clr ersetzen habs nur beim ersten mal false drin gelassen :p versehentlich und dann zu schnell geantwortet mal sehen obs nun genauso geht wie der scl code
 
Zuviel Werbung?
-> Hier kostenlos registrieren
kennt es wohl, zumindest als ich noch programmiert habe ;)

Du kannst False an den IN-Parameter eines FC's schreiben, wenn er vom Typ Bool ist - aber nicht "U False" als Programmcode (außer in SCL) - außer False ist ein symbolischer Operant ...

Gruß
LL
 
Ok, dass muss ich noch, ich habe es mal so gemacht wie ich es mir gedacht habe, aber das sind sachen drin die ich noch nicht kenne. könnt ihr mir nochmal helfen will den code oben wieder übersetzen in awl.
Code:
VAR_TEMP
  VarInt1 : INT;
  VarInt2 : INT;
  VarString1 : STRING;
  VarString2 : STRING;
END_VAR

VarString1 := '';
VarString2 := '';

IF (DCI_Command.existent) THEN
  DCI_Command.handled := FALSE;

  IF (DCI_Command.MessageID = 777) THEN
      DCI_Command.handled := TRUE;
      DCI_GetStringParam(id:=100,s:=VarString1);
      DCI_GetStringParam(id:=103,s:=VarString2);
      IF (DCI_Command.isOK) THEN
         Data.MaterialID := VarString1;
         Data.RecipeID := VarString2;
      END_IF;
  END_IF;

  IF (DCI_Command.MessageID = 778) THEN
      DCI_Command.handled := TRUE;
      DCI_GetStringParam(id:=100,s:=VarString1);
      VarInt1 := DCI_GetIntParam(101);
      VarInt2 := DCI_GetIntParam(102);
      DCI_GetStringParam(id:=103,s:=VarString2);
      IF (DCI_Command.isOK) THEN
         Data.MaterialID := VarString1;
         Data.InPort := VarInt1;
         Data.OutPort := VarInt2;
         Data.RecipeID := VarString2;
      END_IF;
  END_IF;

END_IF;
END_FUNCTION
AWL übersetzung meinerseits :)
Code:
AR_TEMP             
  VarInt1 : INT;
  VarInt2 : INT;
  VarString1 : STRING;
  VarString2 : STRING;
END_VAR

Begin
NETWORK
Title = DCI_HandleCommand


VarString1 := '';
VarString2 := '';


U     DCI_Command.existent;
SPBN  if1;
  CLR;
  = DCI_Command.handled;
  L DCI_Command.MessageID
  L 777
  ==m1.1
  SPBN  if2;    
    set;
    DCI_Command.handled;
    CALL DCI_GetStringParam(id:=100,s:=VarString1);
    CALL DCI_GetStringParam(id:=103,s:=VarString2);
    U DCI_Command.isOK
    SPBN  if3;    
        Data.MaterialID := VarString1;
        Data.RecipeID := VarString2;
    if3:  NOP   0;
  if2:  NOP   0;
if1:  NOP   0;
END_FUNCTION
 
Awl..

Hi,

Code:
VarString1 := '';
VarString2 := '';

das geht so nicht in AWL. Grundsätzlich: die SPS hat die Laderegister(Akku's),
damit u.a. werden die Befehle abgearbeitet. Die Register sind 32 Bit lang.
Eine Stringvariable ist mehrere Bytes breit. In AWL kann man mit Laden/Transferieren aber nur 4 Bytes(also 4 Zeichen) bearbeiten!
Eine Stringvariable ganz mit '' füllen bedeutet:entweder mittels einer Schleife alle Bytes initialisieren, oder eine bibl.Funktion benutzen, wie Block Move oder so.

Wie schon vierlagig sagte, es ist interessant, sich die Übersetzung vom SCL Compiler als rein AWL anzuschauen, dann sieht man Einiges.

V.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das kommt bei der Siemens übersetzung raus, aber ich hätte es gern schöner :)

Code:
      SET   
      SAVE  
      =     L    516.1
      L     W#16#FE00
      T     LW     4
      L     W#16#FE00
      T     LW   260
      U     "DCI_COMMAND".existent
      SPBN  A7d0
      CLR   
      =     DBX   28.0
      L     DBD   10
      L     DW#16#309
      ==D   
      SPBN  A7d1
      SET   
      =     DBX   28.0
      L     DW#16#64
      T     LD   518
      L     W#16#0
      T     LW   522
      L     DW#16#87000020
      T     LD   524
      UC    "DCI_GetStringParam"
            P#L 518.0
            P#L 522.0
      L     DW#16#67
      T     LD   518
      L     W#16#0
      T     LW   522
      L     DW#16#87000820
      T     LD   524
      UC    "DCI_GetStringParam"
            P#L 518.0
            P#L 522.0
      U     DBX   20.0
      SPBN  A7d1
      L     DW#16#10130001
      T     LD   518
      L     W#16#0
      T     LW   522
      L     DW#16#87000020
      T     LD   524
      L     B#16#10
      AUF   DI   803
      T     DIB    4
      L     DW#16#10130001
      T     LD   528
      L     W#16#323
      T     LW   532
      L     DW#16#84000020
      T     LD   534
      UC    "BLKMOV"
            P#L 518.0
            P#L 542.0
            P#L 528.0
      L     DW#16#10130001
      T     LD   518
      L     W#16#0
      T     LW   522
      L     DW#16#87000820
      T     LD   524
      L     B#16#10
      T     DIB   22
      L     DW#16#10130001
      T     LD   528
      L     W#16#323
      T     LW   532
      L     DW#16#840000B0
      T     LD   534
      UC    "BLKMOV"
            P#L 518.0
            P#L 546.0
            P#L 528.0
A7d1: L     "DCI_COMMAND".MessageId
      L     DW#16#30A
      ==D   
      SPBN  A7d0
      SET   
      =     DBX   28.0
      L     DW#16#64
      T     LD   518
      L     W#16#0
      T     LW   522
      L     DW#16#87000020
      T     LD   524
      UC    "DCI_GetStringParam"
            P#L 518.0
            P#L 522.0
      L     DW#16#65
      T     LD   518
      UC    "DCI_GetIntParam"
            P#L 518.0
            P#L 0.0
      L     DW#16#66
      T     LD   518
      UC    "DCI_GetIntParam"
            P#L 518.0
            P#L 2.0
      L     DW#16#67
      T     LD   518
      L     W#16#0
      T     LW   522
      L     DW#16#87000820
      T     LD   524
      UC    "DCI_GetStringParam"
            P#L 518.0
            P#L 522.0
      U     DBX   20.0
      SPBN  A7d0
      L     DW#16#10130001
      T     LD   518
      L     W#16#0
      T     LW   522
      L     DW#16#87000020
      T     LD   524
      L     B#16#10
      AUF   DI   803
      T     DIB    4
      L     DW#16#10130001
      T     LD   528
      L     W#16#323
      T     LW   532
      L     DW#16#84000020
      T     LD   534
      UC    "BLKMOV"
            P#L 518.0
            P#L 550.0
            P#L 528.0
      L     #VarInt1
      T     DIW    0
      L     #VarInt2
      T     DIW    2
      L     DW#16#10130001
      T     LD   518
      L     W#16#0
      T     LW   522
      L     DW#16#87000820
      T     LD   524
      L     B#16#10
      T     DIB   22
      L     DW#16#10130001
      T     LD   528
      L     W#16#323
      T     LW   532
      L     DW#16#840000B0
      T     LD   534
      UC    "BLKMOV"
            P#L 518.0
            P#L 554.0
            P#L 528.0
A7d0: CLR   
      U     L    516.1
      SAVE  
      BE
 
:rolleyes: ... eine Stringbearbeitung wird in AWL nicht schön ... dazu ist dann SCL da ...
Vielleicht solltest du irgendwo mal eine Grenze ziehen - es geht doch (auch) um Übersichtlichkeit ...

Gruß
LL
 
Jop SCL ist mir auch 1000mal lieber, aber wie gesagt es gibt manche die noch kein SCL haben, warum auch immer(wahrscheinlich zusatzkosten) und denen will ich dass jetzt in AWL aufbereiten. Will den Code selber generieren, dazu brauche ich was übersichtliches, was ich als AWL Quelle erstellen kann. Der erste Teil hat gut funktioniert. Nun fehlt nur noch dieser Code-Teil. Danach mache ich nie wieder was mit AWL :p , hoffentlich
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Na ... wenn das mal klappt ... :rolleyes:

Auf jeden Fall - das löschen eines Strings läßt sich durch Löschen der beiden Header-Bytes bewerkstelligen. Hierfür mußt du den String auf jeden Fall auf Byte-Ebene bearbeiten. Die im Inhalt ggf. noch stehenden Zeichen werden dann von weiteren Funktionen ignoriert.

Einen String in einen anderen übertragen wäre ein Fall für Blockmove oder eine selbsterstellte Schleife.

Für weitere Stringfunktionen kommen die gleichen FC's zum Einsatz, wie du sie auch in SCL verwendest - also LEFT, MID, RIGTH, CONCAT usw.

Gruß
LL
 
Ich will die Strings am anfang ja nur initialisieren, gibt es da vielleicht auch was? oder muss ich die ersten beiden bytes löschen. wenn das nur damit geht, wie mache ich das?

L W#16#0;
T VarString1;

usw.?
 
Ok sieht bisher so aus sind noch 8 fehler.

4 schonmal wegen meiner VarString aufrufe. aber warum???

Code:
VAR_TEMP             
  VarInt1 : INT;
  VarInt2 : INT;
  VarString1 : STRING;
  VarString2 : STRING;
END_VAR

Begin
NETWORK
Title = DCI_HandleCommand

L W#16#0000;
T #VarString1;
L W#16#0000;
T #VarString2;


U     DCI_Command.existent;
SPBN  if1;
  CLR;
  = DCI_Command.handled;
  L DCI_Command.MessageID;
  L 777;
  ==I;
  SPBN  if2;    
    set;
    = DCI_Command.handled;
    CALL DCI_GetStringParam(id:=dw#16#100,s:=VarString1);
    CALL DCI_GetStringParam(id:=dw#16#103,s:=VarString2);
    U DCI_Command.isOK;
    SPBN  if3;    
        UC BLKMOV(
            SRCBLK := #VarString1,
            DSTBLK := Data.MaterialID
        );
        UC BLKMOV(
            SRCBLK := #VarString2,
            DSTBLK := Data.RecipeID
        );
    if3:  NOP   0;
  if2:  NOP   0;
if1:  NOP   0;
END_FUNCTION
 
für das Init der Strings könnte das so aussehen :
Code:
L P##VarString_1
LAR1
L 0
T W [AR1,p#0.0]
für den Blockmove : ist denn dein Quell- und der Ziel-Bereich in der Größe identisch ?

Gruß
LL
 
Also in SCL war das bisher immer egal. der Quell wurde an den Zielbereich angepasst ich hoffe das ist in AWL genauso.
sind nur noch 4 Fehler die initialisierung scheint zu funktionieren.

wie löse ich das letzte problem mit dem BLKMOV
 
Zurück
Oben