SegmentsΒΆ
The handling of UTF-8 encoded strings without additional buffering
The specification pbyData
and udiSize
can be used to describe a memory block that is to be considered for the processing of strings.
Receiving Data
eErrorID := itfPeer.Receive(pbyData, udiSize, itfIPAddressFrom, uiPortFrom=>uiPortFrom, udiCount=>udiCount); // UDP/IP
eErrorID := itfConnection.Read(pbyData, udiSize, udiCount=>udiCount); // TCP/IP
udiCount := TO_UDINT(SysFileRead(hFile, pbyData, TO__XWORD(udiSize), ADR(udiResult))); // File Access
udiCount := SysComRead(hCom, pbyData, udiSize, ulTimeout, ADR(udiResult)); // Serial Com
Sending data
eErrorID := itfPeer.Send(itfIPAddress, uiPort, pbyData, udiSize, udiCount=>udiCount); // UDP/IP
eErrorID := itfConnection.Write(pbyData, udiSize, udiCount=>udiCount); // TCP/IP
udiCount := TO_UDINT(SysFileWrite(hFile, pbyData, TO__XWORD(udiSize), ADR(udiResult))); // File Access
udiCount := SysComWrite(hCom, pbyData, udiSize, ulTimeout, ADR(udiResult)); // Serial Com
For all these use cases an IBuilder
implementation offers the possibility to provide the buffer. This allows the corresponding IBuilder
instance to be extended with the new content without a additional buffer and thus without additional effort for the management of the copy.
Read content received by a a network connection to a ``IBuilder`` instance
REPEAT
eErrorID := itfBuilder.GetCurrentSegment(pbyData=>pbyData, udiSize=>udiSize);
eErrorID := itfConnection.Read(pbyData, udiSize, udiCount=>udiCount);
IF eErrorID = ERROR.NO_ERROR AND udiCount > 0 THEN
eErrorID := itfBuilder.ValidateSegment(pbyData, udiCount);
IF eErrorID <> ERROR.NO_ERROR THEN
// Handle Error
EXIT;
END_IF
END_IF
UNTIL udiCount = 0
END_REPEAT
Write the content of a ``IBuilder`` instance to a network connection
pbyData:= itfBuilder.GetFirstSegment(udiSize=>udiSize, eErrorID=>eErrorID);
WHILE pbyData <> 0 AND eErrorID = ERROR.NO_ERROR DO
eErrorID := itfConnection.Write(pbyData, udiSize, udiCount=>udiCount);
IF eErrorID <> ERROR.NO_ERROR OR udiCount <> udiSize THEN
// Handle Error
EXIT;
END_IF
pbyData := itfBuilder.GetNextSegment(pbyData, udiSize=>udiSize, eErrorID=>eErrorID);
END_WHILE