Страница 1 из 1

Программирование на Step7

Добавлено: 30 янв 2013, 17:02
Автоматизатор
"Плохо, когда не знаешь, да еще и забудешь" (с)

Хочу использовать несколько SFB4 "TON", данные хранить компактно: в одном блоке данных или DB функционального блока. Вроде раньше получалось использовать в качестве типа данных SFB. А сейчас не получается.
КОД.jpg

Re: Программирование на Step7

Добавлено: 30 янв 2013, 17:17
Автоматизатор
Затупил, надо то было всего!!

CALL #WDtimer
IN:=
PT:=
Q :=
ET:=

Re: Программирование на Step7

Добавлено: 30 янв 2013, 17:19
Михайло
:) Теперь на всю жизнь запомнишь!

Re: Программирование на Step7

Добавлено: 30 янв 2013, 17:21
Михайло
Программируй в LD, там код как бы автоматически прописывается... Скопировал блок SFB из дерева на рабочее поле и функция CALL сама создается...

Re: Программирование на Step7

Добавлено: 30 янв 2013, 17:40
Автоматизатор
"call" написать не проблема, просто я неправильно вызывал (масло масленное получалось).

Думаю вообще на st написать. Вот, например, как просто организуется переход к текущему состоянию:

L "MemoryDB".STATE
JL S_0
JU S_00
JU S_01
JU S_02
JU S_03
JU S_04
JU S_05
JU S_06
JU S_07
JU S_08
JU S_09
JU S_10
JU S_11
JU S_12
JU S_13
JU S_14
JU S_15
JU S_16
S_0: NOP 0
S_00: NOP 0

А вот действие в 3 состоянии:

S_03: AN "S11"
= "Auto_Q".FU1_K6
= "Auto_Q".FU1_K13
AN "S12"
= "Auto_Q".FU1_K8
= "Auto_Q".FU1_K14
AN "S31"
= "Auto_Q".FU2_K6
= "Auto_Q".FU2_K13
AN "S32"
= "Auto_Q".FU2_K8
= "Auto_Q".FU2_K14
AN "S3"
= "Auto_Q".FU2_K2
= "Auto_Q".FU2_K5
AN "S4"
= "Auto_Q".FU2_K3
= "Auto_Q".FU2_K6
AN "S17"
= "Auto_Q".FU1_K10
AN "S19"
= "Auto_Q".FU2_K12
AN "S37"
= "Auto_Q".FU2_K10
AN "S39"
= "Auto_Q".FU2_K12

Если написать на LAD, то будет ОЧЕНЬ ГРОМОЗКО!

Re: Программирование на Step7

Добавлено: 30 янв 2013, 17:54
CHANt
Ага, не забудь только что по метке S_0 надо обработать - что если в "MemoryDB".STATE больше числа 17 то обнулить все к чертям и выйти из функции))

А вообще, шаблон для STL я приводил вот здесь - http://asutpforum.ru/viewtopic.php?f=35&t=1450

Re: Программирование на Step7

Добавлено: 31 янв 2013, 08:16
ward
JL: Распределенный переход
Формат
JL <метка>

Адрес Описание

<метка > Символьное имя метки перехода.


Описание
Инструкция JL <метка> (переход по списку) представляет собой распределитель переходов.
За ней следует ряд безусловных переходов на метки (максимум 255 ) и заканчивается этот список перед меткой , указанной в самой инструкции JL<метка>.
Все инструкции списка : JU инструкции.
Номер выполняемого перехода (от 0 до 255) берется из ACCU 1-L-L.
Инструкция JL передает управление одной из JU инструкций, если значение в аккумуляторе меньше общего количества безусловных переходов между инструкцией JL и меткой этой инструкции.

Первая в списке инструкция JU будет выполнена при ACCU 1-L-L=0.
Вторая в списке инструкция JU будет выполнена при ACCU 1-L-L=1, и так далее. Инструкция JL передает управление на метку за последней инструкцией JU в списке если число в аккумуляторе, определяющее номер перехода, больше или равно общему числу переходов в списке .
Список инструкций распределенного перехода не должен содержать других инструкций кроме JU.

Код:

Пример

Комментарий
L MB0 // Загрузка номера перехода в ACCU 1-L-L.
JL LSTX // Переход выполняется при ACCU 1-L-L > 3.
JU SEG0 // Переход выполняется при ACCU 1-L-L = 0.
JU SEG1 // Переход выполняется при ACCU 1-L-L = 1.
JU COMM // Переход выполняется при ACCU 1-L-L = 2.
JU SEG3 // Переход выполняется при ACCU 1-L-L = 3.
LSTX: JU COMM // Конец списка переходов
SEG0: L 0 // Исполняемая инструкция
T MB1
JU COMM
SEG1: L 1 // Исполняемая инструкция
T MB1
JU COMM
SEG3: L 2 // Исполняемая инструкция
T MB1
JU COMM
COMM: L 3
T MB1



В этом примере переменная MB0 содержит число, загружаемое в аккумулятор accumulator 1. Вслед за операцией загрузки следует распределитель переходов JL с меткой LSTX, указывающей на конец списка функций перехода JU.
Номер перехода, который должен быть выполнен, содержится в правом байте аккумулятора accumulator 1. Если этот аккумулятор содержит 0, то выполняется первая функция перехода. Если этот аккумулятор содержит 1, то выполняется вторая функция перехода и так далее.

Если число в аккумуляторе превышает размер списка операторов перехода, то происходит переход на конец списка (на первую инструкцию, следующую за набором функций перехода JU).
JL не зависит ни от каких условий и не изменяет битов состояния.
При этом только выражения с оператором JU, располагающиеся без пробелов, допускаются в списке операторов перехода функции JL.
Назначая произвольные метки для этих операторов перехода, Вы должны придерживаться общих правил для меток.

Re: Программирование на Step7

Добавлено: 31 янв 2013, 08:21
CHANt
В этом примере ошибка!
Перед инструкцией JL используется байт MB0, а по телу программы используется MB1, тогда как должен быть везде один и тот же байт.
ЗЫ: к справке, переведенной на русский язык, надо относится вдумчиво :D Кстати, вместо байта можно использовать INT (целое), но ограничения останутся прежние - 255 переходов максимум.

Re: Программирование на Step7

Добавлено: 31 янв 2013, 10:05
ward
может в этом примере в MB1 записывается номер перехода, которые в MB0, не?? И никаким образом в программой и JL не связан?

А что в русской справке много ошибок?

Re: Программирование на Step7

Добавлено: 31 янв 2013, 10:49
CHANt
ward писал(а):может в этом примере в MB1 записывается номер перехода, которые в MB0, не?? И никаким образом в программой и JL не связан?
Ну может афтор где нибудь и сделал типа:

Код: Выделить всё

L MB1
T MB0
Но тогда надо об этом указывать :D А так как в примере - работать не будет
ward писал(а):А что в русской справке много ошибок?
Люди же переводят. Я не подсчитывал, но попадались.

Re: Программирование на Step7

Добавлено: 31 янв 2013, 11:12
Михайло
ward писал(а):А что в русской справке много ошибок?
Справка по контроллерам не такая уж ущербная как, например, по приводам. Я к своему ужасу у Сименса видел даже что-то типа машинного перевода...

Re: Программирование на Step7

Добавлено: 31 янв 2013, 11:36
CHANt
В примере еще вроде ошибки есть.
В общем, как я понимаю, цель программы перебирать все переходы 0-1-2-3 бесконечно, то листинг будет такой:

Код: Выделить всё

L MB0     		// загружаем номер перехода
JL LSTX			// если больше трех, то переход на метку LSTX
JU SEG0
JU SEG1
JU COMM
JU SEG3
LSTX: L 0                  //в случае если в MB0 попало левое число которое больше 3 или больше 255, то обнулить MB0
T MB0
JU End 

SEG0: L 1 // Исполняемая инструкция 
T MB0 
JU End 

SEG1: L 2 // Исполняемая инструкция 
T MB0 
JU End 

COMM: L 3 // Исполняемая инструкция 
T MB1
JU End 

SEG3: L 0 // Завершить перебор
T MB0 
JU End 

End: NOP 0 //конец подпрограммы (просто выход, можно через BE)

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