26 апреля 2011 г.

TwinCAT: Запись данных в файл

На CX9010-1101 (Windows CE 6.0, ARM 533 МГц) возникла задача записи данных в файл, чтобы по результатам этой записи можно было не только просмотреть весь лог, но и построить график. Логичнее всего было бы организовать запись в XLS-файл, таким образом будет обеспечена гибкость последующей обработки данных, поскольку Excel позволяет провести необходимый анализ. Клиенту останется только с помощью карты flash-памяти перетащить сохранённый файл на ПК.


Для реализации теста потребуется любой CX с USB-разъёмом, TwinCAT PLC Control, бесплатные библиотеки TcUtilities.lib, TcBase.lib, TcSystem.lib и Standard.lib, flash-карта для переноса файла, ПК с установленным Excel либо другой программой, позволяющей работать с табличными данными, и 40 минут свободного времени. В рамках теста в файл будут писаться строки, состоящие из двух параметров: времени (в формате [с],[мс]) и изменяющейся в каждом программном цикле переменной.

PROGRAM MAIN
VAR
   file: INT;
   bRun: BOOL;
   fbFileOpen: FB_FileOpen;
   fbFormatString: FB_FormatString;
   fbFileWrite: FB_FilePuts;
   fbFileClose: FB_FileClose;
   fbTimer: TON;
   rTime: REAL;
   i: REAL;
   rCount: REAL;
END_VAR


Далее — пишем программу. Условно она будет разделяться на несколько основных этапов: открытие файла с получением его дескриптора, формирование строки данных, запись строки данных в файл, закрытие файла. Условимся, что файл у нас будет называться file.xls и сохраняться он будет в корневом каталоге hard disk. Очевидно, что можно организовать запись файла и во вложенной папке, предварительно созданной на ПЛК.

CASE file OF
   0: (*Ожидание пуска*)
      IF bRun THEN
         file := file + 1;
      END_IF;

   1: (*Отрытие файла и получение его дескриптора 'fbFileOpen.hFile'*)
      fbFileOpen(
         sNetId := ,
         sPathName := 'hard disk\file.xls',
         nMode := FOPEN_MODEWRITE OR FOPEN_MODETEXT,
         ePath := PATH_GENERIC,
         bExecute := TRUE,
         tTimeout := t#1s);

      IF NOT(fbFileOpen.bError) THEN
         IF fbFileOpen.hFile <> 0 AND NOT(fbFileOpen.bBusy) THEN
            fbFileOpen(bExecute := FALSE);
            file := file + 1;
         END_IF;
      END_IF;

   2: (*Подготовка данных для записи в файл*)
      fbTimer(in := TRUE, pt := t#10m);                (*Вызов таймера*)
      rTime := TIME_TO_REAL(fbTimer.ET)/1000;          (*Перевод времени в формат [с],[мс]*)
      i := i + 0.1;                                    (*Счётчик*)
      rCount := SIN(i)*50 + 50;                        (*Простейшая sin-функция*)
      file := file + 1;

   3: (*Формирование строки для записи в файл*)
      fbFormatString(
         sFormat := '%.2f$09%.2f$L',
         arg1 := F_REAL(rTime),
         arg2 := F_REAL(rCount));

      IF NOT(fbFormatString.bError) THEN
         IF fbFormatString.sOut <> '' THEN
            file := file + 1;
         END_IF;
      END_IF;

   4: (*Запись строки*)
      fbFileWrite(
         sNetId := '',
         hFile := fbFileOpen.hFile,
         sLine := fbFormatString.sOut,
         bExecute := TRUE,
         tTimeout := t#5s);
      file := file + 1;

   5: (*Проверка записи*)
      IF NOT(fbFileWrite.bError) THEN
         IF NOT(fbFileWrite.bBusy) THEN
            fbFileWrite(bExecute := FALSE);
            file := file + 1;
         ELSE
            fbFileWrite(bExecute := TRUE);
         END_IF;
      END_IF;

   6: (*Проверка останова записи*)
      IF bRun AND NOT(fbTimer.OUT) THEN
         file := 2;
      ELSE
         file := file + 1;
      END_IF;

   7: (*Закрытие файла*)
      fbFileClose(
         sNetId := '',
         hFile := fbFileOpen.hFile,
         bExecute := TRUE,
         tTimeout := t#1s);

      IF NOT(fbFileClose.bError) THEN
         IF NOT(fbFileClose.bBusy) THEN
            fbFileClose(bExecute := FALSE);
            file := 0;
         END_IF;
      END_IF;
END_CASE;


Полагаю, излишне будет напоминать, что аналогичным образом можно создавать и обрабатывать не только XLS- и TXT-файлы, а также файлы с другими расширениями. Если в конфигурации системы имеется панель управления, то оператору было бы удобно ещё и задавать имя сохраняемого файла. А если на ПЛК установлена полноценная ОС Windows с пакетом Microsoft Office (или, как вариант, Open.Office), то можно обрабатывать графики не отходя от системы управления.

Комментариев нет:

Отправить комментарий