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

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

st-legal

#420
Цитата: Simple-Scada от 26 июня 2017, 11:22:01Вы уверены, что проблема с быстрым присвоением битов в одну переменную существует после того как Вы убрали внутреннюю переменную? Мы сейчас делаем очень быстрые клики в Вашем проекте по кнопкам "Выход 1" .. "Выход 4" и присвоения всегда выполняются правильно. Может быть Вы во время кликов по кнопкам производите нажатие в зоне кнопки, а отпускаете мышь уже за её пределами? В таком случае присвоение не выполнится и может создастся впечатление, будто нажатие было, а присвоение не выполнилось.
Итоговая картинка, сделал скрины. Нажимал все 4 кнопки последовательно, на последнем скрине итоговый результат. Не работает быстрое присвоение тегу..(((

Teodor

А попробуй десяток полей сделать, и скриптик срабатывающий на изменение переменной:
Увеличивающий на 1 переменную счетчик и присваивающий  в кейсе значения полям по очереди.
Тогда можно будет отследить все изменения переменной.
Еще лучше, если рядом будет еще колоночка полей для внутренней переменной прицепленной как Екс для кнопок. Тогда можно будет точно отследить сам факт нажатия.

st-legal

Цитата: Teodor от 26 июня 2017, 14:50:52А попробуй десяток полей сделать, и скриптик срабатывающий на изменение переменной:
Увеличивающий на 1 переменную счетчик и присваивающий  в кейсе значения полям по очереди.
Тогда можно будет отследить все изменения переменной.
Еще лучше, если рядом будет еще колоночка полей для внутренней переменной прицепленной как Екс для кнопок. Тогда можно будет точно отследить сам факт нажатия.
Приветствую Teodor, в том то и прикол, что с внутренней переменной одновременное присвоение проходит, а вот как заявлено что "улучшенная работа с внешними переменными (значение на присвоение временно хранится в оперативной памяти);" не работает. Это не особо критично, можно операторам объяснить, что необходимо дождаться пока загорится лампочка и затем нажимать другую кнопку. Но просто хотелось добиться результата при одновременном нажатии

Teodor

А мне критично... Объект рабочий и за каждый отвал параметров я запасаюсь вазелином. Один движок уже спалил(он был перемотанный, а 0 означал отсытствие ограничений для частотника). Потому и попросил глянуть что получается, т.к. сам не могу :)

Simple-Scada

st-legal, вчера делали разные тесты с Вашим проектом (OPC-сервер изменили сначала на Kassl dOPC, затем на KepServer), нажимая кнопки "Выход 1" .. "Выход 4", присвоения всегда выполняются правильно, независимо от частоты кликов по кнопкам. Для того, чтобы получить более полную информацию предлагаем проделать следующее:

1. На событие OnClick кнопок "Выход 1" .. "Выход 4" поставить такой универсальный скрипт:
Код: pascal
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

Решил попробовать новые процедуры TimerStart и т.д. Но сразу же возник вопрос, а как ими пользоваться? Дело в том, что процедура требует параметр AVariable типа TM_Variable. Я как-то сразу на это и не обратил внимание. Я ожидал тип TDateTime. Да и в описании к процедуре написано - "Переменная должна быть объявлена в редакторе переменных." Переменную типа TM_Variable не объявишь в редакторе. И второй вопрос, а что за параметр Afrom - "Запускает таймер по переменной AVariable начиная с времени AFrom". Это смещение для AVariable или время запуска(задержка запуска) процедуры?

Simple-Scada

TeNQ, посмотрите пример в Demo-проекте, страница "Скрипты" - "Простые скрипты (1)", блок номер 8. Секундомер сделан полностью на основе таймерных процедур.

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

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

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

TeNQ

#427
Я создал две переменных vrTime, vrFrom типа DateTime в редакторе. В скрипте использовал процедуру TimerStart(vrTime, vrFrom); И компилятор ругается на несовместимость типов TDateTime и TM_Variable. У вас в демо-проекте не ругается. Буду разбираться.
П.С. Все разобрался.
TimerStart(vrTime,  vrFrom.AsDateTime) ;  Вот так надо было сразу) Это я сам запутался.

deldemo

#428
  Здравствуйте помогите пожалуйста с запросом.

Есть код:
Код: pascal
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                         
Есле в запросе присутствует дата которой нет в таблице, то выдает это:

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

Решил так:
Код: pascal
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.      
                                               

deldemo

Здравствуйте.
Подскажите пожалуйста как пользоваться этой функцией

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

Simple-Scada

#430
ЦитироватьЕсле в запросе присутствует дата которой нет в таблице, то выдает это:
Хотя в СУБД запрос проходит на ура и таблица формируется.
Здесь всё дело в формате даты/времени и код QuotedStr(vOtchet_home.AsStr); возвращает дату время в формате, который не подходит для запроса. Поэтому, как Вы и сделали, нужно использовать метод AsSQLDateTime.

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

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

deldemo

#431
ЦитироватьПосмотрите пример использования данной функции
Спасибо огромное. К большому сожалению не знал что есть новая версия мана по скриптам.
                                                                                   
В PDF версии нет примера работы с данной функцией.

deldemo

Вопросик опять нарисовался.
Как извлечь из ячейки не текст а INTEGR или преобразовать TEXT в INTEGR/
Просто  я хотел бы использовать конечный результат как ID для других запросов

Simple_Scada

Для этого нужно использовать функцию StrToInt. Пример:

Код: pascal
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.

Миханик

Как правильно загрузить значение даты из БД в переменную?
например, aDate - переменная типа TM_Variable

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