PDA

Просмотр полной версии : архивирование на спк207



Feld_eger
14.05.2013, 07:24
Продолжаю осваивать СПК207) Всем спасибо за помощь в предыдущих вопросах. Сейчас не могу разобраться с архивированием. Собрал по инструкции функциональные блоки, компиляция проходит успешно. Но при работе архивы не создаются. При задании пути /var/log/ блок WriteData выдает ошибку "3"- не удалось записать в файл. При задании любого другого пути, включая SD-карту, ошибка "1"-не удалось создать файл. CoDeSys V3.5 SP1 Patch 2

kgsh82
15.05.2013, 07:49
Путь для архива существует?

Feld_eger
15.05.2013, 10:20
Попробовал сделать по видеоуроку для ПЛК304. Через ST-редактор запись пошла, но только в папку /var/log/, на USB и SD не пишет. Похоже не видит путь. Через WinSCP в папке /mnt/ никаких путей на флешки не видно.
P.s. есть ли какая-нибудь программа для придания архивным данным более читабельный вид. Как, например, программа построения графиков для МСД200?

capzap
15.05.2013, 11:51
http://www.owen.ru/forum/showthread.php?t=12816
может здесь что интересное найдете

Feld_eger
15.05.2013, 14:49
Спасибо, почитал и разобрался. Оказывается путь к SD карте не /mnt/mmc/ как в инструкции а , в моем случае, /mnt/ufs/media/mmcblk0p1/. Осталось только придумать как из этих данных графики построить.

capzap
15.05.2013, 14:59
Старайтесь сохранить данные в csv, тогда можно в таблице графики строить. Ну или нанять кого то чтоб парсил Ваши данные и выводил их в pdf например

Feld_eger
16.05.2013, 07:11
Поэкспериментировал в Exel 2010, получил нужный результат. Сейчас как раз изучаю расширенный курс по Office2010. В плане сделать чтобы все манипуляции с файлом проводились автоматически.

grr
18.10.2013, 22:16
Поэкспериментировал в Exel 2010, получил нужный результат. Сейчас как раз изучаю расширенный курс по Office2010. В плане сделать чтобы все манипуляции с файлом проводились автоматически.

Получилось реализовать?

Feld_eger
24.10.2013, 07:12
Честно говоря, нет. Так и не разобрался. Завалили другой работой, а в автоматическом представлении данных надобность отпала.

Александр Приходько
27.10.2013, 01:43
Есть еще один Вариант создания архивов:
http://www.owen.ru/forum/showthread.php?t=15867

arlyn
25.11.2013, 16:35
Для архивирования использую библиотеки SysFile , добавляю в файл числа через точку запятую (для возможности последующего открытия в экселе). Вопрос, а что нужно чтоб числа записывались в столбик, а не в строку как сейчас получается? библиотеку ArchiverSPK_3.5.3.53 не использую т.к. сижу на старой прошивке (старая прошивка у меня стабильнее работает с переферией).:)

Александр Приходько
01.12.2013, 21:49
Для архивирования использую библиотеки SysFile , добавляю в файл числа через точку запятую (для возможности последующего открытия в экселе). Вопрос, а что нужно чтоб числа записывались в столбик, а не в строку как сейчас получается? библиотеку ArchiverSPK_3.5.3.53 не использую т.к. сижу на старой прошивке (старая прошивка у меня стабильнее работает с переферией).:)

Если они у Вас пишутся в столбик, значит у Вас после каждого значения пишется знак переноса строки.

Вообще, если вы пишите файл формата CSV,то это обычный текстовый редактор.
Откройте его каким либо редактором и посмотрите что Вы там записали.

arlyn
02.12.2013, 10:44
Если они у Вас пишутся в столбик, значит у Вас после каждого значения пишется знак переноса строки.

Вообще, если вы пишите файл формата CSV,то это обычный текстовый редактор.
Откройте его каким либо редактором и посмотрите что Вы там записали.

У меня значения в столбик не пишутся (
Я открываю его в текстовом редакторе всё пишется в строку, в екселе тоже все написанов строку. Изучил ваш пример(naladka_prikhodko_spk_107_110_v2.3.0.5)в части записи и чтения файла. Что надо сделать для переноса строки? Или можно маленький пример?

Александр Приходько
06.12.2013, 16:54
У меня значения в столбик не пишутся (
Я открываю его в текстовом редакторе всё пишется в строку, в екселе тоже все написанов строку. Изучил ваш пример(naladka_prikhodko_spk_107_110_v2.3.0.5)в части записи и чтения файла. Что надо сделать для переноса строки? Или можно маленький пример?
Надо добавить символы переноса строки и перевода каретки. Если не ошибаюсь это '$r$n', посмотрите в моем примере, обращаю внимание, что это 2 символа.

arlyn
30.01.2014, 12:24
Подскажите пожалуйста как проще всего прочитать конкретную строчку из архива на флешке самим СПК207, для последующего отображения на экране СПК207?
Может есть у кого пример

Мурат Ахриев
30.01.2014, 14:59
1. Для начала вам нужно прочитать файл, для этого используйте функциональный блок "FILE.Read" из библиотеки "CAA File"(В англоязычной справке к Codesys есть описание библиотеки и примеры использования ФБ).

2. Далее в полученном буфере данных(прочитанном файле) вам нужно будет найти интересующую вас строку, в этом вам помогут функциональные блоки раздела работы со стоками (String Functions) из библиотеки "Standard".

3.Полученную (с помощью String Functions) строку выводите на визуализацию.

arlyn
30.01.2014, 16:37
2. Далее в полученном буфере данных(прочитанном файле) вам нужно будет найти интересующую вас строку, в этом вам помогут функциональные блоки раздела работы со стоками (String Functions) из библиотеки "Standard".


А есть ли ограничения на размер этого буфера? Я планирую считывать данные с большого файла (десятки Мб).
1.Прийдется использовать функциональный блок "FILE.SetPos" для передвижения курсора вниз на несколько символов?
2. Это будет медленно пока найдется нужный фрагмент?

Мурат Ахриев
30.01.2014, 17:07
Сам по себе буфер ограничивается количеством свободной оперативной памяти, но функции для обработки буфера(строки) работают только со стоками длинной до 255 символов, весь файл(десятки мегабайт) обработать не получиться. Следовательно предложенный вами вариант с использованием FILE.SetPos вам подходит, т.е. считывать не весь файл, а строку начиная с указанной позиции, а затем изменяя позицию, перемещаться по файлу.

arlyn
30.01.2014, 18:01
Сам по себе буфер ограничивается количеством свободной оперативной памяти, но функции для обработки буфера(строки) работают только со стоками длинной до 255 символов, весь файл(десятки мегабайт) обработать не получиться. Следовательно предложенный вами вариант с использованием FILE.SetPos вам подходит, т.е. считывать не весь файл, а строку начиная с указанной позиции, а затем изменяя позицию, перемещаться по файлу.

А есть способы перемещать курсор для чтения не на несколько символов, а сразу на несколько строк вниз? (Одна строка это запись всех параметров в один момент времени, а количество символов в разных строках различна)

capzap
30.01.2014, 19:58
переведите весь файл не в строки а в массив байт и ищите конец строки, сколько раз встретите от начала на столько строк и спустились ниже

arlyn
30.01.2014, 21:13
переведите весь файл не в строки а в массив байт и ищите конец строки, сколько раз встретите от начала на столько строк и спустились ниже

т.е в функции FILE.Read использовать буфер определенный как масив с данными wstring?

capzap
30.01.2014, 22:00
Неглядел на работу бибки,но вроде в стандартной и так для чтения используется указатель и какая разница на что, на строку или на массив байт. Может и ошибаюсь, пока не могу до КДС35 добраться

Мурат Ахриев
31.01.2014, 16:22
Да, действительно, функциональному блоку чтения файла(FILE.Read) можно подать на вход указатель на массив байт.
Далее проанализировав массив байт найти начало и конец нужной строки.
Далее установить позицию чтения (FILE.Setpos), длину читаемой строки и повторно считать нужную строку (FILE.Read) в буфер типа String[255].

Александр Приходько
01.02.2014, 17:54
Добрый день. Хочу внести одно небольшое, но крайне значимое замечание.
Если вдруг в файле по какой либо причине встретятся два последовательных байта, значения которых равняются нулю, то при чтении данных в формате string вы часть данных не увидите/потеряете, т.к. два нулевых байта подряд признак конца строки.

capzap
01.02.2014, 18:14
http://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D1%81% D1%82%D1%80%D0%BE%D0%BA%D0%B8 не нашел про два нулевых байта для текстовых документов

Александр Приходько
01.02.2014, 20:15
http://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D1%81% D1%82%D1%80%D0%BE%D0%BA%D0%B8 не нашел про два нулевых байта для текстовых документов

Capzap, в этом то и дело, в идеале в документе, который изначально создан как текстовый такой ситуации возникать не должно.
Но если она вдруг возникнет....
Или, например файл битый (запись не прошла корректно или питание в этот момент пропало). Поэтому в идеале конечно не помешало бы сделать проверку файла или читать данные блоками и искать в них нули.

arlyn
02.02.2014, 20:37
Да, действительно, функциональному блоку чтения файла(FILE.Read) можно подать на вход указатель на массив байт.
Далее проанализировав массив байт найти начало и конец нужной строки.
Далее установить позицию чтения (FILE.Setpos), длину читаемой строки и повторно считать нужную строку (FILE.Read) в буфер типа String[255].

Не совсем понятно преимущество.
Например:
var
array_string: ARRAY[0..10] OF STRING;
array1 [0..10] of byte;
FileOpen : File.Open;
FileRead : File.Read;
end_var

открываем файл
FileOpen(.........);
читаем файл
FileRead(xExecute:= TRUE, hFile:= ........., pBuffer:= ADR(array_string[0]), szBuffer:=..........);
В чем преимущество указывать на массив pBuffer:= ADR(array_string[0]), не пойму?

Или реч идет об указании FileRead(xExecute:= TRUE, hFile:= ........., pBuffer:= ADR(array1), szBuffer:=..........);?
А если реч идет о втором варианте, то массив при файле в десяток мегабайт должен быть наверно 0...1000000, его чтение и обработка займет продолжительное время.

Мурат Ахриев
03.02.2014, 11:29
var
string_line: string[255];
array1 [0..10] of byte;
FileOpen : File.Open;
FileRead: File.Read;
Setpos :File.SetPos;
end_var

Для начала считываете в массив байтов

FileRead(xExecute:= TRUE, hFile:= ........., pBuffer:= ADR(array1), szBuffer:=..........)

Затем анализируете массив, ищите начало и конец нужной строки

Далее

Setpos(.........)

Далее считываете уже нужную строку

FileRead(xExecute:= TRUE, hFile:= ........., pBuffer:= ADR(string_line), szBuffer:=..........)

arlyn
03.02.2014, 11:45
var
string_line: string[255];
array1 [0..10] of byte;
FileOpen : File.Open;
FileRead: File.Read;
Setpos :File.SetPos;
end_var

Для начала считываете в массив байтов

FileRead(xExecute:= TRUE, hFile:= ........., pBuffer:= ADR(array1), szBuffer:=..........)

Затем анализируете массив, ищите начало и конец нужной строки

Далее

Setpos(.........)

Далее считываете уже нужную строку

FileRead(xExecute:= TRUE, hFile:= ........., pBuffer:= ADR(string_line), szBuffer:=..........)

Да порядок действий понятен, Но вопрос в другом: Если обрабатываемый файл весит к примеру 10Мб то массив будет размером в array1[0..10485760] of byte . Это же сумасшедшие цифры, время обработки такого массива наверно тоже запредельное!

Александр Приходько
03.02.2014, 23:37
Да порядок действий понятен, Но вопрос в другом: Если обрабатываемый файл весит к примеру 10Мб то массив будет размером в array1[0..10485760] of byte . Это же сумасшедшие цифры, время обработки такого массива наверно тоже запредельное!

Ну в том то и дело, что вам не надо читать всегда весь файл. Конечно, если файл небольшой его можно загрузить в ОЗУ (считать в массив) и дальше обрабатывать. Но если файл заранее не оговорен в размерах, то лучше читать его кусочками и далее ориентироваться по укзателю, где вы находитесь.

GoodLuck
17.05.2014, 23:01
Требуется прочитать из текстового файла, допустим, первые 10 символом. Текст программы такой:
VAR
File_Open: FILE.Open;
File_Close: FILE.Close;
File_Read: FILE.Read;
FILE_MREAD: FILE.MODE;
array1: ARRAY [0..10] OF BYTE;
END_VAR

File_Open.sFileName:='/mnt/ufs/media/mmcblk0p1/text.txt/';
File_Open.eFileMode:=FILE_MREAD;
File_Open.xExecute:=TRUE;
File_Read( xExecute:=TRUE);
File_Read.hFile:=hFile;
File_Read.udiTimeOut:=100000;
IF File_Open.xDone THEN File_Read.szBuffer:=10; File_Read.pBuffer:=ADR(array1);
END_IF
File_Close.xExecute:=TRUE;

Но в результате File_Open.xDone=FALSE и, естественно, все значения массива array1 нулю. Подскажите, пожалуйста, что не так?

Мурат Ахриев
19.05.2014, 10:29
Вот пример, попробуйте сделать по примеру.

GoodLuck
20.05.2014, 22:01
Скажите, пожалуйста, а нет ли какой-нибудь функции, с помощью которой можно найти заданную комбинацию символов в текстовом файле? По аналогии со строковой функцией FIND? Или придется считывать в буфер файл по частям и анализировать каждую часть?

Александр Приходько
28.05.2014, 00:11
Скажите, пожалуйста, а нет ли какой-нибудь функции, с помощью которой можно найти заданную комбинацию символов в текстовом файле? По аналогии со строковой функцией FIND? Или придется считывать в буфер файл по частям и анализировать каждую часть?
Нет. Такой функции нет.
Вам нужно организовать открытие файла, его вычитку. И далее делать поиск по содержиому счинанного.

bezbel
28.05.2014, 12:01
Подскажите пожалуйста (или покажите где посмотреть) как сохранять архив на внешний носитель - SD карту или USB Flash. На вутренний диск все сохраняется нормально. Внешние носители нужно как-то "монтировать" в Linux'е? Почему я подключаясь с помощью WINSCP не вижу внешний диск?

GoodLuck
04.06.2014, 10:28
подскажите, пожалуйста, если такая возможность существует!

Какое значение MODE надо поставить в команде WriteData (библиотека ArchivatorOwenLib), чтобы файл создавался раз в год или раз в месяц?

ChernovR
05.07.2015, 18:13
HELP! Доброго времени суток. не могу разобратся с архивированием СПК 207 cs web нужно что б он записывал 8 переменных в архив и сохранял на SD карту. может у кого есть готовый пример скинте пожалуйса, зарание спасибо.

Александр Ч.
15.07.2015, 07:55
В этой же теме на стр.1 А.Приходько дает ссылку на библиотеку архивации для СПК. Делал как там описано. Даже экспериментировал, убирая функцию переноса с SD на флэшь. Все работает и полгода на обьекте почти

vniko
13.08.2015, 10:02
Для чтения/записи в файл использую библиотеку CAA_File. Основываясь на примерах встроенной справки CoDeSys 3.5 и примере Мурата, написал вот такую программку: Read_file.projectarchive

Самого СПК207 пока нет, поэтому проверяю на CODESYS Control Win V3.
Записываю в файл file_2.txt на диске D следующую строку:
123;456
654;321
Устанавливаю позицию чтения (FileSetPos) в начало первой строки и считываю первую строку, длиной в 7 символов (байт).
В переменной чтения arc_str записалось следующее:
'123;456й└˓ш№¶'
Измеряю длину arc_str = 13 байт (символов).
Пробовал изменять количество байт на чтение - .szBuffer функционального блока FILE.Read. При каких-то значениях размер прочитанной arc_str совпадает с заданным размером чтения .szBuffer, но чаще получается длиннее, с добавленными символами.
Просьба к участникам форума проверить мой пример на самой панели СПК207, может это встроенный в CoDeSys контроллер дает ошибки.
Может я в чем-то ошибаюсь?
Заметил еще, что в созданном и записанном файле в 3-ей строке появились 6 пробелов, которые я не записывал. Чудеса какие-то.

vniko
26.12.2015, 15:47
По поводу записи в файл лишних пробелов я разобрался. Дело в том, что в модуле записи в файл я указываю количество байт для записи в файл .szSize:=24. Т.е. моя строка на запись имеет размер 18 символов и до 24 пишется в файл пустые символы. В моем случае их 6 (при чтении затем в массив байтов из этих позиций читаются нули).
Если количество байт для записи в файл определить как .szSize:=SIZEOF(buffer), в файл будет добавлены нулевые символы до 81, т.к. длина строковой переменной buffer по умолчанию равна 80 (0,1,2,3,4,...,80).

С добавлением символов при чтении строки из файла не разобрался: т.е. в моем случае при чтении из файла строки из 7 символов, реально получаем строку (строковую переменную) с 13-ю символами.
В проекте делаю так: читаю в строку из файла командой FILE.Read с размером буфера .szSize:=len_str, а затем функцией LEFT ограничиваю длину строки величиной len_str.

vniko
08.02.2016, 12:49
Записываю в файл file_2.txt на диске D следующую строку:
123;456
654;321
Устанавливаю позицию чтения (FileSetPos) в начало первой строки и считываю первую строку, длиной в 7 символов (байт).
В переменной чтения arc_str записалось следующее:
'123;456й└˓ш№¶'
Измеряю длину arc_str = 13 байт (символов).

Отвечаю себе сам: По совету техподдержки пробовал использовать формат UNICODE - все то же самое. Замечу, что работать с форматом UNICOD не понравилось - в два раза увеличивается размер файла. Но затем я перешел с CoDeSys Версии 3.5 SP4 Patch 4 на Версию 3.5 SP5 Patch 5. И вот сейчас на SP5 данную ситуацию повторить уже не смог. Читаться стало столько символов, сколько и было задано на чтение. Т.е. вывод: этот БАГ был устранен.

dimessen
25.02.2016, 18:15
Господа, подскажите, пожалуйста! Пытаюсь разобраться с архивированием на примерчике в описании к ArchivatorOwenLib. СПК под рукой нет. Могу ли я проверить как все это работает в режиме эмуляции? Как мне, в таком случае, задать путь вместо ‘/var/log/’ – т.е., чтобы архив создавался на ПК??
Версия CODESYS V3.5 SP5 Patch 5

Радонежский
03.04.2016, 10:41
+еще один вопрос.
Ни для кого не секрет, что существует задача архивации данных на ПЛК и СПК.В лучшем случае лучше использовать retain, а потом архивацию.

В ПЛК110 можно создать файл для ведения архива. Он не большой, по-моему 32 Кб надо уточнить В итоге файл пишется все время в одной области внутренней флеш. Серьезные недостатки: файл небольшой и нет равномерного распределения использования ячеек памяти на flash. Если очень нужно, то приходиться самим создавать несколько файлов и равномерно их использовать. Но в таком случае на разработчике ПО в Codesys ответственность - основной цикл работы ПЛК не должен мешать работе записи в файл и наоборот.

В СПК есть возможность подключения внешних Flash. Если не производить форматирование, то можно ли в СПК применить 64 Гб (128Гб ) с exFAT?
Эта файловая система закрытая (на неё мало нет описания), но вроде как она решает задачи равномерного использования секторов. Кто-нибудь занимался этой тематикой?

vniko
05.04.2016, 17:18
В документе SPK_FAQ_v.1.1.pdf "ОВЕН" пишет требования к USB- и SD- накопителям: файловая система – FAT(16 или 32),
объем – не более 32 Гб.
Пробовал 2 флэшки форматировать в exFAT, в конфигураторе СПК207(М04) их не определил.

Информация из интернета:
Система exFAT предназначена изначально для флэш-накопителей, и по сути можно сказать, что она представляет собой традиционную FAT32, но без каких-либо ограничений. Размеры разделов и файлов в данном случае могут достигать предельно возможных величин, да и количество данных в одной папке является практически неограниченным. В FAT32 присутствует ограничение на размер файла, которое составляет 4 Гб.
Выбирая между тем, какая лучше файловая система – exFAT или NTFS, следует отметить, что последняя отличается неплохой надежностью, которая позволяет без всяких повреждений данных выдержать не одну внезапную перезагрузку. Такая надежность обеспечивается благодаря использованию технологии журналирования. Таким образом, система более часто обращается к различным областям накопителя, и для флэшек или же различных карт памяти такой подход является критичным. Другими словами, они просто начинают более быстро изнашиваться.
Как бы то ни было, по сравнению с другими сменными носителями ( FDD, ZIP, CD-RW, DVD-RW, Tape ) ресурс флэш-памяти весьма велик. Износ не имел бы серьёзного значения, производись запись равномерно по всем адресам. К сожалению, это не так, и вся проблема в файловой системе FAT. Ряд её служебных таблиц переписывается при каждом обновлении любого из файлов, именно эти ячейки памяти первыми выходят из строя. Для борьбы с этим явлением применяется технология «выравнивания износа» (wear leveling): часто изменяемые данные перемещаются по адресному пространству флэш-памяти , так что запись производится по разным физическим адресам. В каждый контроллер заложен свой алгоритм выравнивания; сравнивать их эффективность у тех или иных моделей затруднительно, поскольку детали реализации не разглашаются. Считается, что выравнивание износа повышает ресурс флэш-памяти в 3-5 раз.

Так как в современные USB-накопители и SD-карты встроена (но не обязательна) технология выравнивания износа (wear leveling), которая работает на уровне контроллера флеш-носителя, файловая система, как я понимаю, не так важна. Хотя NTFS в этом смысле нежелательна. И я не вижу особо критичных преимуществ exFAT перед FAT32 по износу ячеек флэш памяти.

Радонежский
06.04.2016, 09:11
Хорошо, вопрос по-другому, но пока не приминаем во внимание периодичность записи. Кто-нибудь сталкивался с выходом из строя внешней flash при постоянной записи архива? И кто-нибудь подскажет программу, снятия карты самой памяти flash для анализа её износа?

Радонежский
07.04.2016, 11:52
Придется самому отвечать, после общения с грамотными специалистами в этой области.
К сожалению, на форуме таких специалистов нет, и они здесь не сидят.

На текущий момент 07.04.16 положение дел с носителями следующее.
EEPROM (ПЗУ) + внутренний котроллер = USB flash (флешка)
EEPROM (ПЗУ) + внутренний котроллер = SD (карточка)
EEPROM (ПЗУ) + внутренний котроллер = SSD накопитель – Единственный тип накопителя, который имеет SMART (S.M.A.R.T.)
Так как SSD накопитель имеет SMART, то его можно прочитать сторонними программами и узнать состояние носителя. И SSD выполняет резервирование данных, чего нет на USB flash и SD. В них надо самому делать несколько копий файла.

В СПК имеется USB и SD разъем, поэтому SSD не рассматриваем. USB flash и SD имеют «свой контроллер», и что это такое? Производители Kingston, SanDisk, Transcend, Silicon Power и др. ввозят в РФ свои носители партиями. Любой производитель в разных партиях применяет различные «внутренние котроллеры» для ОДНОГО И ТОГО ЖЕ ТИПА ПРОДУКТА. Т.е. возьмем две одинаковые внешне и по объему флешки из разных партий и разберем. И увидим там различные контроллеры стоят. Эти контроллеры они общие для всех (Kingston, SanDisk, Transcend, Silicon Power) и их описание есть интернете. По этому описанию можно составить диаграмму и алгоритм последовательности записи. НО НИКАК НЕ УЗНАТЬ КОЛИЧЕСВО СОВЕРШЕННЫХ ЗАПИСЕЙ, т.е. лимит flash.

Существует обратная зависимость количества циклов записей flash от её объема. Т.е. чем больше вы берете по объему, тем быстрее она выйдет из строя. Это надо смотреть у производителя.

exFAT как другие файловые системы не решают вопрос резервирования данных. Это реклама. exFAT позволяет работать с большим объем носителя и все.
В конечном итоге «внутренний котроллер» сам решает в какую область писать данные (он сам запоминает и отсчитывает количество оставшихся записей). Данные располагаются на EEPROM (флеш) НЕПОСЛЕДОВАТЕЛЬНО . Т.е. не надо питать иллюзии, что можно считать и составить карту памяти, а потом легко вытащить свои данные.

Опыт работы показал, что лучшее всего восстанавливаются USB flash и SD фирмы Samsung и те девайсы в которых «внутренний котроллер» фирмы Marvel.
Лучшей программой с пользовательским интерфейсом признается R-Studio, но она платная. Вот в ней и следует работать при отказах флеш.

В итоге для ведения Архива на USB или SD карте следует работать по следующему алгоритму.
После записи файла на flash из Retain памяти провести считывание файла и проверка его. Проверку можно еще сделать с помощью контрольной суммы. После это считать запись удачной. Предусмотреть резервирование файла – два файла. В случае возникновения отказов контроллер flash переведет её в режим только чтение.

capzap
07.04.2016, 12:01
Придется самому отвечать, после общения с грамотными специалистами в этой области.
К сожалению, на форуме таких специалистов нет, и они здесь не сидят.

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

Радонежский
07.04.2016, 13:09
Любая файловая система работает через контроллер SD или USB флешки и потом EEPROM. Алгоритм контроллера это интеллектуальная собственность и его никто не афиширует. Его пытаются понять, а кто понял тот зарабатывает деньги на восстановлении данных. Контроллер из последовательной записи ОС (Windows или Linux) пишет НЕПОСЛЕДОВАТЕЛЬНО данные. Никакой файловой системе это не разобрать.

Умничать и строить умника любой может. А реально разбираться в 1000 железках одновременно еще ни кому не удавалось.

Если я не прав, то можно показать мне это на фактах и реальных вещах. И спорить с тем, кто специализируется на работе с flash будет глупо и неуважительно.

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

capzap
07.04.2016, 13:14
capzap , давайте я с карты памяти сниму её бинарный образ, а вы мне файл с неё считаете? И посмотрим, что у Вас получится.

с убитой флешки? с флешки на которой какая нибудь виндуховая ФС?
Да вкладывайте, хоть и нет под рукой своего ноута с линуксом, может и плк304 сможет прочесть

Радонежский
07.04.2016, 13:44
Внимание! ВНИМАНИЕ! Научный эксперимент!
Обговариваем ход и чистоту действий.
1. Берем USB флешку 4Гб, чтобы было попроще с Fat32 или предложенной «журналируемой файловой системой»
2. Пишем файл и не один.
3. Выкладываем в интернете видео и сами файлы в зашифрованном виде на общее обозрение, чтобы была фиксация изменений.
4. Разбираем флеш и выводим контроллер из строя/ или выпаиваем – и не сообщаем тип контроллера – хотя его в принципе можно постараться будет определить – по обвязке.
5. Capzap, получает по почте USB флешку
6. Не имея возможности подключиться штатными средствами Capzap снимает бинарный файл-образ с EEPROM и восстанавливает требуемый файл.
7. Capzap выкладывает в интернете файл на общее обозрение, чтобы была фиксация изменений
8. Радонежский выкладывает ключ от зашифрованного контейнера в интернет.
9. И все сравнивают результаты.

capzap
07.04.2016, 13:53
не следуйте по пути Сан Саныча Горбункова, не ищите приключений на свой гипс.
Мне самому крайне интересно стало, как Вы с убитой флешки снимите образ, ведь это же ваше высказывание

capzap , давайте я с карты памяти сниму её бинарный образ, а вы мне файл с неё считаете?а теперь уже появилась история с почтой России. Вот как снимите так и по электронке и пошлите. В место того чтоб заглянуть в вики или на крайняк в гугл, чтоб узнать что такое ЖФС, устраиваете здесь фрик-шоу

Радонежский
07.04.2016, 14:30
Месяц назад выкинул флешку с EEPROM от Samsung. Я действительно пойду на эксперимент угроблю нормальною флешку, но мне нужно реальное подтверждение, что вы этим будете заниматься, хотя бы честное благородное слово.
Я не говорю, что быстро сделаю, но буду делать.
В книге «Практическое программирование микроконтроллеров Atmel AVR на языке ассемблера» Ревич Ю.В. Приложение 3 стр.350 (2008 г) приведен пример работы по интерфейсу SPI flash памятью 45DB011B. Это в подтверждение, что это реализуемо. Понятно, что в испытуемой флешке будет EEPROM своя, но принцип будет тот же.
Программатор SPI есть в наличии, но я им уже давно не пользовался и боюсь, что его мне поломали. Но мне не трудно будет приобрести для этого случая- вопрос только во времени.

capzap
07.04.2016, 14:49
я же вступил в дискуссию, после фразы "После записи файла на flash из Retain памяти провести считывание файла и проверка его. Проверку можно еще сделать с помощью контрольной суммы. После это считать запись удачной." Ни чего нового Вы этим не открыли, журналируемые системы это и делают, только на порядок быстрее Вашего способа. И конечно же я не буду заниматься убитой флешкой, если доводить до такого состояния носитель, то ни ЖФС ни Ваш способ не помогут уже

Радонежский
07.04.2016, 15:10
Ладно, в итоге: флешка отформатирована для работы под Linux. Как будет работать Ваш(capzap) вариант в случае, если вынуть флеш во время записи. Будет ли проверка записи и как она осуществиться? Средствами ЖФС или программно. И как мы из своей программы (Codesys) поймем об ошибке?

capzap
07.04.2016, 16:27
в догонку что ли, после разъединения контактов запись то будет? Вот уже десять лет я запускаю линуксовые машины на производстве, флеш выходит из строя по завершении своего ресурса, но чтоб каждый день после выключения питания терялись данные ни кто не жаловался

Радонежский
12.04.2016, 08:47
Не данные, которые записаны.Те которые записаны и так с ними все понятно. А которые еще пишутся. Вот в чем вопрос был.

capzap
12.04.2016, 09:52
ясно же что не запишутся они, другой вопрос если файловая система поддерживает журналирование, эта не законченная запись не повредит структуру файла

Радонежский
13.04.2016, 10:11
Так вот программа, которая пишет файл на flash архив должна получить сообщение, о том что запись была неудачной. Я вот что имел ввиду "После записи файла ... провести считывание файла и его проверку."

capzap
13.04.2016, 10:48
Так вот программа, которая пишет файл на flash архив должна получить сообщение, о том что запись была неудачной. Я вот что имел ввиду "После записи файла ... провести считывание файла и его проверку."

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

Радонежский
14.04.2016, 12:23
Нет. главное это высокая надежность с минимум операций на обслуживание и затрат на оборудование с расходными матерьялами.

capzap
14.04.2016, 12:28
достаточно того, что функция записи возвращает результат отсутствие ошибок и если будет стоять любая ЖФС. Дополнительно в качестве повышения надежности желательно размонтировать флешку перед её изъятием

vniko
21.10.2016, 16:26
В проекте для чтения в файл использую библиотеку CAA_File. Основываюсь на примерах встроенной справки CoDeSys 3.5 и примере Мурата http://www.owen.ru/forum/showthread.php?t=15072&p=138038&viewfull=1#post138038, именно эта тема мне во многом помогла.
Выкладываю часть своего проекта - оставил только то, что относится к чтению файла архива данных (добавил только в визуализацию таблицу данных, т.к. массив данных храню только в памяти). Может кому поможет в освоении CoDeSys 3 и библиотеки CAA_File.

Краткое описание:
Чтение массива (1000 строк) структуры (6 столбцов) из файла D:/articles_arhiv.csv. (Для устройства Control Win V3)
Структура: (archive_param)
1-й элемент (article) - тип STRING(17);
2-й элемент (inv_number) - тип UINT(0..9999);
3-й элемент (t1) - тип TIME;
4-й элемент (t1) - тип TIME;
5-й элемент (t1) - тип TIME;
6-й элемент (skip) - тип USINT;
Величина архива (количество строк) задаётся глобальной переменной ia_max.
Величину массива байт необходимо задать переменной ib_max ориентируясь на максимальное количество символов во всех элементах структуры.
Путь считывания файла (чтение с USB, SD-карты или диска D) можно выбрать в объявлении переменной filename_arhchive, закомментировав соответствующие строки.
Функцию преобразования из кодов ASCII в символы составил сам по своим нуждам, при желании можно дополнить или изменить.

После чтения файла выдается информация:
1. Ошибка чтения (при отсутствии файла).
2. Пустой файл (чтение не происходит).
3. Успешное чтение файла.

Проект содержит комментарии и может быть переписан для чтения любого файла с данными.

Буду признателен, если есть замечания или предложения оптимизации проекта.

distren
20.03.2017, 14:17
var
string_line: string[255];
array1 [0..10] of byte;
FileOpen : File.Open;
FileRead: File.Read;
Setpos :File.SetPos;
end_var

Для начала считываете в массив байтов

FileRead(xExecute:= TRUE, hFile:= ........., pBuffer:= ADR(array1), szBuffer:=..........)

Затем анализируете массив, ищите начало и конец нужной строки

Далее

Setpos(.........)

Далее считываете уже нужную строку

FileRead(xExecute:= TRUE, hFile:= ........., pBuffer:= ADR(string_line), szBuffer:=..........)

Здравствуйте!
Объясните мне, пожалуйста, что значит:"Затем анализируете массив, ищите начало и конец нужной строки."
У меня есть файл размер которого будет постоянно увеличиваться. Мне необходимо в итоговую таблицу выводить данные, которые требуется найти по двум параметрам: дата и название.
примеры просмотрены не один раз. Но никак не могу придумать как их использовать применимо к моей ситуации.

vniko
20.03.2017, 15:43
1. Для измерения размера файла можно воспользоваться FILE.GetSize. Получаете количество байт в файле (file_size).
2. Считываете в массив байт. Получаете aDataArea: ARREY [0..bmax] of BYTE, где bmax = file_size-1.
3. Перебирая в aDataArea[0..bmax] индекс b от 0 до bmax, можно анализировать массив байт. Код 59 соответствует двоеточию, код 13 - концу строки (далее за ним 10 - перенос строки).

Можно, конечно, далее воспользоваться FILE.SetPoz и далее FILE.Read(чтение строки). Но это опять каждый раз доступ к внешней SD или USB-flash, при большом объёме информации займет много времени (проверено).

Я делаю так: анализируя aDataArea[0..bmax] как указано выше, преобразую данные в массив структур aArchive: ARREY[1..imax] OF struct_archive, сохраняемом в оперативной памяти. Скорость выборки будет намного выше и отсутствует работа с внешним накопителем.
Далее по столбцам, например aArchive[i].data и aArchive[i].nazvanie, ищем нужную строку i. И выводим из строки i найденные данные.

distren
21.03.2017, 11:03
Спасибо.Попробую воспользоваться вашим примером.

distren
18.05.2017, 12:28
vniko, во-первых,спасибо Вам большое за пример. Очень упростил мне работу.
Правда, обнаружились некоторые но...
Размер файла,который создается заранее неизвестен,соответственно прописываю ia_max := 40000 - максимально возможное значение.Но при чтении файла в массив данных,ФБ FILE.Read выдает и .xDone = true и .xError=true, .eError = 1.
Описание этой ошибки нет. Но при этом данные считываются.
Понятно,что можно легко обойти её, но все же хотелось знать, что означает данная ошибка.

capzap
18.05.2017, 12:43
не пробовали возложить работу по поиску строки в непонятно_каком_изначально_размере_файла на линукс, всякие cat grep и > делают чудеса, а вместо тяжеловесой бибки CAA File использовать sysexecute

distren
18.05.2017, 13:57
Признаюсь даже и мысли не было.Спасибо, буду пробовать.

distren
18.05.2017, 14:06
Может вы мне сможете подсказать.
Нужно, чтобы данные в файл записывались в течении 3 месяцев, по истечению срока, данные перезаписывались в тот же файл, не затирая предыдущие записи выше.
Пример, были данные: 1,2,3,4,5.Прошло 3 месяца, началась перезапись 6,7,3,4,5->cледующий день 6,7,8,4,5
Данные записываются с помощью CAA File.

capzap
18.05.2017, 14:08
а почему не подходит удаление самой древней строки а новую как обычно в конец файла

distren
18.05.2017, 14:26
Звучит просто, но я не знаю как это можно сделать.
Перейти с помощью File.SetPos в начало и затереть строку? Но тогда в .csv будут пустые строки.

capzap
18.05.2017, 14:36
использовать линуксовую команду tail: брать вывод команды на одну строку меньше чем в файле и вывод отправлять опять в этот же файл

distren
18.05.2017, 14:52
И снова линукс))) Спасибо.Будем изучать.
Может Вы мне подскажите полезные ссылки для работы с линуксом?

capzap
18.05.2017, 15:03
так зачем напрягать программу контроллера, вещами которые и в операционке спокойно можно сделать(с меньшим ущербом по загузке ресурсов). По пводу полезности, просто погуглите либо конкретные команды либо как написали полезные ссылки