Современные технологии автоматизации» («СТА») —  журнал для квалифицированных специалистов по промышленной автоматизации Форум СТА — современные технологии автоматизации Домашняя страница
Домашняя страница форума CTA Домашняя страница форума CTA > II. АСУТП и SCADA > ПЛК и микроконтроллеры
  Активные темы Активные темы
  FAQ FAQ  Искать в форуме   Зарегистрироваться Зарегистрироваться  Вход в систему Вход в систему

Глобальные переменные

 Ответить Ответить Страница  12>
Автор
Сообщение
viktorz Смотреть выпадающим
Новичок
Новичок


Присоединился: 03 Декабрь 2008
Категория: Russian Federation
Online Status: Offline
Публикации: 11
Свойства публикации Свойства публикации   Ответить, цитируя автора - viktorz Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Тема сообщения: Глобальные переменные
    Опубликовано: 24 Ноябрь 2009 13:22
Можно ли вообще обойтись без них?
в каком случае без глобальных переменных не обойтись.

Скажем создал две задачи и одной цикл 10 мс (T1) , у второй 1сек (T2). Что обмениваться данными между задачами можно же в задаче T2 написать T1.var1, где var1 - внутренняя переменная задачи T1. Попробовал работает. точно также и с массивами.
Заранее спасибо.
Наверх
_IP_ Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 29 Январь 2004
Категория: Russian Federation
Online Status: Offline
Публикации: 293
Свойства публикации Свойства публикации   Ответить, цитируя автора - _IP_ Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 25 Ноябрь 2009 11:31
Философский вопрос
Можно обойтись. Но:
1) если переменные действительно общие и логически не принадлежат ни одной задаче, (например время суток) то логично им быть глобальными с объявлениями отделенными от задач?
2)концепция глобальных переменных проста и понятна. Их обожают начинающие. Хочется писать понятные программы, дабы иметь возможность скинуть с себя сопровождение.
3)развитие глобальных переменных вылилось в сетевые переменные. Задачи можно раскидать по нескольким ПЛК. Их глобальные переменные просто объявляем сетевыми.
4)в ПЛК всегда есть глобальные переменные, как минимум это образы входов/выходов.
5)в системах с реальной многозадачностью (такое бывает в ПЛК), одна задача может сбойнуть/подвиснуть и будет снята. Лобовое обращение типа T1.var1 тут потенциально опасно.
В идеале задачи вообще должны быть независимыми. В будущей редакции стандарта МЭК 61131-3 даже вырисовывается такая штука как приложения. Это очень крутые задачи с индивидуальными образами входов/выходов, которые можно автономно останавливать, запускать, изменять и отлаживать. Получается несколько виртуальных ПЛК в одном.
Стратегически, лучше бы общие переменные запихнуть в некие объекты (блоки) и снабдить их интерфейсом для обеспечения целостного безопасного доступа всеми. Но это уже ООП, что опять же, относится к будущей редакции стандарта МЭК.
Наверх
Максим Ананских Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 14 Май 2003
Online Status: Offline
Публикации: 770
Свойства публикации Свойства публикации   Ответить, цитируя автора - Максим Ананских Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 25 Ноябрь 2009 20:02
Первоначально опубликовано _IP_

5)в системах с реальной многозадачностью (такое бывает в ПЛК), одна задача может сбойнуть/подвиснуть и будет снята. Лобовое обращение типа T1.var1 тут потенциально опасно.

Вот здесь нужны Ваши пояснения. Если задачи выполняются в "плоской" памяти, в общем адресном пространстве и в одном потоке, то что здесь потенциально опасного? А если это разные потоки и разные адресные пространства, как то принято в многозадачных системах, то какие тут могут быть глобальные переменные? И где общепринятые средства блокировки и синхронизации - всевозможные мьютексы, семафоры и мейлбоксы?
Инженер-системотехник
+7 (916) 477 3925
Наверх
_IP_ Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 29 Январь 2004
Категория: Russian Federation
Online Status: Offline
Публикации: 293
Свойства публикации Свойства публикации   Ответить, цитируя автора - _IP_ Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 26 Ноябрь 2009 12:34
Задачи МЭК запускаются как нити. При вытесняющей многозадачности всегда есть опасность работы с общими данными. 1 оператор МЭК программы может разворачиваться в несколько в машинном коде, особенно при программной реализации реал и длинных типов, более приоритетная задача может влезть и все испортить. Конечно, тут нужны семафоры и пр.
ИМХО 99% МЭК программ однозадачные. Для CoDeSys я видел всего 2 реальные огромные МЭК программы с десятками циклических и событийных задач (авторы команды из Германии и Италии). Поэтому возникает вопрос, стоит ли эту тему вообще обсуждать применительно к программированию ПЛК? Широкого отклика это не имеет.
Наверх
Максим Ананских Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 14 Май 2003
Online Status: Offline
Публикации: 770
Свойства публикации Свойства публикации   Ответить, цитируя автора - Максим Ананских Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 26 Ноябрь 2009 14:18
Я думаю, что стоит. Хотя бы для того, чтобы люди осознавали, с чем им придется столкнуться при использовании многозадачности. Именно поэтому я заострил внимание на этом вопросе с глобальными переменными. Судя по тому, что переменные каждой задачи доступны для других задач, память у всех задач общая. Поэтому не важно, является переменная глобальной или нет - фактически, глобальными можно считать все переменные. В то же время, я не вижу принципиальной опасности при использовании одной переменной в разных задачах. Обновление одной переменной - это одна машинная операция. Опасность может возникать при работе с более сложными структурами - например, со строками.
Инженер-системотехник
+7 (916) 477 3925
Наверх
_IP_ Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 29 Январь 2004
Категория: Russian Federation
Online Status: Offline
Публикации: 293
Свойства публикации Свойства публикации   Ответить, цитируя автора - _IP_ Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 27 Ноябрь 2009 14:21
Первоначально опубликовано Максим Ананских

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

Ну мы же пишем правильные МЭК программы, без трюков извращенских . Все переменные размещает компилятор статически. Он четко следит за пересечением областей. Хороший компилятор даже умеет генерить исключения при залезании в чужую память, даже при попытке записи в массив за его пределы. Глобальные /локальные – области видимости. Они помогают людям избежать ляпов.
Первоначально опубликовано Максим Ананских

В то же время, я не вижу принципиальной опасности при использовании одной переменной в разных задачах. Обновление одной переменной - это одна машинная операция.

Не всегда. 1) ПЛК может иметь 8 или 16 бит проц. Для него простое сложение двух DINT это 20-30 машинных команд. Есть бит проц с эмуляцией мат сопроцессора. 2) Умножение REAL может состоять из 200 машинных команд. 3) Совсем нежданно: в PC совместимых и многих др. проц. нет битовой памяти, запись дискретного выхода (1 бит) у них это несколько команд. 4) Может одна задача проверить значение атомарной переменной на допустимость (например, <> 0) и спокойно перейти к своим вычислениям (например, делить нечто на ее значение) или логическим последовательностям, и в этот момент другая задача возьмет и изменит переменную (допустим, обнулит) и полный капут. Оттестить такие штуки не реально. Может год работать, а под куранты сделать бах. Можно и еще хуже примеры придумать. Они есть в литературе для программистов по многозадачным системам. Для МЭК тут особой специфики нет.
Наверх
Максим Ананских Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 14 Май 2003
Online Status: Offline
Публикации: 770
Свойства публикации Свойства публикации   Ответить, цитируя автора - Максим Ананских Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 28 Ноябрь 2009 16:29
Первоначально опубликовано _IP_

1) ПЛК может иметь 8 или 16 бит проц. Для него простое сложение двух DINT это 20-30 машинных команд. Есть бит проц с эмуляцией мат сопроцессора. 2) Умножение REAL может состоять из 200 машинных команд. 3) Совсем нежданно: в PC совместимых и многих др. проц. нет битовой памяти, запись дискретного выхода (1 бит) у них это несколько команд.


Ну мы же не будем всерьез рассматривать 8-разрядные ПЛК? Не важно, насколько сложное действие мы выполняем, будь то умножение или изменение одного бита, запись результата в ячейку памяти - это одна машинная инструкция. Согласен, в 16-разрядных контроллерах проблемы могут начаться уже при записи 32-битных переменных.

Первоначально опубликовано _IP_

4) Может одна задача проверить значение атомарной переменной на допустимость (например, <> 0) и спокойно перейти к своим вычислениям (например, делить нечто на ее значение) или логическим последовательностям, и в этот момент другая задача возьмет и изменит переменную (допустим, обнулит) и полный капут. Оттестить такие штуки не реально.


А вот это, действительно, очень серьезная опасность. Именно наличие таких эффектов и является причиной, по которой необходимо обсуждать проблемы многозадачности.
Инженер-системотехник
+7 (916) 477 3925
Наверх
_IP_ Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 29 Январь 2004
Категория: Russian Federation
Online Status: Offline
Публикации: 293
Свойства публикации Свойства публикации   Ответить, цитируя автора - _IP_ Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 30 Ноябрь 2009 12:26
Первоначально опубликовано Максим Ананских

Ну мы же не будем всерьез рассматривать 8-разрядные ПЛК?

Стратегически ДА, но... Изначально при разработке CoDeSys V3 была установка не поддерживать 8 и 16 бит системы. Однако эволюция развивается по спирали. Появились распределенные системы, программируемые реле, параметризованные устройства и др. простейшие. Все это массово делают на AVR, PIC и Infineon C16x. Хотим, не хотим, заказчикам надо. Короче, 16 бит компилятор уже сделали... + Стандарт МЭК не ограничивает разрядность проц.

Первоначально опубликовано Максим Ананских

...изменение одного бита, запись результата в ячейку памяти - это одна машинная инструкция.

Нет. Рассмотрим установку 1го бита в 32 бит системе (проц. общего назначения). Машинные команды: 1)прочитать 32 бит ячейку памяти в аккумулятор, 2) логическое ИЛИ аккумулятора с маской (и вот тут упс, другая задача эту ячейку памяти поменяла) 3) записать значение из аккумулятора в память (и испортить результат второй задачи).
Наверх
Максим Ананских Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 14 Май 2003
Online Status: Offline
Публикации: 770
Свойства публикации Свойства публикации   Ответить, цитируя автора - Максим Ананских Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 30 Ноябрь 2009 16:48
Первоначально опубликовано _IP_

Рассмотрим установку 1го бита в 32 бит системе (проц. общего назначения). Машинные команды: 1)прочитать 32 бит ячейку памяти в аккумулятор, 2) логическое ИЛИ аккумулятора с маской (и вот тут упс, другая задача эту ячейку памяти поменяла) 3) записать значение из аккумулятора в память (и испортить результат второй задачи)


Вы правы, Игорь, я как-то не подумал, что другая задача может захотеть изменить другой бит в то же время. И это еще одна иллюстрация того, насколько все неочевидно при использовании многопоточности. Впрочем, система программирования могла бы включать в себя средства, предотвращающие возможность возникновения конфликтов между задачами. А что сделано в CoDeSys для этого?

Всех интересующихся этой темой я могу отослать к её предыдущему обсуждению в позапрошлом году:
http://forum.cta.ru/forum_posts.asp?TID=2270
Инженер-системотехник
+7 (916) 477 3925
Наверх
Dismay Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 01 Июнь 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 464
Свойства публикации Свойства публикации   Ответить, цитируя автора - Dismay Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 01 Декабрь 2009 04:38
Первоначально опубликовано viktorz

Можно ли вообще обойтись без них?
в каком случае без глобальных переменных не обойтись.

Скажем создал две задачи и одной цикл 10 мс (T1) , у второй 1сек (T2). Что обмениваться данными между задачами можно же в задаче T2 написать T1.var1, где var1 - внутренняя переменная задачи T1. Попробовал работает. точно также и с массивами.
Заранее спасибо.

Три четыре месяца назад были созданы подобные алгоритмы. В системе не предусматривающей синхронизации доступа в принципе. Захватом и инкапсуляцией данных на начальном этапе так же пренебрегли. Мотивировали сие тем, что в результате применения новейших нано технологий мультизадачный контроллер сам все разрулит.
Два алгоритма выполняются раз в секунду. Один из алгоритмов периодически пишет переменную типа BOOL в другом. Результат: Вчера доподлинно установил, что переменная меняется по ходу выполнения алгоритма потребителя, нарушая его работу. Периодически переменная вообще не воспринимается алгоритмом потребителем приводя к редким "окнам" в выполнении. Вывод: При взаимодействии двух независимых задач (процессов) применение синхронизации, инкапсуляции, методов Invoke (запроса на обработку или подобных механизмов основанных на событиях) могут быть не всегда очевидными. Но их отсутствие приводит к очень трудно отслеживаемым ошибкам...   
Наверх
 Ответить Ответить Страница  12>

Переход на форум Права доступа на форуме Смотреть выпадающим

Bulletin Board Software by Web Wiz Forums® version 9.64
Powered by Web Wiz Forums Free Express Edition
Copyright ©2001-2009 Web Wiz