Просмотр полной версии : ПЛК150 уходит в перезагруз
Всем привет. У кого есть 150 под рукой. Просьба проверьте этот проект. В момент записи значения в файловый архив уходит в перезагруз. Не могу понять то ли это с кодом что-то, то ли аппаратная глюк. В момент присвоения имени файла, как только начинает отрабатывать программный блок Write_file. По началу всё работало. Потом решил немного оптимизировать код и тут пошло не так всё. Для проверки в программном блоке достаточно перевести переменную set_time в Истина и потом обратно в Ложь в Time_Date (prg). Через полминуты, по достижению времени записи должна записаться переменная. Пусть хоть нулевое значение. но должна произойти запись. Если на вашем плк никакого перезагруза нет , значит аппаратный сбой.. Спасибо
Всем привет. У кого есть 150 под рукой. Просьба проверьте этот проект. В момент записи значения в файловый архив уходит в перезагруз. Не могу понять то ли это с кодом что-то, то ли аппаратная глюк. В момент присвоения имени файла, как только начинает отрабатывать программный блок Write_file. По началу всё работало. Потом решил немного оптимизировать код и тут пошло не так всё. Для проверки в программном блоке достаточно перевести переменную set_time в Истина и потом обратно в Ложь в Time_Date (prg). Через полминуты, по достижению времени записи должна записаться переменная. Пусть хоть нулевое значение. но должна произойти запись. Если на вашем плк никакого перезагруза нет , значит аппаратный сбой.. Спасибо
А режиме симуляции не запускается. Пишет, что якобы индекс массива не верный. Индекс как индекс . Типа INT...???????
приборист
01.11.2014, 17:27
Смотрите на размерность массива и обращениям к его элементам.
Скорее всего вылетает за границы.
В том то и дело, что работало всё изначально. Я нарадоваться не мог. А потом бац и всё..Вот я и хочу понять, то ли сам ПЛК аппаратно не способен открыть файл. Файловая система накрылась. То уж придётся заново что-то придумывать писать.
ну так сравните эти две строчки
n: INT:=0;и
My_Data: ARRAY[1..45] OF My_Type;в коде нет проверки, что переменная _day имеет значение в пределах диапазона массива. Не могу представить что день из RTC может иметь значение более 31,тем более больше 45, а вот ноль вполне может быть если что то пошло не так при определении даты
Да не получается...Какая то фигня ..Симулятор так и не позволяет сделать старт..
Николаев Андрей
02.11.2014, 12:46
Опишите подробнее работу с файлами.
Как часто создаете новые файлы? Удаляете старые? Как часто переименуете существующие файлы?
Работа задумана так. Раз в сутки значение счётчика заносится в модуль "Архив" для работы со скадой. Тут вопросов нет. Работает. Одновременно для того, чтобы иметь возможность просмотра с панели оператора за определённый день, эти же данные должны записываться в файловую систему. Имя файла для удобства присваивается конвертируемое в Стринг значение даты (см. Date_compare). Значения времени в Time_Date я установил константы. Это пока на время отладки. Чтобы ускорить прохождение суток. При запросе с панели. Значения запрашиваемого года, дня и месяца упаковываются и потом конвертируются в Стринг. Чтобы открыть файл с таким же именем. Поначалу у меня всё и работало. Я уже думал приступить к разработке програмного модуля для удаления (или переименовывания) файлов записанных более 45 дней назад. Но тут что-то пошло не так. И да действительн,о нужно будет мне продумать корректный индекс массива что бы не было наложений одинаковых дней месяца. Но это уже несколько другая тема. Сейчас массив можно задать 31 . Если не трудно просто залейте в ПЛК (у меня просто нет запасного), установите время в Time_Date подождите полминуты. Когда время наступит 23ч 59м 58 с. Должна произойти запись. Пусть нулевого значения , но это должно произойти. У меня есть подозрения, что проблема с ПЛК, а не с кодом. Похоже я его ушатал..но нужна уверенность
Работа задумана так. Раз в сутки значение счётчика заносится в модуль "Архив" для работы со скадой. Тут вопросов нет. Работает. Одновременно для того, чтобы иметь возможность просмотра с панели оператора за определённый день, эти же данные должны записываться в файловую систему. Имя файла для удобства присваивается конвертируемое в Стринг значение даты . Значения времени (23ч 59м 30с)в Time_Date я установил константы. Это пока на время отладки. Чтобы ускорить прохождение суток. При запросе с панели. Значения запрашиваемого года, дня и месяца упаковываются и потом конвертируются в Стринг (см. Date_compare) . Чтобы открыть файл с таким же именем. Поначалу у меня всё и работало. Я уже думал приступить к разработке програмного модуля для удаления (или переименовывания) файлов записанных более 45 дней назад. Но тут что-то пошло не так. И да действительн,о нужно будет мне продумать корректный индекс массива что бы не было наложений одинаковых дней месяца. Но это уже несколько другая тема. Сейчас массив можно задать 31 . Если не трудно просто залейте в ПЛК (у меня просто нет запасного), установите время в Time_Date подождите полминуты. Когда время наступит 23ч 59м 58 с. Должна произойти запись. Пусть нулевого значения , но это должно произойти. У меня есть подозрения, что проблема с ПЛК, а не с кодом. Похоже я его ушатал..но нужна уверенность
СМ последнее сообщение..в предыдущем ошибки
Да не получается...Какая то фигня ..Симулятор так и не позволяет сделать старт..
эмулятор и не будет работать, реальные часы есть только в реальном плк, ну или хотя бы winNT. Если Вы, как говорите, локализовали проблему, то создайте новый проект с одной лишь функцией записи в файл, а то в выложенном проекте не оптимизация была, а ядерная война
Нашёл ПЛК 100 залил проект -вроде работает. Видно действительно что-то с файловой системой у ПЛК150. Но есть вопрос. Написал prg по удалению файлов. Работает.
PROGRAM Delite_file
VAR
Diff_time:TIME:=t#45d;
_Diff_time:TIME:=t#45d;
Current_day, last_day, _last_day: DATE;
END_VAR
(*Удаление лишних файлов *)
last_day:=DT_TO_DATE (DateTime - Diff_time); (*Находим день отстоящий на 45 дней назад*)
strFileName:= DATE_TO_STRING (last_day); (*Присваиваем имени файла этот день. Для этого преобразуем в Стринг*)
SysFileDelete(strFileName); (*Удаляем файл старее 45 дней*)
(*Повторное удаление в случае отключения ПЛК на срок до 90 дней*)
_last_day:=last_day - _Diff_time; (*Находим день отстоящий на 90 дней назад*)
strFileName:= DATE_TO_STRING ( _last_day ); (*Присваиваем имени файла этот день. Для этого преобразуем в Стринг*)
SysFileDelete(strFileName); (*Удаляем файл старее 90 дней*)
Может кто подскажет как это сделать более изящно. Может вызвать как-то список всех файлов. Наподобии как ПЛК Браузере или ещё как.. Спасибо
Powered by vBulletin® Version 4.2.3 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot