Объявление

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

Обращение к флэш-карте.

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

  • Обращение к флэш-карте.

    Пытаюсь обращаться к флэш-карте и при её отсутствии выводить сообщение об отсутствии. При наличии копировать на неё файл и также выводить сообщение.
    Весь код у меня в функциональном блоке и я его вызываю при нажатии на кнопку на визуализации.

    Однако, ничего не выходит.

    Код выглядит так:
    Нажмите на изображение для увеличения. 

Название:	Безымянный_12.png 
Просмотров:	82 
Размер:	27.1 Кб 
ID:	499

    В руководстве сказано:

    Файловая система состоит из системной ФС и монтируемой ФС, которая доступна как на чтение, так и для записи, имеющая следующие точки монтирования:
    /run/media/mmcblk* для SD-карты;
    /run/media/sda* для USB-флеш;

    А что за звёздочки?
    Для usb-флеш какой каталог будет создаваться?

    И корректно ли к нему обращаться, как это сделал я?

  • #2
    Сообщение от Никита Посмотреть сообщение
    Пытаюсь обращаться к флэш-карте и при её отсутствии выводить сообщение об отсутствии. При наличии копировать на неё файл и также выводить сообщение.
    Весь код у меня в функциональном блоке и я его вызываю при нажатии на кнопку на визуализации.

    Однако, ничего не выходит.

    Код выглядит так:
    Нажмите на изображение для увеличения. 

Название:	Безымянный_12.png 
Просмотров:	82 
Размер:	27.1 Кб 
ID:	499

    В руководстве сказано:

    Файловая система состоит из системной ФС и монтируемой ФС, которая доступна как на чтение, так и для записи, имеющая следующие точки монтирования:
    /run/media/mmcblk* для SD-карты;
    /run/media/sda* для USB-флеш;

    А что за звёздочки?
    Для usb-флеш какой каталог будет создаваться?

    И корректно ли к нему обращаться, как это сделал я?

    · /run/media/mmcblk0p1 для встроенной eMMC;

    · /run/media/mmcblk1p1 для SD-карты( где p1 - первый раздел SD карты, p2 - второй раздел SD карты)

    · /run/media/sda1 для и USB-флеш;

    Комментарий


    • #3
      Сообщение от Пушкарев Андрей Посмотреть сообщение


      · /run/media/mmcblk0p1 для встроенной eMMC;

      · /run/media/mmcblk1p1 для SD-карты( где p1 - первый раздел SD карты, p2 - второй раздел SD карты)

      · /run/media/sda1 для и USB-флеш;



      Я пробовал и такой путь использовать, но всё равно запись не происходит.

      Я приложил код, который использую.

      Это корректно или нет?

      Комментарий


      • #4
        Сообщение от Никита Посмотреть сообщение




        Я пробовал и такой путь использовать, но всё равно запись не происходит.

        Я приложил код, который использую.

        Это корректно или нет?
        Использовать корректно, у Вас путь не верный до USB /run/media/sda/data.csv

        правильно так : /run/media/sda1/data.csv

        для целей копирования лучше использовать библиотеку CAA File, у ней функционал чуть больше, хотя можно и через SysFile реализовать.

        та же после процедуры копирования на USB рекомендую выполнить функцию sync, пример функции можно взять на форуме
        http://forum.kb-agava.ru/forum/contr...?кции-sync
        Последний раз редактировалось Пушкарев Андрей; 07-04-2020, 10:09 AM.

        Комментарий


        • #5
          Сообщение от Пушкарев Андрей Посмотреть сообщение
          Примечание: Карта памяти SD, которая установлена в комплекте с ПЛК, предназначена для восстановления системы ПЛК!

          Если есть необходимость использования SD карты в личных целях (Архивирование, использование трендов Codesys итд), то установленную в комплекте карту следует извлечь и установить другую карту памяти SD, после этого произвести ее форматирование в Ext4 средствами ПЛК.
          А почему именно нельзя использовать?
          Как это повлияет на работу?
          Будут ли утеряны файлы?

          Комментарий


          • #6
            Сообщение от Никита Посмотреть сообщение

            А почему именно нельзя использовать?
            Как это повлияет на работу?
            Будут ли утеряны файлы?
            на ней 2 раздела, второй раздел который Вы предположительно будете использовать имеет файловую систему FAT32, при выключении питания плк, такая система менее стабильная чем ext4, она переводится в режим чтения без записи, получится так , что больше не сможете ничего туда записать, пока восстановите файловую систему, поэтому рекомендуется использовать отдельную SD карту с одним разделом и файловой системой ext4

            Комментарий


            • #7
              Сообщение от Пушкарев Андрей Посмотреть сообщение

              Использовать корректно, у Вас путь не верный до USB /run/media/sda/data.csv

              правильно так : /run/media/sda1/data.csv
              Нажмите на изображение для увеличения. 

Название:	fyec gbljhf.png 
Просмотров:	63 
Размер:	27.1 Кб 
ID:	508
              Я заменил, теперь верно.

              Но не работает всё равно.

              Почему так?
              Что делать в данном случае?

              Сообщение от Пушкарев Андрей Посмотреть сообщение

              для целей копирования лучше использовать библиотеку CAA File, у ней функционал чуть больше, хотя можно и через SysFile реализовать.

              та же после процедуры копирования на USB рекомендую выполнить функцию sync, пример функции можно взять на форуме
              http://forum.kb-agava.ru/forum/contr...?кции-sync
              Почему лучше именно эту библиотеку?
              Какая разница в данном конкретном случае?

              Комментарий


              • #8
                Сообщение от Никита Посмотреть сообщение

                Нажмите на изображение для увеличения. 

Название:	fyec gbljhf.png 
Просмотров:	63 
Размер:	27.1 Кб 
ID:	508
                Я заменил, теперь верно.

                Но не работает всё равно.

                Почему так?
                Что делать в данном случае?



                Почему лучше именно эту библиотеку?
                Какая разница в данном конкретном случае?
                в САА FIle в функциональных блоках, есть переменные , отвечающие за статус копирования файла, по ним можно корректно определять состояние

                В Вашем случае , процесс копирования лучше построить через оператор CASE , далее по шагам выполнить процедуру копирования.

                Комментарий


                • #9
                  Я посмотрел библиотечный пример CAA File про копирование. Там как раз CASE используется.
                  Но совершенно не понимаю зачем он в моём случае.

                  Тем не менее я внёс изменения по вашим советам.
                  И действительно заработало.
                  Копирование на флешку происходит.

                  Код выглядит так:

                  Нажмите на изображение для увеличения. 

Название:	fyecfyceyf1111111111111111.png 
Просмотров:	61 
Размер:	36.6 Кб 
ID:	511

                  У меня GVL.arch_save и GVL.flash_NC - это переменные, на которых завязана невидимость двух элементов.

                  И при успешном копировании почему-то срабатывает всегда только GVL.flash_NC (в неё записывается true).

                  Почему так происходит?
                  Что я упускаю?

                  И к чему другому можно привязаться, чтобы наладить такую сигнализацию успешного или неуспешного копирования на флешку?

                  Комментарий


                  • #10
                    Сообщение от Никита Посмотреть сообщение
                    Я посмотрел библиотечный пример CAA File про копирование. Там как раз CASE используется.
                    Но совершенно не понимаю зачем он в моём случае.

                    Тем не менее я внёс изменения по вашим советам.
                    И действительно заработало.
                    Копирование на флешку происходит.

                    Код выглядит так:

                    Нажмите на изображение для увеличения.   Название:	fyecfyceyf1111111111111111.png  Просмотров:	0  Размер:	36.6 Кб  ID:	511

                    У меня GVL.arch_save и GVL.flash_NC - это переменные, на которых завязана невидимость двух элементов.

                    И при успешном копировании почему-то срабатывает всегда только GVL.flash_NC (в неё записывается true).

                    Почему так происходит?
                    Что я упускаю?

                    И к чему другому можно привязаться, чтобы наладить такую сигнализацию успешного или неуспешного копирования на флешку?
                    при использовании CASE происходят переходы между шагами и между ними как минимум 1 цикл, рабочей программы, поэтому это более рационально, отправили команду копирования завершили шаг - следующий шаг, итд, пока не получите статус успешного копирования файла, после получения статуса успешного копирования , можно вывести сообщение об успешном окончании копирования и уйти на шаг завершения функции копирования.

                    В Вашем случае нужно привести работу с использование CASE и все должно получиться



                    для пример можно сделать так:


                    if taskCopyToStorage then

                    startPrg(CLK:=taskCopyToStorage);

                    if startPrg.Q then iState:=1; end_if;

                    else
                    taskCopyToStorage := FALSE;
                    startPrg(CLK:=FALSE);
                    iState:=0;
                    end_if

                    case iState of
                    0: // ожидание
                    ;
                    1: // создание каталога на USB карте
                    strDir :=concat('mkdir ', WorkingStoragePath); // создаем папку
                    strDir :=concat(strDir,'Settings/'); // создаем папку
                    SysProcessExecuteCommand(pszComand := strDir, pResult := ADR(result));
                    iState:=2;


                    2: // копируемый файл
                    sourcePath := 'cp /usr/bin/codesys/PlcLogic/Retain.ret ';
                    copyPath := concat(WorkingStoragePath,'Settings/');
                    iState:= 3;



                    3: // выполняем операцию копирования

                    StrCopy := concat(sourcePath, copyPath);

                    SysProcessExecuteCommand(pszComand := StrCopy, pResult := ADR(result));

                    fileName := concat(WorkingStoragePath,'Settings/Retain.ret');;

                    // проверяем скопированный файл путем, его чтения на USB карте
                    hFile := SysFileOpen( fileName, SysFile.ACCESS_MODE.AM_READ, adr( result ) );

                    if hFile <> RTS_INVALID_HANDLE then

                    MessageInfo := "Файл настроек$Nуспешно сохранен!";
                    Dialogs.ShowDialog('MsgDialog',0,0);
                    iState := 4;

                    else

                    MessageInfo := "Ошибка копирования$Nфайл настроек не сохранен!";
                    Dialogs.ShowDialog('MsgDialog',0,0);
                    iState:= 4;
                    SysFileClose( hFile );

                    end_if


                    4:
                    taskCopyToStorage := False;
                    startPrg(CLK:= false);
                    iState:=0;
                    SysFileClose( hFile );

                    end_case;



                    Последний раз редактировалось Пушкарев Андрей; 08-04-2020, 10:40 AM.

                    Комментарий


                    • #11
                      Я вот так попробовал.
                      Но что-то всё равно не выходит.
                      Сейчас даже не копирует.

                      В чём проблема?
                      И почему, если в прошлый раз копировалось, но условия выполнения некорректно работали?

                      Код:
                      FUNCTION SAVE_TO_FLASH: RTS_IEC_RESULT
                      VAR CONSTANT
                          sFileNewName: STRING := '/run/media/sda1/data.csv';
                          sFileOldName: STRING := '/run/media/mmcblk1p1/data.csv';
                      END_VAR
                      VAR
                          FileStatus: uint := 0;
                          Sync: RTS_IEC_RESULT;
                          fileopn: FILE.Open;
                          filecp: FILE.Copy;
                          filecls: FILE.Close;
                          filerd: FILE.Read;
                          hFile: FILE.CAA.HANDLE;
                          sSizeString: STRING := '';
                      END_VAR
                      
                      _____________________________________
                      
                      
                      FileStatus := 0;
                      
                      CASE FileStatus OF
                          0:
                              filecp( 
                              sFileNameSource := sFileOldName, 
                              sFileNameDest := sFileNewName,
                              udiTimeOut := 3000000,
                              xOverWrite := TRUE);
                              FileStatus := 1;
                          1:
                              filecp.xExecute := TRUE;
                              IF filecp.xDone THEN
                                  FileStatus := 2;
                              END_IF
                              IF filecp.xError THEN
                                  GVL.copy_err := TRUE;
                                  GVL.flash_NC := FALSE;
                                  GVL.arch_save := FALSE;
                              END_IF
                          2:    fileopn(
                                  sFileName := sFileNewName, 
                                  eFileMode := File.MODE.MREAD);
                              fileopn.xExecute := TRUE;
                              hFile := fileopn.hFile;
                          3:    filerd(
                                  hFile := hFile,
                                  udiTimeOut := 3000000,
                                  pBuffer := ADR(sSizeString),
                                  szBuffer := 255);
                      
                              filerd.xExecute := TRUE;
                      
                              IF filerd.xDone THEN
                                  GVL.copy_err := FALSE;
                                  GVL.flash_NC := FALSE;
                                  GVL.arch_save := TRUE;
                                  FileStatus := 4;
                              ELSE
                                  GVL.copy_err := FALSE;
                                  GVL.flash_NC := TRUE;
                                  GVL.arch_save := FALSE;
                                  FileStatus := 4;
                              END_IF
                              IF filerd.xError THEN
                                  GVL.copy_err := TRUE;
                                  GVL.flash_NC := FALSE;
                                  GVL.arch_save := FALSE;
                                  FileStatus := 4;
                              END_IF
                          4:
                              FileStatus := 0;
                              filecls.hFile := hFile;
                              filecls.xExecute := TRUE;
                      END_CASE
                      
                      SysProcessExecuteCommand( '/bin/sync', ADR( Sync ) );
                      Причём у меня всё в виде функции.
                      В условии по нажатию на кнопку на экране.

                      Может с функциями есть нюансы.
                      Почитал Петрова и в Справке.
                      Что я упускаю?
                      Подскажите, пожалуйста.

                      Комментарий


                      • #12
                        Сообщение от Пушкарев Андрей Посмотреть сообщение

                        при использовании CASE происходят переходы между шагами и между ними как минимум 1 цикл, рабочей программы, поэтому это более рационально, отправили команду копирования завершили шаг - следующий шаг, итд, пока не получите статус успешного копирования файла, после получения статуса успешного копирования , можно вывести сообщение об успешном окончании копирования и уйти на шаг завершения функции копирования.

                        В Вашем случае нужно привести работу с использование CASE и все должно получиться



                        для пример можно сделать так:


                        if taskCopyToStorage then

                        startPrg(CLK:=taskCopyToStorage);

                        if startPrg.Q then iState:=1; end_if;

                        else
                        taskCopyToStorage := FALSE;
                        startPrg(CLK:=FALSE);
                        iState:=0;
                        end_if

                        case iState of
                        0: // ожидание
                        ;
                        1: // создание каталога на USB карте
                        strDir :=concat('mkdir ', WorkingStoragePath); // создаем папку
                        strDir :=concat(strDir,'Settings/'); // создаем папку
                        SysProcessExecuteCommand(pszComand := strDir, pResult := ADR(result));
                        iState:=2;


                        2: // копируемый файл
                        sourcePath := 'cp /usr/bin/codesys/PlcLogic/Retain.ret ';
                        copyPath := concat(WorkingStoragePath,'Settings/');
                        iState:= 3;



                        3: // выполняем операцию копирования

                        StrCopy := concat(sourcePath, copyPath);

                        SysProcessExecuteCommand(pszComand := StrCopy, pResult := ADR(result));

                        fileName := concat(WorkingStoragePath,'Settings/Retain.ret');;

                        // проверяем скопированный файл путем, его чтения на USB карте
                        hFile := SysFileOpen( fileName, SysFile.ACCESS_MODE.AM_READ, adr( result ) );

                        if hFile <> RTS_INVALID_HANDLE then

                        MessageInfo := "Файл настроек$Nуспешно сохранен!";
                        Dialogs.ShowDialog('MsgDialog',0,0);
                        iState := 4;

                        else

                        MessageInfo := "Ошибка копирования$Nфайл настроек не сохранен!";
                        Dialogs.ShowDialog('MsgDialog',0,0);
                        iState:= 4;
                        SysFileClose( hFile );

                        end_if


                        4:
                        taskCopyToStorage := False;
                        startPrg(CLK:= false);
                        iState:=0;
                        SysFileClose( hFile );

                        end_case;


                        А почему у вас пример использует SysFile библиотеку?

                        Вы же советовали CAA File пользоваться.

                        Комментарий


                        • #13
                          Сообщение от Никита Посмотреть сообщение

                          А почему у вас пример использует SysFile библиотеку?

                          Вы же советовали CAA File пользоваться.
                          Пример, дан для наглядности, тип библиотеки значения не имеет, с CAA FIle, принцип будет тот же.

                          Комментарий


                          • #14
                            Сообщение от Никита Посмотреть сообщение
                            Я вот так попробовал.
                            Но что-то всё равно не выходит.
                            Сейчас даже не копирует.

                            В чём проблема?
                            И почему, если в прошлый раз копировалось, но условия выполнения некорректно работали?

                            Код:
                            FUNCTION SAVE_TO_FLASH: RTS_IEC_RESULT
                            VAR CONSTANT
                            sFileNewName: STRING := '/run/media/sda1/data.csv';
                            sFileOldName: STRING := '/run/media/mmcblk1p1/data.csv';
                            END_VAR
                            VAR
                            FileStatus: uint := 0;
                            Sync: RTS_IEC_RESULT;
                            fileopn: FILE.Open;
                            filecp: FILE.Copy;
                            filecls: FILE.Close;
                            filerd: FILE.Read;
                            hFile: FILE.CAA.HANDLE;
                            sSizeString: STRING := '';
                            END_VAR
                            
                            _____________________________________
                            
                            
                            FileStatus := 0;
                            
                            CASE FileStatus OF
                            0:
                            filecp(
                            sFileNameSource := sFileOldName,
                            sFileNameDest := sFileNewName,
                            udiTimeOut := 3000000,
                            xOverWrite := TRUE);
                            FileStatus := 1;
                            1:
                            filecp.xExecute := TRUE;
                            IF filecp.xDone THEN
                            FileStatus := 2;
                            END_IF
                            IF filecp.xError THEN
                            GVL.copy_err := TRUE;
                            GVL.flash_NC := FALSE;
                            GVL.arch_save := FALSE;
                            END_IF
                            2: fileopn(
                            sFileName := sFileNewName,
                            eFileMode := File.MODE.MREAD);
                            fileopn.xExecute := TRUE;
                            hFile := fileopn.hFile;
                            3: filerd(
                            hFile := hFile,
                            udiTimeOut := 3000000,
                            pBuffer := ADR(sSizeString),
                            szBuffer := 255);
                            
                            filerd.xExecute := TRUE;
                            
                            IF filerd.xDone THEN
                            GVL.copy_err := FALSE;
                            GVL.flash_NC := FALSE;
                            GVL.arch_save := TRUE;
                            FileStatus := 4;
                            ELSE
                            GVL.copy_err := FALSE;
                            GVL.flash_NC := TRUE;
                            GVL.arch_save := FALSE;
                            FileStatus := 4;
                            END_IF
                            IF filerd.xError THEN
                            GVL.copy_err := TRUE;
                            GVL.flash_NC := FALSE;
                            GVL.arch_save := FALSE;
                            FileStatus := 4;
                            END_IF
                            4:
                            FileStatus := 0;
                            filecls.hFile := hFile;
                            filecls.xExecute := TRUE;
                            END_CASE
                            
                            SysProcessExecuteCommand( '/bin/sync', ADR( Sync ) );
                            Причём у меня всё в виде функции.
                            В условии по нажатию на кнопку на экране.

                            Может с функциями есть нюансы.
                            Почитал Петрова и в Справке.
                            Что я упускаю?
                            Подскажите, пожалуйста.

                            Вот простая реализация с помощью CAA File и она должна работать


                            if taskSaveTrendsToUSB then

                            startPrg(CLK:=taskSaveTrendsToUSB);

                            if startPrg.Q then iState:=1; end_if;

                            else
                            taskSaveTrendsToUSB := FALSE;
                            startPrg(CLK:=FALSE);
                            iState:=0;
                            end_if

                            case iState of
                            0: // ожидание
                            ;

                            1:

                            sFileName := '/run/media/sda1/Application.tempCirc1.sqlite';
                            sFileNameCopy := '/run/media/mmcblk1p1/trends/Application.tempCirc1.sqlite';

                            fbFileCopy( xExecute := true , sFileNameDest := sFileName, sFileNameSource := sFileNameCopy, xOverWrite := true );


                            if fbFileCopy.xDone then

                            iState := 2;

                            fbFileCopy(xExecute := false);

                            elsif fbFileCopy.xError then

                            iState := 3;

                            end_if


                            2:

                            MessageInfo := "Архивы$Nуспешно загружены$Nна USB носитель";
                            Dialogs.ShowDialog('MsgSussSaveTrend',0,0);
                            umount();
                            iState:= 4;



                            3: MessageInfo := "Ошибка копирования$NАрхивы не сохранены!";
                            Dialogs.ShowDialog('MsgDialog',0,0);
                            iState:= 4;


                            4:
                            taskSaveTrendsToUSB := False;
                            startPrg(CLK:= false);
                            iState:=0;
                            fbFileCopy(xExecute := false);


                            end_case;

                            Комментарий


                            • #15
                              Я адаптировал Ваш пример под свою ситуацию, но возникли вопросы.

                              Правильно ли я объявил эти переменные?:


                              Код:
                              taskSaveTrendsToUSB: bool;
                              MessageInfo: WSTRING;

                              И уже - в свою очередь - совсем непонятно, как объявить эти.
                              И вообще как их использовать.


                              Код:
                              Dialogs.ShowDialog
                              umount(); 
                              startPrg 
                              (CLK:=taskSaveTrendsToUSB)  [COLOR=#FFA500]// CLK - это, видимо, вход startPrg?[/COLOR]
                              Ваш пример подразумевается использовать, как program?

                              Комментарий

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