У меня UDP-соединение с элементом управления Wa go с помощью Modbus / UDP, и у меня были большие проблемы с TIdUdpClient.
Проблема заключалась в том, что отправка данных всегда работала, но компонент не получал никаких данных , даже пакет ответа был четко виден в WireShark.
Я долго искал, пока не обнаружил, что массив буфера приема ДОЛЖЕН быть установлен на ожидаемую длину данных (НЕ 0), иначе клиент не получит НИКАКОГО data.
Просто хочу, чтобы другие не искали часы.
Примечание: получение содержит проверку бита ошибки для кода функции Modbus. можно игнорировать, если вы передаете данные, отличные от Modbus
Пример рабочего кода:
function TWagoIO.sendCommand (arucTX : array of Byte; uiTXLen : integer;
var arucRX : array of Byte; var uiRXLen : integer) : boolean;
var
clSocket : TIdUdpClient;
arTXBuff : TIdBytes;
arRXBuff : TIdBytes;
iIndex : integer;
iByteCount : integer;
strPeerIP : string;
uiPeerPort : word;
bRetValue : boolean;
begin
bRetValue := true;
clSocket := TIdUdpClient.Create (nil);
SetLength(arTXBuff, uiTXLen);
for iIndex := 0 to (uiTXLen - 1) do
begin
arTXBuff [iIndex] := arucTX [iIndex];
end;
clSocket.Host := strIPAddress;
clSocket.Port := uiPortNum;
clSocket.SendBuffer(strIPAddress, uiPortNum, arTXBuff);
SetLength(arRXBuff, 1024);
strPeerIP := '';
uiPeerPort := 60000;
Sleep (100);
uiRXLen := clSocket.ReceiveBuffer(arRXBuff, strPeerIP, uiPeerPort, 3);
if (uiRXLen > 7) then
begin
for iByteCount := 0 to uiRXLen do
begin
arucRX [iByteCount] := arRXBuff [iByteCount];
end;
if ((arucRX [7] and C_FC_ERROR_FLAG) = C_FC_ERROR_FLAG) then
begin
bRetValue := false;
end;
end
else
begin
bRetValue := false;
end;
clSocket.Destroy;
result := bRetValue;
end;