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

Zuviel Werbung?
-> Hier kostenlos registrieren
für den Blockmove : ist denn dein Quell- und der Ziel-Bereich in der Größe identisch ?

Aus deiner letzten Antwort schliesse ich, dass es bei dir nicht so ist ... dann wird es wohl nichts mit Blockmove - AWL ist DAS nicht egal ... :rolleyes:

Was willst du also tun ? Den Bereich anpassen oder einen eigenen Blockmove erstellen (so macht es SCL).

Gruß
LL
 
Was verstehst du unter Bereich anpassen?
Und was unter eigenen Blockmove :-)

Sagen wir:
Quelle(String[254],mit 5 Zeichen also länge 5 im 2ten Byte)
Ziel(String[16], ich will alles rein kopieren und den rest abschneiden, also das erste byte verwerfen und das 2te byte mitkopieren)

ich hoffe ich habs gut erklärt :-)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hatte dich auch schon vorher verstanden.
Ein eigener Blockmove ist eine von dir erstellte Schleife, die deine Quelle in dein Ziel kopiert und die entsprechenden Anpassungen dann "handisch" vornimmt.
Sieh dir dazu vielleicht mal den entsprechenden Beitrag in der FAQ an ...
 
welche FAQ, habe heute hier schon alles durchwühlt nach irgendwelchen hinweisen wie ich das mache :-)
aber ich gucke nochmal nach "eigenen BLKMOV".
mit dem normalen gehts dann also nicht so wie ich das will :-)
Habe ich das richtig verstanden
 
Zuviel Werbung?
-> Hier kostenlos registrieren
möglich das für welche die AWL oft nutzen die Codezeilen super leserlich sind aber ich muss mich da echt anstrengen :-)

Was ich machen muss ist ja nur lies byte 2 von Quelle und byte 1 von Ziel

schreibe b2.quelle nach b2.ziel
For n = inhalt.b2 +1 TO b1.ziel
lade b(n).quelle
schreibe nach b(n).ziel
next n

wie mache ich das??? in AWL
frage mich warum awl heute noch genutzt wird. fub ok aber awl ist doch sinnlos ^^
helft mir, vielleicht bin ich auch zu scl verwöhnt.

ich schau mir so lange noch weiter den FAQ an vielleicht finde ich da doch noch die Lösung :-)
 
Na ... du bist ja lustig ...
Wenn ich mich recht erinnere, dann wolltest du das in AWL machen - ich hatte dir empfohlen irgendwo einen Schlußstrich zu ziehen ... :ROFLMAO:

Es wird so gemacht, wie du es beschreibst :
Code:
-bilde Pointer auf Quell-Variable
-bilde Pointer auf Ziel-Variable
REPEAT
   -lese Byte an Position Quell-Pointer
   -schreibe Byte an Position Ziel-Pointer
   -erhöhe beide Pointer
   -erhöhe Index
UNTIL Index < Anzahl
... und jetzt viel Spaß ... :ROFLMAO:
 
Ok das kann ich so nicht machen wird zu umfangreich bei der Code generierung. ok dann habe ich nur noch die möglichkeit mit dem Blockmove.
wo liegt da jetzt der fehler? Quelle und Ziel sind von Byte 1 her gleich. Warum kommt da ein fehler? muss ich mir den anypointer selber zusammenbasteln?

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

Begin
NETWORK
Title = DCI_HandleCommand

L P##VarString1;
LAR1;
L 0;
T W [AR1,p#0.0];
L P##VarString2;
LAR1;
L 0;
T W [AR1,p#0.0];


U     DCI_Command.existent;
SPBN  if1;
  CLR;
  = DCI_Command.handled;
  
  L DCI_Command.MessageID;
  L 777;
  ==D;
  SPBN  ig1;    
    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  ih1;    
        AUF 
        UC BLKMOV(
            SRCBLK := VarString1,
            DSTBLK := Data.MaterialID
        );
        UC BLKMOV(
            SRCBLK := VarString2,
            DSTBLK := Data.RecipeID
        );
    ih1:  NOP   0;
  ig1:  NOP   0;
  
  L DCI_Command.MessageID;
  L 778;
  ==D;
  SPBN  ig2;    
    set;
    = DCI_Command.handled;
        Call DCI_GetIntParam(id:=dw#16#101,RET_VAL:=VarInt1);
        Call DCI_GetIntParam(id:=dw#16#102,RET_VAL:=VarInt2);
    U DCI_Command.isOK;
    SPBN  ih2;
        L VarInt1;
        T Data.InPort;
        L VarInt2;
        T Data.OutPort;
    ih2:  NOP   0;
  ig2:  NOP   0;
  
if1:  NOP   0;
END_FUNCTION
 
Zuviel Werbung?
-> Hier kostenlos registrieren
OK nun kommen zumindest keine Fehler mehr.
mal sehen obs halbwegs geht, dass reicht mir :-)

Code:
FUNCTION DCI_HandleCommand:VOID

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

Begin
NETWORK
Title = DCI_HandleCommand

L P##VarString1;
LAR1;
L W#16#FE00;
T W [AR1,p#0.0];
L P##VarString2;
LAR1;
L W#16#FE00;
T W [AR1,p#0.0];


U     DCI_Command.existent;
SPBN  if1;
  CLR;
  = DCI_Command.handled;
  
  L DCI_Command.MessageID;
  L 777;
  ==D;
  SPBN  ig1;    
    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  ih1;    
        Call "BLKMOV"(
            SRCBLK := VarString1,
            RET_VAL := iERROR,
            DSTBLK := Data.MaterialID
        );
        Call "BLKMOV"(
            SRCBLK := VarString2,
            RET_VAL := iERROR,
            DSTBLK := Data.RecipeID
        );
    ih1:  NOP   0;
  ig1:  NOP   0;
  
  L DCI_Command.MessageID;
  L 778;
  ==D;
  SPBN  ig2;    
    set;
    = DCI_Command.handled;
        Call DCI_GetIntParam(id:=dw#16#101,RET_VAL:=VarInt1);
        Call DCI_GetIntParam(id:=dw#16#102,RET_VAL:=VarInt2);
    U DCI_Command.isOK;
    SPBN  ih2;
        L VarInt1;
        T Data.InPort;
        L VarInt2;
        T Data.OutPort;
    ih2:  NOP   0;
  ig2:  NOP   0;
  
if1:  NOP   0;
END_FUNCTION
 
Es liegt erstmal gar nicht an den unterschiedlichen Strings ...

Du hast in deinem Baustein ein AUF stehen - AUF was ? Dieser Befehl ruft einen DB auf : also AUF DB10 (z.B.)

Dann der Aufruf des Blockmove - mach das mal so :
Code:
       Call "BLKMOV"(
            SRCBLK := VarString1,
            RET_VAL := mw200,
            DSTBLK := Data.MaterialID
Gruß
LL

Nachsatz:
Oh ... ich sehe gerade, dass du das mittlerweile selbst herausgefunden hast ... ;)
 
habs schon gefunden siehe beitrag vor dir :-)

muss ich den DB nun aufmachen wie es in der einen beschreibung steht? ne oder? macht sicher der BLKMOV für mich.

Grüße kai
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok der generator funktioniert so wie er soll danke :-) was ich als einzigstes noch machen muss ist das mit der Stringgröße, weil die mitübertragen wird, aber da habe ich schon eine idee :-)

Grüße Kai
 
Ok brauche doch noch einmal eure Hilfe.

ich will folgendes machen.
String[254] Data.Str[16]

Quelle=String,Ziel=Data.Str

merke das erste Byte von Data.Str
mache BLKMOV
schreibe Byte zurück an erste Stelle von Data.Str
so geht der Header nicht verloren.
Wie geht das vor und nach BLKMOV

L B P#Data.Str
BLKMOV
T B P#Data.Str

sowas in der Richtung nur halt richtig :-)
 
Auch gut wäre erste Byte von Data.Str kopieren in erstes Byte VarString und dann den Blockmove machen, aber irgendwie kriege ich das erste byte von Data.Str nicht kopiert.
 
Habe ich auch schon versucht :-)
aber da kommen die Fehlermeldungen siehe Anhang.
 

Anhänge

  • Area.JPG
    Area.JPG
    105,4 KB · Aufrufe: 9
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

das geht so nicht Du kannst nur schreiben P##Data, zugriff auf Strukturen ist damit nicht möglich. Du kannst aber zu AR1 entsprechend eine Offset addieren.

Gruss Daniel
 
Code:
L P##Data
LAR1
L B[AR1, P#10.0]
T #saveHeader

wäre z.B. das Byte 10 nach der Adresse von Data

oder zu AR1 den Offset addieren
Code:
L P##Data
LAR1
+AR1 P#10.0
L B[AR1, P#0.0]
T #saveHeader

Gruss Daniel
 
Zurück
Oben