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

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

Автор Тема: Вопросы по скриптам в Simple-Scada 2  (Прочитано 319416 раз)

st-legal

  • Новичок
  • *
  • Сообщений: 18
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #420 : 26 Июня 2017, 11:49:21 »
Вы уверены, что проблема с быстрым присвоением битов в одну переменную существует после того как Вы убрали внутреннюю переменную? Мы сейчас делаем очень быстрые клики в Вашем проекте по кнопкам "Выход 1" .. "Выход 4" и присвоения всегда выполняются правильно. Может быть Вы во время кликов по кнопкам производите нажатие в зоне кнопки, а отпускаете мышь уже за её пределами? В таком случае присвоение не выполнится и может создастся впечатление, будто нажатие было, а присвоение не выполнилось.
Итоговая картинка, сделал скрины. Нажимал все 4 кнопки последовательно, на последнем скрине итоговый результат. Не работает быстрое присвоение тегу..(((
« Изменён: 26 Июня 2017, 13:44:59 от Simple-Scada »

Teodor

  • Старожил
  • ****
  • Сообщений: 256
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #421 : 26 Июня 2017, 14:50:52 »
А попробуй десяток полей сделать, и скриптик срабатывающий на изменение переменной:
Увеличивающий на 1 переменную счетчик и присваивающий  в кейсе значения полям по очереди.
Тогда можно будет отследить все изменения переменной.
Еще лучше, если рядом будет еще колоночка полей для внутренней переменной прицепленной как Екс для кнопок. Тогда можно будет точно отследить сам факт нажатия.

st-legal

  • Новичок
  • *
  • Сообщений: 18
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #422 : 26 Июня 2017, 15:20:55 »
А попробуй десяток полей сделать, и скриптик срабатывающий на изменение переменной:
Увеличивающий на 1 переменную счетчик и присваивающий  в кейсе значения полям по очереди.
Тогда можно будет отследить все изменения переменной.
Еще лучше, если рядом будет еще колоночка полей для внутренней переменной прицепленной как Екс для кнопок. Тогда можно будет точно отследить сам факт нажатия.
Приветствую Teodor, в том то и прикол, что с внутренней переменной одновременное присвоение проходит, а вот как заявлено что "улучшенная работа с внешними переменными (значение на присвоение временно хранится в оперативной памяти);" не работает. Это не особо критично, можно операторам объяснить, что необходимо дождаться пока загорится лампочка и затем нажимать другую кнопку. Но просто хотелось добиться результата при одновременном нажатии

Teodor

  • Старожил
  • ****
  • Сообщений: 256
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #423 : 26 Июня 2017, 15:30:15 »
А мне критично... Объект рабочий и за каждый отвал параметров я запасаюсь вазелином. Один движок уже спалил(он был перемотанный, а 0 означал отсытствие ограничений для частотника). Потому и попросил глянуть что получается, т.к. сам не могу :)

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3000
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #424 : 27 Июня 2017, 10:52:01 »
st-legal, вчера делали разные тесты с Вашим проектом (OPC-сервер изменили сначала на Kassl dOPC, затем на KepServer), нажимая кнопки "Выход 1" .. "Выход 4", присвоения всегда выполняются правильно, независимо от частоты кликов по кнопкам. Для того, чтобы получить более полную информацию предлагаем проделать следующее:

1. На событие OnClick кнопок "Выход 1" .. "Выход 4" поставить такой универсальный скрипт:
Код
begin
  Log_Add(Sender.Name + '.Click: ' + bout.AsUTF8String);
end.

2. Сохранить и запустить проект. Последовательно нажать кнопки "Выход 1", "Выход 2", "Выход 3" "Выход 4";
3. Завершить работу клиента и сервера скады;
4. Отправить на support@simple-scada.com лог-файл сервера из папки "Simple-Scada 2\Logs\Server-log.txt".

TeNQ

  • Постоялец
  • ***
  • Сообщений: 199
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #425 : 28 Июня 2017, 12:07:32 »
Решил попробовать новые процедуры TimerStart и т.д. Но сразу же возник вопрос, а как ими пользоваться? Дело в том, что процедура требует параметр AVariable типа TM_Variable. Я как-то сразу на это и не обратил внимание. Я ожидал тип TDateTime. Да и в описании к процедуре написано - "Переменная должна быть объявлена в редакторе переменных." Переменную типа TM_Variable не объявишь в редакторе. И второй вопрос, а что за параметр Afrom - "Запускает таймер по переменной AVariable начиная с времени AFrom". Это смещение для AVariable или время запуска(задержка запуска) процедуры?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3000
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #426 : 28 Июня 2017, 12:18:11 »
TeNQ, посмотрите пример в Demo-проекте, страница "Скрипты" - "Простые скрипты (1)", блок номер 8. Секундомер сделан полностью на основе таймерных процедур.

Цитировать
"Переменная должна быть объявлена в редакторе переменных." Переменную типа TM_Variable не объявишь в редакторе.
Здесь говорится не о типе данных, а о самой переменной. Любая переменная, которая создается в редакторе переменных представляет собой объект типа TM_Variable. Тип данных у переменной должен быть как раз DateTime, чтобы на её основе можно было создать секундомер.

Допустим у нас есть переменная vrTimer с типом данных DateTime, тогда на её основе можно запустить секундомер так:
Код
begin
  TimerStart(vrTime, 0);  // запускаем таймер с нуля
end.

Цитировать
И второй вопрос, а что за параметр Afrom
Это время с которого секундомер начнёт отсчет. Т.е. можно стартовать не с нуля.

TeNQ

  • Постоялец
  • ***
  • Сообщений: 199
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #427 : 28 Июня 2017, 12:29:39 »
Я создал две переменных vrTime, vrFrom типа DateTime в редакторе. В скрипте использовал процедуру TimerStart(vrTime, vrFrom); И компилятор ругается на несовместимость типов TDateTime и TM_Variable. У вас в демо-проекте не ругается. Буду разбираться.
П.С. Все разобрался.
TimerStart(vrTime,  vrFrom.AsDateTime) ;  Вот так надо было сразу) Это я сам запутался.
« Изменён: 28 Июня 2017, 12:33:36 от TeNQ »

deldemo

  • Старожил
  • ****
  • Сообщений: 308
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #428 : 28 Июня 2017, 15:01:44 »
  Здравствуйте помогите пожалуйста с запросом.

Есть код:
Код
var {Заполняем таблицу tblOtchet "Отчет производства"}
  aQuery:string;
  aHome:string;
  aEnd:string;
begin
  aHome := QuotedStr(vOtchet_home.AsStr);
  aEnd := QuotedStr(vOtchet_end.AsStr);

  aQuery :=  'SELECT'+
                 ' AR_NAME'+
                 ', AR_ARTICLECODE'+
                 ', BD_STARTTIME'+
                 ', BD_ENDTIME'+
             ' FROM CFG_ARTICLE, CFG_BATCHES'+
             ' WHERE (AR_ARTICLE_ID = BD_PRODUCT_ID'+
             ' AND BD_STARTTIME >= '+aHome+''+
             ' AND BD_STARTTIME <= '+aEnd+')'+
             ' ORDER BY BD_STARTTIME;';

  tblOtchet.RunSQL(aQuery, tsSaveFixRow);
end.       

Где:
  vOtchet_home:= DateTime
  vOtchet_end:= DateTime                         
Есле в запросе присутствует дата которой нет в таблице, то выдает это:

Хотя в СУБД запрос проходит на ура и таблица формируется.

Решил так:
Код
var {Заполняем таблицу tblOtchet "Отчет производства"}
  aQuery:string;
begin
  aQuery :=  'SELECT'+
                 ' AR_NAME'+
                 ', AR_ARTICLECODE'+
                 ', BD_STARTTIME'+
                 ', BD_ENDTIME'+
             ' FROM CFG_ARTICLE, CFG_BATCHES'+
             ' WHERE (AR_ARTICLE_ID = BD_PRODUCT_ID'+
             ' AND BD_STARTTIME >= '+vOtchet_home.AsSQLDateTime+''+
             ' AND BD_STARTTIME <= '+vOtchet_end.AsSQLDateTime+')'+
             ' ORDER BY BD_STARTTIME;';

  tblOtchet.RunSQL(aQuery, tsSaveFixRow);
end.     
                                               
« Изменён: 29 Июня 2017, 11:43:03 от Simple-Scada »

deldemo

  • Старожил
  • ****
  • Сообщений: 308
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #429 : 29 Июня 2017, 08:20:55 »
Здравствуйте.
Подскажите пожалуйста как пользоваться этой функцией

Код
function GetCell(ACol, ARow: Integer): TM_TableCell; 
Описание: Возвращает ячейку на пересечении столбца с номером ACol и строки с номером
ARow. Возвращает nil, если такой ячейки не существует.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3000
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #430 : 29 Июня 2017, 10:47:35 »
Цитировать
Есле в запросе присутствует дата которой нет в таблице, то выдает это:
Хотя в СУБД запрос проходит на ура и таблица формируется.
Здесь всё дело в формате даты/времени и код QuotedStr(vOtchet_home.AsStr); возвращает дату время в формате, который не подходит для запроса. Поэтому, как Вы и сделали, нужно использовать метод AsSQLDateTime.

Цитировать
Подскажите пожалуйста как пользоваться этой функцией
Посмотрите пример использования данной функции в руководстве по скриптам. Эта функция возвращает указанную ячейку. Ячейка имеет тип TM_TableCell, все свойства ячейки можно посмотреть здесь (доступны только для чтения). Если Вы не уверены, что ячейка существует в заданных "координатах", то для большей надежности кода можно сначала делать проверку на nil и только потом работать с ячейкой, например:

Код
var
  aCell: TM_TableCell;
begin
  aCell := Table1.GetCell(1, 1);  // получаем ячейку на пересечении столбца 1 и строки 1
  if aCell <> nil then            // если ячейка в столбце 1 и строке 1 существует, то
    Text1.Text := aCell.Text;     // извлекаем из ячейки текст
end.
« Изменён: 29 Июня 2017, 10:52:28 от Simple-Scada »

deldemo

  • Старожил
  • ****
  • Сообщений: 308
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #431 : 29 Июня 2017, 15:22:55 »
Цитировать
Посмотрите пример использования данной функции
Спасибо огромное. К большому сожалению не знал что есть новая версия мана по скриптам.
                                                                                   
В PDF версии нет примера работы с данной функцией.
« Изменён: 29 Июня 2017, 15:23:45 от deldemo »

deldemo

  • Старожил
  • ****
  • Сообщений: 308
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #432 : 29 Июня 2017, 15:29:37 »
Вопросик опять нарисовался.
Как извлечь из ячейки не текст а INTEGR или преобразовать TEXT в INTEGR/
Просто  я хотел бы использовать конечный результат как ID для других запросов

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1178
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #433 : 29 Июня 2017, 15:36:42 »
Для этого нужно использовать функцию StrToInt. Пример:

Код
var
  aCell: TM_TableCell;
  I: Integer;
begin
  aCell := Table1.GetCell(1, 1);  // получаем ячейку на пересечении столбца 1 и строки 1
  if aCell <> nil then            // если ячейка в столбце 1 и строке 1 существует, то
    I := StrToInt(aCell.Text);     // извлекаем из ячейки число
end.

Миханик

  • Постоялец
  • ***
  • Сообщений: 180
    • Просмотр профиля
    • www.vpa-dv.ru
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #434 : 30 Июня 2017, 12:57:36 »
Как правильно загрузить значение даты из БД в переменную?
например, aDate - переменная типа TM_Variable

aDate.Value := DataSet.FieldByName('val_date').AsDateTime - так не работает.