This is topic аргументы и массивы in forum Языки программирования в TRACE MODE 6 / Algorithm Programming Languages at Форум TRACE MODE: техническая поддержка.
Есть 10 аргументов, например: вход1, вход2 и т.д. В ST программе создал глобальную переменную массив Arr[1..10]. Приравнял Arr[1]=вход1, Arr[2]=вход2 и т.д. в программе мне удобно обращаться к элементу массива, например: for цикл=1 to 10 do Arr[цикл]:=..... ; (алгоритм вычисления сложный) Писать строчку для каждого аргумента, не удобно : вход1:=... вход2:=.... и т.д.
В конце программы выполняю обратное преобразование присваиваю вход1, вход2 и т.д. значениям массива.
Все работает, но фактически в программе глобальные переменные дублируют мои аргументы, затрачивается процессорное время на ненужное присвоение. Не соображу, есть ли красивое решение?
Posted by Nico (Участник № / Member № 5342) on :
а зачем создавать глобальный массив ? в таких случаях инициализацию массива(или передачу его значений в аргументы ) делают через функции getAttributeF.setAttributeF
[ 21.06.2012, 13:11: Сообщение отредактировал / Message edited by AdAstra Technical Support ]
Posted by mev163 (Участник № / Member № 4235) on :
спасибо
Posted by mev163 (Участник № / Member № 4235) on :
как с помощью setAttributeF работать с boolean типом? почему-то не изменяется, может что не так делаю?
Posted by Nico (Участник № / Member № 5342) on :
через setAttributeI а если массив boolean то надо использовать биты и аргумент безнаковый
Posted by mev163 (Участник № / Member № 4235) on :
выполняю setAttributeF(19, 1000 , 0); все равно первый атрибут не изменяется. пробовал и setAttributeI у атрибута стоит in/out - uint.
Posted by Nico (Участник № / Member № 5342) on :
1. а если массив boolean то надо использовать биты и аргумент безнаковый тем боллее что размерность массива < 32
2. 19-правильный ID канала ? чтение работает ? программа выполняется ? в tm6_log и файл профайлера что-нибудь запмсалось ? у ID=19 поставвить бит отладки и установить debugon=1000 3 версия TM ?
Posted by mev163 (Участник № / Member № 4235) on :
чтение прекрасно работает. программа выполняется. тм 6.07.2 Создал специально новый проект, ST программа с одной строкой: setAttributeI(1, 1001 , 122); результат - 0 . Можешь прислать текст программы, где работает Setattribute ?
Posted by Nico (Участник № / Member № 5342) on :
в 0 аргументе меняем значение руками значения аргументов куда пишем куда привязаны и как наблюдаем
привязать set к другому атрибуту(например 2) и проверить
привязать set к другому атрибуту(например 140-172) и проверить
через упакованные биты пргрпмма работает быстрее
Posted by mev163 (Участник № / Member № 4235) on :
не работает, извиняюсь не туда посмотрел. не на тот аргумент. не работает код. обновился до 6.08
команда SetAttribute не хочет работать:
PROGRAM VAR_INOUT ARG_000 : DINT; END_VAR
setAttributeI(1,1000,122);
END_PROGRAM
Posted by mev163 (Участник № / Member № 4235) on :
Заметил, что SetAttributeI работает для attr_id=1, 2 и т.д. т.е. для реального значения, входного значения и т.д. не получается изменять аргументы программы. Вопрос к тех поддержке открыт. Если возможно,пожалуйста пример на почту: xxx(собака)yyy
[ 18.06.2012, 15:08: Сообщение отредактировал / Message edited by AdAstra Technical Support ]
Posted by Nico (Участник № / Member № 5342) on :
какому каналу задаются аргументы? связаны с чем-нибудь аргументы попробуйте через атрибуты 140-172 они соответсвуют аргументам начиная с 0
Posted by mev163 (Участник № / Member № 4235) on :
создал новый чистый проект, одну программу st. 4 переменных. PROGRAM VAR_OUTPUT ARG_000 : DINT; END_VAR VAR_OUTPUT ARG_001 : DINT; END_VAR VAR_OUTPUT ARG_002 : DINT; END_VAR VAR_OUTPUT ARG_003 : DINT; END_VAR // ниже описаны глобальные переменные UDINT_ch_id=1; UINT_attr_id=1001; DINT_value=121; // //сама функция: setAttributeI(UDINT_ch_id,UINT_attr_id,DINT_value); END_PROGRAM
по-подобию getAttributeF, пытался обращаться к аргументам программы UINT_attr_id= 1000 + порядковый номер нужного мне аргумента в программе. аргументы st программы ни с чем не связаны. Результат - 0. При UINT_attr_id=140 - результат 0. Не могли бы прислать работающий пример?
Posted by Nico (Участник № / Member № 5342) on :
то есть производится попытка setAtribute изменить значения аргументов у программы в которой данная функция вызывается ?
создайте еше 1 call,содержащий данные и меняйте в нем(успех ходит где-то рядом )
Posted by mev163 (Участник № / Member № 4235) on :
именно так. хотел упростить программу (см. самое первое сообщение)
Posted by Nico (Участник № / Member № 5342) on :
те заработало ?
Posted by mev163 (Участник № / Member № 4235) on :
нет, не заработало.
quote:значения аргументов у программы в которой данная функция вызывается ?
Именно так. Хочу получить возможность обращаться к аргументам программы как к элементам массива. Чтение получается, а запись - нет. Жду комментариев и помощи Адастры.
Id=2 call.chgr (содержит аргументы ни к чему не привязанные)
Posted by mev163 (Участник № / Member № 4235) on :
не понял , никогда не использовал CALL. если можно, чуть подробнее, не соображу...
нужно создать Call с id=2 поставить в параметрах call.chgr ?
Posted by Nico (Участник № / Member № 5342) on :
чем вызывается шаблоны -каналами call каналы класса call могут только содержать данные(например chgreq) создайте в узле такой канал и назначьте ему функцию
Posted by mev163 (Участник № / Member № 4235) on :
спасибо, сейчас попробую. Создал Call ChGroupReq параметр поставил 16. создал 4 аргумента. Результат: В ID=2: аргументы скопировались из ID=1 (из ST программы). В Id=2 изменяется аргумент по SetAttribute (2, 1001, 123), но это изменение не передается обратно в аргументы ST программы.
Posted by Nico (Участник № / Member № 5342) on :
и не будет тк перед вызовом программы TM делает срез значений всех аргументов при выходе создается срез выходных переменных который записывается в аргументы тира OUTPUT и затирают асинхронные присвоения к которым относятся выше используемые функции(имейте входа в call.chgr и результат туда же а алгоритм пересылки содержит программа)
Posted by mev163 (Участник № / Member № 4235) on :
у меня сейчас 350 аргументов (по 10 аргументов для массива). получается, что проще оставить массив из глобальных переменных. в начале программы и в конце присвоить ему значения аргументов, чем перепривязывать их... Хотел сократить и оптимизировать код, видимо не получилось. Т.е. получается что SetAttribute не может изменить аргументы той программы из которой она вызывалась?
PS Как вы думаете насколько уменьшится время выполнения одного цикла программы, если убрать из программы около 350 строк присвоения глобальных переменных аргументам, заменив на алгоритм описанный выше?
Posted by Nico (Участник № / Member № 5342) on :
Верно и это не явдяется ошибкой Использование глобальных переменных эквивалентно использованию дополнительных аргументов
еще раз намекаю бинарные(bool) переменные оптимальнее использовать упакованными
Posted by mev163 (Участник № / Member № 4235) on :
все же, жду ответа от тех поддержки по поводу SetAttribute. Про boolean - ясно. Спасибо за помощь Nico
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
"Т.е. получается что SetAttribute не может изменить аргументы той программы из которой она вызывалась?"
Верно. Не стоит пытаться функцией SetAttribute задавать значения аргументов программы, в которой она вызывается. В конце пересчета канала Call.Program выполняется запись во все его аргументы Output , в результате чего будут затерты значения, выставленные асинхронными функциями SetAtribute (выше об этом правильно упомянул Nico).
В данном случае можно создать канал Call с типом вызова ChGroupReq и работать с его аргументами из программы, используя функции SetAttribute и GetAttribute.
Спасибо Nico за грамотные ответы.
Posted by mev163 (Участник № / Member № 4235) on :
вопрос про эффективность: с точки зрения эффективности использования процессорного времени, что лучше канал Call или глобальными переменными массивы создавать?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Можно сказать, что в целом ресурсоемкость обоих подходов одинакова.