'Inteligenty' dom ze sterownikiem PLC

 Language:
Szukanie zaawansowane  

Aktualności:

Powrót do strony głównej: www.edom-plc.pl

Autor Wątek: Przerwanie pracy Timera  (Przeczytany 2563 razy)

rkoper1

  • Newbie
  • *
  • Wiadomości: 2
    • Zobacz profil
Przerwanie pracy Timera
« dnia: Marca 09, 2019, 12:22:24 am »

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
Zapisane

vakul

  • Full Member
  • ***
  • Wiadomości: 149
    • Zobacz profil
Odp: Przerwanie pracy Timera
« Odpowiedź #1 dnia: Marca 10, 2019, 06:12:49 pm »

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.
Zapisane

admin

  • Administrator
  • Sr. Member
  • *****
  • Wiadomości: 313
    • Zobacz profil
Odp: Przerwanie pracy Timera
« Odpowiedź #2 dnia: Marca 25, 2019, 10:22:56 am »

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
Zapisane