PDA

Просмотр полной версии : подскажите, сохранение данных.



Сергей Борисович
23.09.2010, 09:54
ПЛК100
Счетчик CTU считает деньги в DWORD
Как лучше сделать, чтобы при сбросе счетчика данные сохранились, и таких записей должно быть 30. Я этой цели добился, но при выключении питания всё по 0.
SysLibFile для этих целей кажется не подходит.
Это мой первый проект, подскажите пожалуйста, мозги кипят:(

Филоненко Владислав
23.09.2010, 10:50
Ключевое слово Retain

Сергей Борисович
23.09.2010, 11:11
не понял, поподробнее пожалуйста, где описание почитать, если это блок.

Николаев Андрей
23.09.2010, 12:14
Переменая, в которой Вы накапливаете значение с счетчика должна быть объявлена как Retain - это просто свойство переменной. После этого значение переменной при отключении питания будет сохраняться в энергонезависимой памяти.
Откройте руководство по CoDeSys или Help и почитайте про Retain

Сергей Борисович
23.09.2010, 23:44
Спасибо! Всё получилось.
Только не сразу, я выход со счетчика объявлял как retain, а надо было счетчик CTUD.
Но получилось как хотел, спасибо:)

Николаев Андрей
24.09.2010, 10:46
Не правильно. Можно и так, но не совсем корректно. :)
Вы значение с выхода блока какой то переменной присваиваете... вот её и объявляйте как Retain, не надо весь блок в память вносить.

Сергей Борисович
24.09.2010, 21:28
Блок CTUD переменная на выходе CV, ее я и объявлял как Retain, ничего не получалось. Прочел, что можно весь блок, так и сделал. Почему не коректно?
Теперь на выходе CV я могу %QW8.15.0 поставить, что мне и надо было, чтобы данные на панели отображались.

Николаев Андрей
25.09.2010, 11:58
с ввыхода блока значение присваиваете промежуточной переменной prom1 или schet1...
Эту переменную и сохраняете как retain...
а уж что Вы будете в панель передавать и по каким адресам - вопрос второй. Переменная для панели = schet1...
не мешайте все в кучу - потом легче будет...

Сергей Борисович
26.09.2010, 09:46
Переменную schet1 каким классом объявлять VAR, VAR_OUTPUT, или VAR_GLOBAL?

Николаев Андрей
26.09.2010, 15:09
Если она у Вас используется только в данной программе\подпрограмме, то VAR. Если она будет выходом блока, то var output. Если должна быть доступна сквозняком во всех подпрограммах - var global.
А вообще почитайте обязательно мануал по данному вопросу.
Не нужно читать мануал как книгу, а вот обращаться к нужным рзделам нужно

Сергей Борисович
26.09.2010, 20:31
У меня всего одна программа, подпограмм я не делал, поэтому под словом блок я имею в виду переменную класса VAR типа CTUD Функциональный блок ‘инкрементный / декрементный счетчик’ в составе программы, именно эту переменную я объявил retain. Под словом блок я не имел ввиду новый POU. Мы друг друга правильно понимаем?
Я объявлял выход CTUD как retain класса VAR и var global и ничего не полуалось. Не пробовал как var output.

Николаев Андрей
27.09.2010, 09:46
ну как то так...

Сергей Борисович
27.09.2010, 10:51
Всё правильно, я так и делал, только использовал выход CV а не QU, после выключения питания и включения через 10 мин. данные не сохранялись!
В этой схеме impuls1 объявлен как VAR OUTPUT?

Николаев Андрей
27.09.2010, 13:21
var output Вам не нужен в принципе...
Retain переменная, объявленная таким образом НЕ МОЖЕТ НЕ СОХРАНЯТЬСЯ - проверенно тысячи раз...

Сергей Борисович
01.10.2010, 00:27
Переменная param объявлена как retain
http://owen.ru/forum/attachment.php?attachmentid=2874&stc=1&d=1285880564

Выключаем, включаем через 10 мин. Обнулилось!!!
http://owen.ru/forum/attachment.php?attachmentid=2875&stc=1&d=1285880585

То-же но ОНЛАЙН выключен
http://owen.ru/forum/attachment.php?attachmentid=2876&stc=1&d=1285880639

Что не так? Заранее спасибо.

Сергей Борисович
01.10.2010, 17:01
может какая дополнительная информация нужна? жду ответ.

Николаев Андрей
01.10.2010, 19:11
завтра попробуем...

Сергей Борисович
07.10.2010, 12:20
куда все пропали?

Сергей Борисович
08.10.2010, 09:50
ну пробовали???

Александр Приходько
08.10.2010, 12:06
Здравствуйте. Если я все правильно понял, то проблема у вас с понимнием механизма работы ФБ.

Когда вы запускаете программу, то ваш ФБ начинает производить счет. Естественно у ФБ есть своя локальная память, но она не энергонезависимая! Поэтому если на выход этого блока просто поставить переменную Retain? то ни чего у вас не выйдет. Почему?

Когда происходит отключение питания и разряжается аккумулятор, то данные у вас в RETAIN естественно сохранятся, но сам ФБ счетчика обнулится, поэтому при подаче питания счетчик начнет работать с нуля! И естественно Retain сбросится в 0!

Сергей Борисович
08.10.2010, 16:10
Правильно!!!
Поэтому весь ФБ я объявил как Retain, и всё получилось, но мне написали, что это не совсем корректно.

Николаев Андрей
09.10.2010, 18:04
Попробуйте записывать значение в Retain переменную по команде.
Возможно Вы просто не успеваете в самом начале цикла отследить значение переменной, а в неё уже с выхода счетчика 0 записался...

Сергей Борисович
13.03.2012, 13:24
Теперь другая проблема.
После перезаливки и перезагрузки плк(выкл на 10 мин.) произошло следующее;
на выходе ФБ объявленного как Retain отобразились данные за 25.08.2011 хотя была дата 12.03.2012. Данные ФБ обновляются каждые сутки, и как спустя пол года они вылезли?
Как такое может быть?
Причём на одном плк данные исказились, а на втором всё прошло нормально.
Кто-то объяснит?

Сергей Борисович
17.03.2012, 11:07
На 10-ти контроллерах перезаливка прошла нормально.
Почему на одном вылезли старые данные?

Валенок
17.03.2012, 12:31
перезаливки и перезагрузки плк(выкл на 10 мин.)
Странная процедура.
Вы уверены что все действия для всех 10-ти сделали абсолютно одинаково ?
Что показывает аккумулятор через модуль статистики ?

Сергей Борисович
18.03.2012, 21:02
Почему странная процедура?
Надо обновить программу.
В программе небольшие дополнения, не изменения а дополнения.
Но надо сохранить Retain переменные, для системы диспечеризации.
Поэтому заливаем программу сразу на диск без её обновления по запросу CoDeSys.
Выключаем, ждём 10 мин. и включаем, загружается обновлённая программа со старыми переменными.
Но так происходит не всегда.
Аккумы я не проверял, но контроллер до этого несколько суток был в работе и аккум должен был быть заряжен.
Но это вариант, надо их проверить.
Что может быть ещё?

Сергей Борисович
24.03.2012, 00:23
Странная процедура.
Вы уверены что все действия для всех 10-ти сделали абсолютно одинаково ?
Что показывает аккумулятор через модуль статистики ?

Сегодня ещё один слетел полностью после перезагрузки,
слетело всё,
даже часы с календарём.
Ввёл все настройки, время, дату, выключил, включил и опять всё слетело.
Модуль статистики показывает 588.
Похоже аккум сдох, или не контачет.
Как это проверить?
Ссылку кто-нибудь скиньте.
Спасибо.

capzap
24.03.2012, 06:34
588 это нормальная цифра, у меня и при 300 еще работает. Вскройте плк и проведите внешний осмотр, может железо невыдерживает в среде, которой находится

Дмитрий Артюховский
26.03.2012, 15:09
у меня есть большое количество жалоб клиента на слеты данных из ретайн, в настоящее время убрал все переменные из ретайн области, выполняю самостоятельное сохранение необходимых данных на флеш... Частично решило проблему замена аккумулятора на батарейки... выпаиваем аккумулятор и на контакты подключаю батарейный модуль из 3 АА. Обязательно диод, чтобы ПЛК не пытался заряжать батарейки!

Сергей Борисович
27.03.2012, 11:58
у меня есть большое количество жалоб клиента на слеты данных из ретайн, в настоящее время убрал все переменные из ретайн области, выполняю самостоятельное сохранение необходимых данных на флеш... Частично решило проблему замена аккумулятора на батарейки... выпаиваем аккумулятор и на контакты подключаю батарейный модуль из 3 АА. Обязательно диод, чтобы ПЛК не пытался заряжать батарейки!

Сохранение данных на флеш меня не устраивает, т.к. мне надо сохранять время, оно не должно слетать.
Но за всё время только на 2-ух плк слетело всё.
Всё же будем менять аккум.
С батарейками тоже вариант.

Gans
27.03.2012, 17:19
Здравствуйте Сергей Борисович

Сохранение данных на флеш меня не устраивает, т.к. мне надо сохранять время, оно не должно слетать.
А что мешает каждый раз при запуске проверять корректность даты/времени и если проблемы - брать время с соседнего ПЛК100 или компа и тд?!

Сергей Борисович
27.03.2013, 13:10
Все плк разбросаны по городу, связь через модем-лектус. Приходится каждый раз при отключении питания плк вводить дату и время через панель или дистанционно через лектус.

Сергей Борисович
27.03.2013, 13:21
В плк Retain переменные сохраняются при выключении питания.
Вопрос, как организовать принудительно сохранение Retain переменных?

Сергей Борисович
19.04.2013, 11:01
Подскажите пожалуйста!
как организовать принудительно сохранение Retain переменных?

Yegor
19.04.2013, 12:17
принудительно сохранение Retain переменныхНикак. Зачем? Опишите проблему, и мы попробуем найти иное решение.

Евгений_Томск
19.04.2013, 18:36
Если правильно понимаю, Retain переменные - это обычные переменные,которые всего лишь дополнительно,при помощи встроенной процедуры, сохраняются в файл retain.xxx при выключении и считываются из файла при включении ПЛК.
Может действительно проще самостоятельно сохранять и считывать нужные переменные из файла, по значению переменной power.Или сохранять редко ,при изменеии значений.

Yegor
19.04.2013, 20:44
Негоже системные файлы самому трогать.

Сергей Борисович
23.04.2013, 14:55
Никак. Зачем? Опишите проблему, и мы попробуем найти иное решение.

Почему никак?!
плк ведь это как-то делает!
Проблема следующая:
Когда истекает срок жизни аккума в плк, при выключении плк сохранение Retain переменных не происходит. Аккум не тянет. Мало того, при след. загрузке загружаются Retain переменные сохранённые в прошлый раз. Поэтому, если аккум умирает, надо Retain переменные сохранить до того, как отключится питание.
Вот и вся проблема.
Если это делает плк, значит и моя программа это может делать.
Вопрос, КАК!

capzap
23.04.2013, 15:24
Почему никак?!
плк ведь это как-то делает!
Проблема следующая:
Когда истекает срок жизни аккума в плк, при выключении плк сохранение Retain переменных не происходит. Аккум не тянет. Мало того, при след. загрузке загружаются Retain переменные сохранённые в прошлый раз. Поэтому, если аккум умирает, надо Retain переменные сохранить до того, как отключится питание.
Вот и вся проблема.
Если это делает плк, значит и моя программа это может делать.
Вопрос, КАК!

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

Yegor
23.04.2013, 22:58
Если это делает плк, значит и моя программа это может делать.Без общедоступных функций для вызова процедуры сохранения (их нет) вам остаётся хакать прошивку. Но будь у вас подобные навыки, вы бы не пришли сюда с такими вопросами.

Можно, конечно, отказаться от встроенного механизма retain-переменных и сохранять/загружать данные из файла вручную как вам сказал capzap в другой теме. Но это уже не retain-переменные, да и записывать придётся постоянно, а флэш-память таких приколов не любит. А записать прямо перед отключением питания не получится, т.к. машину времени не изобрели.

Sergey666
24.04.2013, 00:10
Во первых данные можно сохранять ,писать и читать файл .Библиотека и примеры сислибфайл.
При пропадании питания последние актуальные значения сохранить не сможет при дохлом аккумуляторе.(Ни ретайн ни в собственном файле).
Подключить бесперебойник и после факта пропадания питания 220в (фиксировать чем угодно от реле до монитора сети) принудительно останавливать работу , записывать актуальные значения и все...
Геморройно конечно но...:rolleyes:

Филоненко Владислав
25.04.2013, 13:45
Достаточно завести файл, в который при включении питания (очередном) записывать время включения.
А в ретайн добавить текущее время.
И если при следующем включении время в ретайн оказывается раньше времени в файле - то это признак того что ретайн не сохранилось корректно и надо запускать процедуру старта без ретайн или ещё что делать.

Sergey666
26.04.2013, 02:23
Достаточно завести файл, в который при включении питания (очередном) записывать время включения.
А в ретайн добавить текущее время.
И если при следующем включении время в ретайн оказывается раньше времени в файле - то это признак того что ретайн не сохранилось корректно и надо запускать процедуру старта без ретайн или ещё что делать.
Что-то не спится...:rolleyes:
Владислав! В вашем случае время в ретайн ВСЕГДА будет раньше.
(*Плюс еще один вопрос - на сколько процедур записи ресурс флэш памяти в контроллере?*)

Филоненко Владислав
29.04.2013, 08:19
Что-то не спится...:rolleyes:
Владислав! В вашем случае время в ретайн ВСЕГДА будет раньше.
(*Плюс еще один вопрос - на сколько процедур записи ресурс флэш памяти в контроллере?*)

1. Запись в файл, естественно, будет после проверки но перед очередной записью ретайна при выключении, так что при проверке если все ОК - время в файле будет раньше чем в ретейне, а если ретейн не сохранился - то позже.
2. Ресурс флеши - 300кк записей.