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

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

Simple-Scada

Demo-версия обновлена. beloleg86, теперь Ваш скрипт должен корректно работать для аналоговых заслонок (т.е. для заслонок у которых включено свойство "Показать поле").

Вай-Вай, ошибка со слоями устранена.

Вообще, в этом обновлении довольно много изменений, но пока не будем публиковать официальное обновление, т.к. на днях решим ещё несколько вопросов и выложим официально.

beloleg86

#91
Спасибо а как обновить версию Стандарт на 1000 точек, при покупке вы дали ссылку на скаду, можно ли с нее обновиться? Лицензия оформлена на ОАО "ЮКЭК-Белоярский" "и еще в редакторе и в клиенте выскакивает ошибка и система закрывается когда заходишь в меню О программе

Код: pascal
Сигнатура проблемы:
  Имя события проблемы:	APPCRASH
  Имя приложения:	Editor.exe
  Версия приложения:	2.0.0.0
  Отметка времени приложения:	573aa805
  Имя модуля с ошибкой:	KERNELBASE.dll
  Версия модуля с ошибкой:	6.1.7601.18229
  Отметка времени модуля с ошибкой:	51fb1116
  Код исключения:	0eedfade
  Смещение исключения:	0000c41f
  Версия ОС:	6.1.7601.2.1.0.256.1
  Код языка:	1049
  Дополнительные сведения 1:	f26e
  Дополнительные сведения 2:	f26e409a6454e93683a6b9f907943f95
  Дополнительные сведения 3:	8c82
  Дополнительные сведения 4:	8c82d1f2107cefd2c06d5af805433944

Simple-Scada

beloleg86, ближе к ночи мы добавим ещё несколько изменений и исправлений и вышлем Вам ссылку на обновление.

Цитироватьи еще в редакторе и в клиенте выскакивает ошибка и система закрывается когда заходишь в меню О программе
Сейчас проверим.

TeNQ

Вопрос по скрипту ToExcel. Пробовал его использовать, но результат - создается пустой Excel`евский файл.
   Переменная Try2 - внутренний тег с частотой записи в тренд 1сек. База подключена и я через WorkBench вижу что значения туда пишутся. Скрипт я использовал из руководства с небольшими изменениями.
Код: pascal
var
aBegin, aEnd: TDateTime;
begin
   aEnd := Now; // конец интервала – текущая дата;
   aBegin := IncSecond(aEnd, -10); // начало интервала – текущая дата – 10 секунд;
   Try2.ToExcel ('', aBegin, aEnd, evtAll, False);
end.           
Результатом по идее должно быть 10 значений. В базе записей меньше, явно не с секундным интервалом, а по изменению - видимо это оптимизация. Все равно что-то же должно быть выведено в файл, а  он пустой. Что я делаю не так?

Simple-Scada

#94
ЦитироватьВ базе записей меньше, явно не с секундным интервалом, а по изменению - видимо это оптимизация.
Да, это из-за оптимизации. Помимо неё, есть ещё одна оптимизация из-за которой Вы можете получать пустой файл экспорта. Дело в том, что вершины трендов не добавляются в БД сразу, т.к. это может привести к плохим последствиям, если таких трендов будет много. Поэтому вершины сначала накапливаются в специальном буфере и только затем загружаются в БД одним большим SQL-запросом. Поэтому при формировании отчета за последние 10 секунд в БД с большой вероятностью этих данных не окажется. Но здесь есть, что улучшить. Например, мы можем сделать так, чтобы в результат выборки из БД добавлялись данные из буферов... и тогда экспорт всегда будет правильным (не касается экспорта по часам/дням/месяцам).

TeNQ

#95
Да в принципе это была тестовая задача. Мне лень было ждать, поэтому я и взял короткий интервал. Так что если переделка будет трудозатратна/ухудшит производительность скады  то и не надо.

ЦитироватьПоэтому вершины сначала накапливаются в специальном буфере и только затем загружаются в БД одним большим SQL-запросом.
А вот тогда другой вопрос, возникла мысль использовать БД для хранения массива значений. Выбрал фунцию записи в тренд при каждом изменении значения. Так вот сколько я не менял значение переменной -  в БД, судя по WorkBench ни одно изменение не записалось. А второй тренд пишущийся с интервалом в 1 сек туда заносится по изменению +когда нет изменений значения пишутся каждые 30 сек.
   Прошло уже минут 10 времени, в 1м тренде так обновлений и не было. Это из-за буфера? Похоже да. Поскольку все значения появились в БД при закрытии клиента. Если весь этот буфер висит в оперативке, то так  при аварийном отключении питания можно большой кусок данных(по времени/ не по размеру) потерять. Выигрывает те, кто используют большое кол-во трендов -> большие объемы записываемых данных -> буфер быстро заполняется -> часто сбрасывается. Но задачи то бывают разные. Иногда пишутся показания нескольких счетчиков/регуляторов, там объемы данных небольшие. Может привязать оптимизацию/буфер к кол-ву трендов/частоте записи в проекте?

beloleg86

Добрый день все мои вопросы решены, Теперь О программе вылетов нет как в редакторе так и в клиенте, заслонка работает как и надо как я и хотел... спасибо

Simple-Scada

TeNQ, да, выгрузка буфера в БД должна зависеть от времени. Особенно это применимо для варианта "при каждом изменении". На выходных планируем сделать официальное обновление. В нем этот вопрос будет решен.

toreto

Хотел организовать настройки цветовой темы проекта для каждого клиента, пробую записывать в файл, а потом во время инициализации читать, но как то не получается, может кто поделится идеей

TeNQ

#99
Цитата: toreto от 26 мая 2016, 14:26:50Хотел организовать настройки цветовой темы проекта для каждого клиента, пробую записывать в файл, а потом во время инициализации читать, но как то не получается, может кто поделится идеей
Ну тут наверное надо разделить задачи - сохранение/чтение в файл и задание цветовой темы для конкретного клиента.
   С первой задачей можно разобраться. Создать численные переменные Client_Colour_Scheme_X для каждого клиента соотвественно и сохранять/считывать их. Значения они будут принимать
0 - csGrey //тема серого цвета
1 - csDarkGrey //тема темно серого цвета. и тд.
   Со второй задачей у меня возникли проблемы. Я задал имя клиента через Options.exe. Читаю имя клиента функцией
GetClientName. А она ничего не возвращает. Хотя должна была вернуть строку с именем клиента. А значит и функция выбора цветовой схемы для конкретного клиента procedure SetColorSchemeClient (AClientName: UTF8String; AScheme: TM_ColorScheme); у меня не заработала.

Simple-Scada

#100
toreto, для корректного решения данной задачи не хватает события OnInitializationClient, которое вызывалось бы клиентом при подключении к серверу, т.к. обычное событие OnInitialization не подойдёт, ведь оно вызывается сервером единожды - во время активации проекта. На выходных мы сделаем обновление, в котором эту задачу можно будет легко решить.

ЦитироватьЧитаю имя клиента функцией GetClientName. А она ничего не возвращает.
Видимо потому что она вызывается в скрипте OnDataChange? Если так, то все верно, ведь GetClientName возвращает имя клиента, который вызвал скрипт. А клиенты не имеют отношения к OnDataChange событиям, т.к. они вызываются сервером. Поэтому имя клиента в этом событии получить не удастся. В этом плане событие OnDataChange уникально и отличается от всех других, которые вызываются клиентами (OnClick, OnDblClick и т.д.). Сейчас опишем это в справке.

TeNQ

#101
ЦитироватьВидимо потому что она вызывается в скрипте OnDataChange?
В скриптах OnInitialization.
Код: pascal
if GetClientName = 'Test' then 
    SetColorSchemeClient ('Test', csBrown);
Просто, чтобы проверить я написал в  OnSecondTimer.
Код: pascal
begin
  Text1.Text := 'Имя клиента = ' + GetClientName ;
  SetColorSchemeClient (GetClientName ,csBrown);
end.       
Имя не вывелось и схема не поменялась.

Simple-Scada

#102
Верно, это же касается и всех других событий, которые вызываются сервером (OnInitialization, OnSecondTimer, OnHourTimer, OnExit).

ЦитироватьИмя не вывелось и схема не поменялась.
Как Вы успели заметить SetColorSchemeClient не выполнилась, как и не выполнятся многие другие методы, т.к. этот скрипт будет вызван сервером. Как раз вчера мы сделали несколько изменений и теперь в серверных скриптах все методы будут работать, кроме тех, которые работают с данными клиента (на сегодняшний день это только одна функция GetClientName). А мы надеялись, что никто не заметит этого до очередного обновления.

TeNQ

#103
Вопрос о свойстве кнопке ActiveState. В редакторе состояний кнопки есть свойство Номер - порядковый номер состояния. Но порядковый номер состояния не соответствует таковому состоянию ButtonX.ActiveState. Например, для кнопки с фиксацией номер состояния в редакторе Отпущено - 1, Нажата - 2. В реальности при исполнении скрипта ActiveState кнопки в состоянии Отпущено - 0, Нажата - 1. Возможно это разные свойства и все работает так как надо, но сейчас в них можно запутаться, тем более что для кнопки с фиксацией доступно множество состояний.

beloleg86

Дайте пример по скрипту пожалуйста, например есть три переменных типа Boolean: opened, closed, average есть изображение с тремя кадрами: 0 кадр - открыто, 1 кадр - закрыто,  2 кадр - промежуточное.
задача при изменении состояния переменных показывался кадр изображения соответствующей этой переменной