PDA

Просмотр полной версии : Глюк USB Drive: показывает mounted и данные по памяти сам по себе



S.A.D.
15.09.2018, 15:25
В процессе изучения возможностей работы с файлами на внешних накопителях поймал следующий глюк:
Спк как-то запомнила сама себе показатели памяти флешки и вне зависимости от того воткнута флешка или нет показывает их и флаг mounted. Точно так же в процессе работы даёшь команду размонтироваться, она проходит но тут же через несколько секунда флаг mounted снова поднимается. При этом воткнута флешка или нет не имеет значения. Холодный и заводской сбросы ничего не дали: только перезагрузка по питанию убрала этот глюк.
На SD карте не проверял, но подозреваю, что тоже такое может быть. Кто-то сталкивался с таким? Если да, то может есть какой-то нюанс который надо учесть чтобы такого не происходило?

Ильнур Гибадуллин
15.09.2018, 17:03
В процессе изучения возможностей работы с файлами на внешних накопителях поймал следующий глюк:
Спк как-то запомнила сама себе показатели памяти флешки и вне зависимости от того воткнута флешка или нет показывает их и флаг mounted. Точно так же в процессе работы даёшь команду размонтироваться, она проходит но тут же через несколько секунда флаг mounted снова поднимается. При этом воткнута флешка или нет не имеет значения. Холодный и заводской сбросы ничего не дали: только перезагрузка по питанию убрала этот глюк.
На SD карте не проверял, но подозреваю, что тоже такое может быть. Кто-то сталкивался с таким? Если да, то может есть какой-то нюанс который надо учесть чтобы такого не происходило?

Здравствуйте!

Вы сейчас говорите о каком-то определенном проекте или о компоненте Drives в таргет-файле?

S.A.D.
15.09.2018, 17:12
Здравствуйте!

Вы сейчас говорите о каком-то определенном проекте или о компоненте Drives в таргет-файле?

о компоненте Drives. С файлами пытаюсь работать посредством САА библиотеки. В частности смотрел насколько шустро происходит сериализация в файл массива на 15мб. Выяснил, что очень медленно - буду работать с данными по-другому, правда придётся больше кода написать.

Щас вот вообще СПК флешку видеть перестал и HP Format Tool не хочет её форматировать, хотя виндовая утилита форматирует нормально. Это конечно врядли связано с глюком, но тем не менее.

Ильнур Гибадуллин
16.09.2018, 12:30
о компоненте Drives. С файлами пытаюсь работать посредством САА библиотеки. В частности смотрел насколько шустро происходит сериализация в файл массива на 15мб. Выяснил, что очень медленно - буду работать с данными по-другому, правда придётся больше кода написать.

Щас вот вообще СПК флешку видеть перестал и HP Format Tool не хочет её форматировать, хотя виндовая утилита форматирует нормально. Это конечно врядли связано с глюком, но тем не менее.

Какая версия таргет-файла и версия прошивки СПК?

Осинский Алексей
17.09.2018, 08:38
Точно так же в процессе работы даёшь команду размонтироваться, она проходит но тут же через несколько секунда флаг mounted снова поднимается.

В момент, когда даете команду на размонтирование запись на носитель ведется?
Если да, то контроллер просто не может размонтировать flash'ку т.к. устройство занято.

Перед передачей команды на размонтирование прекращайте работать с накопителем и закройте открытые файлы, которые хранятся на flash'ке.

S.A.D.
17.09.2018, 11:10
В момент, когда даете команду на размонтирование запись на носитель ведется?
Если да, то контроллер просто не может размонтировать flash'ку т.к. устройство занято.

Перед передачей команды на размонтирование прекращайте работать с накопителем и закройте открытые файлы, которые хранятся на flash'ке.

вот и ответ! Спасибо. Да, действительно такая проблема была. Я не мог закрыть файл и в процесс закрытия делал размонтирование. То есть он просто бесконечно долго висит в процессе закрытия. Думаю причина этому размер файла 15мб. Вероятно корректно СПК может оперировать только небольшими файлами. Если будет возможность добавьте пожалуйста в модуль DRIVE какое нибудь поле с кодом ошибки размонтирования, чтобы показывало ошибку, а не то, что устройство размонтировано, как это происходит сейчас.

Осинский Алексей
17.09.2018, 11:26
вот и ответ! Спасибо. Да, действительно такая проблема была. Я не мог закрыть файл и в процесс закрытия делал размонтирование. То есть он просто бесконечно долго висит в процессе закрытия. Думаю причина этому размер файла 15мб. Вероятно корректно СПК может оперировать только небольшими файлами. Если будет возможность добавьте пожалуйста в модуль DRIVE какое нибудь поле с кодом ошибки размонтирования, чтобы показывало ошибку, а не то, что устройство размонтировано, как это происходит сейчас.

Вы работаете с библиотекой SysFile или CAA File?
Тестировал библиотеку CAA File на файлах с размерами до 2 Гб которые "жили" на USB-накопителе: как чтение, так и запись работает корректно.
Если пришлете проект в формате projectarchive (можно E-mail: support@owen.ru с пометкой "Для Осинского Алексея, с форума"), я посмотрю, может что-нибудь бросится в глаза.
В проекте оставьте только то, что относится к работе с файлами.

S.A.D.
17.09.2018, 15:08
Вы работаете с библиотекой SysFile или CAA File?
Тестировал библиотеку CAA File на файлах с размерами до 2 Гб которые "жили" на USB-накопителе: как чтение, так и запись работает корректно.
Если пришлете проект в формате projectarchive (можно E-mail: support@owen.ru с пометкой "Для Осинского Алексея, с форума"), я посмотрю, может что-нибудь бросится в глаза.
В проекте оставьте только то, что относится к работе с файлами.

Библиотека CAA File
Проект во вложении:

Осинский Алексей
18.09.2018, 14:08
Библиотека CAA File
Проект во вложении:

Добрый день.
Прошу прощения, только добрался посмотреть проект.
У Вас при вызове ФБ fileClose не передается дескриптор файла
Нужно так:


fileClose (
xExecute:= (writeCmd AND (fileWriteDone OR fileWriteError OR fileWriteAborted)) OR
(readCmd AND (fileReadDone OR fileReadError OR fileReadAborted)),
hFile := fileOpenHandler,
xBusy => fileClosing,
xDone => fileCloseDone,
xError => fileCloseError,
eError => fileWriteErrorCode);


Проверил. Чтение и запись работают корректно.
USB-Flash извлекается корректно.

Осинский Алексей
18.09.2018, 14:22
Просто для информации:
ФБ (программы) для работы с файлами очень легко проектировать на языке SFC.
Программы получаются наглядными и проще в сопровождении.
К примеру программа для чтения чего-то из файла может выглядеть следующим образом:
38798

Наглядно видно, куда выполнение программы может пойти из текущего состояния и при каких условиях.
И не потребуется в условиях активации каждого блока (xExecute) писать условия перехода на шаг.
Т.е. если программа перешла на шаг ReadFromFile, то файл уже открыт и ФБ чтения может быть активирован просто как


fileRead (xExecute := TRUE);


Почитать о этом замечательном языке проектирования можно в документе PLCopen SFC (https://oscat-ru.weebly.com/) (документ на русском языке).

S.A.D.
18.09.2018, 15:29
о, блин. Это появилось видимо из-за того что подсказка, которую предлагает codesys не соответствует реально имеющимся входам и выходам ФБ. А я дурак проворонил, что не добавил дескриптор. Извините, пожалуйста, что потратил ваше время на такую глупую ошибку. Впредь буду как в старом добром 2.3 всё ручками смотреть в менеджере библиотек, а подсказку отключу чтоб текст не загораживала.


Просто для информации:
ФБ (программы) для работы с файлами очень легко проектировать на языке SFC.
Программы получаются наглядными и проще в сопровождении.
большое спасибо за это замечание. Вполне вероятно, что вы правы, но мне с этими графическими языками наоборот тяжело почему-то. CFC ещё пол беды, но например LD я вообще как вижу, то повесится хочу - дико ненаглядно, неудобно и неинформативно как по мне.

Осинский Алексей
18.09.2018, 16:11
проворонил, что не добавил дескриптор
Рад, что смог помочь.


Впредь буду как в старом добром 2.3 всё ручками смотреть в менеджере библиотек, а подсказку отключу чтоб текст не загораживала.
Используйте возможности дополнения кода.

в CODESYS есть несколько возможностей подсказок имеющихся входов-выходов ФБ
1) Сочетание клавиш CTRL+пробел
вызывает подсказку, из которой можно выбрать входы-выходы, POU с похожими именами (если начали его вводить).
38799
1.1) Например, на рисунке выше я набрал вручную fileClose();
1.2) Установил курсор между скобками и нажал заветное сочетание клавиш
1.3) CDS предложил выбрать одну из возможных переменных
1.4) Если Вы используете доступ к переменным через ИМЯ_ФБ.ИМЯ_ПЕРЕМЕННОЙ, то достаточно набрать "ИМЯ_ФБ." и нажать CTRL+пробел (если включить настройку "Tools - Options - SmartCoding - List components after typing a dot (.)", то нажимать сочетание клавиш после ввода точки не потребуется)

2) Помощник ввода (кнопка F2)
38800
2.1) Нажав F2 выберите "Instance Calls";
2.2) Выберите ФБ, который Вы хотите вызвать
2.3) Нажмите ОК
2.4) CDS вставит заготовку кода для присвоения всех входов\выходов ФБ:
38801



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