Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Алгоритм работы таймера / 12 сообщений из 12, страница 1 из 1
01.01.2018, 12:00
    #39578525
Dmitry_A123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм работы таймера
Всем привет и с Новым Годом.
Вопрос:
есть запись в файле в виде
timer1=ON/13:22/13:23/1/1/1/0/0/0/1
timer2=ON/13:03/13:04/1/1/1/1/1/1/1
timer3=ON/13:05/13:06/1/0/1/0/1/0/1
timer4=ON/13:07/13:08/1/0/0/0/1/0/0
timer5=ON/13:09/13:10/1/1/0/0/1/0/0

есть функция, которая проверяет системное время, сравнивает его с файлом и включает/отключает реле. Если поставить обработку одной строки, то все ОК. А если обрабатывать все пять строк, то получается что срабатывает только пятый таймер. Т.е. если время соответствует timer1, то реле включается. Далее проверяется вторая строка, и если время не соответствует, то реле выключается.
Задача - необходимо реализовать булевую функцию, которая включает и выключает реле в зависимости от настроек. (Типа многозадачный таймер).

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
if Copy(f.Strings[strnum],posN('=',f.Strings[strnum],1)+1,PosN('/',f.Strings[strnum],1)-posN('=',f.Strings[strnum],1)-1)='ON' then
   if (Copy(f.Strings[strnum],PosN('/',f.Strings[strnum],2+day)+1,1)='1') and
       (StrToTime(Copy(f.Strings[strnum],posN('/',f.Strings[strnum],1)+1,PosN('/',f.Strings[strnum],2)-posN('/',f.Strings[strnum],1)-1))<=Time) and
       (StrToTime(Copy(f.Strings[strnum],posN('/',f.Strings[strnum],2)+1,PosN('/',f.Strings[strnum],3)-posN('/',f.Strings[strnum],2)-1))>Time) then
         begin
          result:=true;
         end  else
         begin
         result:=false;
          end;



Чтобы было понятнее:
Первое включение 1:00 - 2:00, второе 3:00 - 4:00
Сейчас 1:30
Проверяется первая строка - время соответствует условие, реле включается
Проверяется вторая строка - время не соответствует, реле выключается (а надо чтобы работало до 2:00)

Если не трудно, подскажите, а то всю голову сломал уже
...
Рейтинг: 0 / 0
01.01.2018, 12:54
    #39578532
Dmitry_A123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм работы таймера
Всем спасибо, уже разобрался))
...
Рейтинг: 0 / 0
02.01.2018, 12:33
    #39578665
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм работы таймера
Dmitry_A123,

авторЕсли не трудно, подскажите, а то всю голову сломал уже

ужас, выкинуть говнокод, нормально расписать условие, и больше так не писать никогда. иначе будешь и дальше голову ломать при любом изменении или дополнении.
...
Рейтинг: 0 / 0
02.01.2018, 13:09
    #39578673
под ван
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм работы таймера
makhaonDmitry_A123,

авторЕсли не трудно, подскажите, а то всю голову сломал уже

ужас, выкинуть говнокод, нормально расписать условие, и больше так не писать никогда. иначе будешь и дальше голову ломать при любом изменении или дополнении.
Так ты помоги делом, а не словом - напиши свой не говнокод, на личном примере покажи, как можно и нужно делать.
...
Рейтинг: 0 / 0
02.01.2018, 13:27
    #39578683
Няшик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм работы таймера
под ван,

Тут же элементарное дело, делаем Copy строки до \n сбрасываем \n и бьём опять же до = и уже разбиваем на /

Элементы добавляем в массив TDictionary<string, TDictionary<int, string>>

Дальше делаем с этой инфой что угодно, перебирая через foreach к примеру
...
Рейтинг: 0 / 0
02.01.2018, 14:11
    #39578689
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм работы таймера
Так я же не знаю условий :) ТЗ надо. Что тут делать? ON/13:22/13:23/1/1/1/0/0/0/1 когда что включать когда выключать? Там может быть OFF? Код смотреть не хочу, потому как новый год, лень думать и вообще слом мозга :)

авторТ.е. если время соответствует timer1, то реле включается

Какое реле включается? Какое выключается? 1 включаем, 0 отключаем? или еще как? Почему указано два времени? Что будет происходить с 13:22 до 13:23?

Для начала можно SplitStr по '/' в массивы структур. Счаз трохи накидаю.
...
Рейтинг: 0 / 0
02.01.2018, 14:32
    #39578697
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм работы таймера
Не знаю, насколько названия полей соответствую ТЗ, набросал, не запускал, надо гонять:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
procedure TForm2.Button1Click(Sender: TObject);
type
 TRalayRec = record
  OnFlag: boolean;
  StartTime: TDateTime;
  StopTime: TDateTime;
  RalaysOn: array [0..6] of boolean;
 end;
var
 i, j:  integer;
 SL: TStringList;
 Arr: TStringDynArray;
 Relays: array of TRalayRec;
begin
 SL := TStringList.Create;
 try
  SL.LoadFromFile('timers.txt');
  SetLength(Relays, SL.Count);
  for i := 0 to SL.Count - 1 do
  begin
   Arr := SplitString(SL[i], '/');
   with Relays[i] do
   begin
    OnFlag := Arr[0] = 'ON';
    TryStrToTime(Arr[1], StartTime);
    TryStrToTime(Arr[2], StopTime);
    for j := 0 to 6 do
     RalaysOn[j] := Arr[j + 3];
   end;
  end;
 finally
  FreeAndNil(SL);
 end;
end;
...
Рейтинг: 0 / 0
02.01.2018, 14:37
    #39578698
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм работы таймера
Отвлекли, сорри )

Код: pascal
1.
RalaysOn[j] := Arr[j + 3] = '1';
...
Рейтинг: 0 / 0
02.01.2018, 14:50
    #39578704
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм работы таймера
Няшик, makhaon,

вот вы какие крутые и отчаянные хакеры.
...
Рейтинг: 0 / 0
02.01.2018, 17:17
    #39578729
Няшик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм работы таймера
чччД,

Кхм. Спроси меня - как бы сделал Я для Себя.

Я бы сделал так

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
procedure TForm1.Button1Click(Sender: TObject);
var
  p: TMatchCollection;
begin
  p := TRegEx.Matches(Memo1.Text,
    '\b(.*)\=(.*)\/(.*)\/(.*)\/(.*)\/(.*)\/(.*)\/(.*)\/(.*)\/(.*)\/(.*)\b');

  
  ShowMessage(p.Item[0].Groups.Item[3].Value); // 13:22
end;



Потому что я могу.
...
Рейтинг: 0 / 0
02.01.2018, 19:56
    #39578765
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм работы таймера
Ребята, хватит отсебятины, используйте кэшед текст буфферз.
...
Рейтинг: 0 / 0
02.01.2018, 22:09
    #39578789
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм работы таймера
можно просто перегнать в массив вариантов, если records не нравится.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Алгоритм работы таймера / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]