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

Многопоточность в ADAM 5510( или прерывания)

 Ответить Ответить Страница  <1234 7>
Автор
Сообщение
QWERT Смотреть выпадающим
Участник
Участник


Присоединился: 10 Апрель 2009
Категория: Afghanistan
Online Status: Offline
Публикации: 55
Свойства публикации Свойства публикации   Ответить, цитируя автора - QWERT Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Тема сообщения: Многопоточность в ADAM 5510( или прерывания)
    Опубликовано: 13 Апрель 2009 16:51
Первоначально опубликовано sanwork

...

Чаще называют  "команд-аппарат", и еще другие названия ........



С вуажением, SAN

[/QUOTE]

Спасибо большое
буду разбираться
Наверх
Максим Ананских Смотреть выпадающим
Действительный член
Действительный член
Аватар

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

Можно ли это организовать с помощью мульти потоков, есть ли Multithreading в библиотеках для ADAM5510? или недокументированное что-нибудь, Или как можно это сделать с помощью прерываний?


Обычно программисты, привыкшие писать программы для ПК, впервые столкнувшись с программированием ПЛК, входят в ступор. Все удобства, к которым они привыкли, здесь зачастую оказываются бесполезными и даже вредными!

Итак:
1. Забудьте многопоточность, как страшный сон. Случаи, когда она действительно нужна, очень редки и, надеюсь, Вам они не попадутся. Я бы не хотел столкнуться с отладкой многопоточной программы на контроллере.
2. Забудьте ООП. Нет никаких объектов, есть функциональные блоки, и все, что с ними можно сделать, это их вызвать. Никакого наследования, никакого полиморфизма!
3. Динамическое распределение памяти - табу. Вся необходимая память отводится заранее.
4. Как можно реже используйте подпрограммы. Алгоритм, хорошо описывающий один технологический объект, может не подойти ко второму таком же. А если и подойдет, с течением времени картина может измениться. Копипаст - вот наш метод!
5. Существует только один цикл. Это цикл сканирования ПЛК. Если нужно повторить какое-то действие, повтори его на следующем цикле сканирования.
6. Научись, наконец, писать комментарии к каждой строчке программы!
7. Используй оператор GOTO... Шутка. Оператор GOTO использовать все равно нельзя!
Инженер-системотехник
+7 (916) 477 3925
Наверх
Максим Ананских Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 14 Май 2003
Online Status: Offline
Публикации: 770
Свойства публикации Свойства публикации   Ответить, цитируя автора - Максим Ананских Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 14 Апрель 2009 00:15
А если серьезно, программа в контроллере выполняет функцию конечного автомата, т.е автомата с конечным числом состояний. Смысл её работы следующий. На входе программы имеется вектор Xn, описывающий состояние управляемого объекта на n-ом цикле выполнения программы. Программа вычисляет вектор управляющего воздействия Yn по формуле:

Yn = F(Xn, Sn-1), где Sn-1 - состояние автомата на предыдущем цикле программы, сохраненное в памяти: Sn-1 = F'(Xn-1, Sn-2).

Интервал времени между n-ым и n-1 циклами, т.е. интервал дискретизации, называют также временем цикла сканирования. Чем он меньше, тем лучше. То есть, программа должна выполняться как можно чаще.

Чтобы программа не оказалась слишком длинной и запутанной, векторы Xn, Sn и Yn можно разбить на векторы меньшей размерности, элементы которых имеют смысловую связь между собой (например, относятся к одному и тому же узлу управляемого объекта), получив таким образом набор векторных уравнений, которые можно вычислять последовательно. Этот процесс называют декомпозицией. Декомпозицию выполняют таким образом, чтобы уравнения имели как можно меньше зависимых членов.

Подробнее см.: http://ru.wikipedia.org/wiki/Автоматное_программирование
Инженер-системотехник
+7 (916) 477 3925
Наверх
globus Смотреть выпадающим
Участник
Участник


Присоединился: 29 Июнь 2007
Категория: Russian Federation
Online Status: Offline
Публикации: 62
Свойства публикации Свойства публикации   Ответить, цитируя автора - globus Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 14 Апрель 2009 07:49
Первоначально опубликовано QWERT


Спасибо большое
буду разбираться

при использовании в проекте машины состояний программа становиться более гибкой и расширить ее функциональность для разработчика не составит особого труда. К тому же в дальнейшем можно создать бланк (некий костяк программы с набором состояний, например: инициализация, работа, обработка ошибок, завершение…) и использовать его в других проектах в качестве основы. Конечно если программа складывает два числа особого смысла нет городить машину состояний но вот если проект большой то рекомендую задуматься на над ее использованием.
С уважением!
Наверх
Leonid Uretsky Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 09 Октябрь 2003
Категория: Russian Federation
Online Status: Offline
Публикации: 187
Свойства публикации Свойства публикации   Ответить, цитируя автора - Leonid Uretsky Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 14 Апрель 2009 08:09
В свое время делал довольно сложную программу для Adam 5510M. Выглядело примерно так:
int main(void)
{
//Инициализация
        while(!PrgStop)
        {
              //Обработка таймеров
              //Обработка регистров, измененных по Modbus TCP
              //Обработка нажатых в терминале клавиш
              //Обработка команд
              //Дискретный ввод
              //Аналоговый ввод
              //Выполнение команд
              //Формирование дискретных выходов
              //Формирование регистров Modbus TCP
        }
}

Там была такая структура
   struct {
     unsigned char Test_Run:1;
     unsigned char Test_Num:4;
     unsigned char Test_Step:5;
     unsigned char Test_Last_Code:2;
     unsigned char Reserv:4;
     } wStat;
Она определяла, какой сейчас шаг программы выполняется. Выполнение команд выглядела так:
switch (wStat.Test_Num)
{
case 1:
       switch (wStat.Test_Step)
       {
       case 0:
       //Действие
       break;
       case 1:
       //Действие
       break;
       .....
break;
case 2:
...
Наверх
QWERT Смотреть выпадающим
Участник
Участник


Присоединился: 10 Апрель 2009
Категория: Afghanistan
Online Status: Offline
Публикации: 55
Свойства публикации Свойства публикации   Ответить, цитируя автора - QWERT Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 14 Апрель 2009 09:57
Первоначально опубликовано Максим Ананских

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

Можно ли это организовать с помощью мульти потоков, есть ли Multithreading в библиотеках для ADAM5510? или недокументированное что-нибудь, Или как можно это сделать с помощью прерываний?


Обычно программисты, привыкшие писать программы для ПК, впервые столкнувшись с программированием ПЛК, входят в ступор. Все удобства, к которым они привыкли, здесь зачастую оказываются бесполезными и даже вредными!

Итак:
1. Забудьте многопоточность, как страшный сон. Случаи, когда она действительно нужна, очень редки и, надеюсь, Вам они не попадутся. Я бы не хотел столкнуться с отладкой многопоточной программы на контроллере.
2. Забудьте ООП. Нет никаких объектов, есть функциональные блоки, и все, что с ними можно сделать, это их вызвать. Никакого наследования, никакого полиморфизма!
3. Динамическое распределение памяти - табу. Вся необходимая память отводится заранее.
4. Как можно реже используйте подпрограммы. Алгоритм, хорошо описывающий один технологический объект, может не подойти ко второму таком же. А если и подойдет, с течением времени картина может измениться. Копипаст - вот наш метод!
5. Существует только один цикл. Это цикл сканирования ПЛК. Если нужно повторить какое-то действие, повтори его на следующем цикле сканирования.
6. Научись, наконец, писать комментарии к каждой строчке программы!
7. Используй оператор GOTO... Шутка. Оператор GOTO использовать все равно нельзя!


ну все примерно доехал
как это есть


ОК!
Спасибо за советы
учтем
Наверх
QWERT Смотреть выпадающим
Участник
Участник


Присоединился: 10 Апрель 2009
Категория: Afghanistan
Online Status: Offline
Публикации: 55
Свойства публикации Свойства публикации   Ответить, цитируя автора - QWERT Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 14 Апрель 2009 09:59
Первоначально опубликовано Leonid Uretsky

В свое время делал довольно сложную программу для Adam 5510M. Выглядело примерно так:
int main(void)
{
//Инициализация
        while(!PrgStop)
        {
              //Обработка таймеров
              //Обработка регистров, измененных по Modbus TCP
              //Обработка нажатых в терминале клавиш
              //Обработка команд
              //Дискретный ввод
              //Аналоговый ввод
              //Выполнение команд
              //Формирование дискретных выходов
              //Формирование регистров Modbus TCP
        }
}

Там была такая структура
   struct {
     unsigned char Test_Run:1;
     unsigned char Test_Num:4;
     unsigned char Test_Step:5;
     unsigned char Test_Last_Code:2;
     unsigned char Reserv:4;
     } wStat;
Она определяла, какой сейчас шаг программы выполняется. Выполнение команд выглядела так:
switch (wStat.Test_Num)
{
case 1:
       switch (wStat.Test_Step)
       {
       case 0:
       //Действие
       break;
       case 1:
       //Действие
       break;
       .....
break;
case 2:
...





я уже попробовал написать
получилось похоже



дзякуй усiм
прикольная штука
Наверх
sanwork Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 08 Март 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 440
Свойства публикации Свойства публикации   Ответить, цитируя автора - sanwork Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 14 Апрель 2009 12:10

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

1. Забудьте многопоточность ...
2. Забудьте ...
3. Как можно реже используйте подпрограммы ... 
5. Не используйте ... 
6.  Не делайте ...

Вы описали контроллер 50-ти летней давности, причем, переключающий свет в подсобке. Да еще и Реального Времени, который применяется далеко не всегда - в основном в ЧПУ ... 

Раньше, во времена ферритовых колец, память считали по битам, а не то что по байтам !  Рады бы - да не было. Тогда и были провозглашены временные постулаты, затянувшиеся на долго ...

Сами Отцы Конечных Автоматов еще в 19-м веке мечтали о море памяти, и свободно рисовали стройную и гибкую схему многозадачной исполнительной машины !

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

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

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

( Да, и забудьте про монстрятно-нагроможденную Windows ... )

С уважением, SAN

Наверх
Максим Ананских Смотреть выпадающим
Действительный член
Действительный член
Аватар

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


Вы описали контроллер 50-ти летней давности, причем, переключающий свет в подсобке. Да еще и Реального Времени, ...


Хоть процитированное Вами и было шуткой, но, как все знают, в каждой шутке есть доля шутки. Поэтому прокомментирую то, с чем не могу согласиться.

1. Контроллер всегда работает в режиме реального времени, поскольку управление без привязки к реальному времени перестает быть управлением. Это следует из ТАУ.
2. В современных ПЛК памяти хоть и не очень много, но вполне достаточно. Стиль их программирования связан не с этим.
3. Многозадачность нынешних Windows берет свое начало в UNIX. В свое время был и другой подход. Я думаю, многие помнят висюче-падучую Win'95... И понимают, чем чревато взаимодействие задач в контроллере.
4. Я не вполне понял определение "одноцикловая многозадачность". В современных контроллерах можно реализовать как вытесняющую, так и невытесняющую многозадачность. Вопрос, стоит ли это делать? В случае вытесняющей многозадачности сразу возникает вопрос с синхронизацией. А затем еще и с отладкой полученной программы.
5. Принцип, мешающий динамическому распределению памяти, всего один. Это принцип обеспечения надежности. Динамическое распределение порождает ряд проблем (сборка мусора, возможность утечки памяти, и т.д.). Но главное даже не в этом. Вы можете придумать ситуацию, в которой может понадобиться динамически выделить память в процессе работы контроллера? Что делать, если эта операция завершится отказом?

Инженер-системотехник
+7 (916) 477 3925
Наверх
sanwork Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 08 Март 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 440
Свойства публикации Свойства публикации   Ответить, цитируя автора - sanwork Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 16 Апрель 2009 23:07

Попробую ответить прямо по номерам Вашим пунктов:

1.
Режим Реального Времени в контроллерах получается сам-собой - его не нужно специально создавать, потому что крутится один общий цикл, и нет перескоков на "подциклы" и "подзадачи". Точный расклад по времени нужен не всегда !
А вот режим Жесткого Реального Времени - это специальный случай, когда несколько процессов нужно точно согласовать во времени. Тут уже пред'являются особые и требования к задачам. Так, например блок программы должен выполняться не быстро и не медленно, а за  гарантированный отрезок времени. И алгоритмы эдесь тоже специальные - линейно-избыточные, конечных ветвлений  и др.
2.
В современных ПЛК (при нынешних технологиях) процессор с 10-20 Мбайт памяти - обычное дело, а вот раздобыть эксклюзив с парой килобайт - надо  попотеть (можно в музее) !
3.
Вытесняющая, не-вытесняющая многозадачность ... ?  В контроллерах не используется ни та ни другая модель !
Для простого управления строится одиночная машина состояний (команд-аппарат), для многосложных систем - не намного сложнее : несколько машин состояний, поставленных рядом.  В обоих случаях главный цикл одинаково обходит все шаги всех задач не застревая.
Просто, при сложных процессах, когда они логически разделяются на несколько блоков, их удобно и естественно также разделить на несколько командаппаратов.
4.
Этот пункт частично был затронут в предыдущем. Можно добавить, что отладка значительно упрощается, когда разные задания, мало связанные между собой, систематизируются и раскладываются по разным задачам, каждая из которых выполняется по своим шагам.
Всё делается на одном уровне, в одном цикле и без всякой путаницы. Благо, что мощности чипов позволют.
Если пытаться организовать как-то иначе, то через пару шагов беспробудно завязнешь - проверено !
Д и забудьте наконец про Windows !
5.
Динамическое выделение памяти - низкоуровневый системный механизм, и никагого влияния на работу программы не оказывает - она работает на высоком уровне, и их интересы никак не пересекаются !
Большинство ПЛК щас делают на базе ПРОМ-ПК, в том числе и ДИН-коробочки вроде АДАМ-а или ВАГА (которые вроде и на ПРОМ-ПК то не похожи). Так что вопрос о том, можно ли программе по ходу дела занять память - уходит в историю.

С уважением, SAN

Наверх
 Ответить Ответить Страница  <1234 7>

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

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