Объявление

Свернуть
Пока нет объявлений.

Логирование в файл

Свернуть
X
 
  • Фильтр
  • Время
  • Показать
Очистить всё
новые сообщения

  • Логирование в файл

    Добрый день!

    Подскажите как организовать логирование в файл.
    В библиотеке AgavaType есть FB TLogger, есть пример вывода в порт,
    а вот как выводить в файл не понятно. Особенно интересно было бы хранить лог на SD карте ПЛК-30.

  • #2
    Добрый день, логирование в файл ни чем не отличается от логирования в порт. При логорировании в порт, Вы открываете нужный порт, и ведете лог, при логировании в файл, нужно открыть файл и производить запись.

    var_global

    result: RTS_IEC_RESULT;
    Logger: TLogger; // Журнал сообщений.

    end_var


    // Вывод в файл.
    Logger.Attach( EnLoggerAdapter.laFile, SysFileOpen( '/run/media/mmcblk0p1/log.txt', ACCESS_MODE.AM_WRITE, adr( result ) ) );


    Далее создаем метод для логирования:

    method public SaveLogActions
    var_input
    ActionName : string;
    end_var
    var
    dwCopySize :dword;
    end_var


    Logger.logwarn( ActionName, _a0()); // Вызов функции логирования.



    Далее в теле цикла программы, для логирования нужно по команде вызывать данный метод.

    SaveLogActions('Пример записи лога в текстовый файл!' );



    Комментарий


    • #3
      Среда пишет "Не удалось получить доступ к внутреннему объекту SysFileOpen библиотеки 3SLicense ",
      не получается воспользоваться этой функцией, в чем может быть причина?

      Комментарий


      • #4
        Сообщение от Evgeny Martynov Посмотреть сообщение
        Среда пишет "Не удалось получить доступ к внутреннему объекту SysFileOpen библиотеки 3SLicense ",
        не получается воспользоваться этой функцией, в чем может быть причина?
        Библиотека SysFile от 3S установлена? какая версия компилятора в проекте? должна быть 3.5.10.

        Комментарий


        • #5
          SysFile не было, разобрался, спасибо

          Комментарий


          • #6
            А еще, такой вопрос:
            Писать, то пишется, только при запуске каждый раз затирается старый файл, почему так происходит, и как это обойти?

            Комментарий


            • #7
              Сообщение от Evgeny Martynov Посмотреть сообщение
              А еще, такой вопрос:
              Писать, то пишется, только при запуске каждый раз затирается старый файл, почему так происходит, и как это обойти?
              Ну объяснение этому простое, при старте плк происходит открытие всегда одного и того же файла, соответственно старый затирается значением нового.
              Простой вариант выхода из этой ситуации, при старте плк, произвести копирование, текстового файла с названием даты файла в другой каталог например LogDebug_22_05_2019.txt

              для этого нужно доработать метод логирования:

              method public SaveLogActions
              var_input
              ActionName : string;
              end_var
              var
              dwCopySize :dword;
              end_var


              Logger.logwarn( ActionName, _a0()); // Вызов функции логирования.


              // Копирование файла лога при старте плк в другой каталог, тем самым сохраняя старый лог в другом файле.

              sysFileCopy('/run/media/mmcblk0p1/Log.txt', '/run/media/mmcblk0p1/SaveLog/Log.txt', adr(dwCopySize));

              Более сложный вариант это при открытии файла, определять его на заполненность, и писать лог в конец файла, тем самым он не будет затираться.
              Последний раз редактировалось Пушкарев Андрей; 22-05-2019, 06:28 AM.

              Комментарий


              • #8
                Может быть просто изменить метод доступа? Скажем с ACCESS_MODE.AM_WRITE на ACCESS_MODE.AM_APPEND. Существуют также и другие способы логирования:

                cmd := 'echo `date "+%Y-%m-%d %H:%M:%S"` restart codesys, n=';
                cmd := concat( cmd, int_to_string(n) );
                cmd := concat( cmd, ', savecnt=' );
                cmd := concat( cmd, dint_to_string( RetainControl.AttemptSaveCounter ) );
                cmd := concat( cmd, ' >> /var/opt/codesys/log.txt' );

                SysProcessExecuteCommand( cmd, adr( result ) );

                Комментарий

                Обработка...
                X