PDA

Просмотр полной версии : еще раз про аккумулятор или как сохранить ретайн



lajator
14.06.2012, 13:24
решил поднять тему, тк с момента приобретения ПЛК 150 получается, что ретайн переменные не сохраняются.
Поскольку пользователь я неискушенный, то долго не мог понять, почему, то, что должно сохраняться, просто скидывается на начальные значения. Контроллер куплен недавно,не больше года(правда на бирке с зав.номером есть цифры 2010). Ретайн с момента пуска не сохранялись, да и связь с ним терялась сразу же после выкл. основного питания.
Открыл контроллер, меряю тестером, при включенном питании на аккум. 4,2В. По прошествии суток (должен зарядиться), отключаем, связь отваливается сразу, напряжение на аккум.практически мгновенно падает до 1,4В.
Ретайн не сохранились.
Повесил в параллель 3 аккума по 1,2 В , 2100 мА (что было под рукой). Ретайн сохраняются, даже сигнал пропадания питания успевает показать прежде чем связь отвалится. Ток разряда ~140 мА. Отпаял родной, меряю без нагрузки, напряжение 3,2 В , но при маломальской нагрузке 1кОм, падает практически до нуля!!!
Предположим заменю аккум, но если произойдет два подряд выключения , опять пипец.
Как еще можно сохранять значения ретайнов (я не программист и пока писать в файл и затем вынимать нужное мне в программу не умею ,если конечно такое возможно. но по судя по форуму, этим тоже особо пользоваться нельзя )?
это же действительно проблема, которая до сих пор не решена, у других производителей стоит просто часовая батарейка или ионистор...

Frayl
14.06.2012, 13:30
А можно увидеть текст программы?

lajator
14.06.2012, 13:42
А можно увидеть текст программы?

можно завтра? пишу с работы, день давно закончился, у нас уже 20:41..


вот прг

capzap
14.06.2012, 14:54
попробуйте вместо ретайн использовать модбас слейв, переменные хранящиеся в нем будут и глобальными и должны сохранятся при отключении питания. Вдруг поможет

Frayl
14.06.2012, 15:34
просто я много слышал про несохранение retain переменных и причины в большинстве случаев были в коде. Я тоже допускал такие ошибки

Frayl
14.06.2012, 15:41
.... просто скидывается на начальные значения. ...

вот может быть даже кроется здесь разгадка. Именно на начальные? Не в 0? А где вы задаете начальные значения Retain-переменных? В начале цикла, в области объявления переменных?

lara197a
14.06.2012, 15:44
Так-то бесперебойник решит Вашу проблему.

nalnik
14.06.2012, 19:17
Я запарился менять батарейки и сделал так:

Создается файл с именем переменной ретайн.
Одна переменная - один файл.
Постоянно перезаписывать файл нельзя-- упорите флеш.
Записываю по какому либо условию

Запись:
dwHandle := SysFileOpen('Pr_XX.t','w');
SysFileWrite(dwHandle,ADR(Pr_XX),SIZEOF(Pr_XX));
SysFileClose(dwHandle);

Чтение:
dwHandle := SysFileOpen('Pr_XX.t','r');
SysFileRead(dwHandle,ADR(Pr_XXf),SIZEOF(Pr_XXf)-1);
SysFileClose(dwHandle);


Работает.
Pr_XX --- имя переменной
SysLibFile.lib --- добавь библиотеку.

Алексей Дмитриев
14.06.2012, 19:23
>>Ток разряда ~140 мА.
Это Вы хотите сказать, что ток, потребляемый от аккума при выключенном питании контроллера 140 ма? Не слишком-ли для той таблеточки, что там стоит? Скорей всего он прекращает потреблять совсем по прошествии 2...3 минут, то есть когда контроллер совсем прекратит выполнять код, а будет лишь поддержка RAM.

nalnik
14.06.2012, 19:23
попробуйте вместо ретайн использовать модбас слейв, переменные хранящиеся в нем будут и глобальными и должны сохранятся при отключении питания. Вдруг поможет
Не поможет! У меня они и БЫЛИ модбас слейв.

lajator
15.06.2012, 11:13
>>Ток разряда ~140 мА.
Это Вы хотите сказать, что ток, потребляемый от аккума при выключенном питании контроллера 140 ма? Не слишком-ли для той таблеточки, что там стоит? Скорей всего он прекращает потреблять совсем по прошествии 2...3 минут, то есть когда контроллер совсем прекратит выполнять код, а будет лишь поддержка RAM.

да, даже немножко больше, ~ 10 s но это не всегда(тоже думаю, что слишком, у нее емкость всего то 150mAh). Повторное выключение через короткий промежуток времени не вызывает такого броска.
Сейчас проверил, контроллер был включен всю ночь (аккум, мой могучий, три по 1,2Вx2100mAh). Меряю ток заряда = 0,05 mA_типа заряжена, отключаю основное, ток меняет знак и равен ~180..140mA, примерно 10s, потом 0,3..0,7mA. Связь отваливается, но можно соединиться и обязательно можно проследить ошибку "Power down Swith to backup".
ретайн (в глобал ) сохранились как забил.

На родной батарее ни ошибки, ни повторного соединения, ни сохранения ретайн, просто отвалился и все.

lajator
15.06.2012, 11:16
Так-то бесперебойник решит Вашу проблему.


Слишком дорогое решение для одного контроллера

drvlas
16.09.2013, 13:29
Я прошу прощения у модераторов, но вынужден здесь повторить свой пост из другой ветки (http://www.owen.ru/forum/showthread.php?t=10842&page=2&p=119128#post119128). Дело в том, что попал на ту ветку по поиску, написал туда вопрос, а потом увидел, что тема-то в курилке. Я, например, туда не захожу никогда. Потому все же сдублирую здесь, на рабочем месте :)

Просмотрел по форуму стоны народа по поводу аккумулятора (батарейки), а также неоднократные уверения представителей компании в том, что с данным вопросом что-то будут делать (пруфлинк по поводу ПЛК100, интересующего меня).
Да... Получается не очень весело. Ни удобного способа замены аккума, ни штатных мер по его экономному расходованию я так и не увидел. Что из этого следует: на аккум полагаться нельзя.
Собственно, я так и решил пару лет назад. Ни одного ритейна, никаких надежд на аккум, да еще и отпаивали его при выпуске изделий, чтобы не мешал нормально быстро перезапускаться ПЛК (что бы там овеновцы не выдумывали в поддержку своей теории борьбы с погаными сетями - это чушь). Потом, правда, я поставил слежение за питанием из модуля Статистики и научился сбрасывать ПЛК сразу. Аккумы перестали выпаивать, и то хорошо.

Но жизнь требует иногда новых ходов Вот и понадобилось мне перебрасывать данные из ОЗУ во флеш ПЛК. И делаю именно так, как пишет уважаемый Александр:
Цитата Сообщение от Александр Приходько Посмотреть сообщение
По сути Retain каждый может реализовать самостоятельно. Как только получаем фронт отключения питания все жизненно необходимые данные пишем в файл
Работает. Причем, в силу безобразно расточительного использования аккума господами разработчиками, я спокойно прописываю 100 файлов, а процессор все молотит...
Но теперь вот вопрос: при наличии аккумулятора такой "ритейн" работает. А вот если его нет? Если он есть, но сдох? Сумею ли я по-быстрячку прописать ОДИН небольшой файлик (сотня-другая байт), получив КАРАУЛ! от модуля Статистики? Пока вижу, что нет. Отпаял аккум, запустил свою прогу, вырубил питание. Включаю - ни один файл не записался.
Означает ли это, что при полной смерти аккумулятора такой метод сохранения данных из ОЗУ принципиально не работает?
Или у меня просто кривые руки?

Спасибо!

petera
16.09.2013, 16:53
Тут бы контролировать сетевое напряжение 220В до блока питания, например оптопарой брать один полупериод, будет практически прямоугольный импулс 10мс с периодом 20 мс, и завести на вход ПЛК. Не пришло три импульса скажем за 80 мс. Караул! Пишем файл. Наверно емкости конденсаторов фильтра в блоке питания будет достаточно для работы ПЛК на время записи файла.
А если в проекте используется ПЛК+СП270, то в некотороых случаях можно так http://www.owen.ru/forum/showthread.php?t=15707

drvlas
16.09.2013, 17:57
Наверно емкости конденсаторов фильтра в блоке питания будет достаточно для работы ПЛК на время записи файла.А х.з...
Да как-то не хотелось бы ставить внешний монитор питания на такой чЮдесный ПЛК. Кроме того, тут сейчас идет борьба с непонято чем, питание не выключается совсем, а как-то проседает и восстанавливается. Система дуреет.

И хотелось бы все же ответ от предприятия-разработчика. Они-то знают, что происходит в их ПЛК при снятии сигнала "питание нормальное" в модуле Статистики. Сейчас, как я вижу, питание микроконтроллера переключается на резервное (аккумулятор) и уже не имеет значения, медленно ли продолжает угасать внешнее питание или обрывается сразу. Контроллер уже на батарейке - а если ее нет, то он вырубается мгновенно. Только так и можно объяснить тот факт, что никакое, даже весьма быстрое дельце не удается сделать без батарейки после получения сигнала из модуля Статистики.

Сам прочел, плохо понял :) Ну, скажу, какая могла бы быть альтернатива (на нее я и рассчитывал). Если бы на питание МК поступали и внешнее, и от батарейки (грубо говоря, через 2 диода), то отсутствие батарейки привело бы к тому, что напряжение питания плавно (как позволят конденсаторы блока питания) уменьшалось бы от номинала до нуля. Выработался сигнал "авария питания", а процессор еще молотит от этой убываэщей экспоненты. Ну, и за десяток миллисекунд можно было бы прописать во флеш файлик.
Но скорее всего там переключатель на полевичках, а не диоды...

PavelGO
10.01.2014, 11:01
Я запарился менять батарейки и сделал так:

Создается файл с именем переменной ретайн.
Одна переменная - один файл.
Постоянно перезаписывать файл нельзя-- упорите флеш.
Записываю по какому либо условию

Запись:
dwHandle := SysFileOpen('Pr_XX.t','w');
SysFileWrite(dwHandle,ADR(Pr_XX),SIZEOF(Pr_XX));
SysFileClose(dwHandle);

Чтение:
dwHandle := SysFileOpen('Pr_XX.t','r');
SysFileRead(dwHandle,ADR(Pr_XXf),SIZEOF(Pr_XXf)-1);
SysFileClose(dwHandle);


Работает.
Pr_XX --- имя переменной
SysLibFile.lib --- добавь библиотеку.

А с массивом структур прокатит?
Количество контроллеров растёт, а батареи дохнут. Даже только что купленные не работают на акб.

drvlas
10.01.2014, 12:00
Даже только что купленные не работают на акб.Так... бывает, что нужно после складского хранения ПЛК просто тупо дать ему постоять включенным в сеть. У меня попадались экземпляры, которые даже не стартовали, я в сервис сдуру понес. А нужно было подержать включенными...
Все это не снимает моих претензий к создателям ПЛК, ибо вот так затыкаться на посаженном аккуме - какой-то кЕтай получается. Но что делать. Благодарю ОВЕН, что продолжает выпускать этот простой и дешевый ПЛК. Со всеми его тараканами.

PavelGO
10.01.2014, 14:01
Затолкал все переменные в структуру и сделал как nalnik прописал.

Allmax
04.10.2014, 17:51
Здравствуйте!
Работает ли библиотека sislibfile в ПЛК в режиме исполнения (без создания загрузочного проекта)...

capzap
04.10.2014, 18:39
Здравствуйте!
Работает ли библиотека sislibfile в ПЛК в режиме исполнения (без создания загрузочного проекта)...
-
работает

Allmax
05.10.2014, 10:54
Не могу понять почему не происходит сохранение структуры.
Если не сложно - посмотрите проект.
14618

capzap
05.10.2014, 15:02
Не могу понять почему не происходит сохранение структуры.
Если не сложно - посмотрите проект.
14618

Вы как бы умеете пользоваться оператором CASE, работой с файлами?
Может быть файл еще не передался, а Вы уже выполняете функцию закрытия, это же не программирование на компьютере

Allmax
05.10.2014, 15:28
Спасибо!
А как можно определить сколько понадобится времени для сохранения, к примеру 100 байт. Или увеличивать время в таймере, перед закрытием файла пока не получится сохранить?

По поводу CASE и работы с файлами - пока только осваиваю...

capzap
05.10.2014, 15:36
что возвращает функция записи? Отсюда и найдете ответ как контролировать записаны ли все подготовленные для этого данные

Allmax
05.10.2014, 16:48
Точно!!! Спасибо!

жекон
06.10.2014, 02:00
Честно сказать уже столько раз поднимался этот вопрос что наверное набил аскомину и уважаемой техподержке и всем мною глубоуважаемым старожилам сего форума.Я понимаю что судьбу можно обмануть писать эти переменные куда угодно, но почему не зля сделать это стартдными для кодесус методами зачем все эти танцы с бубнами,я специально в последних проектах вывел с модуля статистики ресурс аккумулятора и тут произошло чудо он показывает 600 а переменные не сохраняются,а то прекрасно понял что панечка померла а как это объяснить начальству и всем остальным заинтеросавын лицам

Максим Tomahawk
06.10.2014, 06:10
жекон, из модуля статистики нормально работает только температура процессора ) (http://www.owen.ru/forum/showthread.php?t=14055&page=2&p=145665&viewfull=1#post145665)

2) Сейчас стоит ПЛК на объекте без аккумулятора, и что показывает наш Time to backup power down, s? (Время до разряда аккумулятора) 600 либо 588 секунд. А ничего, что он уже выпаян?
Можете задействовать вход под контакт от реле, сидящего на основном питании, и по пропаже этого сигнала записывать в память то, что вы хотели.

Андрей007
10.01.2015, 17:34
что возвращает функция записи? Отсюда и найдете ответ как контролировать записаны ли все подготовленные для этого данные
Скиньте пожалуйста пример правильной работы с SysLibFile. Как правильно записывать и читать?

Эдуард_Н
12.03.2015, 06:53
При замене аккумуляторов в 2-ух ПЛК160 выяснилось, что установленные на заводе аккумуляторы раздуло. И почему-то в паспорте к ПЛК160 пишут, что установлен LIR2477, на самом деле там LIR2466.

Вольд
12.03.2015, 09:08
При замене аккумуляторов в 2-ух ПЛК160 выяснилось, что установленные на заводе аккумуляторы раздуло. И почему-то в паспорте к ПЛК160 пишут, что установлен LIR2477, на самом деле там LIR2466.
Вздутие аккумулятора говорит о том, что не соблюдаются режимы заряд/разряд. Аккумулятор или перезаряжается или глубоко разряжается. Разработчикам ПЛК надо думать над этим.

murdemon
12.03.2015, 22:10
сохраняй просто в файл и обратно считывай
+ CmpChecksum.lib
Просто вызываешь данный блок в программе и все Retain сохраняются в файл а при запуске берутся из него (это для Codesys V3 для Raspberry PI)
PROGRAM RetainManager
VAR_INPUT
RetainFilePathName : STRING := '/tmp/extend/pccard/SD_MMC0_1/Retain';
SaveFilterTime : TIME := T#5S;
ForceSave : BOOL;
END_VAR
VAR
Init: BOOL;
pRetainFilePathName : POINTER TO STRING;
pCurrentApp : POINTER TO APPLICATION;
RetainAreaSize: __XWORD;
pRetainArea: POINTER TO BYTE;
dwCRCSave: DWORD;
dwCRC: DWORD;
TOF1 : TOF := (PT := SaveFilterTime);
R_TRIG1: R_TRIG;
END_VAR
VAR_OUTPUT
RTSIECResult : RTS_IEC_RESULT;
AttemptSaveCounter: INT;
END_VAR

IF NOT Init THEN
pCurrentApp := AppGetCurrent(ADR(RTSIECResult));
IF RTSIECResult<>0 THEN RETURN; END_IF
RetainAreaSize := AppGetAreaSize(pApp:= pCurrentApp, uiType:= DA_RETAIN, pResult:= ADR(RTSIECResult));
IF RTSIECResult<>0 THEN RETURN; END_IF
pRetainArea := AppGetAreaAddress(pApp:= pCurrentApp, uiType:= DA_RETAIN, pResult:= ADR(RTSIECResult));
IF RTSIECResult<>0 THEN RETURN; END_IF
IF LEN(RetainFilePathName) <> 0 THEN
pRetainFilePathName := ADR(RetainFilePathName);
ELSE
pRetainFilePathName := ADR(pCurrentApp^.szName);
END_IF
RTSIECResult := AppRestoreRetainsFromFile(pCurrentApp, pRetainFilePathName^);
CASE RTSIECResult OF
0: // #define ERR_OK 0x0000
16#1E: // #define ERR_SIGNATURE_MISMATCH 0x001E /* Signature mismatch of an api function */
16#32: // #define ERR_FILE_ERROR 0x0032 /* File error. e.g. cannot open a file for writing because it could be write protected */
ELSE RETURN;
END_CASE
dwCRCSave := CRC32Finish(ulCRC:= CRC32Update(ulCRC:= CRC32Init(), pData:= pRetainArea, ulSize:= RetainAreaSize));
Init := TRUE;
END_IF

R_TRIG1(CLK := ForceSave);

dwCRC := CRC32Finish(ulCRC:= CRC32Update(ulCRC:= CRC32Init(), pData:= pRetainArea, ulSize:= RetainAreaSize));

IF dwCRC <> dwCRCSave OR R_TRIG1.Q THEN
IF NOT TOF1.Q OR R_TRIG1.Q THEN
RTSIECResult := AppStoreRetainsInFile(pCurrentApp, pRetainFilePathName^); // записасать в файл
IF RTSIECResult = 0 THEN
dwCRCSave := dwCRC;
END_IF
AttemptSaveCounter := AttemptSaveCounter + 1;
TOF1(IN := TRUE);
END_IF
END_IF

IF TOF1.Q THEN
TOF1(IN := FALSE);
END_IF

KRUG
16.03.2015, 16:43
я пробовал менять родной аккумулятор на оригинальный но тот тоже долго не протянул, сейчас припаял литиевый от телефона филипс и приклеил к низу верхней платы на 2х стор скотч, по сравнению со штатным очень емкий получился, успевает ретайны записать и еще через неделю остановки правильно время считает, с штатным через пару дней все обнулялось