Фронты в LD UNITY PRO

Модератор: SaniOK

Фронты в LD UNITY PRO

Сообщение san » 21 сен 2012, 08:27

Давеча заметил интересную весчь. Но перед этим немного предистории.
В PL7 все переменные были только EBOOL, BOOLом были только биты слов (например %MWx.y, %IWr.s.m.y %SWx.y). EBOOL содержит кроме самого булевого значения (TRUE/FALSE) ещё предыдущее значение и факт форсирования. Исходя из этого во всех языках ловились фронты: сравнивались предыдущее и текущее значение и если они отличались - срабатывал передний или задний фронт. В ладере это были катушки -|P|- и -|N|- , в ST - операторы RE и FE. Понятное дело что с битами слов такая штука не конала, так как это был "вечный фронт".
В UNITY PRO всё стало по другому.
1) при обращении к ячейкам %S, обращаешся к BOOL а не к EBOOL
2) RE и FE это уже функции, но аргументом для них по прежнему является только EBOOL
3) контакты -|P|- и -|N|- работают ДАЖЕ с BOOL, и работатют так же странно (чуть ниже объясню) как и с EBOOL
Факт 3 обнаружил случайно, на одном из семинаров по UNITY PRO, причем в таком тоне, что типа "сейчас вы увидите что -|P|- с BOOL корректно не работает ", был небольшой облом конечно, но с кем не бывает :-) .
Очевидно (ИМХО) механизм отлова фронтов заложен в самом LD, то есть где-то в данных секции LD, отведено место под сохранение предыдущего значения. Так вот, странность заключается в том, что при вызове секции подпрограммы SR написанной на LD, срабатывает условие только один раз, хоть в переменную никто больше ничего не записывал.
Вот такие мои наблюдения. Может кто-то более прояснит ситуацию?
Аватар пользователя
san
 
Сообщений: 883
Зарегистрирован: 05 мар 2012, 11:59
Откуда: Киев, Национальный университет пищевых технологий, каф.ИАСУ
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Пункты репутации: 21

Re: Фронты в LD UNITY PRO

Сообщение Yaroslav Polyanskij » 21 сен 2012, 14:11

Поясните, пожалуйста, фразу:
"при вызове секции подпрограммы SR написанной на LD, срабатывает условие только один раз, хоть в переменную никто больше ничего не записывал"
Какое условие срабатывает только один раз? Какая переменная имеется ввиду, та что вызвала запуск подпрограммы?
Yaroslav Polyanskij
 
Сообщений: 18
Зарегистрирован: 24 июл 2012, 16:46
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 3

Re: Фронты в LD UNITY PRO

Сообщение san » 21 сен 2012, 14:28

Например программа в секции MAST:
Код: выделить все
var1:=%S6;
%MW100:=inc_int1; sr1();inc_int1:=%MW100;
%MW100:=inc_int2; sr1();inc_int2:=%MW100;

Содержание SR1
Изображение
Таблица анимаций
Изображение
Где-то так...
Вложения
Рисунок2.png
Таблица анимаций в режиме выполнения
(14.18 KiB) Скачиваний: 248
Рисунок1.png
Подпрограмма sr1
(1.42 KiB) Скачиваний: 239
Аватар пользователя
san
 
Сообщений: 883
Зарегистрирован: 05 мар 2012, 11:59
Откуда: Киев, Национальный университет пищевых технологий, каф.ИАСУ
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Пункты репутации: 21

Re: Фронты в LD UNITY PRO

Сообщение Yaroslav Polyanskij » 24 сен 2012, 11:12

Добавил функцию Return в конце подпрограммы, но ситуация не изменилась, и подпрограмма обрабатывается только один раз.

Заметил, что если сделать две одинаковые подпрограммы на LD, аналогичные той, что представлена постом выше, и внести изменения в программу на ST, то все будет работать корректно.
Пример программы на ST:
var1:=%S6;
%MW100:=inc_int1; sr1();inc_int1:=%MW100;
%MW100:=inc_int2; sr2();inc_int2:=%MW100;
Yaroslav Polyanskij
 
Сообщений: 18
Зарегистрирован: 24 июл 2012, 16:46
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 3

Re: Фронты в LD UNITY PRO

Сообщение san » 24 сен 2012, 12:11

Yaroslav Polyanskij писал(а):Заметил, что если сделать две одинаковые подпрограммы на LD, аналогичные той, что представлена постом выше, и внести изменения в программу на ST, то все будет работать корректно.

Это ещё раз потверждает тот факт, что предыдущее значение он запоминает в самой секции программы.
Аватар пользователя
san
 
Сообщений: 883
Зарегистрирован: 05 мар 2012, 11:59
Откуда: Киев, Национальный университет пищевых технологий, каф.ИАСУ
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Пункты репутации: 21

Re: Фронты в LD UNITY PRO

Сообщение Yaroslav Polyanskij » 24 сен 2012, 14:19

При этом, если заменить тип переменной var1 с BOOL на EBOOL, то подпрограмма на LD также будет обрабатываться один раз.
Если же подпрограмму написать на ST (переменная var1 будет типа EBOOL), то программа исполняется правильно.
Yaroslav Polyanskij
 
Сообщений: 18
Зарегистрирован: 24 июл 2012, 16:46
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 3

Re: Фронты в LD UNITY PRO

Сообщение san » 24 сен 2012, 14:42

Yaroslav Polyanskij писал(а):При этом, если заменить тип переменной var1 с BOOL на EBOOL, то подпрограмма на LD также будет обрабатываться один раз.
Если же подпрограмму написать на ST (переменная var1 будет типа EBOOL), то программа исполняется правильно.

На ST фронты можно ловить только функциями FE и RE, а это в UNITY PRO не одно и то же, что контакты с фронтами. В контактах можно пользоваться только EBOOL. Функции можно в ладере тоже использовать, но тоже только с EBOOL и всё будет корректно работать, так как ресурсы EBOOL не зависят от количество вызовов за цикл.
В PL7 же контакты с фронтами пользовались только с EBOOL, тоесть отлов фронтов в ладере был такой же как в RE и FE. Но разработчики (ИМХО) подумали что будет удобнее если механизм отлова фронтов в ладере спрятать от разработчиков. То есть при каждом вызове секции, фронты зсуваются, тогда как через EBOOL фронты зсуваются только при новой записи в переменную.
Аватар пользователя
san
 
Сообщений: 883
Зарегистрирован: 05 мар 2012, 11:59
Откуда: Киев, Национальный университет пищевых технологий, каф.ИАСУ
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Пункты репутации: 21

Re: Фронты в LD UNITY PRO

Сообщение Андерс » 26 окт 2016, 13:17

Вот помогите пожалуйста, я хочу поймать фронт бита во входном слове блока DFB на языке ST.
Т.е. пусть к блоку DFB подключена переменная Var1 типа integer и нужно поймать фронт нулевого бита в этом слове.
Как это лучше сделать?
Андерс
 
Сообщений: 23
Зарегистрирован: 10 окт 2016, 05:10
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0

Re: Фронты в LD UNITY PRO

Сообщение san » 26 окт 2016, 15:44

Андерс писал(а):Вот помогите пожалуйста, я хочу поймать фронт бита во входном слове блока DFB на языке ST.
Т.е. пусть к блоку DFB подключена переменная Var1 типа integer и нужно поймать фронт нулевого бита в этом слове.
Как это лучше сделать?

Если в DFB - лучше ловить фронты руцями, сохранив прошлое значение и сравнивать с текущим.
Аватар пользователя
san
 
Сообщений: 883
Зарегистрирован: 05 мар 2012, 11:59
Откуда: Киев, Национальный университет пищевых технологий, каф.ИАСУ
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Пункты репутации: 21

Re: Фронты в LD UNITY PRO

Сообщение Андерс » 27 окт 2016, 08:51

Если вручную, то значит получается так, что надо в последней секции DFB сохранять куда-то двоичную переменную - например в Private раздел переменных и потом до этой последней секции сравнивать текущую с сохраненной в Private разделе. Так?
Андерс
 
Сообщений: 23
Зарегистрирован: 10 окт 2016, 05:10
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0

След.

Вернуться в Высокоуровневые системы автоматизации - M340, M580, Premium, Quantum и Unity

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron