FB_StreamBuffer  Function Block

This functionblock acts as a stream buffer for use with FB_XmlControl


Variables

Name Type Description
_PointerToStringBuffer POINTER TO BYTE
_BufferSize UDINT
_Length UDINT

Methods

Clear PUBLIC

Clears the buffer and sets the length to 0

Implementation
IF (_PointerToStringBuffer = 0) OR (_BufferSize = 0) THEN
    RETURN;
END_IF

FOR Count := 0 TO (_BufferSize - 1) DO
    _PointerToStringBuffer[Count] := 0;
END_FOR

_Length := 0;
Copy PUBLIC

Copies a string from the character buffer

Parameters

Name Type Description
StartPos UDINT
EndPos UDINT

Outputs

Name Type Description
CopyLen UDINT
XmlError E_XmlError
Implementation
Loop := 0;
PointerToByteToCopy := ADR(Copy);
PointerToBuffer := _PointerToStringBuffer + StartPos - 1;

WHILE(Loop < SIZEOF(Copy)) AND (StartPos - 1 + Loop < _Length) AND (StartPos + Loop < EndPos) DO
    PointerToByteToCopy^ := PointerToBuffer^;
    Loop := Loop + 1;
    PointerToByteToCopy := ADR(Copy) + Loop;
    PointerToBuffer := _PointerToStringBuffer + StartPos + Loop -1;
END_WHILE;

IF Loop = SIZEOF(Copy) THEN
    XmlError := E_XmlError.ErrorStringLen;
ELSIF StartPos - 1 + Loop = _Length THEN
    XmlError := E_XmlError.ErrorMaxBufferLen;
ELSE
    XmlError := E_XmlError.OK;
END_IF;

PointerToByteToCopy^ := 0;
CopyLen :=  Loop;
CutOff PUBLIC

Parameters

Name Type Description
StartPos UDINT

Outputs

Name Type Description
CutLen UDINT
XmlError E_XmlError
Implementation
Loop := 0;
PointerToByteToCut := ADR(CutOff);
PointerToByteBuffer := _PointerToStringBuffer + StartPos - 1;

WHILE PointerToByteBuffer^ <> 0 AND(Loop < SIZEOF(CutOff)) AND StartPos -1  + Loop < _Length DO
    PointerToByteToCut^ := PointerToByteBuffer^;
    Loop := Loop + 1;
    PointerToByteToCut := ADR(CutOff) + Loop;
    PointerToByteBuffer := _PointerToStringBuffer + StartPos - 1 + Loop;
END_WHILE;

IF PointerToByteBuffer^ = 0 THEN
    XmlError := E_XmlError.OK;
ELSIF Loop = SIZEOF(CutOff) THEN
    XmlError := E_XmlError.ErrorStringLen;
ELSIF StartPos - 1 + Loop = _Length THEN
    XmlError := E_XmlError.ErrorMaxBufferLen;
END_IF;

PointerToByteToCut^ := 0;
_Length := StartPos -1;

PointerToByteBuffer := _PointerToStringBuffer + StartPos - 1;
PointerToByteBuffer^ := 0;

CutLen := Loop;
Find PUBLIC

Find a searchstring in the buffer and returns its position. It's possible to add a preffered startposition within buffer

Parameters

Name Type Description
SearchString STRING
StartPos UDINT
Implementation
Loop := 0;
Search := 0;

PointerToBuffer := _PointerToStringBuffer + StartPos;
PointerToSearch := ADR(SearchString);

WHILE(PointerToSearch^ <> 0 ) AND Loop + StartPos < _Length DO
    IF PointerToBuffer^ <> PointerToSearch^ THEN
        Loop := Loop + 1;
        PointerToBuffer := _PointerToStringBuffer + StartPos + Loop;
        PointerToSearch := ADR(SearchString);
        Search := 0;
    ELSE
        Search := Search + 1;
        PointerToBuffer := _PointerToStringBuffer + StartPos + Loop + Search;
        PointerToSearch := ADR(SearchString ) + Search;
    END_IF;
END_WHILE;
Find := Loop + 1 + StartPos;
FindBack PUBLIC

Parameters

Name Type Description
SearchString T_MaxString
Implementation
Loop := 0;
Search := 0;

PointerToBuffer := _PointerToStringBuffer + _Length;
PointerToSearch := ADR(SearchString);

WHILE(PointerToSearch^ <> 0) AND Loop < _Length DO
    IF PointerToBuffer^ <> PointerToSearch^ THEN
        Loop := Loop + 1;
        PointerToBuffer := _PointerToStringBuffer + _Length - Loop;
        PointerToSearch := ADR(SearchString);
        Search := 0;
    ELSE
        Search := Search + 1;
        PointerToBuffer := _PointerToStringBuffer + _Length - Loop + Search;
        PointerToSearch := ADR(SearchString ) + Search;
    END_IF;
END_WHILE;
FindBack := _Length - Loop + 1;
SetBuffer PUBLIC

Parameters

Name Type Description
PointerToBufferAddress POINTER TO BYTE Set buffer address (ADR ...)
SizeOfBuffer UDINT Set buffer size (SIZEOF ...)
Implementation
IF (PointerToBufferAddress = 0) OR (SizeOfBuffer = 0) THEN
    SetBuffer := FALSE;
    RETURN;
END_IF;

_BufferSize := SizeOfBuffer;
_PointerToStringBuffer := PointerToBufferAddress;

SetBuffer := TRUE;

Properties

Append : T_MaxString SET

Appends a string to the buffer

BufferSize : UDINT GET

Read current Buffersize

Length : UDINT GET SET

Gets/Sets the current length (in bytes) of the streambuffer

Used by

Declaration source
// This functionblock acts as a stream buffer for use with FB_XmlControl
FUNCTION_BLOCK FB_StreamBuffer 
VAR
    _PointerToStringBuffer : POINTER TO BYTE;
    _BufferSize : UDINT;
    _Length : UDINT;
END_VAR