Объявление

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

Механизм работы с Retain-переменными в ПЛК-40

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

  • #16
    Я имею в виду, что при каждом включении происходит принудительная запись, а память имеет ограниченное число циклов перезаписи.
    В Ваш код добавил строку
    Код:
    (* ==== Вызов блока для работы с retain переменными ==== *)
         RetainFB(destination := EnStorageDevice.DevSysFS);
    
         CountR := RetainFB.AttemptSaveCounter;
    После включения счетчик показывает 1.

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

Название:	Retain6.jpg 
Просмотров:	4 
Размер:	7.8 Кб 
ID:	215

    Комментарий


    • #17
      Сообщение от Юрий Посмотреть сообщение
      Я имею в виду, что при каждом включении происходит принудительная запись, а память имеет ограниченное число циклов перезаписи.
      В Ваш код добавил строку
      Код:
      (* ==== Вызов блока для работы с retain переменными ==== *)
      RetainFB(destination := EnStorageDevice.DevSysFS);
      
      CountR := RetainFB.AttemptSaveCounter;
      После включения счетчик показывает 1.

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

Название:	Retain6.jpg 
Просмотров:	4 
Размер:	7.8 Кб 
ID:	215
      Все верно, а Вы когда будете переменные изменять у Вас запись происходить не будет?
      или у вас ПЛК будет выключаться и включаться с периодичностью в 1с?

      тип памяти установленной в ПЛК - 40 eMMC которая имеет не малый ресурс, при условии что писать Вы туда будет не чаще 1 минуты.

      Если переживаете за внутреннюю eMMС, то тогда пишите retain на SD карту.
      RetainFB(destination := EnStorageDevice.DevSD)

      Комментарий


      • #18
        Сообщение от Юрий Посмотреть сообщение

        Спасибо за рекомендации.
        В таком случае при каждом включении ПЛК будет происходить перезапись переменных, что не очень хорошо.
        При хранении retain на внутренней eMMC количество циклов записи весьма значительное (зависит от размера свободного пространства) и составляет более 10 000 циклов. При хранении переменных на SD-карте количество циклов перезаписи опеределяется качеством и объемом SD-карты. Так же в ПЛК-40 имеется возможность хранения retain в области FRAM, ресурс которой практически не ограничен (миллион и более циклов).

        Комментарий


        • #19
          Все верно, а Вы когда будете переменные изменять у Вас запись происходить не будет?
          Переменные изменяются редко, чаще всего при наладке оборудования.

          Так же в ПЛК-40 имеется возможность хранения retain в области FRAM, ресурс которой практически не ограничен (миллион и более циклов).
          Про эту возможность нельзя ли поподробней.
          Последний раз редактировалось Юрий; 29-03-2019, 08:22 AM.

          Комментарий


          • #20
            FRAM доступен по адресу /sys/bus/i2c/devices/0-0050/fram. Размер FRAM - 8 кб.

            Комментарий


            • #21
              FRAM доступен по адресу /sys/bus/i2c/devices/0-0050/fram. Размер FRAM - 8 кб.
              Все равно непонятно.

              И все же напрашивается некоторая доработка блока TRetainStorage, чтобы он сам записывал переменные после загрузки программы.
              Всем спасибо. Будем считать, что вопрос закрыт.

              Комментарий


              • #22
                (* ==== При первом старте плк, инициализируем файл Retain значениями из области определения var global retain ==== *)

                if bFirstCycle then

                RetainFb(destination := EnStorageDevice.DevSysFS, ForceSave := true); // ForceSave - принудительная запись.

                bFirstCycle := false;

                end_if

                (* ==== Вызов блока для работы с retain переменными ==== *)

                RetainFB(destination := EnStorageDevice.DevSysFS);

                Проблема с ненужной перезаписью переменных решилась очень просто. Определение ключа принудительной записи необходимо поместить в область Retain-переменных.

                Код:
                VAR RETAIN
                     bFirstCycle : BOOL := true;
                END_VAR
                В операторе IF строки поменять местами.

                Код:
                if bFirstCycle then
                
                bFirstCycle := false;
                
                RetainFb(destination := EnStorageDevice.DevSysFS, ForceSave := true); // ForceSave - принудительная запись.
                
                end_if
                
                (* ==== Вызов блока для работы с retain переменными ==== *)
                
                RetainFB(destination := EnStorageDevice.DevSysFS);

                Комментарий

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