| Предыдущая тема :: Следующая тема |
| Автор |
Сообщение |
IAndrey Новичок


Зарегистрирован: May 24, 2016 Сообщения: 9 Рейтинг: +0/-1
|
Добавлено: Вт 24 Май, 2016 10:04:49 Заголовок сообщения: Принцип прохода программы Control Logix |
|
|
| Здравствуйте! Такой вопрос у меня возник, релейная логика, если я последовательно поставлю два блока MOV первый будет 0 записывать в некий тег, а второй в этот же тег будет писать 1. Если запустить эту программу, то тег будет всегда в "1". Когда программа сканируется она вроде бы должна в "0" переводить тег этот, а уже потом в "1". На деле же этого не происходит (либо происходит, но очень быстро). Разъясните, как вообще программа сканируется? Измененные данные пишутся в какой то буфер, а после прохода уже в теги или сразу в теги, прямо во время сканирования? |
|
| Вернуться к началу |
|
 |
AlexV Эксперт


Зарегистрирован: Jan 10, 2007 Сообщения: 126 Рейтинг: +6/-0 Откуда: г.Мирный, Якутия
|
Добавлено: Ср 25 Май, 2016 4:19:09 Заголовок сообщения: |
|
|
Значение записывается сразу в тэг.
Проверять надо не беcсмысленными действиями, а проверкой условия
Например, mov(a ,1) - grt(a, 0) - mov (a, b) |
|
| Вернуться к началу |
|
 |
oldDad Site Admin


Зарегистрирован: May 05, 2005 Сообщения: 2773 Рейтинг: +89/-5
|
Добавлено: Ср 25 Май, 2016 7:53:22 Заголовок сообщения: Re: Принцип прохода программы Control Logix |
|
|
| IAndrey писал(а): | | прямо во время сканирования? |
Необязательно прямо во время сканирования.
В контроллерах Logix используется мультизадачная операционная система реального времени, ресурсы в которой (задачи, программы, приоритеты и т.п.) нужно правильно и оптимальным образом планировать.
Пример: последовательное, ранг за рангом, выполнение какой-то программы в любой момент может прервать более высокоприоритетная задача, которая может изменить данные, которые прерванная более низкоприоритетная задача обрабатывала до момента передачи управления от нее к более высокоприоритетной задаче. После выполнения более приоритетной задачи процессор вернется к прерванной низкоприоритетной, и может оказаться, что результат получится не таким, как ожидалось, т.к. исходные данные были изменены более приоритетной задачей. _________________ Обращайтесь к профессионалам. |
|
| Вернуться к началу |
|
 |
IAndrey Новичок


Зарегистрирован: May 24, 2016 Сообщения: 9 Рейтинг: +0/-1
|
Добавлено: Ср 25 Май, 2016 10:26:21 Заголовок сообщения: |
|
|
Есть тег Status, который принимает целочисленное значение в зависимости от того, какой аларм сработал. Его, естественно нужно обнулять, если значение вышло из аларма. То есть, по сути у меня моргание будет в данном случае? |
|
| Вернуться к началу |
|
 |
oldDad Site Admin


Зарегистрирован: May 05, 2005 Сообщения: 2773 Рейтинг: +89/-5
|
Добавлено: Ср 25 Май, 2016 13:34:05 Заголовок сообщения: |
|
|
Если будете то обнулять тэг, то устанавливать его в единицу, то да, это называется мигание. _________________ Обращайтесь к профессионалам. |
|
| Вернуться к началу |
|
 |
IAndrey Новичок


Зарегистрирован: May 24, 2016 Сообщения: 9 Рейтинг: +0/-1
|
Добавлено: Ср 25 Май, 2016 13:47:52 Заголовок сообщения: |
|
|
| А не подскажете, как тогда на релейке реализовать уход от мигания? Тэг ведь надо все равно обнулять, после пропадания аларма. Как то странно реализовано, зачем сразу тег записывать? Писалось бы в буфер, после окончания цикла из буфера переписывалось бы в теги и по новой. Удобнее ведь работать было бы. |
|
| Вернуться к началу |
|
 |
dv_ Эксперт


Зарегистрирован: Sep 14, 2006 Сообщения: 776 Рейтинг: +41/-1 Откуда: Донецк
|
Добавлено: Ср 25 Май, 2016 16:56:42 Заголовок сообщения: |
|
|
| IAndrey писал(а): | | А не подскажете, как тогда на релейке реализовать уход от мигания? Тэг ведь надо все равно обнулять, после пропадания аларма. Как то странно реализовано, зачем сразу тег записывать? Писалось бы в буфер, после окончания цикла из буфера переписывалось бы в теги и по новой. Удобнее ведь работать было бы. | Сделай промежуточный тег с которым работаешь в программе и только потом переноси в свой .Status.
SCADA может вычитать твой уже установленный "0" и еще не установленные 1, 2...
Глядя на этот код настоятельно рекомендую изучить команду ALMA. Что в сочетании с FTView SE...  |
|
| Вернуться к началу |
|
 |
vsv1953 Частый гость


Зарегистрирован: Jan 21, 2009 Сообщения: 39 Рейтинг: +3/-0
|
Добавлено: Ср 25 Май, 2016 17:06:14 Заголовок сообщения: |
|
|
| IAndrey писал(а): | | А не подскажете, как тогда на релейке реализовать уход от мигания? Тэг ведь надо все равно обнулять, после пропадания аларма. Как то странно реализовано, зачем сразу тег записывать? Писалось бы в буфер, после окончания цикла из буфера переписывалось бы в теги и по новой. Удобнее ведь работать было бы. |
Вы пытаетесь организовать мигающую сигнализацию или еще что то?
Конкретно опишите. |
|
| Вернуться к началу |
|
 |
mp3corp Эксперт


Зарегистрирован: Dec 12, 2012 Сообщения: 164 Рейтинг: +2/-0
|
Добавлено: Чт 26 Май, 2016 5:26:45 Заголовок сообщения: |
|
|
Как я понимаю из куска кода, Вам необходимо сделать обработку алармов? На ST не проще ли это описывать? Когда то нечто подобное делал:
| Код: | if Out>=HiHi & HiHiEn & NOT Block //сравнение значение с максимальной аварийной уставкой если *_Block=1 авария отключена
then TimerHiHi.TimerEnable:=1;
TimerHi.TimerEnable:=0;
TimerLo.TimerEnable:=0;
TimerLoLo.TimerEnable:=0;
else if Out>=Hi & HiEn & NOT Block //сравнение значение с максимальной предаварийной уставкой если *_Block=1 авария отключена
then TimerHi.TimerEnable:=1;
TimerHiHi.TimerEnable:=0;
TimerLo.TimerEnable:=0;
TimerLoLo.TimerEnable:=0;
else if Out<=LoLo & LoLoEn & NOT Block //сравнение значение с минимальной аварийной уставкой если *_Block=1 авария отключена
then TimerLoLo.TimerEnable:=1;
TimerHi.TimerEnable:=0;
TimerLo.TimerEnable:=0;
TimerHiHi.TimerEnable:=0;
else if Out<=Lo & LoEn & NOT Block //сравнение значение с минимальной предаварийной уставкой если *_Block=1 авария отключена
then TimerLo.TimerEnable:=1;
TimerHi.TimerEnable:=0;
TimerHiHi.TimerEnable:=0;
TimerLoLo.TimerEnable:=0;
else
TimerHiHi.TimerEnable:=0;
TimerHi.TimerEnable:=0;
TimerLo.TimerEnable:=0;
TimerLoLo.TimerEnable:=0;
end_if;end_if;end_if;end_if;
(* Проверяем выхода таймеров по уставкам *)
if TimerHiHi.DN then Code:=1;
else if TimerHi.DN then
Code:=2;
else if TimerLo.DN then
Code:=3;
else if TimerLoLo.DN then
Code:=4;
else
Code:=0;
end_if;end_if;end_if;end_if;
|
Соответственно заведены необходимые таймеры, "TONR". |
|
| Вернуться к началу |
|
 |
IAndrey Новичок


Зарегистрирован: May 24, 2016 Сообщения: 9 Рейтинг: +0/-1
|
Добавлено: Сб 28 Май, 2016 7:28:08 Заголовок сообщения: |
|
|
| mp3corp писал(а): | | Как я понимаю из куска кода, Вам необходимо сделать обработку алармов? |
Да, вы правы, именно это и нужно сделать. На другом контроллере обработку писал на С++, все отлично работало. А ST поддерживает циклы?
Сделал пока так, вроде должно работать как надо:
 |
|
| Вернуться к началу |
|
 |
mp3corp Эксперт


Зарегистрирован: Dec 12, 2012 Сообщения: 164 Рейтинг: +2/-0
|
Добавлено: Сб 28 Май, 2016 10:56:35 Заголовок сообщения: |
|
|
| IAndrey писал(а): | | mp3corp писал(а): | | Как я понимаю из куска кода, Вам необходимо сделать обработку алармов? |
Да, вы правы, именно это и нужно сделать. На другом контроллере обработку писал на С++, все отлично работало. А ST поддерживает циклы?
Сделал пока так, вроде должно работать как надо:
 |
Конечно поддерживает. |
|
| Вернуться к началу |
|
 |
Ryzhij62 Эксперт


Зарегистрирован: Apr 06, 2011 Сообщения: 409 Рейтинг: +29/-2 Откуда: Россия Рязань
|
Добавлено: Сб 28 Май, 2016 13:40:53 Заголовок сообщения: |
|
|
| IAndrey писал(а): |
Сделал пока так, вроде должно работать как надо:
[ | Ничего Вам не "должно" - при невыполнении лог.условий ноль из временного тега в окончательный не перепишется.
Последний Mov выносите в отдельную ступеньку без условий, или с AllwaysTrue. |
|
| Вернуться к началу |
|
 |
IAndrey Новичок


Зарегистрирован: May 24, 2016 Сообщения: 9 Рейтинг: +0/-1
|
Добавлено: Вс 29 Май, 2016 9:08:29 Заголовок сообщения: |
|
|
| Ryzhij62 писал(а): | | при невыполнении лог.условий |
Что значит эта фраза? Смотрел, думал, ничего не понял. Покатал этот кусок в эмуляторе, все нормально обновляется и переписывается. Поясните подробнее пожалуйста. |
|
| Вернуться к началу |
|
 |
Ryzhij62 Эксперт


Зарегистрирован: Apr 06, 2011 Сообщения: 409 Рейтинг: +29/-2 Откуда: Россия Рязань
|
Добавлено: Вс 29 Май, 2016 11:22:46 Заголовок сообщения: |
|
|
Подумайте над операторами -]\[-, которых у Вас аж две штуки.
Если эти условия не выполняются - выходной тег не обновится. |
|
| Вернуться к началу |
|
 |
IAndrey Новичок


Зарегистрирован: May 24, 2016 Сообщения: 9 Рейтинг: +0/-1
|
Добавлено: Вс 29 Май, 2016 14:09:50 Заголовок сообщения: |
|
|
| Понял, спасибо! |
|
| Вернуться к началу |
|
 |
|