Документация по SCADA системе Simp Light


Содержание:


Выгрузка

Система программирования (скрипты) системы СИМП Лайт позволяет произвести выгрузку информации из БД в файлы и сторонние базы данных SQL.

Выгрузка в текстовый файл
Выгрузка в excel-файл
Выгрузка в базу данных SQL

  Выгрузка в текстовый файл

Скрипт выгрузки в текстовый файл информации одного канала за прошедшие сутки.

{Pascal Script}
Var
  res, f: Integer = 0;
  beginData, endData: TDate;
  dtDate: TDateTime;
  dValue: Double;
  nameChannel, nameFile, s: String  = '';               
  stream: TMemoryStream;                                                 
                                         
Begin                 
  nameChannel := 'Температура 1';               
  beginData := now()-1;                  
  endData := now();
  nameFile:= 'C:\' + dateToStr(beginData) + '_' + dateToStr(endData) + '.txt';
 
  if FileExists(nameFile) then   
    begin
       AddToDebugLog('Файл с именем ' + nameFile + ' уже существует. Скрипт остановлен');
       exit;
    end;  

  stream := TMemoryStream.Create;
  try
  res := StreamReadFromDatabase(beginData, endData, nameChannel, stream);
  if res = 0 then
  begin
     while GetValueFromStream(stream, dtDate, dValue) do           
     begin                                                             
         s := s + dateTimeToStr(dtDate) + ' = ' + FormatFloat('#0.#0', dValue) + #10;
         f := f + 1;
         if f mod 500 = 0 then   //записываем порциями по 500 записей        
           begin    
              SaveToTxtFile(nameFile, s);       
              s := '';
           end;
     end;                   
     AddToDebugLog('Обработка ' + IntToStr(f) + ' записей завершена.');
  end                      
  else                                                                 
     AddToDebugLog('Ошибка считывания: ' + IntToStr(res));
  finally                     
    stream.Free;
  end;    
  SaveToTxtFile(nameFile, s);   // записываем остаток записей                
end.


 Выгрузка в excel-файл

Скрипт выгрузки в exel-файл информации двух каналов за прошедшие сутки.

{Pascal Script}
Var
  res, per, f: Integer = 0;
  beginData, endData: TDate;                    
  dtDate: TDateTime;
  dValue: Double;
  name1, name2, nameFile, s: String  = '';
  stream: TMemoryStream;                                                 
                    
Begin                                                      
  name1 := 'Температура 1';
  name2 := 'Температура 2';
  beginData := now()-1;                                                                  
  endData := now();
  nameFile := 'c:\' + dateToStr(beginData) + '_' + dateToStr(endData) + '.xls';
      
  if FileExists(nameFile) then   
    begin
       AddToDebugLog('Файл с именем ' + nameFile + ' уже существует. Скрипт остановлен');
       exit;
    end;  
 
  per := Excel.CreateTemplate;
 
  if per > 0 then
    begin  
       AddToDebugLog('Ошибка создания excel-файла. Код ошибки = ' + IntToStr(per));
       Excel.Close;
       exit;               
    end;                              

  Excel.Save(nameFile);
  Excel.Close;
  per := Excel.OpenTemplate(nameFile);
                         
  if per > 0 then
    begin  
       AddToDebugLog('Ошибка открытия excel-файла. Код ошибки = ' + IntToStr(per));
       Excel.Close;
       exit;
    end;    
 
  AddToDebugLog('Начали работать с excel-файлом.');
  Excel.Cell['B1'] := 'Дата/Время';
  Excel.Cell['C1'] := name1;
  stream := TMemoryStream.Create;  
  try
    res := StreamReadFromDatabase(beginData, endData, name1, stream);
    if res = 0 then                                              
       begin
          while GetValueFromStream(stream, dtDate, dValue) do           
          begin                                  
            Excel.Cell['B'+ intToStr(f + 2)] := dateTimeToStr(dtDate);
            Excel.Cell['C'+ intToStr(f + 2)] := dValue;
            f := f + 1;               
          end;                   
          AddToDebugLog('Обработка ' + IntToStr(f) + ' записей завершена.');
       end                      
    else                                                                 
       AddToDebugLog('Ошибка считывания канала "' + name1 + '" =' + IntToStr(res));
  finally                     
    stream.Free;             
  end;    
  Excel.Save(nameFile);
 
  f := 0;    
  Excel.Cell['D1'] := 'Дата/Время';
  Excel.Cell['E1'] := name2;
  stream := TMemoryStream.Create;
  try                                                                                                
    res := StreamReadFromDatabase(beginData, endData, name2, stream);
    if res = 0 then   
       begin                                                       
          while GetValueFromStream(stream, dtDate, dValue) do           
          begin                                  
            Excel.Cell['D'+ intToStr(f + 2)] := dateTimeToStr(dtDate);
            Excel.Cell['E'+ intToStr(f + 2)] := dValue;
            f := f + 1;               
          end;                   
          AddToDebugLog('Обработка ' + IntToStr(f) + ' записей завершена.');
       end                            
    else                                                                 
       AddToDebugLog('Ошибка считывания канала "' + name2 + '" =' + IntToStr(res));    
  finally                     
    stream.Free;             
  end;    
  Excel.Save(nameFile);
 
  Excel.Close;
end.        


 Выгрузка в базу данных SQL

Скрипт выгрузки информации из БД СИМП Лайт в БД MySQL посредством использования механизма ODBC, выгружается информация одного канала с временной отметкой.

Если на компьютере установлен сервер MySQL и установлен Mysql Connector ODBC, то возможно взаимодействовать с MySQL из системы СИМП Лайт. Рассмотрим несколько простых шагов, которые приведут к гарантированному результату. Первым делом создадим учебную базу данных в MySQL, и будет работать в скрипте с этой базой данных.

В консольном клиенте MySQL получим список имеющихся баз данных, используем для этого команду show databases. Создадим базу данных с именем testDB. И убедимся, с помощью всё той же команды show databases, что наша база данных появилась в списке баз данных MySQL.

Следующим шагом будет настройка механизма ODBC для доступа к нашей учебной базе данных (testDB). Для открытия окна "Администратор источника данных ODBC (32-разрядная версия)" следует в окне поиска Windows набрать "ODBC" и операционная система поможет отыскать вышеназванное приложение. Создадим свой источник данных в панели "Пользовательский DSN". Для этого необходимо нажать кнопку "Добавить", и в открывшемся диалоговом окне введем имя источника данных, пусть это будет - "databases_MySQL". Заполняем поля как представлено на картинке.

После того, как в поле "Database" выбрали базу данных "testDB", следует нажать кнопку "Test" и получить окно "Test Result" с сообщением "Connection successful". Это свидетельствует о том, что путь доступа к нашей учебной базе "" настроен, и можно переходить к следующему этапу. Это обязательное условие! Не стоит двигаться дальше, пока не будет получено сообщение "Connection successful".

После закрытия диалогового окна по созданию (настройке) источника данных получаем имя нашего источника в списке источников данных механизма ODBC.

Возвращаемся в консольный клиент MySQL. Выбираем учебную базу данных (testDB) и создаем в ней таблицу test, с тремя полями:  автоинкрементный ключ (id), отметку даты/времени (data_time) и вещественное поле для значения (val).

Теперь можно приступать к созданию скрипта по работе с MySQL. В модуле "Редактор каналов" создаем виртуальный канал и создаем скрип с нижеследующим содержанием.

// в примере используется таблица - test :
//  id (int) - автоинкремент, первичный ключ; data_time (TIMESTAMP), val (float)       
                         
// В консольном клиенте MySQL создаем базу данных и таблицу:
//   create database testDB;    
//   use testDB    
//   create table test (id integer auto_increment primary key, data_time TIMESTAMP, val float);
                 
var
  res, f: Integer = 0;                      
  beginData, endData: TDate;
  dtDate: TDateTime;
  dValue: Double;
  nameChannel, s, s_dValue, s_dtDate: String  = '';               
  stream: TMemoryStream;
 
  ADOConnection: TADOConnection;
  ADOQuery: TADOQuery;
  ConnectionString: string;
 
                              
procedure OnStartScript;
begin
  CoInitialize(nil);
  ADOConnection := TADOConnection.Create(nil);
  ADOQuery := TADOQuery.Create(nil);
end;

procedure OnStopScript;
begin                         
  CoUninitialize;                                     
  ADOConnection.free;
  ADOQuery.free;            
end;
                
begin    
  nameChannel := 'Температура 1';               
  beginData := now() - 1/24;         // берем данные из БД за последний час         
  endData := now();  
  stream := TMemoryStream.Create;
 
  try                         
    ADOConnection.Connected := false;
    ADOConnection.ConnectionString := 'databases_MySQL'; // таблица "test" базы данных SQL "testDB"      
    ADOQuery.Connection := ADOConnection;

    
    res := StreamReadFromDatabase(beginData, endData, nameChannel, stream);
    if res = 0 then                                              
       begin
          while GetValueFromStream(stream, dtDate, dValue) do           
          begin
            s := floatToStr(dValue);
            s_dValue := copy(s, 1, pos(',', s)-1) + '.' + copy(s, pos(',', s)+1, 2); // меняем "," на "."
            s_dtDate := FormatDateTime('yyyy-mm-dd hh:nn:ss', dtDate);        // меняем формат даты
            s := Format('insert into test(data_time, val) values (''%s'', %s)', [s_dtDate, s_dValue]);
                                                        
            ADOQuery.SQL.Clear;                                         
            ADOQuery.SQL.Text := s;
            ADOQuery.ExecSQL;                                                    
                                
            f := f + 1;                                                                   
          end;                                                                                        
          AddToDebugLog('Обработка ' + IntToStr(f) + ' записей завершена.');
       end                      
    else                                                                 
       AddToDebugLog('Ошибка считывания канала "' + nameChannel + '" =' + IntToStr(res));
       
    AddToDebugLog('Экспорт строк в таблицу test завершилось удачно!');  

  Except                                    
    AddToDebugLog('Увы, что-то пошло не так');
  end;   
  stream.Free;
end. 

Поскольку работа с извлечением информации из БД системы СИМП Лайт и передача этих данных в БД MySQL требует времени, то скрип следует запускать не чаще чем раз в минуту (значение поля "Интервал выполнения" = 60000) если скрипт выполнятся циклично по таймеру, а лучше всего скрипу выбрать тип запуска "Выполнять по событию записи в канал".
Самостоятельно создайте необходимые мнемосхемы, если это необходимо. Вышеуказанный скрип запускался на базе демо-проекта системы СИМП Лайт и берет информацию канала "Температура 1" за прошедший час. Сохраняем проект системы СИМП Лайт и запускаем модуль "Монитор". Если всё сделано правильно, то в окне отладки получим нижеследующую информацию.

Возвращаемся в консольный клиент MySQL. Командой select просматриваем информацию таблицы test учебной базы testDB.