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

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

Simple-Scada

Цитата: lipvasko от 14 августа 2019, 08:13:48И еще вопрос , может кому то покажется глупым , но подскажите правила расстановки  end  end;  и ;   и без ;  ...... компилятор пропускает много вариантов их расстановки и этим путает, в других языках , все как то наглядней
Символ ";" нужно ставить всегда в конце каждого блока кода. Примеры:
Код: pascal
// точка с запятой в конце блока if..then:
begin
  if (A = 0) then 
    A := 1;
end.

// точка с запятой в конце блока if..then..else:
begin
  if (A = 0) then 
    A := 1 
  else 
    A := 0;
end.

// точка с запятой в конце блока begin..end:
begin
  if (A = 0) then 
  begin
    myProcedure_1;
    myProcedure_2;
  end;
end.

// точка с запятой в конце блока begin..end..else:
begin
  if (A = 0) then 
  begin
    myProcedure_1;
    myProcedure_2;
  end else
    myProcedure_3;
end.

// точка с запятой и вложенные begin..end:
begin
  begin
    begin

    end else
      begin

      end;
  end;
end.

lipvasko

#901
Спасибо за ответы ,но  возник вопрос  есть запрос
Код: pascal
 procedure WriteValueToTable_1;
     var
    aQuery: string;
  begin
  aQuery := 'INSERT INTO `vesy_1` ' +
            '(`timestamp`, `silos_1`, `silos_2`, `silos_3`, `silos_4`, `ves`, `naklad`) VALUES ' +
            '(NOW(), ' +Vesy_1_silos_1.AsStr+ ', ' +Vesy_1_silos_2.AsStr+ ', '
             + Vesy_1_silos_3.AsStr+ ', ' + Vesy_1_silos_4.AsStr+ ', ' + Vesy_1_ves.AsStr+ ', ' +   vesy_1_naklad.AsStr+ ');';
 RunSQL(aQuery, nil, 0);
  end;
ну соответственно  есть и база созданная , в ней
Код: pascal
timestamp()
int
int
int
int
int
VARCHAR(20)
и все вроде в базу  грузится ,но  переменная  vesy_1_naklad. это строка , и  её содержание как правило  , что то вроде  99-356,  и вот я заметил ,что в базу грузится математическое выражение , в самом проекте все нормально и выводится , что надо, когда я сделал её кириллицей , загрузка прекратилась , т.е. SQL рассматривает ее так же интежером , где я ошибся в запросе на добавление и как сделать правильно

Victor_P.


lipvasko


Dmitry_Impuls

#904
Добрый день.
Вопрос по работе с переменными...
Есть таблица (хранится в БД) ID переменной, еёимя и  требуемое значение.
Списки переменных и значений представляют собой наборы для проверок маршрутов (размеры списков разные).
Для проверки  сейчас используется запрос
Код: pascal
SELECT o.`VarName`,r.`Value` FROM `route` r,  `scadaobjects` o 

После его выполнения в цикле
Код: pascal
      aVar:=GetVariableByName(DataSet.Fields[0].AsUTF8String);
      if (Assigned(aVar)) and (aVar.Value=StrToInt(DataSet.Fields[1].AsUTF8String))
      then  ... 
Но в таблице хранятся и ID переменной.

Вопрос - возможно ли обратиться к переменной по ID и не звать GetVariableByName?

Simple-Scada

Здравствуйте.
Добавим поиск переменной по ID в ближайшем обновлении.

Kar

Здравствуйте,
Есть возможность наладить обмен сообщениями со сторонним приложением? Лучше через simple-scada сервер.
Укажите пожалуйста дорогу где копать?

Neskad

Кажется, прямых документированных возможностей нет. Можно, например, через те-же OPC с виртуальными тегами, или через чтение-запись в общий файл, который можно и не на диске создать, а прямо в ОЗУ.

Simple-Scada

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

Обмениваться данными можно либо через общий OPC-сервер, либо через файлы, либо через БД. Например: приложение записало данные в БД, скада считала данные из БД. Или приложение изменило переменные на OPC-сервере, скада отобразила эти переменные. Аналогично от скады в приложение.

Миханик

#909
Добрый день.
Бьюсь с отправкой смс - если отправляю сообщение кирилицей, то всё нормально. Если отправляю на латинице, то приходит абракадабра (вложение). Что посоветуете?
Код: pascal
Level1 := 'L1=no data';
Level2 := 'L2=no data';
SendSMS(Field_PhoneNumber.AsStr, DateTimeToStr(Now) + ', s.Vozzhaevka, MK 492. Uroven mazuta: ' + Level1 + ', ' + Level2, false);

И второй вопрос: создаю внутренний тег типа String, включаю свойство "Автоматическое восстановление". В программе записываю в него номер телефона, и после перезапуска программы он не сохраняется, приходится заново его вбивать.

Simple-Scada

Здравствуйте.
Какой тип данных у переменных Level1, Level2?

ЦитироватьИ второй вопрос: создаю внутренний тег типа String, включаю свойство "Автоматическое восстановление". В программе записываю в него номер телефона, и после перезапуска программы он не сохраняется, приходится заново его вбивать.
Можете выслать проект для проверки на support@simple-scada.com с указанием проблемной переменной?

Миханик

По обоим вопросам написал на почту, так как проект общий.

Dmitry_Impuls

Добрый день.
Спасибо за оперативный ответ на предыдущий вопрос.

В документации сказано, что Ячейка (TM_TableCell) имеет свойство Variable и приведён пример
Код: pascal
  Table1.Columns[3].Cells[1].Variable.Value := 10;

В проекте есть 25 однотипных объектов с 64 свойствами.
Под объект приготовлено окно, делается привязка переменных при вызове окна OnShow
Код: pascal
var
  aNum : String;
  tblParam : TM_Table;
begin
  aNum:=IntToStr(Sender.Tag;);    // получили номер объекта
  tblParam := GetTableByName('tblParam'+aNum);
  if tblParam <> nil then
  begin
    tblParam.Tag:=IntToStr(Sender.Tag;); // передали его ниже
    tblParam.OnDataChangeEvent // обновили данные на объект
  end;
end;

Далее OnDataChangeEvent выводит актуальные данные (пример для времени шага)
Код: pascal
 tblParam := GetTableByName('tblParam'+aNum);
  if tblParam <> nil then
    with tblParam as TM_Table do
    begin
      Columns[2].Cells[1].Text:=SecondsToStr(GetVariableByName('StepRunTimeSet_T'+aNum+'_W').AsInt64);   
...
    end;

Оператору надо менять параметры техпроцесса. По OnCellClick попробовали менять переменную (тип в ОРС - на запись в контроллер)
Код: pascal
  begin
  with Cell do
    case Row of
       1:Variable.Value :=Text; // попытка присвоить отображаемое значение
       2:Variable.Value :=1800; // попытка писать число
...
    end;
  end;
Сервер выдаёт ошибку "Ошибка в скрипте Table_onClick в строке _номер_строки_с_присвоением_ Access violation at address 0389AA7. Read jf address 0CD1582."

Но варианты записи
Код: pascal
Table3.Columns[2].Cells[17].Variable:=GetVariableByName('StepMonTimeSet_T01_W');
StepMonTimeSet_T02_W.Value:=3600; 
проходят успешно.

Получить тег объекта, чтоб определить имя переменной StepMonTimeSet_T01_W,StepMonTimeSet_T02_W ... StepMonTimeSet_T25_W нет возможности у процедуры параметр типа TM_TableCell.

Как быть в такой ситуации?

Dmitry_Impuls

#913
:D
Цитата: Dmitry_Impuls от 30 августа 2019, 13:35:26Как быть в такой ситуации?
очень просто... надо быть внимательней. Выводится текст, а меняется переменная... которой нет
после
  Columns[2].Cells[1].Text:=SecondsToStr(GetVariableByName('StepRunTimeSet_T'+aNum+'_W').AsInt64);
надо привязку всё-таки сделать...
  Columns[2].Cells[1].Variable:=(GetVariableByName('StepRunTimeSet_T'+aNum+'_W');

Simple-Scada

Цитата: Миханик от 29 августа 2019, 12:18:24И второй вопрос: создаю внутренний тег типа String, включаю свойство "Автоматическое восстановление". В программе записываю в него номер телефона, и после перезапуска программы он не сохраняется, приходится заново его вбивать.
Переменная успешно восстанавливает своё значение, но сразу стирается скриптом "Button_ClearPhoneNumber_OnDataChange", ведь при запуске проекта переменные инициализируются и происходит выполнение OnDataChange скриптов. Используйте событие OnClick вместо OnDataChange чтобы скрипт выполнялся только по клику на объект.

Цитата: Миханик от 29 августа 2019, 12:18:24Бьюсь с отправкой смс - если отправляю сообщение кирилицей, то всё нормально. Если отправляю на латинице, то приходит абракадабра (вложение).
Сделали исправление при отправке на латинице,  обновление будет в ближайшее время.