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