PDA

Просмотр полной версии : КА и ST программы



ktyjixy
31.01.2013, 12:00
(****кусочек 1******)
CASE i OF
1: i:=i+1;
2: i:=i+1;
3: i:=i+1;
4: i:=i+1;
5: i:=i+1;
6: i:=i+1;
7: i:=i+1;
8: i:=i+1;
9: i:=i+1;
10: i:=1;
END_CASE
(*****кусочек 2****)
IF i=0 THEN i:=i+1; END_IF
IF i=1 THEN i:=i+1; END_IF
IF i=2 THEN i:=i+1; END_IF
IF i=3 THEN i:=i+1; END_IF
IF i=4 THEN i:=i+1; END_IF
IF i=5 THEN i:=i+1; END_IF
IF i=6 THEN i:=0; END_IF
(****кусочек 3******)
//IF udc.reset=TRUE THEN udc.RESET:=FALSE; END_IF

IF udc.CV =0 THEN udc.CU :=TRUE;END_IF
IF udc.CV =1 THEN udc.CU :=TRUE;END_IF
IF udc.CV =2 THEN udc.CU :=TRUE;END_IF
IF udc.CV =3 THEN udc.CU :=TRUE;END_IF
IF udc.CV =4 THEN udc.CU :=TRUE;END_IF

IF udc.Q=TRUE THEN udc.RESET:=TRUE;END_IF
IF udc.CU THEN udc.CU :=FALSE;END_IF

udc (
pv:=5);

(*****кусочек 4*****)
WHILE mainLoop DO

IF i=0 THEN i:=i+1; END_IF
IF i=1 THEN i:=i+1; END_IF
IF i=2 THEN i:=i+1; END_IF
IF i=3 THEN i:=i+1; END_IF
IF i=4 THEN i:=i+1; END_IF
IF i=5 THEN i:=i+1; END_IF
IF i=6 THEN i:=0; END_IF

END_WHILE

(*************)


имеем указанный код^ на ST, скармливаемый CDS v3.5

а теперь ув. знатоки ВОПРОС :confused: ?

какой кусок из перечисленных будет работать как конечный автомат ?
начальная переменная инициализируется снаружи (для отладки).

как реализовать конечный автомат на ST?
как это сделать корректно?

просьба не писать "мне нравится так",
а скомпилить и посмотреть как оно работает,
а потом написать,
я думаю что этот вариант лучше потому что...
будем коллективно обсуждать.

capzap
31.01.2013, 12:44
скачайте базовую библиотеку OSCAT и посмотрите как работает функция INC1
А по поводу кусков выше, написан бред, бесполезно занимающий ресурсы процессора

Yegor
31.01.2013, 13:45
как реализовать конечный автомат на ST?
как это сделать корректно?
(* Избегаем чисел, господа. Избегаем чисел *)
TYPE PROCESS_STAGE :
(InitStage, ProcessingStage, ExposureStage, ProductCoolingStage);
END_TYPE

CASE state OF
InitStage:
(* Do stuff *)
IF Initialized THEN
state := ProcessingStage;
END_IF
ProcessingStage:
(* Do stuff *)
IF Processed THEN
state := ExposureStage;
END_IF
ExposureStage:
(* Do stuff *)
IF ExposureComplete THEN
state := ProductCoolingStage;
END_IF
ProductCoolingStage:
(* Do stuff *)
IF T < 30 THEN
state := InitStage;
END_IF
END_CASEЭто общепринятый подход. Бонусы использования перечислений вместо числовых констант — легко вставлять и удалять состояния, хорошая чиаемость кода.

ktyjixy
31.01.2013, 15:40
Все верно, пример с CASEом понятен и корректен.
видимо я не совсем правильно поставил вопрос.

Правильно так:
Какие конструкции языка используются для описания КА и почему?

почему нельзя использовать несколько условных операторов, а можно только case?

есть ли библиотеки с некой стандартной реализацией КА?
как например на С?

ktyjixy
31.01.2013, 15:44
скачайте базовую библиотеку OSCAT и посмотрите как работает функция INC1
А по поводу кусков выше, написан бред, бесполезно занимающий ресурсы процессора

линки на библиотеку в студию, будем разбирать
написанный выше код, естественно не имеет никакого смысла, вопрос
КАКИЕ ВЫРАЗИТЕЛЬНЫЕ СРЕДСТВА ST ВЫ ИСПОЛЬЗУЕТЕ для реализации КА и почему?

capzap
31.01.2013, 16:45
линки на библиотеку в студию, будем разбирать
написанный выше код, естественно не имеет никакого смысла, вопрос
КАКИЕ ВЫРАЗИТЕЛЬНЫЕ СРЕДСТВА ST ВЫ ИСПОЛЬЗУЕТЕ для реализации КА и почему?

http://oscat.de/downloadmanager/viewdownload/3-oscatbasic/81-oscat-basic-text.html

http://oscat.de/downloadmanager/viewdownload/3-oscatbasic/90-oscat-basic-docu-english.html

Yegor
01.02.2013, 07:21
почему нельзя использовать несколько условных операторов, а можно только case?кАнЕШна МожНА ТоЛьк ЧТМСТЬ кода worsening итц мининг becoms cluttered, u know. «CASE state», «switch(step)» и т.п. это вообще своего рода фразеологизмы в программировании — видя эти два слова, сразу понимаешь, что перед тобой с вероятностью 90% автомат; «IF step = » таким свойством похвастать не может. В других ЯП CASE ещё и быстрее (http://en.wikipedia.org/wiki/Jump_table), чем простыня ифов.
есть ли библиотеки с некой стандартной реализацией КА?Именно библиотек нет, наверное. Можете заполнить эту нишу, если считаете, что спрос будет. Ништяков там всяких наделать — сохранение состояния при выключении питания, пауза и т.п. С gtfox'ом скооперируйтесь (http://www.owen.ru/forum/showthread.php?p=74642).

Игорь Петров
01.02.2013, 14:10
Обязательно на ST?

http://www.codesys.com/typo3temp/pics/bdc8b65ae7.jpg

ktyjixy
04.02.2013, 13:53
Обязательно на ST?

да, вопрос именно по ST.

а что за прилада как на рисунке?
я не знаком, вроде бы как UML statechart в кодесисе

там же мэковская версия КА вроде есть, SFC что ли
чем она не устраивает ?

Валенок
04.02.2013, 16:23
Ну Вам же Егор вполне ясно объяснил - КА можно и из IF, просто выразительней и лаконичней CASE в текстовых языках ничего нет


IF i=0 THEN i:=i+1; END_IF
IF i=1 THEN i:=i+1; END_IF
...
IF i=6 THEN i:=0; END_IF
А это не КА. Если хотите КА из IF сделать, то

IF i=0 THEN i:=i+1;
ELSIF i=1 THEN i:=i+1;
...
ELSIF i=6 THEN i:=0; END_IF
Это КА из IF

Игорь Петров
04.02.2013, 17:14
..вроде бы как UML statechart в кодесисе
Да. Платный плагин CODESYS Professional edition


там же мэковская версия КА вроде есть, SFC что ли чем она не устраивает ?
Совсем иная математика. SFC - это сети Петри.

KA/ST см. Switch-технология. Программирование задач логического управления (http://www.owen.ru/forum/showthread.php?p=74642).