Объявление

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

Проверка наличия свободного места на USB-накопителе в ПЛК-50

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

  • Проверка наличия свободного места на USB-накопителе в ПЛК-50

    Вот в этой теме выяснили, как на лету определять наличие/отсутствие USB накопителя (или SD карты).
    Есть ли у Агавы какой-нибудь способ определения размера USB-флешки и свободного места на ней?
    Например, с помощью команды с терминала df -h для получения информации о свободном месте и размере накопителя.
    У Овена для доступа к терминалу Linux есть библиотека CmpSysExec. Есть ли что-то такое у Агавы?
  • Выбрано как ответ пользователем Selya 17-02-2025, 08:45 AM.

    Сообщение от Selya Посмотреть сообщение
    Выяснил, что есть такая библиотека SysProcess, в которой есть функции доступа к терминалу Linux: SysProcessExecuteCommand, SysProcessExecuteCommand2. Собственно мне нужна вторая, которая исполняет команду и возвращает полученный от терминала результат.
    Вот, что у меня получилось:
    Код:
    PROGRAM PLC_PRG
    VAR
    // проверка свободного места на флешке
    bTest : BOOL; // переключаю кнопкой
    testTrigger : Standard.R_TRIG;
    
    sCommand : STRING;
    refCommand : REFERENCE TO STRING;
    sOutput : STRING; // вывожу в текстовое поле
    refOutput : REFERENCE TO STRING;
    
    result : RTS_IEC_RESULT;
    END_VAR
    
    // проверка свободного места на флешке
    testTrigger(CLK:= bTest, Q=> );
    
    sCommand:= 'df -h /run/media/sda1'; //'echo "Hello world!"';
    
    refCommand REF= sCommand;
    refOutput REF= sOutput;
    
    IF testTrigger.Q THEN
    SysProcessExecuteCommand2(pszCommand:= refCommand, pszStdOut:= refOutput, udiStdOutLen:= SIZEOF(sOutput), pResult:= ADR(result));
    
    bTest:= FALSE;
    END_IF
    Работает, но как-то странно. "Hello world" выводится, а вот ответ на команду 'df -h /run/media/sda1' выводится не полностью.
    Должно быть (проверял в терминале)
    Код:
    Filesystem Size Used Available Use% Mounted on
    /dev/sda1 28.8G 6.0G 22.8G 21% /run/media/sda1
    а получается
    Код:
    Filesystem Size Used Available Use% Mounted on
    /dev/sda1
    Может кто подскажет, в чём может быть проблема?
    string по дефолту ограничен 81 символом если не ошибаюсь, попробуйте увеличить размер переменной string вот так refOutput : REFERENCE TO STRING(1024); Только нужно переменную скорее всего локально определить как
    refOutput : STRING(1024);

    Комментарий


    • #2
      Выяснил, что есть такая библиотека SysProcess, в которой есть функции доступа к терминалу Linux: SysProcessExecuteCommand, SysProcessExecuteCommand2. Собственно мне нужна вторая, которая исполняет команду и возвращает полученный от терминала результат.
      Вот, что у меня получилось:
      Код:
      PROGRAM PLC_PRG
      VAR
      // проверка свободного места на флешке
      bTest : BOOL; // переключаю кнопкой
      testTrigger : Standard.R_TRIG;
      
      sCommand : STRING;
      refCommand : REFERENCE TO STRING;
      sOutput : STRING; // вывожу в текстовое поле
      refOutput : REFERENCE TO STRING;
      
      result : RTS_IEC_RESULT;
      END_VAR
      
      // проверка свободного места на флешке
      testTrigger(CLK:= bTest, Q=> );
      
      sCommand:= 'df -h /run/media/sda1'; //'echo "Hello world!"';
      
      refCommand REF= sCommand;
      refOutput REF= sOutput;
      
      IF testTrigger.Q THEN
      SysProcessExecuteCommand2(pszCommand:= refCommand, pszStdOut:= refOutput, udiStdOutLen:= SIZEOF(sOutput), pResult:= ADR(result));
      
      bTest:= FALSE;
      END_IF
      Работает, но как-то странно. "Hello world" выводится, а вот ответ на команду 'df -h /run/media/sda1' выводится не полностью.
      Должно быть (проверял в терминале)
      Код:
      Filesystem Size Used Available Use% Mounted on
      /dev/sda1 28.8G 6.0G 22.8G 21% /run/media/sda1
      а получается
      Код:
      Filesystem Size Used Available Use% Mounted on
      /dev/sda1
      Может кто подскажет, в чём может быть проблема?

      Комментарий


      • #3
        Похоже что вывод буферизован. Надо как-то сбросить буфер. Обычно это делают либо закрытием файла/пайпа или вызовом аналога flush.

        Комментарий


        • #4
          Сообщение от Selya Посмотреть сообщение
          Выяснил, что есть такая библиотека SysProcess, в которой есть функции доступа к терминалу Linux: SysProcessExecuteCommand, SysProcessExecuteCommand2. Собственно мне нужна вторая, которая исполняет команду и возвращает полученный от терминала результат.
          Вот, что у меня получилось:
          Код:
          PROGRAM PLC_PRG
          VAR
          // проверка свободного места на флешке
          bTest : BOOL; // переключаю кнопкой
          testTrigger : Standard.R_TRIG;
          
          sCommand : STRING;
          refCommand : REFERENCE TO STRING;
          sOutput : STRING; // вывожу в текстовое поле
          refOutput : REFERENCE TO STRING;
          
          result : RTS_IEC_RESULT;
          END_VAR
          
          // проверка свободного места на флешке
          testTrigger(CLK:= bTest, Q=> );
          
          sCommand:= 'df -h /run/media/sda1'; //'echo "Hello world!"';
          
          refCommand REF= sCommand;
          refOutput REF= sOutput;
          
          IF testTrigger.Q THEN
          SysProcessExecuteCommand2(pszCommand:= refCommand, pszStdOut:= refOutput, udiStdOutLen:= SIZEOF(sOutput), pResult:= ADR(result));
          
          bTest:= FALSE;
          END_IF
          Работает, но как-то странно. "Hello world" выводится, а вот ответ на команду 'df -h /run/media/sda1' выводится не полностью.
          Должно быть (проверял в терминале)
          Код:
          Filesystem Size Used Available Use% Mounted on
          /dev/sda1 28.8G 6.0G 22.8G 21% /run/media/sda1
          а получается
          Код:
          Filesystem Size Used Available Use% Mounted on
          /dev/sda1
          Может кто подскажет, в чём может быть проблема?
          string по дефолту ограничен 81 символом если не ошибаюсь, попробуйте увеличить размер переменной string вот так refOutput : REFERENCE TO STRING(1024); Только нужно переменную скорее всего локально определить как
          refOutput : STRING(1024);

          Комментарий

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