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

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

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

VladislavVladimirovich

  • Новичок
  • *
  • Сообщений: 1
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1320 : 01 Декабря 2021, 21:33:03 »
Коллеги, здравствуйте!
Возникла необходимость написать скрипт, создающий таблицу имя которой является переменной вводимой в поле.
Пробовал разные варианты вроде :

Код: (delphi)
aQuery := 'CREATE TABLE IF NOT EXISTS' + QuotedStr(table_name.AsStr) + ' (' +
    '`id` INT NOT NULL AUTO_INCREMENT,' +
    '`magn_rec` VARCHAR(45) NOT NULL,' +
    '`servo_rec` VARCHAR(45) NOT NULL,' +
    '`gas_rec` VARCHAR(45) NOT NULL,' +
    '`comment` VARCHAR(60) NULL,'+
    'PRIMARY KEY(`id`),' +
    'UNIQUE KEY `name_UNIQUE` (`id`)' +
    ') ENGINE=InnoDB DEFAULT CHARSET=utf8;';
Скрипт всегда компилируется, но запрос не выполняется, выдает ошибку синтаксиса sql.

В тексте выше строковая переменная являющаяся именем таблицы - table_name.
Если не пытаться использовать "переменное" имя, то скрипт нормально работает и таблица создается. Прошу подсказать как решить вопрос
« Изменён: 02 Декабря 2021, 10:09:56 от Simple_Scada »

Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 166
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1321 : 02 Декабря 2021, 09:37:58 »
Здравствуйте.
Код: (delphi)
aQuery := 'CREATE TABLE IF NOT EXISTS' + '`' + table_name.AsStr + '`' + ' (' +

asutpfoma

  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1322 : 02 Декабря 2021, 12:40:52 »
Вопрос про архивы.
Код
Pump1DayReport : ARRAY [1..366] OF TDateTime
; - объявлено в unit GlobalModule;
kns_12_worktime1day_1 - архивируемая переменная в редакторе.
Хочу в отдельном скрипте в цикле выдергивать архивные значения в массив, далее по изменению интересующего элемента массива производить действия.
Код
ArchiveValueByTime(kns_12_worktime1day_1, Pump1DayReport[i - 1], aDate);

Как обыграть? Пока ошибка несоответствия типов. Спасибо

engineer0800

  • Новичок
  • *
  • Сообщений: 1
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1323 : 02 Декабря 2021, 16:34:33 »
Добрый вечер!
Появилась такая проблемма с отправкой СМС.
На телефон Андроид сообщения приходят, а на служебный кнопочный старый телефон НЕ приходят.
GSM модем Телеофис RX101-R4.
Галочки: "ждать ответа" и "менять режимы" испробовал.
Запись сообщений в кирилице и латинице испробовал.
Скрипт:
Код: (delphi)
begin
alarm_1.Value:=GetBit(bity_ot_skvazhiny.AsInt,2); // Авария частотника скважина 1
// Авария частотника скважина 1
 if alarm_1.Value then
    begin
     if not Memory_alarm_1.Value then // не отсылалась смс
      begin
       SendSMS('79024194140','Авария частотника скважина 1');
       slovo_1.Value:=SetBit(slovo_1.AsInt,2,true);
       Memory_alarm_1.Value:=True;
      end
     else
      begin
       slovo_1.Value:=SetBit(slovo_1.AsInt,2,false);
      end;
    end
 else
   begin
    Memory_alarm_1.Value:=False;
   end;                                   
end.
Буду рад подсказкам с вашей стороны.
« Изменён: 02 Декабря 2021, 21:48:59 от Simple-Scada »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1178
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1324 : 02 Декабря 2021, 22:50:05 »
Здравствуйте.

Цитировать
Хочу в отдельном скрипте в цикле выдергивать архивные значения в массив, далее по изменению интересующего элемента массива производить действия. Как обыграть? Пока ошибка несоответствия типов.
Ошибка несоответствия типов возникает из-за того, что у Вас массив имеет тип TDateTime, а результат ArchiveValueByTime должен записываться в переменную(TM_Variable) - см. описание по ссылке. Через массив данную задачу решить не получится. В любом случае придется создать необходимое количество внутренних переменных для хранения результатов ArchiveValueByTime. Можно назвать их однотипно, тогда можно будет в цикле вызвать ArchiveValueByTime и записать результаты в нужные переменные используя функцию GetVariableByName, например:
Код: (delphi)
var
 I: Integer;
 aVar: TM_Variable;
begin
  for I := 1 to 10 do
  begin
    aVar := GetVariableByName('MyVar' + IntToStr(I));
    if aVar <> nil then   // если переменная существует
      ArchiveValueByTime(kns_12_worktime1day_1, aVar, aDate);
  end;
end.
, после чего можно проверять значение требуемой переменной. Также, учитывайте, что ArchiveValueByTime это архивная процедура. Не рекомендуется вызывать их слишком часто и в больших количествах.


Цитировать
Появилась такая проблемма с отправкой СМС. На телефон Андроид сообщения приходят, а на служебный кнопочный старый телефон НЕ приходят.
Ни скада-система, ни модем не знают и не могут знать/определить, на какой именно телефон производится отправка. Отправка всегда производится одинаково - по указанному номеру телефона и никак не зависит от типа телефона, его возраста и т.д. Если на один из телефонов SMS приходят, то значит отправка SMS настроена корректно и нужно разбираться со вторым телефоном. Проверьте, что на этот телефон вообще приходят SMS, например отправьте на него SMS с другого телефона. Убедитесь, что при тестировании у Вас точно выполняются условия скрипта. Лучше всего при тестировании использовать простейший скрипт по клику на кнопку, без каких либо условий, например:
Код: (delphi)
begin
   SendSMS('79024194140','Авария частотника скважина 1');                             
end.
, установите данный скрипт на клик первой кнопки и аналогичный скрипт на клик второй кнопки, после чего производите тестирование. Проверьте, что Вы точно правильно указываете номер телефона. Возможно, после внесения изменений в проект/скрипты Вы не перезапустили проект, тогда причина в этом. При внесении изменений в проект его необходимо перезапустить на сервере скады.

Цитировать
Галочки: "ждать ответа" и "менять режимы" испробовал. Запись сообщений в кирилице и латинице испробовал.
Не нужно просто так менять настройки отправки - их изменение имеет смысл только в случае если отправка SMS не работает. Верните настройки по-умолчанию и протестируйте, если хотя бы на один телефон SMS приходит, то настройки корректные и нужно разбираться со вторым телефоном. Также, при изменении настроек нужно обязательно перезапустить сервер скады, чтобы изменения вступили в силу.

pan2000

  • Постоялец
  • ***
  • Сообщений: 171
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1325 : 03 Декабря 2021, 00:48:57 »
    Здравствуйте.
Хочу в отдельном скрипте в цикле выдергивать архивные значения в массив, далее по изменению интересующего элемента массива производить действия.
Функция ArchiveValueByTime() асинхронная, так просто в цикле она работать не будет. Для синхронизации с циклом можно предварительно переменной-результату присвоить незначимое значение (вне области возвращаемых значений), вызвать функцию и получить правильный результат по событию "Изменилась переменная-результат" с игнорированием незначимого значения.
Во вложении пример заполнения таблицы и массива архивными значениями за каждый день в течение года. Выбирается год (2019..2022) и часы-минуты первого вычисления, далее с периодом ровно один день. Правильно учитывается длина года. Функция, предположительно, не экстраполирует "в будущее", т.е. просто не возвращает значение и цикл не завершается (2021,2022). Для завершения можно использовать тайм-аут или ограничивать цикл по предварительно полученному из БД максимальному значению временной метки переменной.
Предварительно необходимо подключить свою базу данных.

asutpfoma

  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1326 : 07 Декабря 2021, 11:22:03 »
Приветствую. Есть ли возможность добавлять знаки табуляции в формируемую строку для дальнейшей записи ее в файл?

Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 166
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1327 : 07 Декабря 2021, 12:54:57 »
Здравствуйте.

Код: (delphi)
var
  aText: String;

begin
  aText := 'Часть строки' + #9 + 'Вторая часть строки';
  { прервать скрипт если файл по стандартному пути не существует }
  if not FileExists('MyTextFile.txt', '') then
    Exit;

  { открыть файл для записи }
  TextFileOpen('MyTextFile.txt', '', fomRewrite, fcpUTF8);

  { записать в файл строку "aText" }
  TextFileWriteLn(aText);

  { закрыть файл }
  TextFileClose;

end.

Где #9 - обозначение знака табуляции.

asutpfoma

  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1328 : 07 Декабря 2021, 13:25:58 »
Какая-то справка по подобным символам существует?)
« Изменён: 07 Декабря 2021, 13:26:26 от Simple_Scada »

Victor_P.

  • Пользователь
  • **
  • Сообщений: 69
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1329 : 07 Декабря 2021, 14:55:15 »
Какая-то справка по подобным символам существует?)
Да, таблица ASCII
« Изменён: 07 Декабря 2021, 14:58:19 от Victor_P. »

asutpfoma

  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1330 : 08 Декабря 2021, 12:41:33 »
Помогите с преобразованием типов, запутался.
В ячейке таблицы есть запись в формате 'чч:мм:сс'. Хочу дернуть это значение, преобразовать в секунды и дальше уже делать с этим значением разную математику.
Преобразование из Table1.Columns[0].Cells[0].Text в секунды это? Различные варианты StrTo* испробовал, все что-то не то.

Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 166
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1331 : 08 Декабря 2021, 20:02:19 »
Здравствуйте.

Например, можно использовать методы для работы с датой/временем, которые описаны здесь. Есть функции для извлечения часов/минут/секунд из значения TDateTime:
Код: (delphi)
var
  aTime: TDateTime;
begin
  aTime := StrToTime(Table1.Columns[0].Cells[0].Text);
  MyVar.Value :=  HourOf(aTime) * 3600 + MinuteOf(aTime) * 60 + SecondOf(aTime);
end.

Но если, как Вы писали ранее в этой теме значение в секундах изначально содержится в какой-то переменной, то используйте в расчетах эту переменную.
« Изменён: 08 Декабря 2021, 20:19:26 от Simple_Scada »

pan2000

  • Постоялец
  • ***
  • Сообщений: 171
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1332 : 08 Декабря 2021, 23:58:44 »
      Здравствуйте.

Преобразование из Table1.Columns[0].Cells[0].Text в секунды это? Различные варианты StrTo* испробовал, все что-то не то.
Можно так:
Код: (delphi)
 MyVar.Value := SecondsBetween(StrToTime(Table1.GetCell(0, 0).Text), 0));
Функция StrToTime возвращает, для корректного значения параметра, дробную часть Double числа. См. вложение.

asutpfoma

  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1333 : 15 Декабря 2021, 07:25:28 »
Фильтр скользящее среднее для булевых сигналов работает? Хочу фильтровать сигнал на случай пропадания связи не более 1 минуты.

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1178
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1334 : 15 Декабря 2021, 10:21:05 »
Здравствуйте.

Фильтры для переменной будут корректно работать только с аналоговыми значениями.