PDA

Просмотр полной версии : ПЛК110 [M02] Не работает SysLibFile и OwenLibFileAsync с областю постоянной памяти.



saniyo
12.04.2018, 00:57
Доброго всем времени суток.

ПЛК110 [M02] Не работает SysLibFile и OwenLibFileAsync с областью постоянной памяти VAR PERSISTENT RETAIN.

Собственно, приехали, невозможно прочитать данные в эту область, если массив лежит в VAR области все работает.
Пробовал уже буфер делать в VAR и потом через SysMemCpy копировать куда надо, но данные вовремя копирования теряются.

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

Структуры лопатить поотдельности не буду даже не предлагать.

сайз пока 8776 байт.

Ах, да и ещё одна проблема иногда вот такое выскакивает смотрите вложение, при использовании половины памяти ретайн.
Если сделать Clean all и перекомпильнуть - работает до поры, до времени. Но сами понимаете сразу полная с нуля загрузка в ПЛК.

Валенок
12.04.2018, 02:09
проект/очистить все

capzap
12.04.2018, 07:28
че то все смешали в одну кучу. Как библиотека работы с файлами соотноситься с областью объявлений, обычно либо самостоятельно хранят данные через бибку или доверяются исполнительной системе заниматься записью и чтением.

ЗЫ Да и одновременное PERSISTENT RETAIN не должно работать в некоторых случаях http://www.owen.ru/forum/showthread.php?t=7326&p=35956&viewfull=1#post35956

saniyo
12.04.2018, 10:32
А как библиотека работы с файлами соотноситься с областю VAR с которой она работает?

Я храню в постоянной памяти свой файл конфигурации, как туда произвести запись из файла?

capzap
12.04.2018, 10:37
ну так и зачем делать масло масленное, если переменные с пометкой ретайн сохраняются самой операционной системой, зачем паралельно этому самостоятельно сохранять в файл то же самое. Используйте только биюлиотеку, а все эти PERSISTENT RETAIN уберите

Валенок
12.04.2018, 10:41
А как библиотека работы с файлами соотноситься с областю VAR с которой она работает?
"Никак. Ей просто похрену"
(С) Capzap ))

capzap
12.04.2018, 10:43
Никак. Ей просто похрену.

это мои слова, он просто цитировать не умеет

saniyo
12.04.2018, 11:08
Прикиньте ситуацию вам надо забросить данные из внешнего мира в рабочую постоянную память, как ето сделать?

Валенок
12.04.2018, 11:14
.., как ето сделать?
Очень сложный код :
A := B;
//A - постоянная рабочая память. retain
//B - область отображения внешнего мира. Например слейв.

capzap
12.04.2018, 11:46
Прикиньте ситуацию вам надо забросить данные из внешнего мира в рабочую постоянную память, как ето сделать?

Вы считаете на это есть готовый ответ? Во первых как данные попадают из внешнего мира, конфигуратор/библиотека, по модбас/др.протоколы, по rs485, TCP/UDP, через вставленную флешку

saniyo
12.04.2018, 12:45
Из написаного выше думаю и так понятно откуда. Банальность в том что в обратном направлении всё рабоатет, тобиж VAR PERSISTENT RETAIN > FLASH. А обратно нет.

Валенок
12.04.2018, 12:46
.. А обратно нет.
У Вас - нет.

Филоненко Владислав
12.04.2018, 12:49
Вообще-то, если посмотреть на скриншот- просто кончилась память Retain. Уменьшите размер данных и всё.

saniyo
12.04.2018, 18:14
Вообще-то, если посмотреть на скриншот- просто кончилась память Retain. Уменьшите размер данных и всё.

Память ето вторая проблема, она решается clear all ,compile.
Основная проблема как загнать данные из flash в GLOBAL VAR PERSISTENT RETAIN с помощю SysFileLib или аналога от owen. функция read не работает. размер структуры 8кб.

Валенок
12.04.2018, 21:21
функция read не работает.
Снова по новой. У вас - не работает. А так - все норм.


PS
И походу в 8й строке не на 11 на на 14 умножать нужно было.

saniyo
12.04.2018, 23:18
Снова по новой. У вас - не работает. А так - все норм.


PS
И походу в 8й строке не на 11 на на 14 умножать нужно было.

Я извиняюсь, но про какую 8-ю строку разговор, может я что-то пропустил. Подетальней пожалуйста, что и где работает? Оператор присваивания в вашем примере точно работает сомнений нет.





CASE Step OF

0: IF ReadStart THEN
Step := 1;
END_IF
ReadStart := FALSE;

1: dwReadBytes := 0;
SysFileClose (dwFileIndex);
Step := 2;

2: dwFileIndex := SysFileOpen ('sDb_n.txt' , 'r');
Step := 3;

3: dwReadBytes := SysFileRead (dwFileIndex , ADR(sDb) , SIZEOF(sDb));
SysFileSetPos (dwFileIndex, 0 );
IF dwReadBytes <> 0 THEN
Step := 4;
END_IF

4: SysFileClose (dwFileIndex);
Step := 0;
END_CASE


упрощенная реализация для наглядности. Код работает, когда элемент sDb лежит в GLOBAL VAR и НЕ РАБОТАЕТ, когда в GLOBAL VAR PERSISTENT RETAIN.
Каким х.. прочитать куда надо?

Валенок
13.04.2018, 00:04
Когда заболит зуб, стоматологу пришлите его макет (как упрощеный релиз) - пусть лечит. Хрен ли

saniyo
13.04.2018, 12:23
Залил тотже проект в другой плк на прошывке 1.0.72 - работает.
Попоробую продаунгрейтить рабочий плк.

lazy
13.04.2018, 14:57
тоже макет )

3: dwReadBytes := dwReadBytes + SysFileRead (dwFileIndex , ADR(sDb) + dwReadBytes , SIZEOF(sDb) - dwReadBytes );

IF dwReadBytes = SIZEOF(sDb) THEN
SysFileSetPos (dwFileIndex, 0 ); (* зачем здесь? *)
Step := 4;
END_IF

saniyo
13.04.2018, 15:20
На всякий случай чтоб наверняка , типа обнуление всех условий, на сименсе я конечно так не делаю надобности нет, с овном тут другие обстоятельства.

Подтверждаю то что прошивка 67,73 не работает флеш в вар персистент ретайн, а 72 работает вопрос нахрена такую хрень писать


0.3.73 - Исправлено обнуление RETAIN переменных при включении ПЛК с тумблером в положении STOP

0.3.72 - Исправлена работа с RETAIN переменными
- Увеличен RAM-диск до 256кб
- Улучшен обмен по RS-485

0.3.67 - Исправлен обмен при групповых запросах RS-485
- Исправлено появление ошибки 81 на RS-485-1 при корректном опросе

0.3.66 - Исправлена работа с TCP сокетами через библиотеку SysLibSocket.lib
- Добавлена поддержка OwenCloud

0.3.65 - Исправлена возможность перезагрузки ПЛК при работе по RS-485 при нестабильном соединении

0.3.64 - Улучшен обмен по RS-485

0.3.57 - Исправлен механизм Network Variables при обмене между ПЛК на Codesys v2 и v3
- Добавлена поддержка функций побитового чтения/записи в Modbus

0.3.56 - Улучшен обмен по RS-485

0.3.55 - Улучшена работа Modbus TCP при работе с несколькими slave при обрывах связи
- Поправлен функционал сетевых переменных (режим приемника)

0.3.53 - Исправлено чтение файлов при использовании 20 функции Modbus

0.3.52 - Исправлена невозможность повторного подключения к ПЛК при отключении опроса OPC сервера по Modbus TCP

0.3.51 - Добавлена поддержка чипов FTDI2322, подключаемых по USB
- Улучшена совместимость с библиотекой UNM


Где здесь вобще что-то написано про изменения. Вакханалия.

Sergey666
13.04.2018, 18:07
Т.С, в вашем коде примера в 3м стэпе логическая ошибка: как только кол-во байт превысит 0 переход к закрытию файла.

И эти Сименсовские заморочки "Persistent Retain" к чему? Масло-масляное, в КДС работает просто VAR Retain.

capzap
13.04.2018, 18:22
Т.С, в вашем коде примера в 3м стэпе логическая ошибка: как только кол-во байт превысит 0 переход к закрытию файла.

И эти Сименсовские заморочки "Persistent Retain" к чему? Масло-масляное, в КДС работает просто VAR Retain.

отмажется, скажет что упрощенная реализация выложена. А так Ситников правильно делал мне замечание (http://www.owen.ru/forum/showthread.php?t=27498&p=259950&viewfull=1#post259950), вот тут как раз такая же ситуация, если просто VAR, то успевает всю инфу прочесть за цикл контроллера, а если это хитровлюбленная память то приходит сбой на который Вы обратили внимание, в итоге дело не в прошивках, а чисто в коде

saniyo
13.04.2018, 22:28
Нет там никаких ошибок это просто закрытие предыдущего файла. код рабочий работал больше года в старом ПЛК, заменили на новый недоделанный (да и старый тоже недоделанный был) просто заказчик с головой не дружит, пришлось мне с ОВЕН связаться. хотя проект под кодесис есть для интеграции в процессы пальчики оближешь.

saniyo
13.04.2018, 22:44
https://drive.google.com/file/d/11OSSW_8-zMal2pGaZNN3PFIgB7aPnq3I/view?usp=sharing

Пример не работает в 3.0.67, 3.0.73 и работает на 3.0.72. Функция READ не возвращает количество считанных байт там два варианта. Ошыбок никаких в коде нет все что там есть ето вставки из другого кода и подправленные под пример.

saniyo
13.04.2018, 23:14
И кстати да тему можно закрывать, итог незнаю почему но мне перепрошывка помогла на 3.0.72.

saniyo
13.04.2018, 23:27
Ответ на ваши вопросы. Код взят из старой программы где раньше не было входа для подпрограммы. а была глобальная переменная которая поступала из внешнего мира на вход делала свое дело, обнулялась и ложилась обратно для передачи в сеть. здесь я ничего не думал менять так как нефиг делать и так всё работало, код используется только тогда когда идет новая загрузка программы для восстановления данных в структурированной постоянной памяти. Если бы персистент ретайн работало так как написано в мануале на кодесис то этого куска кода и не понадобилось бы.