1
Ваши вопросы / Re: Вопросы по скриптам в Simple-Scada 2
« : 02 Сентября 2024, 13:07:01 »
Всем спасибо огромное!
Официальный форум Simple-Scada.
В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.
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.
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.
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.

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