Вопросы по скриптам в Simple-Scada 2

Автор Simple-Scada, 29 января 2016, 15:19:20

AutoCY

#240
Как правильно присвоить переменной Time_1 значение времени 08.00.00, которая будет являться константой?

Код: pascal
const
    Time_1 =(08, 00, 00);

или

Код: pascal
 var Time_1: TDataTime;
begin
 Time_1 := (08, 00, 00);

При попытке сделать так - выдает ошибку при компиляции EncodeTime:

Код: pascal
var
 Time_1 : TDateTime;
begin
 Time_1.Value :=  EncodeTime(8, 0, 0, 0);
end.     

Simple-Scada

AutoCY, тип TDateTime этот тот же самый тип Double (вещественное число) и при создании константы время придется задавать именно как вещественное число и это неудобно. При попытке сделать так - выдает ошибку при компиляции EncodeTime. Сейчас EncodeDate, EncodeTime не вынесены в скрипты. Добавим их в очередном обновлении. Но возможно Вашу задачу можно решить проще. Можете описать то, что нужно сделать в скрипте? Мы предложим решение.

AutoCY

#242
ЦитироватьНо возможно Вашу задачу можно решить проще. Можете описать то, что нужно сделать в скрипте? Мы предложим решение.

Задача заключается в следующем: необходимо сделать таймер наработки оборудования с тремя интервалами во времени. Например, таймер формирует отдельные отрезки времени с 8.00 до 12.00, далее с 12.00 до 16.00 и т.д. При этом компонент таблица регистрирует эти данные в соответствующие ячейки. В результате, чтобы можно было проследить сколько работало оборудование в трех сменах в течении суток, скажем, за месяц.

Таймер будет включаться не только от времени, но еще и от дополнительных переменных. Как управлять таймером от переменных на данный момент времени я разобрался.

Teodor

Простите, но это работа контроллера, а не скады...

AutoCY

Цитата: Teodor от 17 марта 2017, 16:39:03Простите, но это работа контроллера, а не скады...
Да мне бы пока понять как включить и выключить таймер по определенному времени. А с контроллером...увы, в этом проекте я занимаюсь только скадой.

Teodor

Цитата: AutoCY от 17 марта 2017, 13:13:30Таймер будет включаться не только от времени, но еще и от дополнительных переменных. Как управлять таймером от переменных на данный момент времени я разобрался.
Ну так, а время это что, не переменная? Задайте в секундном скрипте проверку времени, и зависимо от смены переменной смена присваивайте значение 1,2,3.

Таймера тогда собсно тоже 3.
1 стартует если железо включено и смена=1, иначе стоп.
2...
3...


Simple-Scada

#246
Цитата: AutoCY от 17 марта 2017, 13:13:30необходимо сделать таймер наработки оборудования с тремя интервалами во времени. Например, таймер формирует отдельные отрезки времени с 8.00 до 12.00, далее с 12.00 до 16.00 и т.д. При этом компонент таблица регистрирует эти данные в соответствующие ячейки. В результате, чтобы можно было проследить сколько работало оборудование в трех сменах в течении суток, скажем, за месяц.
Но ведь в этом случае все накопленные в таблице записи будут потеряны при первом перезапуске сервера скады или проекта. К тому же, чтобы они добавлялись в таблицу придется на каждый интервал времени выделить переменные и связать ячейки таблицы с этими переменными. Причем если планируется выводить наработку за месяц добавляя по 3 новых строки в день, то получается что нужно создать 90 строк в таблице и заполнить все строки переменными. Плюс остается проблема с потерей данных при перезапусках. Такая система совсем не подходит для нормальной работы.

Правильнее было бы выводить наработки получая их из архива. Т.е. включить у нужных тегов архивацию а затем выполнять выборку из БД за нужный интервал времени и подсчитывать время наработки. Тогда даже после перезапуска сервера все наработки сохранятся. Только сейчас все это нужно делать в запросе и готовых функций для вычисления наработок средствами скады нет. Постараемся их добавить в ближайших обновлениях.

AutoCY

#247
ЦитироватьНо ведь в этом случае все накопленные в таблице записи будут потеряны при первом перезапуске сервера скады или проекта. К тому же, чтобы они добавлялись в таблицу придется на каждый интервал времени выделить переменные и связать ячейки таблицы с этими переменными. Причем если планируется выводить наработку за месяц добавляя по 3 новых строки в день, то получается что нужно создать 90 строк в таблице и заполнить все строки переменными. Плюс остается проблема с потерей данных при перезапусках. Такая система совсем не подходит для нормальной работы.

Правильнее было бы выводить наработки получая их из архива. Т.е. включить у нужных тегов архивацию а затем выполнять выборку из БД за нужный интервал времени и подсчитывать время наработки. Тогда даже после перезапуска сервера все наработки сохранятся. Только сейчас все это нужно делать в запросе и готовых функций для вычисления наработок средствами скады нет. Постараемся их добавить в ближайших обновлениях.
C БД я займусь немного позже. А пока не пойму как сделать правильным сравнение по отрезку времени в четвертой строке:

Код: pascal
begin
      Timer_1.Value := Now;
       txtTimer_4.Text := TimeToStr(Now);
       if(Timer_1.Value > 07:00:00) and (Timer_1.Value < 15:00:00)  then
            begin
               { если выполнено условие, то включается таймер }
               vrIntervalInSec_3.Value := SecondsBetween(Now, vrTime_3.Value);
               { При включении таймера выводим накопленное время }
               txtTimer_3.Text := TimeToStr(Now - vrTime_3.Value);
               Image8.Color := clRed

            end
      else
         begin
         { если таймер ещё не включен }
         Timer_1.Value := IncSecond(Now, -vrIntervalInSec_3.AsInt);
         Image8.Color := clNone
         end;
  end.              

Simple-Scada

ЦитироватьА пока не пойму как сделать правильным сравнение по отрезку времени в четвертой строке:
Т.е. нужно проверить, что час из значения Timer_1 больше 7 и меньше 15? Тогда нужно делать так:

Код: pascal
var
  aHour: Byte;
begin
  aHour := HourOf(Timer_1.AsDateTime);   // достаём час из переменной Timer_1 в переменную aHour
  if (aHour > 7) and (aHour < 15) then 
    // ...
end.

AutoCY

ЦитироватьТогда нужно делать так:
Спасибо за ответ.

AutoCY

При попытке повторить видео-пример по работе с файлами, компиляция не получается: в первой строке выбивает ошибку Not enough actual parametrs:
 
Код: pascal
begin
  if FileOpen ('Hello.sbm') then
  begin
      FileWriteString (Field9.ValueAsStr);
      FileWriteInteger (Field7.ValueAsInt);
      FileWriteSingle (Field8.ValueAsFloat);
      FileWriteString (Text13.Text);
      FileWriteDateTime (Now);
  end;
end.
     

Simple_Scada

Здравствуйте!

С момента записи видеоурока функции FileOpen, FileRecreate, FileExists получили еще один параметр APath - задает полный путь к файлу. Если этот параметр оставить пустым (= ''), то будет взят стандартный путь: «..\Simple-Scada 2\Projects\Папка_проекта\User files\». Важно! При указании пути к файлу в конце обязательно должен быть символ «\».

Поэтому скрипт нужно изменить так:
Код: pascal
begin
  if FileOpen ('Hello.sbm', '') then  // если файл по стандартному пути успешно открыт, то ...
  begin
      FileWriteString (Field9.ValueAsStr);
      FileWriteInteger (Field7.ValueAsInt);
      FileWriteSingle (Field8.ValueAsFloat);
      FileWriteString (Text13.Text);
      FileWriteDateTime (Now);
  end;
end.

AutoCY

#252
ЦитироватьС момента записи видеоурока функции FileOpen, FileRecreate, FileExists получили еще один параметр APath - задает полный путь к файлу. Если этот параметр оставить пустым (= ''), то будет взят стандартный путь: «..\Simple-Scada 2\Projects\Папка_проекта\User files\». Важно! При указании пути к файлу в конце обязательно должен быть символ «\».

Рабочий код получился таким (без Value):
Код: pascal
begin
  if FileOpen ('Hello.sbm', '') then
  begin
      FileWriteString (Field9.AsStr);
      FileWriteInteger (Field7.AsInt);
      FileWriteSingle (Field8.AsFloat);
      FileWriteString (Text13.Text);
      FileWriteDateTime (Now)
  end;
end.             
По умолчанию файл сохранился там, где Вы и сказали. Но я не совсем понял, как указать пользовательский путь сохранения файла. Не могли бы пример привести для наглядности. Например, путь такой:
D:\Simple-Scada 2\Папка_файла\.

Simple_Scada

#253
Здравствуйте!

Пример:
Код: pascal
begin
  if FileOpen('Hello.sbm', 'D:\Simple-Scada 2\Папка_файла\') then
  begin
      FileWriteString (Field9.AsStr);
      FileWriteInteger (Field7.AsInt);
      FileWriteSingle (Field8.AsFloat);
      FileWriteString (Text13.Text);
      FileWriteDateTime (Now);
  end;
end.   
   

ksapp

#254
Здравствуйте.
Недавно начал изучать Simple-SCADA. Система интересная. Видимо, остановлюсь на ней (раньше не использовал SCADA, пробовал многие, но по разным причинам отказывался и продолжал создавать своё ПО для АСУ на Делфи). Появилось несколько вопросов по скриптам:

1) Можно ли как-то вызвать скрипт из другого скрипта
2) Можно ли как-то объявить глобальную процедуру/функцию
3) Можно ли выполнять скрипты, которые находятся во внешних файлах
4) Можно ли объявить глобальный класс/объект и связать с ним глобальную переменную, или, например, глобальный массив
5) Можно ли использовать API-Windows и DLL
6) Можно ли выводить в поля значения в двоичном или шестнадцатеричном виде
7) Немного напрягает отсутствие отмены изменений в редакторе скриптов (хотя кого я обманываю - сильно напрягает)))

Всем заранее спасибо.