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


Зарегистрирован: Jun 17, 2008 Сообщения: 8 Рейтинг: +0/-0
|
Добавлено: Вт 17 Июн, 2008 10:56:11 Заголовок сообщения: Доступ к элементам модуля 1756-IF16 |
|
|
В проекте присутствует модуль оцифровки входных аналоговых сигналов 1756-IF16. В списке тегов он отображается структурой, содержащей данные каждого канала:
Local:3:I.Ch0Data
Local:3:I.Ch1Data
Local:3:I.Ch2Data
...
...
Local:3:I.Ch15Data
Можно ли эти каналы перебрать в цикле? Т.е. данные с этих каналов необходимо переписать в массив, можно ли их перебрать по адресам или номерам?
Спасибо! |
|
| Вернуться к началу |
|
 |
kempo Эксперт


Зарегистрирован: Jul 10, 2006 Сообщения: 150 Рейтинг: +6/-0 Откуда: Украина, Алчевск
|
Добавлено: Вт 17 Июн, 2008 11:08:52 Заголовок сообщения: |
|
|
| Для какой цели необходимо их в массив загонять? Почему нельзя напрямую к каналу обращаться? |
|
| Вернуться к началу |
|
 |
AgeevSlava Постоянный участник


Зарегистрирован: Dec 13, 2005 Сообщения: 53 Рейтинг: +0/-0 Откуда: Украина, Мариуполь
|
Добавлено: Вт 17 Июн, 2008 11:10:49 Заголовок сообщения: |
|
|
Привет! Создай массив из 16-и элементов минимум (в данном примере это AI_Data[]) и при помощи инструкции CPS организуй копирование данных из соответствующего модуля. А потом пользуй массив в цикле. Пример на ST, но та же инструкция применяется и в LAD.
//Чтение входных данных аналоговых каналов в буферную зону
CPS (Local:1:I.Ch0Data, AI_Data[0] , 16) ; |
|
| Вернуться к началу |
|
 |
stAntonio Новичок


Зарегистрирован: Jun 17, 2008 Сообщения: 8 Рейтинг: +0/-0
|
Добавлено: Вт 17 Июн, 2008 11:39:12 Заголовок сообщения: |
|
|
Спасибо помощь.
Этот способ решения проблемы я тоже знаю.
Дело вот в чем, в проекте, который я дополняю, происходит опрос нескольких таких модулей. изначально было написано на LD. 37 шагов одинаковых инструкций. я нашел способ оптимизировать этот опрос. Вот как я попытался его решить:
FOR cnt1 := 0 TO 15 BY 1 DO
//0-15 0-15
ain_buf[cnt1].data := Local:3:I.Ch1Data;
ain_buf[cnt1].status := Local:3:I.Ch1Status;
//16-31 0-15
ain_buf[(16+cnt1)].data := Local:4:I.Ch1Data;
ain_buf[(16+cnt1)].status := Local:4:I.Ch1Status;
END_FOR;
FOR cnt1 := 0 TO 5 BY 1 DO
//32-37 0-5
ain_buf[(32+cnt1)].data := Local:5:I.Ch1Data;
ain_buf[(32+cnt1)].status := Local:5:I.Ch1Status;
ain_cfg[(32+cnt1)].SclMax := Local:5:C.Ch1Config.HighEngineering;
ain_cfg[(32+cnt1)].SclMin := Local:5:C.Ch1Config.LowEngineering;
END_FOR;
при этом необходимо менять номера каналов:
Ch0ata
Ch1Data
Ch2Data
....
Ch15Data
но как это сделать в цикле я не знаю.
вспоминая язык С++, у меня возникла идея обращаться по адресам в которых лежат эти элементы. Все элементы Real, лежат друг за другом в структуре, которая автоматически создается средой разработки для данного модуля. Но к сожалению я не смог найти способа это сделать.
Может вы знаете? заранее спасибо. |
|
| Вернуться к началу |
|
 |
stAntonio Новичок


Зарегистрирован: Jun 17, 2008 Сообщения: 8 Рейтинг: +0/-0
|
Добавлено: Вт 17 Июн, 2008 11:43:40 Заголовок сообщения: |
|
|
И вообще возможно ли обращаться к тегам, и их элемента по адресам как это происходит в обычном программировании?
P.S. Изучать RS Logix я начал только недавно, так что всех тонкостей не знаю. Пардону просим!  |
|
| Вернуться к началу |
|
 |
maxim Эксперт


Зарегистрирован: Feb 16, 2007 Сообщения: 123 Рейтинг: +7/-0 Откуда: Енакиево
|
Добавлено: Вт 17 Июн, 2008 12:24:01 Заголовок сообщения: |
|
|
[quote="stAntonio"]И вообще возможно ли обращаться к тегам, и их элемента по адресам как это происходит в обычном программировании?
В ControlLogix 5550 распределение памяти - динамическое. Поэтому программист имеет доступ не к фиксированому адресу памяти , а к единице хранения данных - тэгу. |
|
| Вернуться к началу |
|
 |
stAntonio Новичок


Зарегистрирован: Jun 17, 2008 Сообщения: 8 Рейтинг: +0/-0
|
Добавлено: Вт 17 Июн, 2008 12:32:18 Заголовок сообщения: |
|
|
Спасибо, тогда еще вопрос:
Возможна ли навигация внутри тега по адресу?
Простите туплю.  |
|
| Вернуться к началу |
|
 |
AgeevSlava Постоянный участник


Зарегистрирован: Dec 13, 2005 Сообщения: 53 Рейтинг: +0/-0 Откуда: Украина, Мариуполь
|
Добавлено: Вт 17 Июн, 2008 13:06:52 Заголовок сообщения: |
|
|
| А собственно в чем конечная цель обращений в цикле к данным конфигурации, состояния каналов и к самим данным? Хотите написать процедуру однотипной обработки каналов? |
|
| Вернуться к началу |
|
 |
stAntonio Новичок


Зарегистрирован: Jun 17, 2008 Сообщения: 8 Рейтинг: +0/-0
|
Добавлено: Вт 17 Июн, 2008 13:22:51 Заголовок сообщения: |
|
|
Да.
Либо придется описывать 160 каналов вручную либо как то оптимизировать их опрос.
Возможно ли использовать в этом случае псевдонимы?
Спасибо за ваши ответы. |
|
| Вернуться к началу |
|
 |
kempo Эксперт


Зарегистрирован: Jul 10, 2006 Сообщения: 150 Рейтинг: +6/-0 Откуда: Украина, Алчевск
|
Добавлено: Вт 17 Июн, 2008 13:29:11 Заголовок сообщения: |
|
|
| А почему бы тогда просто не сделать подпрограмму и в ее теги вносить нужные вам? У нас так обрабатывается порядка 300 сигналов - все отлично работает |
|
| Вернуться к началу |
|
 |
stAntonio Новичок


Зарегистрирован: Jun 17, 2008 Сообщения: 8 Рейтинг: +0/-0
|
Добавлено: Вт 17 Июн, 2008 13:41:44 Заголовок сообщения: |
|
|
Извините, Кемпо, а можно пример?
что то я туго сегодня соображаю. |
|
| Вернуться к началу |
|
 |
maxim Эксперт


Зарегистрирован: Feb 16, 2007 Сообщения: 123 Рейтинг: +7/-0 Откуда: Енакиево
|
Добавлено: Вт 17 Июн, 2008 13:54:23 Заголовок сообщения: |
|
|
Забросьте это в тело цикла и меняя "cnt1" заполняйте массив данными
ain_buf[cnt1].data := Local:3:I.Data[cnt1];
ain_buf[cnt1].status := Local:3:I.Status[cnt1]; |
|
| Вернуться к началу |
|
 |
stAntonio Новичок


Зарегистрирован: Jun 17, 2008 Сообщения: 8 Рейтинг: +0/-0
|
Добавлено: Вт 17 Июн, 2008 14:08:08 Заголовок сообщения: |
|
|
| К сожалению тагого члена "Local:3:I.Data[cnt1];" в теге Local:3:I нет. |
|
| Вернуться к началу |
|
 |
Kondratiev Постоянный участник


Зарегистрирован: Dec 04, 2005 Сообщения: 79 Рейтинг: +1/-0 Откуда: Мариуполь, Киев
|
Добавлено: Вт 17 Июн, 2008 15:41:40 Заголовок сообщения: |
|
|
Действительно косвенная адресация в СontrolLogix только через массивы.
И если уж кортит обрабатывать каналы в цикле то через промежуточный буфер( буферы, например разные для статуса, ошибок, данных). Но обработка каждого канала отдельным рангом/рангами часто нагляднее, особенно если коменты хорошо написаны.
Конечно хочется загнать всю обработку входов в пару вложенных циклов, но "каждый выбирает по себе"...
Кстати объединияя все в цикл кроме красоты вы мало что выигрываете. сокрацается объем кода. зачем?? при объемах памяти CL это не столь важно. |
|
| Вернуться к началу |
|
 |
Kondratiev Постоянный участник


Зарегистрирован: Dec 04, 2005 Сообщения: 79 Рейтинг: +1/-0 Откуда: Мариуполь, Киев
|
Добавлено: Вт 17 Июн, 2008 15:48:40 Заголовок сообщения: |
|
|
ИМХО оптимальный вариант для программера: перебрать всю структуру аналогового модуля в подпрограмме.
А в нее передавать входными параметрами данные с разных модулей.
и выходными параметрами швырять куда вм там нужно.
А для эксплуатации, ежели ей код проги остается, милее всего каждый канал перебирать однотипными рангами/блоками рангов! Удобнее если что прослеживать путь сигнала |
|
| Вернуться к началу |
|
 |
|