Hallo,
Wij maken gebruik van Delphi 5 met Asyncpro 2.58 voor het maken van TCP socket connecties.
Hiervoor plaatsen wij een TapdWinsockPort component op ons Form.
Het connecteren, data ontvangen en verzenden is geen enkel probleem.
Maar nu ben ik tijdens het debuggen een raar probleem tegen gekomen. Wat me voor een raadsel stelt en aangezien we TapdWinsockPort component veelvuldig gebruiken heb ik dit ook nog nooit meegemaakt.
Asyncpro maakt gebruik van een ComportTriggerAvail procedure om aan te geven dat er data op de port is.
Hier krijg je dan ook een variabele Count mee wat het aantal bytes weergeeft dat beschikbaar is.
Tijdens debuggen ben ik verbonden met een Terminal programma om communicatie te simuleren. Dit is wel Modbus weet niet of dit uitmaakt
Een timer stuurt elke 250ms via de volgende code wat uit over de port:
Code:
comport.putstring(CHR(2) + CHR(0) + CHR(0) + CHR(0) + CHR(0) + chr(6) + chr(1) + chr(1) + chr(0) + chr(0) + chr(0) + chr(8));
Het Terminal programma stuurt daar als antwoord het volgende op:
<STX><NUL><NUL><NUL><NUL><EOT><NUL><SOH><SOH><CR >
Dit is dus voor ComportTriggerAvail telkens een Count van 10. Nu is het probleem als ik dit een minuut of 10 zo laat lopen komen er meerdere (4 ongeveer) ComportTriggerAvail met een Count van 4095 (InSize staat op 4096)
De InBuffUsed is dan ook ineens 4095. Via onderstaande Code Kijk je naar wat er beschikbaar is. En dat is idd 4095 lang en met telkens herhalingen van wat de Terminal gestuurd heeft.
Code:
for k := 1 to count do begin
if comport.CharReady then
received := received + comport.GetChar;
end;
Het lijkt erop dat ineens de complete Inbuffer naar de ComportTriggerAvail gekopieerd wordt meerdere keren.
Wat is er aan de hand? Kan ik dit oplossen of achterhalen waar dit vandaan komt?
Onderstaand de volledige ComportTriggerAvail Code en daaronder een logging die gemaakt is. Op 10:14:42 kan je zien wat ik bedoel.
Code:
procedure TOT.ComportTriggerAvail(CP: TObject; Count: Word);
var i,id,o,k:integer;
begin
if Inlineerror then begin
Inlineerror := false;
for i := 1 to MAXDEVICE do begin
if (Device[i].dosend) then begin
postmessage(Device[i].rhnd, Device[i].mes, Device[i].Hnd, 0);
end;
end;
end;
try
//DEVICE SPECIFIC
if count > 12 then begin
Dolog('Count of: ' + inttostr(Count) + ' received and InBuffUsed: ' + IntToStr(comport.InBuffUsed));
end;
for k := 1 to count do begin
if comport.CharReady then
received := received + comport.GetChar;
end;
while (length(received) > length(cmdhead)) and (copy(received, 1, length(cmdhead)) <> cmdhead) do begin
received := copy(received, 2, length(received));
end;
DoLog('Received: ' + received + ' InBuffUsed: ' + IntToStr(comport.InBuffUsed));
while (length(received) > 6) and (length(received) >= ord(received[6]) + 6) do begin
timeout := 0;
//if copy(received, 8, 1) = chr(2) then begin
if copy(received, 8, 1) = chr(1) then begin
id := polltimer.tag;
o := device[id].inputs;
device[id].inputs := ord(received[10]);
for i := 1 to MaxDevice do begin
if (device[i].dosend) and (device[i].addr = device[id].addr) then begin
device[i].inputs := device[id].inputs;
if Device[i].Request or (isfollow and (o <> Device[i].Inputs)) then begin
Device[i].Request := false;
postmessage(Device[i].rhnd, Device[i].mes, Device[i].Hnd, 3);
end
else if (o <> Device[i].Inputs) then
postmessage(Device[i].rhnd, Device[i].mes, Device[i].Hnd, 11);
end;
end;
end;
received := copy(received, ord(received[6]) + 6, length(received));
end;
except
received := '';
end;
end;
IO-WEIGHBRIDGE 120190501.zip
Bookmarks