Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - avtzarenko

Страницы: [1]
1
Всем спасибо огромное!

2
После перезапуска проекта не сохраняются значения, которые введены  в поля описанные в инструкции "управление границами переменных", хотя в свойствах переменной стоит восстановление.
Система сообщений у меня работать не будет, у меня архивация v1 и всего многообразия настроек описанных в инструкции https://simple-scada.com/help/manual/messet.html у меня нет, ну или они неявные.
Спасибо.
считаю вопрос закрыт тк мой скрипт криво, но справляется с уведомлениями.

3
Границы переменной не подходят т.к границу срабатывания указываются вручную и они  не постоянные.
Например при розливе виноматериала на тихие вина температура должна быть -3, чтобы получить температуру виноматериала  +6, а для игристого -7 градусов

4
Добрый день.
Как реализовать отправку только одного тревожного сообщения при достижении границы доп переменной?
основная переменная  - датчик температуры с ОРС
доп. переменная  - граница срабатывания, вручную выставленное значение в поле
Реализовано универсальным скриптом, но сейчас при любом изменении переменной выше доп переменной шлются сообщения
Код: (delphi)
begin
   if Sender is TM_Object then     // проверяем, что Sender это объект
     with Sender as TM_Object do   // приводим Sender к типу "TM_Object"

         if AsSingle >= VariableEx.AsSingle  then
            begin
              Color := clRed;
              AddMessage(Now, mkWarning, Variable.Description + ' превысила ' + Variable.AsStr + ' градуса ', True, True);
            end else

    Color := RGB(191,191,191);

       end.

5
Спасибо большое.
В итоге вышел из ситуации несколькими таблицами и двумя кнопками, со временем допилю,чтобы сама обновлялась каждую неделю.
Может кому будет полезно.
Описание:
Таблица показаний температурных датчиков за период. Показаний датчика несколько в час, выбрать показания  ночью с 00 до 01 и днём с 12 до 13.
trends_data - основная таблица sql
variables_data - связанная таблица с описанием поля
ID - уникальный идентификатор, он же id переменной
Description - описание переменной (в итоге не понадобилось)
Value - показания
Timestamp - дата-время показаний

Пример заполнения одной таблицы:
Код: (delphi)
var
     aQuery_1:string;
begin
     aQuery_1 :=   'WITH RankedData_1 (Date_1, Value_1, ID_1,   Descr_1, Time_1, Rank_1) AS' // декларируем временную таблицу
                         +'('                                                                                                               // выборка из БД
                         +'SELECT '
                         +' CAST(Timestamp as date) AS Date_1, '                                                       // извлекаем дату
                         +' convert(numeric(10,2), trends_data.Value) as Value_1, '                              // приводим показания к формату два знака после запятой
                         +' trends_data.ID as ID_1, '
                         +'variables_data.Description AS Descr_1, '
                         +' FORMAT(Timestamp ,''HH:mm:ss'') AS Time_1, '                                       // извлекаем время
                         +' ROW_NUMBER() OVER (PARTITION BY CAST (Timestamp as date), trends_data.ID ORDER BY FORMAT(Timestamp ,''HH:mm:ss'')) AS Rank_1 ' // подсчитываем количество показаний в час
                         +' FROM trends_data join variables_data on trends_data.ID = variables_data.ID '  // связываем таблицы
                         +' WHERE trends_data.ID in (1619) AND (FORMAT(Timestamp ,''HH:mm:ss'') BETWEEN ''12:00:00'' AND ''13:00:00'') '  // фильтруем по ID датчика и времени получения показаний
                         +' )'
            +' SELECT  top (30) Date_1, Value_1'                                                           // добавляем в итоговую таблицу необходимые данные - последние 30
            +'   FROM RankedData_1  '
            +'   WHERE Rank_1 = 1  '                                                                            // оставляем первое значение часа
            +'   ORDER BY Date_1 desc, ID_1 desc,  Time_1 desc';

  Table5.RunSQL(aQuery_1, tsSaveFixRow);
 
  Text225.Visible := True;
  Text225.Text := 'Температура днём';
end.                                 

6
Спасибо Большое!!!
НЕ посмотрел куда создал вопрос и думал, что меня игнорируют и создал вопрос в другой ветке и начал дальше писать но уже через sql
Видимо я неверно описал структуру таблиц.
trends_data - таблица БД
ID - уникальный идентификатор датчика (в запросе участвует 1619,1623,1627)
Value - значение датчика
Timestamp - дата и время записи значения датчика (несколько значений в час) и дабо брать первое значение т.к в час значений два

Немного подправил привязки к моей БД, при компиляции всё ок, при проверке ошибка
Обычный скрипт, привязка к кнопке
В чем может быть ошибка?

Код: (delphi)
var aFirstDay: TDateTime;
begin
  aFirstDay := IncDay(DATE, - (6 + integer(DayOfTheWeek(Now))));                           // первый день пред. недели
  Table5.RunSQL('SELECT FORMAT(`Timestamp`,''%d.%m.%Y  %H:%i'') as Time_1 , trends_data.ID  as ID, trends_data.Value as Value_1  FROM `trends_data` '                              // форматирование даты-времени и добавление фильтра столбцов
              + 'WHERE trends_data.ID in (1619,1623,1627)'
              + 'AND (MINUTE(`Time_1`) = 0) '                                                   // фильтр: минуты=0 или начало часа
              + 'AND ((HOUR(`Time_1`) MOD 12) = 0) '                                            // фильтр: час=0 или час=12
              + 'AND (`Time_1` >=' + MySQLDateTime(aFirstDay, dttHour)                          // фильтр: предыдущая неделя - начало
              + ') AND (`Time_1` <' + MySQLDateTime(IncDay(aFirstDay, 7), dttHour)              //         предыдущая неделя - конец
              + ') ;',
              tsSaveFixRow);
end.


7
Добрый день.
Просьба подсказать причину по которой компилятор выдает ошибку
Заполнение таблицы из БД
Написал код, напрямую запрос к БД sql отрабатывает нормально (скрин 211), через компилятор Scada c ошибкой (скрин 210) :(
Код: (delphi)
var
aQuery: string;
begin
 aQuery :=

 'WITH
 RankedData1 (ID, Descr, Value_1, Time_1, Date_1, Rank) AS
 (
 SELECT TOP (35) trends_data.ID  as ID, variables_data.Description   AS Descr, trends_data.Value   as Value_1,  FORMAT(Timestamp ,'hh:mm:ss')  AS Time_1,
 CAST (Timestamp as date) AS Date_1,
 ROW_NUMBER() OVER (PARTITION BY CAST (Timestamp as date), trends_data.ID ORDER BY FORMAT(Timestamp ,'hh:mm:ss'))  AS Rank
 FROM trends_data join variables_data on trends_data.ID = variables_data.ID
 WHERE trends_data.ID in (1619) AND (FORMAT(Timestamp ,'hh:mm:ss') BETWEEN '12:00:00' AND '13:00:00')
 ORDER BY Date_1 desc
 SELECT  Date_1, Time_1, Value_1
 FROM RankedData1WHERE Rank = 1
 ORDER BY Date_1  , ID ,  Time_1';

Table5.RunSQL(aQuery, tsAll);
  end;
end.

И второй вопрос как сделать чтобы данный скрипт исполнялся каждый понедельник?

8
Добрый день.
Просьба подсказать  или указать на ветку где уже обсуждалась проблема.
Есть три температурных датчика T_3, T_6, T_7 с переодичностью сохранения данных 30 минут.
Необходимо выводить на форму в таблицу Table5 данные за предыдущую неделю в разрезе данных на 00 и 12 часов.
Каждый понедельник таблица должна пересчитываться. В отчете это работает отлично, а вот на форму проблема, не хватает мозгов.
Начало понятно...
Код
var
  aQuery: string;
  aWeek: TDateTime;
begin
aWeek := StartOfTheWeek(Now);
then begin
  aQuery := 'SELECT 'T_3' as ''Улица'', 'T_6' as ''1 этаж'', 'T_7' as ''2 этаж'' FROM 'my_table';

....

  Table5.RunSQL(aQuery, tsAll);
end.

Во вложении пример как в отчете

9
Добрый день.

Требуется при наступлении определенного времени (в моём случае начало смены - 00:00:01, 08:00:01, 16:00:01) в переменные записывалось значение 0,
переменные - vrStartCount_Botle, vrStartCount_Tunnel, vrStartCount_Foil,  vrStartCount_label

написал скрипт на исполнение в 1 сек, но ругается при компиляции на then.
Подскажите как исправить скрипт?
Код: (delphi)
var
  dt1: TDateTime;
  dt2: TDateTime;
  dt3: TDateTime;
begin
  dt1 := Now;
  dt2 := Now;
  dt3 := Now;
  { если часы, минуты и секунды равны началу смены}
  if ((HourOf(dt1) = '00' and      (MinuteOf(dt1) = '00' and     (SecondOf(dt1) = '01') or
     (((HourOf(dt2) = '08' and     (MinuteOf(dt2) = '00' and     (SecondOf(dt2) = '01') or
     ((HourOf(dt3) = '16' and      (MinuteOf(dt3) = '00' and     (SecondOf(dt3) = '01')  then
 begin
    vrStartCount_Botle.Value := 0 ;
    vrStartCount_Tunnel.Value  := 0 ;
    vrStartCount_Foil.Value := 0    ;
    vrStartCount_label.Value := 0  ;
  end;
end.

10
Добрый день.
Просьба подсказать как организовать подсчет выпуска продукции в минуту.
С контролера  передаются накопительные данные 0~25000, требуется получить какое количество произведено в минуту с выводом на форму для просмотра и построения трендов.

Написал скрипт, но не понимаю, как организовать: выпуск продукции в мин= выпуск продукции текущий - выпуск продукции минуту назад (например текущий - 1200, минуту назад - 1150, т.е выпуск в минуту равен 50 шт)

Код: (delphi)
var
  Speedbotle_temp: integer;

begin
  if Dicount2.Value = 0 then
    Speedbotle_min.Value := 0
  else
    Speedbotle_min.Value := Dicount2.Value - Speedbotle_temp;
  Speedbotle_temp := Dicount2.Value
end.

Страницы: [1]