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