Problem z idFtp w timerze

0

Witajcie.

Mam maly problem, z ktorym walcze od kilku dni.

Pisze program, ktory ma za zadanei odczytywac temperatury i zapisywac wyniki w pliku tekstowym.
Ponadto chcialem aby program wysylal na ftp ostatni pomiar (najbardziej aktualny), ktory umieszczony jest w osobnym pliku tymczasowym.

Pomiar temperatury realizowany jest poprzez wywolanie zewnetrznego programu do odczytu temperatur co 1 minute, przy pomocy timera.

Po odczycie temperatur i utworzeniu pliku tymczasowego, program ma sie polaczyc do ftp i wyslac ten plik na serwer. To zadanie powinno rowniez byc realizowane przez ttimera oraz idFTP.

Problem pojawia się gdy dołącze procedure wysylania pliku (60B) na serwer.
I to tez nie zawsze. Czasem działa przez kilka godzin bez przerwy, a czasem po 15 minutach juz się wykrzacza w taki sposob, ze nie odczytuje temperatur i nie zapisuje nic do plikow.
Najczestszy błąd to przekroczony czas serwera.

Czy mozna w jakis sposob ograniczyc czas proby połączenia sie do ftp przy uzyciu komponentu idFtp, tak aby jesli nie połączy się przez np. 20sek, olał sprawe i sprobował później?

Obecnie program działa na moim laptopie, ale będzie transferowany na stacjonarny komputer z UPSem.
Teraz pytanie takie, jak sprawdzic czy jest połączenie z netem??
Dzisiaj miałem sytuacje taką, ze prąd wyłączyli, komputer działał, net (router) nie, pomiary były realizowane.
Programik chciał wysłać plik na serwer i się wywalil.

procedure TMainForm.Timer1Timer(Sender: TObject);
begin
    // realizowanie odczytów temperatur oraz tworzenie plikow

 czy_wysylac:=true;   // jesli plik z danymi jest poprawny sprobuj go wyslac
 Timer2.enabled:=true; // wiadomo co to jest :):)

end;

Drgui timer ktory co pewien czas ma wysylac plik na serwer wyglada tak:

procedure TMainForm.Timer2Timer(Sender: TObject);
begin
    if czy_wysylac then begin

       idftp1.Password:='...';
       idftp1.Username:='...';
       idftp1.Host:='...';

      try
       idftp1.Connect(true,-1);
      finally
       idftp1.Disconnect;
       Timer2.enabled:=false;
      end;
    end;
end;

No i sama procedurka wysylania:


procedure TMainForm.IdFTP1AfterClientLogin(Sender: TObject);
begin
      if idftp1.Connected then
        idftp1.Put('d:\delphi\temperatury\dane\net.txt','/public_html/strony/pomiary.txt', false);

end;

Czasy Timerow to:

Timer1.Interval:=60000;
Timer2.Interval:=10000;

Jeśli ktoś wie jak pomoc, to prosze o jakieś wskazówki.

Pozdrawiam
Maciej Płokarz
SonErgo

0

IdFTP ma właściwości ReadTimeout i TransferTimeout zajrzyj do dokumentacji.
http://www.indyproject.org/docsite/html/frames.html?frmname=topic&frmfile=TIdFTP_ReadTimeout.html
http://www.indyproject.org/docsite/html/frames.html?frmname=topic&frmfile=TIdFTP_TransferTimeout.html

EDIT// No i jak robisz już to na tych timerach to Timer2.Enabled:=False albo flaga czy_wysylac:= False od momentu łączenia do momentu zakończenia połączenia.

0

Dzieki za zainteresowanie tematem.

Zmienna

czy_wyslac

to zmienna, ktora decyduje czy wyslac plik, jesli format danych jest poprawny.
Problem polega na tym, ze w timer1 zastowalem uruchomienie zewnetrznego programu do oczytu temperatur z czujnikow DS18s20 - digitemp.exe.
Raz na jakis czas, program digitemp.exe, nie wykona pomiaru ze wszystkich czujnikow i plik jest niekompletny.
Zdecydowalem, aby nie wysylac pliku ktory zawiera bledy (niekompletny plik).
Na samym poczatku timera1 sprawdzana jest poprawnosc (czy wszystkie czujniki zostaly odczytane).
Jesli tak jest, to

czy_wyslac:=true

Takze ta zmienna "czy_wyslac" nie ma nic wspolnego z wysylaniem pliku na serwer, to tylko zmienna mowiaca czy wysylac plik, czy nie.

Po odczycie temperatur i po ustawieniu

czy_wyslac:=true

uruchamiany jest drugi timer, ktory po sprawdzeniu "czy_wyslac" powinen ustanowic polaczenie z serwerem i wyslac plik na serwer.

Problem pojawia sie, jesli za dlugo nie mozna sie polaczyc.

I nie wiem jak to naprawic.

Sprobowalem ustawic "Read TimeOut" na jakies 30s.
Zobaczymy jaki to da efekt.

Jakby pojawily sie jakies inne sugestie, to podsylajcie.

Pozdrawiam serdecznie
Maciej Płokarz
SonErgo

0

Ale chodzi mi o to, że nie może dojść do sytuacji że zaczniesz coś wysyłać a tymczasem timer w trakcie wysyłania ponownie wywoła wysłanie pliku na serwer bo program się wysypie dlatego musisz mieć jakąś zmienną, która będzie sygnalizowała czy można w danym momencie wysyłać.

0

Witajcie

Poprawilem kod źrodłowy i wyglada nastepująco:


procedure TMainForm.Timer1Timer(Sender: TObject);
begin
      // instrukcje odczytujae temperature i tworzace pliki

     czy_wysylac:=true;
     end;
    Timer2.enabled:=true;
end;

procedure TMainForm.Timer2Timer(Sender: TObject);
begin
    if czy_wysylac then begin
       Timer2.enabled:=false;
       czy_wysylac:=false;
       idftp1.Password:='zzzz';
       idftp1.Username:='zzzz';
       idftp1.Host:=zzzzz;
      try
       try
        idftp1.Connect(true);
        except
        idftp1.Disconnect;
       end;
      finally
       idftp1.Disconnect;
      end;
    end;
end;

procedure TMainForm.IdFTP1AfterClientLogin(Sender: TObject);
begin
      if idftp1.Connected then
        idftp1.Put('d:\delphi\temperatury\dane\net.txt','/public_html/strony/pomiary.txt', false);

end;

Na pol godziny wylaczylem polaczenie sieciowe
Pomiary byly nadal robione, czyli plik net.txt byl uaktualniany co 60s, ale nie wysylal na serwerek, bo nie mial jak.
Po uruchomieniu połączenia sieciowego, program po wykonaniu timera1 uruchomil timer2 i wyslal aktualne pomiary na serwer.
Efekty można obejzec na stronie www.sonergo.com.pl/strony/pomiary.php

Jakos dziala.
Zobaczymy jak dlugo.

Dzieki za pomoc.
Pozdrawiam
Maciej Płokarz

1 użytkowników online, w tym zalogowanych: 0, gości: 1