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