string Variablen verschieben

Felse

Level-1
Beiträge
221
Reaktionspunkte
10
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen ich habe folgendes Problem: Ich habe in meinem Projekt einige E/A Felder (string) angelegt. In diese soll ein text eingegeben werden. Soweit OK. In einem übergeordneten A-Feld (string) sollen dann je nach Zuständen die verschiedenen Texte der E/A Felder erscheinen. Wie kann ich den Text verschieben?
Dachte erst das würde eventuell mit
Code:
IF E1.0 AND E2.0                           
 THEN string1:= string2;
END_IF;
aber das geht wohl nicht, aber wie dann?
 
String

Hallo,

erstmal wäre interessant was nicht geht... zeigt die Visu nichts an? Was steht im DB? Bissel Input wäre nicht schlecht.

André
 
Hallo zusammen ich habe folgendes Problem: Ich habe in meinem Projekt einige E/A Felder (string) angelegt. In diese soll ein text eingegeben werden. Soweit OK. In einem übergeordneten A-Feld (string) sollen dann je nach Zuständen die verschiedenen Texte der E/A Felder erscheinen. Wie kann ich den Text verschieben?
Dachte erst das würde eventuell mit
Code:
IF E1.0 AND E2.0                           
 THEN string1:= string2;
END_IF;
aber das geht wohl nicht, aber wie dann?

In SCL kann man das schon so machen (Wird dann beim compilieren in eine AWL-Schleife umgesetzt, die die Strings über Pointer Byteweise umkopiert.). Ich denke mal, string1 ist als Output und string2 als Input deiner Funktion definiert. Die Strings sollten in einem DB angelegt sein und an die In- und Outputs der Funktion angetragen werden. Diese DB-Strings dann mit deiner Visu als Strings verbinden.

Aber Achtung. Das Umkopieren erfolgt in jedem Zyklus, solange E1.0 und E2.0 anliegen. Besser wäre, das mit einem Flankenwechsel zu machen, denn einmaliges Umkopieren reicht ja.
 
Hier mal ein kleines Beispiel:

Code:
FUNCTION FC254 : INT

Title = 'String umkopieren'
//
// String umkopieren
//
Version : '1.0'
author  : Ralle
name    : STR_KO
family  : SYSTEM

VAR_INPUT
   // Eingangsparameter
   InString: STRING;
END_VAR

VAR_OUTPUT 
   // Ausgangsparameter
   OutString: STRING;
END_VAR

VAR_TEMP
    // temporäre Variablen
END_VAR

// Anweisungsteil
    OutString := InString;
   
    ;
    FC254 := 100;
END_FUNCTION
 
Eigenartigerweise gehts jetzt mit der if Anweisung...? Vorher hatte ich die besagten Fehlermeldungen. Naja jetz ist eh bald feierabend, falls ich noch ein prob hab meld ich mich nochmal.
Siemens eben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Kompiler benutzt dazu den BLKMOV.

André

Ne, das wüßte ich aber. :cool:
Da mußt du einen anderen SCL-Compiler haben, als ich. ;)

Der Code, der obigen SCL-Funktion:
generiert vom SCL Übersetzer Version: SCLCOMP K05.03.05.00_01.03.00.01 release

Code:
      SET   
      SAVE  
      =     L      0.1
      L     P##OutString
      LAR1  
      L     W [AR1,P#0.0]
      T     LW    18
      AUF   DB [LW 18]
      L     D [AR1,P#2.0]
      LAR1  
      L     B [AR1,P#0.0]
      L     P##InString
      LAR1  
      TAK   
      L     W [AR1,P#0.0]
      T     LW    18
      AUF   DB [LW 18]
      TAK   
      L     D [AR1,P#2.0]
      LAR1  
      TAK   
      L     B [AR1,P#1.0]
      >=I   
      SPB   I007
      TAK   
I007: L     P##OutString
      LAR1  
      TAK   
      L     W [AR1,P#0.0]
      T     LW    18
      TAK   
      AUF   DB [LW 18]
      L     D [AR1,P#2.0]
      LAR1  
      TAK   
      T     B [AR1,P#1.0]
      L     B#16#4
      /I    
      T     LW     4
      RRD   16
      T     LW     2
      L     P##OutString
      LAR1  
      L     D [AR1,P#2.0]
      T     LD     6
      L     P##OutString
      LAR1  
      L     W [AR1,P#0.0]
      T     LW    14
      L     P##InString
      LAR1  
      L     D [AR1,P#2.0]
      T     LD    10
      L     P##InString
      LAR1  
      L     W [AR1,P#0.0]
      T     LW    16
      L     B#16#0
      L     LW     4
      ==I   
      SPB   I008
I009: T     LW     4
      LAR1  LD    10
      AUF   DB [LW 16]
      L     D [AR1,P#2.0]
      +AR1  P#4.0
      TAR1  LD    10
      LAR1  LD     6
      AUF   DB [LW 14]
      T     D [AR1,P#2.0]
      +AR1  P#4.0
      TAR1  LD     6
      L     LW     4
      LOOP  I009
I008: L     B#16#0
      L     LW     2
      ==I   
      SPB   I00a
I00b: T     LW     2
      LAR1  LD    10
      AUF   DB [LW 16]
      L     B [AR1,P#2.0]
      +AR1  P#1.0
      TAR1  LD    10
      LAR1  LD     6
      AUF   DB [LW 14]
      T     B [AR1,P#2.0]
      +AR1  P#1.0
      TAR1  LD     6
      L     LW     2
      LOOP  I00b
I00a: L     100
      T     #RET_VAL
      CLR   
      U     L      0.1
      SAVE  
      BE
 
Scl

Hallo Ralle,

dann ergänze ich meine Aussage. Der Kompiler benutzt dazu den BLKMOV - wenn er kann. Ich hatte etwas ähnliches in einem FB, da gehts komischerweise. Hab ihn mal aufs wesentliche abgespeckt.

Code:
FUNCTION_BLOCK FB100
 
VAR_INPUT
    String_IN         : STRING[254];                   // string format (Lenght254)                  
END_VAR
 
VAR_OUTPUT
    String_OUT        : STRING[254];                   // string format (Lenght254)                  
END_VAR
VAR
END_VAR
VAR_TEMP
END_VAR
 
//*****************************************************************************************************************************************
BEGIN
 
        String_OUT := String_IN;
 
END_FUNCTION_BLOCK

generierter AWL-Code
Code:
      SET   
      SAVE  
      =     L      0.1
      L     DW#16#10130001
      T     LD     2
      L     DINO
      T     LW     6
      TAR2  
      +     L#0
      T     LD     8
      L     B#16#FE
      T     DIB [AR2,P#256.0]
      L     DW#16#10130001
      T     LD    12
      L     DINO
      T     LW    16
      TAR2  
      +     L#2048
      T     LD    18
      TAR2  LD    22
      UC    "BLKMOV"
            P#L 2.0
            P#L 26.0
            P#L 12.0
      LAR2  LD    22
      U     L      0.1
      SAVE  
      BE

André
 
Sehr eigenartig von Siemens gelöst. Denn auch in einem FC könnte man ja den SFC20 nutzen, wenn man nur wollte.

@Felse

FC254:=100;

Ist der Rückgabewert der Funktion.
Mann muß das nicht tun, aber ich hab mir das so angewöhnt. Bei längeren Funktionen kann man darin auch einen Status- oder Fehlercode unterbringen.
 
Zurück
Oben