"Плохо, когда не знаешь, да еще и забудешь" (с)
Хочу использовать несколько SFB4 "TON", данные хранить компактно: в одном блоке данных или DB функционального блока. Вроде раньше получалось использовать в качестве типа данных SFB. А сейчас не получается.
Программирование на Step7
- Автоматизатор
- Профессионал
- Сообщения: 993
- Зарегистрирован: 09 окт 2012, 05:18
Программирование на Step7
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- Автоматизатор
- Профессионал
- Сообщения: 993
- Зарегистрирован: 09 окт 2012, 05:18
Re: Программирование на Step7
Затупил, надо то было всего!!
CALL #WDtimer
IN:=
PT:=
Q :=
ET:=
CALL #WDtimer
IN:=
PT:=
Q :=
ET:=
Re: Программирование на Step7
Теперь на всю жизнь запомнишь!
Re: Программирование на Step7
Программируй в LD, там код как бы автоматически прописывается... Скопировал блок SFB из дерева на рабочее поле и функция CALL сама создается...
- Автоматизатор
- Профессионал
- Сообщения: 993
- Зарегистрирован: 09 окт 2012, 05:18
Re: Программирование на Step7
"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, то будет ОЧЕНЬ ГРОМОЗКО!
Думаю вообще на 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
Ага, не забудь только что по метке S_0 надо обработать - что если в "MemoryDB".STATE больше числа 17 то обнулить все к чертям и выйти из функции))
А вообще, шаблон для STL я приводил вот здесь - http://asutpforum.ru/viewtopic.php?f=35&t=1450
А вообще, шаблон для STL я приводил вот здесь - http://asutpforum.ru/viewtopic.php?f=35&t=1450
Re: Программирование на Step7
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.
Назначая произвольные метки для этих операторов перехода, Вы должны придерживаться общих правил для меток.
Формат
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
В этом примере ошибка!
Перед инструкцией JL используется байт MB0, а по телу программы используется MB1, тогда как должен быть везде один и тот же байт.
ЗЫ: к справке, переведенной на русский язык, надо относится вдумчиво Кстати, вместо байта можно использовать INT (целое), но ограничения останутся прежние - 255 переходов максимум.
Перед инструкцией JL используется байт MB0, а по телу программы используется MB1, тогда как должен быть везде один и тот же байт.
ЗЫ: к справке, переведенной на русский язык, надо относится вдумчиво Кстати, вместо байта можно использовать INT (целое), но ограничения останутся прежние - 255 переходов максимум.
Re: Программирование на Step7
может в этом примере в MB1 записывается номер перехода, которые в MB0, не?? И никаким образом в программой и JL не связан?
А что в русской справке много ошибок?
А что в русской справке много ошибок?
Re: Программирование на Step7
Ну может афтор где нибудь и сделал типа:ward писал(а):может в этом примере в MB1 записывается номер перехода, которые в MB0, не?? И никаким образом в программой и JL не связан?
Код: Выделить всё
L MB1
T MB0
Люди же переводят. Я не подсчитывал, но попадались.ward писал(а):А что в русской справке много ошибок?
Re: Программирование на Step7
Справка по контроллерам не такая уж ущербная как, например, по приводам. Я к своему ужасу у Сименса видел даже что-то типа машинного перевода...ward писал(а):А что в русской справке много ошибок?
Re: Программирование на Step7
В примере еще вроде ошибки есть.
В общем, как я понимаю, цель программы перебирать все переходы 0-1-2-3 бесконечно, то листинг будет такой:
Вот при таком листинге, каждый скан контроллера будет выполняться один переход.
В общем, как я понимаю, цель программы перебирать все переходы 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)