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

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

VladislavVladimirovich

#1320
Коллеги, здравствуйте!
Возникла необходимость написать скрипт, создающий таблицу имя которой является переменной вводимой в поле.
Пробовал разные варианты вроде :

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

Simple Scada

Здравствуйте.
Код: pascal
aQuery := 'CREATE TABLE IF NOT EXISTS' + '`' + table_name.AsStr + '`' + ' (' +

asutpfoma

Вопрос про архивы.
Код: pascal
Pump1DayReport : ARRAY [1..366] OF TDateTime
; - объявлено в unit GlobalModule;
kns_12_worktime1day_1 - архивируемая переменная в редакторе.
Хочу в отдельном скрипте в цикле выдергивать архивные значения в массив, далее по изменению интересующего элемента массива производить действия.
Код: pascal
ArchiveValueByTime(kns_12_worktime1day_1, Pump1DayReport[i - 1], aDate);

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

engineer0800

#1323
Добрый вечер!
Появилась такая проблемма с отправкой СМС.
На телефон Андроид сообщения приходят, а на служебный кнопочный старый телефон НЕ приходят.
GSM модем Телеофис RX101-R4.
Галочки: "ждать ответа" и "менять режимы" испробовал.
Запись сообщений в кирилице и латинице испробовал.
Скрипт:
Код: pascal
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.
Буду рад подсказкам с вашей стороны.

Simple_Scada

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

ЦитироватьХочу в отдельном скрипте в цикле выдергивать архивные значения в массив, далее по изменению интересующего элемента массива производить действия. Как обыграть? Пока ошибка несоответствия типов.
Ошибка несоответствия типов возникает из-за того, что у Вас массив имеет тип TDateTime, а результат ArchiveValueByTime должен записываться в переменную(TM_Variable) - см. описание по ссылке. Через массив данную задачу решить не получится. В любом случае придется создать необходимое количество внутренних переменных для хранения результатов ArchiveValueByTime. Можно назвать их однотипно, тогда можно будет в цикле вызвать ArchiveValueByTime и записать результаты в нужные переменные используя функцию GetVariableByName, например:
Код: pascal
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 с другого телефона. Убедитесь, что при тестировании у Вас точно выполняются условия скрипта. Лучше всего при тестировании использовать простейший скрипт по клику на кнопку, без каких либо условий, например:
Код: pascal
begin
   SendSMS('79024194140','Авария частотника скважина 1');                              
end.
, установите данный скрипт на клик первой кнопки и аналогичный скрипт на клик второй кнопки, после чего производите тестирование. Проверьте, что Вы точно правильно указываете номер телефона. Возможно, после внесения изменений в проект/скрипты Вы не перезапустили проект, тогда причина в этом. При внесении изменений в проект его необходимо перезапустить на сервере скады.

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

pan2000

    Здравствуйте.
Цитата: asutpfoma от 02 декабря 2021, 12:40:52Хочу в отдельном скрипте в цикле выдергивать архивные значения в массив, далее по изменению интересующего элемента массива производить действия.
Функция ArchiveValueByTime() асинхронная, так просто в цикле она работать не будет. Для синхронизации с циклом можно предварительно переменной-результату присвоить незначимое значение (вне области возвращаемых значений), вызвать функцию и получить правильный результат по событию "Изменилась переменная-результат" с игнорированием незначимого значения.
Во вложении пример заполнения таблицы и массива архивными значениями за каждый день в течение года. Выбирается год (2019..2022) и часы-минуты первого вычисления, далее с периодом ровно один день. Правильно учитывается длина года. Функция, предположительно, не экстраполирует "в будущее", т.е. просто не возвращает значение и цикл не завершается (2021,2022). Для завершения можно использовать тайм-аут или ограничивать цикл по предварительно полученному из БД максимальному значению временной метки переменной.
Предварительно необходимо подключить свою базу данных.

asutpfoma

Приветствую. Есть ли возможность добавлять знаки табуляции в формируемую строку для дальнейшей записи ее в файл?

Simple Scada

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

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

#1328
Какая-то справка по подобным символам существует?)

Victor_P.

#1329
Цитата: asutpfoma от 07 декабря 2021, 13:25:58Какая-то справка по подобным символам существует?)
Да, таблица ASCII

asutpfoma

Помогите с преобразованием типов, запутался.
В ячейке таблицы есть запись в формате 'чч:мм:сс'. Хочу дернуть это значение, преобразовать в секунды и дальше уже делать с этим значением разную математику.
Преобразование из Table1.Columns[0].Cells[0].Text в секунды это? Различные варианты StrTo* испробовал, все что-то не то.

Simple Scada

#1331
Здравствуйте.

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

Но если, как Вы писали ранее в этой теме значение в секундах изначально содержится в какой-то переменной, то используйте в расчетах эту переменную.

pan2000

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

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

asutpfoma

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

Simple_Scada

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

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