PDA

Просмотр полной версии : retain переменные, случайные значения



ribamuka
25.02.2020, 14:07
ПЛК 100

У меня есть раздел в CodeSys:

VAR_GLOBAL RETAIN
head: WORD := 0;
tail: WORD := 0;
END_VAR

Пока я не присваивал значения переменных в ноль, после прошивки (загрузочный проект), переменные ИНОГДА принимали случайные значения.

Два вопроса:

1. Как объяснить, появление случайных значений?
2. Из-за того, что при инициализации переменных я их обнуляю, не может ли получиться так, что в какой-то момент записанные значения заменятся на ноли?
(я потестировал, вроде такого не происходит, но хотелось бы знать наверняка).

Роман Николаевич
25.02.2020, 14:21
пока жестко не обнулил. Куски старых данных по адресам.

ribamuka
25.02.2020, 14:38
Под жестко обнулил, вы что понимаете?

Роман Николаевич
25.02.2020, 15:10
ПЛК 100

У меня есть раздел в CodeSys:

VAR_GLOBAL RETAIN
head: WORD := 0;
tail: WORD := 0;
END_VAR

Пока я не присваивал значения переменных в ноль, после прошивки (загрузочный проект), переменные ИНОГДА принимали случайные значения.

Два вопроса:

1. Как объяснить, появление случайных значений?
2. Из-за того, что при инициализации переменных я их обнуляю, не может ли получиться так, что в какой-то момент записанные значения заменятся на ноли?
(я потестировал, вроде такого не происходит, но хотелось бы знать наверняка).

Когда в начале Вы присваиваете переменной значение 0, то область памяти выделенная под эту переменную забивается 0 и значения не "плавают", когда начальное значение не указываете, то возможно что по адресу выделенному переменной были какие то другие данные и поэтому как вы говорите значения "плавают"

Роман Николаевич
25.02.2020, 15:59
Двоичный (бинарный) файл — в широком смысле: последовательность произвольных байтов. Какая конкретно последовательность бит в области отведенную под переменную изначально была? Или этот файл изначально только 0 был занят? Объявляя переменную и ее начальное значение мы как бы структурируем файл в данной области. Или я в чем то не прав?

Роман Николаевич
25.02.2020, 16:19
так изначально то файл просто набор случайных бит? Почему если не присваивать начальные значения, то иногда проскакивают какие то левые значения как говорит уважаемый ribamuka?

:rolleyes:Я понял. При выключении контроллера в этот файл записываем данные и как бы присваиваем переменным значения, но почему тогда левые значения появляются иногда? если начальные значения не задавать? Может дело в питании и ретайн просто не успевают записаться?

ribamuka
25.02.2020, 16:33
При первом запуске retain переменной неоткуда считаться т.к. в файл они не разу не записались, вот похоже в этом случае в переменной и появляется мусор.

ribamuka
25.02.2020, 17:49
Прошу пояснить, вы как-то отлавливаете потерю питания и пытаетесь в этот момент записать значение переменных?
Если батарея села, как сработает этот механизм?

ribamuka
25.02.2020, 20:58
А я вам скажу, почему у вас проблемы не возникает. Видимо вы не используете встроенные часы. Они зависят от батареи и когда она садится время сбивается на начало времен. Я с этим горя хлебнул. Пришлось написать реализацию протокола NTP и синхронизовывать врем через интеренет. Но это тоже до конца не спасает т.к. сервер времени может умереть. Сейчас думаю на rs232 подключить GPS приемник и с него время получать.

ribamuka
25.02.2020, 21:44
Вы сказали, что ПЛК с 2008 года работает и на батарею не обращали внимание, вот на это я и ответил, что не обращали из-за того, что часы не используете. Мое высказывание к retain не имело никакого отношения.