Регистрация | Последние сообщения | Персональный список | Поиск | Настройка конференции | Личные данные | Правила конференции | Список участников | Top 64 | Статистика раздела | faq | Что нового v.2.3 | Чат
Skunk Forum - Техника, Наука, Общество » АСУТП »
защита от ошибок переполнения в Codesys

Версия для печати (настроить)

Новая тема | Написать ответ

Подписаться

Автор Тема:   защита от ошибок переполнения в Codesys
kohausen
Junior Member

Сообщений: 14
Регистрация: Декабрь 2006

написано 20 Февраля 2007 11:07ИнфоПравкаОтветитьIP

Работаю с ПЛК Lenze (среда drive developer studio - тот же Codesys,но дополенный фишками от Lenze)...возникла ситуация переполнения диапазона одной переменной....т.е. при ее равенстве нулю из нее вычитается какое-либо число (допустип 1) и переменная принимает знанечение, равное верхнему порогу диапазона...Собсвенно такя ситуация рассматривается в книге Петрова. Но как с ней боротся и отслеживать возникновение таких ситуаций?

Builder
Junior Member

Сообщений: 14
Откуда: Минск
Регистрация: Июль 2006

написано 20 Февраля 2007 12:36ИнфоПравкаОтветитьIP

Я с Codesys не работал, но. А почему нельзя сделать так: if(N>x)x=0;else x=x-1; где N-Ваше число, x-переменная.
А вообще, для контроля переполнения как Вы хотите должно выполняться 2 условия: проц должен поддерживать такие исключения и среда должна поддерживаь. Первое можно заменить 2-м, но в этом случае очень сильно тормозятся программы.

a11oleg
Member

Сообщений: 44
Откуда: Москва,Россия
Регистрация: Июль 2003

написано 20 Февраля 2007 14:31ИнфоПравкаОтветитьIP

Вообще не знаю как в этом плк, но в принципе если в ПЛК включена библиотека SysLibCallBack можно получить исключение expt_fpu_overflow(см Task Configuration/System Events)и обработать его

IP
Member

Сообщений: 54
Откуда: Russia
Регистрация: Июнь 2006

написано 20 Февраля 2007 17:33ИнфоПравкаОтветитьIP

Еще можно объявить переменную с ограничением диапазона значений:
Например x : INT (-10000..10000);
Далее в проект нужно добавить ф-ю CheckRangeSigned (или CheckRangeUnsigned для переменных без знака) и ловить попытку переполнения. Вообще это более для отладки нужно, желательно писать программу так, чтобы переполнение не возникало.

kohausen
Junior Member

Сообщений: 15
Регистрация: Декабрь 2006

написано 22 Февраля 2007 08:54ИнфоПравкаОтветитьIP

IP
можете немного пояснить....данная функция просто сигнализирует о том, что произошло переполнение?

IP
Member

Сообщений: 55
Откуда: Russia
Регистрация: Июнь 2006

написано 22 Февраля 2007 10:21ИнфоПравкаОтветитьIP

Так работает expt_fpu_overflow.

Функция CheckRangeSigned вызывается всегда, перед любым присваиванием значения любой переменной с ограниченным диапазоном. Ее нужно просто вставить в проект. На входе она получает значение (которое пытаемся присвоить в программе), верхнюю и нижнюю границу. Что эта функция вернет, то и будет реально присвоено. Например, если вставить такую функцию:

FUNCTION CheckRangeSigned : DINT
VAR_INPUT
value, lower, upper: DINT;
END_VAR

CheckRangeSigned := 0;

То чтобы мы не пытались присвоить переменной с ограниченным диапазоном, будет получаться 0. Попытки присвоения константы, выходящей за границу, отслеживает компилятор. Данная функция работает во время исполнения.
В основном она применяется в отладочных целях. Можно конечно и в программе использовать, если ограниченных переменных немного.

Аналогичные функции (CheckBounds) применяются для контроля индексов массивов. Например, см. текст игрушки Тетрис , где эта ф-я контролирует выход фигуры за границы игрового поля.

kohausen
Junior Member

Сообщений: 16
Регистрация: Декабрь 2006

написано 22 Февраля 2007 12:08ИнфоПравкаОтветитьIP

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

IP
Member

Сообщений: 56
Откуда: Russia
Регистрация: Июнь 2006

написано 24 Февраля 2007 10:18ИнфоПравкаОтветитьIP

Смотрите внимательно, что написано внутри этой функции! В приведенном мною выше примере ДА.
Но эту функцию пишете Вы и делаете в ней то, ЧТО НАДО. Например, если надо чтобы значение переменной с ограниченным диапазоном никогда не выходило за диапазон, то я пишу ф-ю которая выполняет 'обрезание':

FUNCTION CheckRangeSigned : DINT
VAR_INPUT
value, lower, upper: DINT;
END_VAR

IF (value < lower) THEN
CheckRangeSigned := lower; (*обрезаю по нижней границе*)
ELSIF(value > upper) THEN
CheckRangeSigned := upper; (* обрезаю по верхней границе *)
ELSE
CheckRangeSigned := value; (* отдаю как есть *)
END_IF

Подробнее см. тут.

Сделайте пустой проект и грубо поэкспериментируйте с этой функцией, все станет понятно.
Удачи!

Ваш ответ:

Коды форума
Смайлики


Ник:    Пароль       
Отключить смайлики

Все время MSK

Склеить | Разбить | Закрыть | Переместить | Удалить

Новая тема | Написать ответ
Последние сообщения         
Перейти к:

Свяжитесь с нами | skunksworks.net

Copyright © skunksworks.net, 2000-2018

Разработка и техническая поддержка: skunksworks.net


Рейтинг@Mail.ru Яндекс.Метрика