Główna > Programowanie
Przerwanie pracy Timera
(1/1)
rkoper1:
Witam
Pracuję nad własnym blokiem funkcyjnym do sterowania roletami i mam problem z zatrzymaniem timera TN.
Zrobilem tak, że jak się dwukrotnie naciśnie klawisz rolety to roleta załącza sie na na 35 sekund aby poszła do góry lub w dół w zależności od nacisniętego klawisza.
Teraz chce zrobić tak że jak roleta sobie już jedzie w góre lub w dół to nacisniecie jakiegokolwiek klawisza od sterowania roletą ma zatrzymać timer co spowoduje zatrzymanie silnika w rolecie.
Podsuniecie pomysł jak to mogę rozwiązać. W PLC jestem początkujący, ale każda wskazówka zapewne będzie dla mnie cenna.
Pozdrawiam
vakul:
Nie przepadam za timerami i coraz częściej używam takiej konstrukcji:
w momencie startu (jednorazowo) wywołuję coś takiego:
t_start := TIME();
następnie w trakcie działania programu, gdzie analizuję czasy robię to tak:
czas_dzialania := TIME_TO_DWORD(TIME() - t_start )/1000; <- tutaj wyrażone w sekundach (dzielenie przez 1000) zmienna czas_dzialania to zmienna liczbowa (np. INT, DWORD w zależności od wymaganego zakresu).
a później warunki w rodzaju IF (czas_dzialania>10) THEN ...
Zwróć uwagę, że nie możesz robić warunków w rodzaju IF (czas_dzialania = 10) THEN bo o ile przy sekundach nie powinno być problemu, to przy operacjach na milisekundach możesz nie trafić w konkretną wartość i warunek nigdy nie będzie spełniony.
Typowy cykl wykonania mojego programu to ok. 29-31ms. Na takich "timerach" można robić naprawdę fajne rzeczy.
admin:
Cześć,
A sprawdzałeś TP_1 z biblioteki Oscat basic?
To jest zrzut z gita:
(* @NESTEDCOMMENTS := 'Yes' *)
(* @PATH := '\/Logic\/generators' *)
(* @OBJECTFLAGS := '0, 8' *)
(* @SYMFILEFLAGS := '2048' *)
FUNCTIONBLOCK TP_1
VAR_INPUT
IN : BOOL;
PT : TIME;
RST : BOOL;
END_VAR
VAR_OUTPUT
Q : BOOL;
END_VAR
VAR
tx : TIME;
start : TIME;
ix : BOOL;
END_VAR
(*
version 1.0 28. jun. 2008
programmer hugo
tested by oscat
TP_1 generates a pulse every time it is calles with in := TRUE.
in addition the timer can be cleared asynchronously with rst.
the timer can be retriggered as often as necessary. it will count PT from the last trigger.
*)
(* @END_DECLARATION := '0' *)
(* read system timer *)
tx := DWORD_TO_TIME(T_PLC_MS());
IF RST THEN
Q := FALSE;
ELSIF IN AND NOT ix THEN
Q := TRUE;
start := tx;
ELSIF tx - start >= PT THEN
Q := FALSE;
END_IF;
ix:= IN;
(* revision history
hm 28. jun. 2008
original version
*)
END_FUNCTION_BLOCK
Nawigacja
Idź do wersji pełnej