Step 7 OSCAT LIB Buffer to String

Guten Morgen,

ich würde gerne hier das Thema nochmal aufgreifen wollen. Gibt es noch Anwender die hier mich eventuell unterstützen können ?

Thema ist ich habe in meiner PLCSIM 315er CPU mal den Baustein als Quelle etc. als Testprojekt usw eingebunden und geladen. Jetzt wäre die Frage wie bekomme ich den Pointer richtig aufgebaut und an den Baustein übergeben.


Gruß
 
Jetzt wäre die Frage wie bekomme ich den Pointer richtig aufgebaut und an den Baustein übergeben.
einfach das betreffende Array am Input verschalten

Oder bekommst du BUFFER_TO_STRING nicht zu S7-SCL konvertiert?
Es gibt die OSCAT Lib auch schon konvertiert für S7: oscat_basic_332_s7

Hier der SCL-Quelltext "BUFFER_TO_STRING":
Code:
FUNCTION_BLOCK BUFFER_TO_STRING
TITLE = 'BUFFER_TO_STRING'
//
//this function will retrieve a string from an array of byte starting at position start and stop at position stop.
//the function needs to be called: buffer_TO_String(adr("array"),sizeof("array"), start, stop);
//because this function works with pointers its very time efficient and it needs no extra memory.
//
VERSION : '1.5'
AUTHOR  : hugo
NAME    : BBSTR
FAMILY  : BUFFER

VAR_INPUT
    PT : POINTER;
        _pt AT pt: STRUCT
            DBNr: WORD;
            Adr: DWORD;
        END_STRUCT;    
    SIZE : INT;
    START : INT;
    STOP : INT;
END_VAR
VAR_OUTPUT
    _STRING : STRING;
        _str AT _STRING : STRUCT
            length: BYTE;
            act_length: BYTE;
            str: ARRAY [1..254] OF BYTE;
        END_STRUCT;
END_VAR
VAR_TEMP
    ps : INT;   //POINTER TO BYTE;
    i : INT;
    tPT : INT;
    stp: INT;
    sta: INT;
END_VAR

BEGIN

tPT := DWORD_TO_INT(SHR(IN:=SHL(IN:=_pt.Adr,N:=8),N:=11));

ps := 1;    //ADR(BUFFER_TO_STRING);
IF size = 0 THEN RETURN; END_IF;
sta := MIN(IN1:=start, IN2:=size-1);
stp := MIN(IN1:=stop, IN2:=size-1);

(* check for maximum string_length *)
IF (stp - sta + 1) >= BYTE_TO_INT(_str.act_length) THEN
  stp := sta + BYTE_TO_INT(_str.act_length) - 1;
END_IF;

FOR i := sta TO stp DO
    _str.str[ps] := WORD_TO_BLOCK_DB(_pt.DBNr).DB[tpt+i];
    ps := ps + 1;
END_FOR;

(* terminate the string *)
_str.act_length := INT_TO_BYTE(ps-1);

(* revision History
hm  5. mar. 2008  rev 1.0
  original version

hm  16. mar. 2008 rev 1.1
  changed type of input size to uint

hm  13. may. 2008 rev 1.2
  changed type of pointer to array[0..32767]
  changed size of string to STRING_LENGTH

hm  12. jun. 2008 rev 1.3
  check for pointer overrun
  change input start and stop to uint
  added type conversions to avoid warnings under codesys 3.0

hm  23. mar. 2009 rev 1.4
  avoid writing to input stop

hm  12. nov. 2009 rev 1.5
  limit start and stop to size -1

*)
END_FUNCTION_BLOCK


Theoretisch müsstest du auch einfach BLKMOV verwenden können zum Kopieren von BYTE-Array zu STRING. Was genau willst du denn machen?
 
Hi,

das Thema ist das wir eine bestehenden Baustein aus der TIA Welt in SCL zurück konvertiert haben. Das passt auch soweit, alles auch in SCL. Dann kommen aber halt die Stringfunktionen zum Thema.

Daher würde ich gerne den Baustein in S7 SCL gerne belassen, bis auf die Anpassung das ich dann das ArrayOfByte mit dem Buffer_To_String entsprechend die Daten rum kopieren kann.

Das wäre eine feine Sache.

Kannst du mir einen Screenshot vielleicht zeigen wie man den Baustein beschaltet. Ich bekomme es leider nicht hin.

In Step7 Classic bin ich auch echt was unbeholfen, eher der TIA Nutzer

Gruß
 
Hi,

sString := ''; // Initialisierung //
FOR t_i := 1 TO 48 DO
//"DB_HMI_ZugangEuchner".Out.Chip.User[t_i] := IO_PN_IN[t_i + 1]; //

// _Thb 20251027
cChar := BYTE_TO_CHAR(IO_PN_IN[t_i + 1]);
sString := CONCAT(IN1 := sString, IN2 := CHAR_TO_STRING(cChar));
END_FOR;

SO würde ich gerne das Array umkopieren, das geht aber anscheinend nicht im SCL vom S7.

Aber ist es denn in Step7 so kompliziert oder restriktiv gehalten und problematisch Strings entsprechend umzukopieren. Ja ich weis das man auch die tatsächliche Länge zuweisen muss.

Aber ich bekomme es mit keinen möglichen vernünftigen Mittel hin. Selbst mit dem Oscatbaustein habe ich keine Chance !!!

Gruß
 
In SCL classic musst du den STRING mit einem CHAR-Array überlagern (AT), dann kannst du auf die einzelnen Zeichen indiziert zugreifen.

Bei S7-300/400 kann man so auf die einzelnen Zeichen eines String zugreifen:
Code:
VAR
    TMP_CHR : CHAR;
    TMP_STR : STRING[8];
//den String mit einer Struktur überlagern
    sTMP_STR AT TMP_STR : STRUCT
      mL : BYTE;
      aL : BYTE;
      Text : ARRAY[1..8] OF CHAR;
    END_STRUCT;
//oder nur mit einem Array überlagern
    aTMP_STR AT TMP_STR : ARRAY[-1..8] OF CHAR;
END_VAR

BEGIN
    TMP_CHR := sTMP_STR.Text[1];
    TMP_CHR := aTMP_STR[1];
PS: das geht auch variabel indiziert:
Code:
    TMP_CHR := sTMP_STR.Text[i];
    TMP_CHR := aTMP_STR[i];

    sTMP_STR.Text[i] := TMP_CHR;
    aTMP_STR[i] := TMP_CHR;

    sTMP_STR.Text[i] := 'A';
    TMP_CHR := aTMP_STR[i]; //liefert 'A'
 
Kannst du mir das bitte genau zeigen wie du das machst ? Machst du das auch so wie ich es in den paar Zeilen gezeigt habe ?

Danke ...

@PN/Dp
Wie meinst du das mit dem Überlagern kannst du das erklären was da passiert und warum man das so machen muss !
Danke

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
1762758419900.png
Guten Morgen, das wäre mal mein Aufruf ... Der String bleint aber leer. In der VAT habe ich ein paar Zeichen in mein Array gesetzt.

Das Quell Array ist 127 BYte lang, Das Ziel ist ja ein String mit 254 Zeichen.

Gruß
 
Soweit ich mich erinnern kann werden Strings in Step7 in der Online Ansicht der DBs nicht aktualisiert.
Dein Ergebnis solltest du dir in einer Variablentabelle anschauen.
 
Hi,

ja das ist mir bewusst, danke für den Hinweis. Ich bin gerade am testen, habe neue Erkentnisse, so wie es aussieht kann es sein das der Ursprung von Oscat so nicht funktioniert !!! Kann ich mir zwar nicht vorstellen, aber jetzt habe ich String Zeichen endlich kopieren können
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@PN/Dp
Wie meinst du das mit dem Überlagern kannst du das erklären was da passiert und warum man das so machen muss !
siehe die Hilfe zum Schlüsselwort "AT": Hilfe zu STEP 7 / Bausteine programmieren mit S7-SCL > Deklaration lokaler Variablen und Bausteinparameter > Deklarieren von Sichten auf Variablenbereiche

oder in der TIA-Hilfe suchen nach "AT" > Variablen mit AT überlagern
 
Zurück
Oben