PDA

Просмотр полной версии : SysLibFile не пишет в память



Hemann
07.06.2015, 23:04
Коллеги, добрый день!

Что-то не понимаю, в чем дело. В приложенном проекте не пишутся значения на внутреннюю флеш-память. У меня ПЛК150-УМ, прошивка 2.14.0, таргеты 2.11 с сайта ОВЕНа. Если в SysFileOpen в режиме доступа поставить 'w', и при этом файл только создается, то программа "вываливается" (обрывается связь с ПК, и ПЛК уходит в перезагрузку), а в существующий запись не происходит. Если поставить 'rw', то новый файл не создается (функция возвращает 0), а в существующий ничего не пишется. Прошу помощи, так как мыслей никаких уже нет, а сроки поджимают.

lazy
08.06.2015, 11:58
Особо разбирался но
1. однозначно 'w';
2. Tst_str2:=CONCAT(Tst_str2,'$R$N');
3. что будет если не выполницо условие IF fwByteNum=LEN(fTotal_str) THEN? Будем открывать '1.log' с новым хендлом? Кста, вроде есть ограничение на кол-во открытых файлов, вроде четыре... (???)
4. перед fTotal_str:=CONCAT(Tst_str,Tst_str2); тоже неплохо было бы fTotal_str:='';
5. на форуме часто пишут, что методически грамотно разделять операции с файлами по циклам. )
6. Плохо понимаю условия переходов между шагами.
Прогоните прогу пошагово обращая внимание что происходит со строками и манипулятором файла.
7. Да, если есть '$R$N' и SysFileClose то не хватает еще и SysFileSetPos... )

Еще. полезно писать как то так:

IF fHandle = 0 THEN
fHandle:=SysFileOpen('1.log','w');
END_IF
IF fHandle <> 0 then
SysFileClose(fHandle);
fHandle := 0;
END_IF

Hemann
08.06.2015, 13:24
Спасибо! Будем пробовать

Hemann
08.06.2015, 23:18
Большое спасибо lazy за подсказку, особенно за вот это:
IF fHandle = 0 THEN
fHandle:=SysFileOpen('1.log','w');
END_IF
Я-то делал без этой проверки, поэтому файл открывался столько раз, сколько хватало дескрипторов, а потом-всё...

Остался, правда, нюанс в том, что если файла не существует, то ПЛК уходит в перезагрузку... Перед началом работы программы приходится записывать пустой файл во флеш-память, тогда работает.

lazy
09.06.2015, 14:33
SysFileOpen('1.log','w') должен либо открывать файл либо создавать его когда такового нет. вполне возможно создать файл за один цикл не получаецо поэтому в условиях перехода между шагами апосля SysFileOpen поставь не TRUE, а fHandle > 0. или проверяй дескриптор перед записью. думаю так )

Hemann
09.06.2015, 21:55
Неа, не пошло. Дескриптор проверяю по-любому, и при выходе из шага с созданием файла, и (когда файл существует) перед записью, но ПЛК при отсутствии файла все равно уходит в перезагрузку.

lazy
11.06.2015, 14:15
Сделай так чтобы за один цикл ПЛК было только одно обращение к какой либо функции работы с файлами. Потом. При включении открываем файл. Обращаемсо к SysFileOpen пока не дождемся хендла. Открылся? (значит создался) - следующим циклом - закрываем. Далее Цикл - Открываем. следующий цикл - пишем. следующий - закрываем. итд. У меня по таком алгоритму все и работает. )

Hemann
13.06.2015, 20:22
lazy это все оказались проделки самого ПЛК. Я взял у себя на складе ПЛК110-32 и перенес программу на него - все создается и пишет и т.д. Но тут оказались еще чудеса. Я открываю файл с двумя хендлами, т.е. один раз создаю/открываю на запись, а второй-на чтение. Это для того чтобы данные могли одновременно записываться в архив, и в тоже самое время можно было по нему двигаться для просмотра. В общих чертах работает, но почему-то при чтении удается двигаться только между первыми пятью записями, дальше не удается. Я пытаюсь установить нужную позицию с помощью SysFileSetPos и контролирую что получилось с помощью SysFileGetPos, так вот SysFileGetPos упирается в какой-то "потолок" и все. Вниз до нуля-пожалуйста, от нуля до этого "потолка"-тоже без проблем, а вот выше-никак. Чтобы это значило?

Yegor
14.06.2015, 11:53
Я открываю файл с двумя хендламиТак не делают. До закрытия дескриптора на запись в дескрипторе на чтение можно ожидать чего угодно.

Hemann
14.06.2015, 16:00
Yegor Спасибо. Может быть тогда посоветуете как мне быть: нужно и записывать в архив новые значения, и двигаться по этому файлу в режиме чтения уже имеющихся записей, причем одновременно (не в одно мгновение, но читать файл не прерывая записи)

Yegor
15.06.2015, 06:03
Открыть в режиме 'rw' с одним дескриптором — чтение/запись. Пишем, пишем, пишем... Если надо прочитать, то хоп назад SysFileSetPos; потом хоп — обратно, и опять пишем, пишем, пишем.

petera
15.06.2015, 09:40
Открыть в режиме 'rw' с одним дескриптором — чтение/запись. Пишем, пишем, пишем... Если надо прочитать, то хоп назад SysFileSetPos; потом хоп — обратно, и опять пишем, пишем, пишем.
Только SysLibFile не поддерживает режим 'rw'. :(
'rw'=='w'

Hemann
15.06.2015, 09:42
В том-то и дело, что rw не поддерживается...

Yegor
15.06.2015, 13:14
Блин, чо за шняга. Ну, переоткрыть на чтение перед чтением, потом обратно закрыть и открыть на запись. Вроде работает.

Hemann
15.06.2015, 13:45
Как ни странно, после холодной перезагрузки ПЛК все заработало в том виде, в каком я изначально сделал, т.е. доступ к одному файлу по двум дескрипторам. Не написал сразу, потому что ждал пока архив по записи наберется

Carter
28.09.2015, 13:03
Не хотел создавать новую тему, спрошу здесь, если кто подскажет. Пишу в файл ПЛК154 с минимально возможной периодичностью каждые 1-5 секунд. Понимаю, что память не резиновая и прочие моменты, но интересует, не слишком ли "болезненно" открывать\закрывать файл так часто для flash? И как мне файл, созданный в памяти ПЛК, скопировать на ПК?

Yegor
28.09.2015, 13:39
как мне файл, созданный в памяти ПЛК, скопировать на ПК?Кодесисом (Online > Read file from PLC) либо PLC_IO (http://www.owen.ru/catalog/codesys_v2/13245899).

Филоненко Владислав
28.09.2015, 15:11
w==rw

Пишу в файл ПЛК154 с минимально возможной периодичностью каждые 1-5 секунд. Понимаю, что память не резиновая и прочие моменты, но интересует, не слишком ли "болезненно" открывать\закрывать файл так часто для flash?

Следует понимать, что каждое обращение на запись - минимум 1 запись во Flash. запись раз в секунду - минимум 31 миллион записей в год, в реальности, если не применять особые методы для уменьшения фрагментации - 42-45 миллионов записей в год.
Общий ресурс - не более 300 миллионов записей. Если устраивает, что ПЛК гарантированно выйдет из строя за 6 лет, то ничего страшного.