mev163
Active Forum Member / Активный участник форума
Участник № / Member № 4235
отправлено / posted
Есть 10 аргументов, например: вход1, вход2 и т.д. В ST программе создал глобальную переменную массив Arr[1..10]. Приравнял Arr[1]=вход1, Arr[2]=вход2 и т.д. в программе мне удобно обращаться к элементу массива, например: for цикл=1 to 10 do Arr[цикл]:=..... ; (алгоритм вычисления сложный) Писать строчку для каждого аргумента, не удобно : вход1:=... вход2:=.... и т.д.
В конце программы выполняю обратное преобразование присваиваю вход1, вход2 и т.д. значениям массива.
Все работает, но фактически в программе глобальные переменные дублируют мои аргументы, затрачивается процессорное время на ненужное присвоение. Не соображу, есть ли красивое решение?
Сообщения / Posts 66 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Nico
Forum Professor / Завсегдатай форума
Участник № / Member № 5342
отправлено / posted
а зачем создавать глобальный массив ? в таких случаях инициализацию массива(или передачу его значений в аргументы ) делают через функции getAttributeF.setAttributeF
[ 21.06.2012, 13:11: Сообщение отредактировал / Message edited by AdAstra Technical Support ]
Сообщения / Posts 873 | Из / From: Россия
| IP / IP: IP адрес / IP address |
mev163
Active Forum Member / Активный участник форума
Участник № / Member № 4235
mev163
Active Forum Member / Активный участник форума
Участник № / Member № 4235
отправлено / posted
как с помощью setAttributeF работать с boolean типом? почему-то не изменяется, может что не так делаю?
Сообщения / Posts 66 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Nico
Forum Professor / Завсегдатай форума
Участник № / Member № 5342
отправлено / posted
через setAttributeI а если массив boolean то надо использовать биты и аргумент безнаковый
Сообщения / Posts 873 | Из / From: Россия
| IP / IP: IP адрес / IP address |
mev163
Active Forum Member / Активный участник форума
Участник № / Member № 4235
отправлено / posted
выполняю setAttributeF(19, 1000 , 0); все равно первый атрибут не изменяется. пробовал и setAttributeI у атрибута стоит in/out - uint.
Сообщения / Posts 66 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Nico
Forum Professor / Завсегдатай форума
Участник № / Member № 5342
отправлено / posted
1. а если массив boolean то надо использовать биты и аргумент безнаковый тем боллее что размерность массива < 32
2. 19-правильный ID канала ? чтение работает ? программа выполняется ? в tm6_log и файл профайлера что-нибудь запмсалось ? у ID=19 поставвить бит отладки и установить debugon=1000 3 версия TM ?
Сообщения / Posts 873 | Из / From: Россия
| IP / IP: IP адрес / IP address |
mev163
Active Forum Member / Активный участник форума
Участник № / Member № 4235
отправлено / posted
чтение прекрасно работает. программа выполняется. тм 6.07.2 Создал специально новый проект, ST программа с одной строкой: setAttributeI(1, 1001 , 122); результат - 0 . Можешь прислать текст программы, где работает Setattribute ?
Сообщения / Posts 66 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Nico
Forum Professor / Завсегдатай форума
Участник № / Member № 5342
mev163
Active Forum Member / Активный участник форума
Участник № / Member № 4235
отправлено / posted
Заметил, что SetAttributeI работает для attr_id=1, 2 и т.д. т.е. для реального значения, входного значения и т.д. не получается изменять аргументы программы. Вопрос к тех поддержке открыт. Если возможно,пожалуйста пример на почту: xxx(собака)yyy
[ 18.06.2012, 15:08: Сообщение отредактировал / Message edited by AdAstra Technical Support ]
Сообщения / Posts 66 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Nico
Forum Professor / Завсегдатай форума
Участник № / Member № 5342
отправлено / posted
какому каналу задаются аргументы? связаны с чем-нибудь аргументы попробуйте через атрибуты 140-172 они соответсвуют аргументам начиная с 0
Сообщения / Posts 873 | Из / From: Россия
| IP / IP: IP адрес / IP address |
mev163
Active Forum Member / Активный участник форума
Участник № / Member № 4235
отправлено / posted
создал новый чистый проект, одну программу 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. Не могли бы прислать работающий пример?
Сообщения / Posts 66 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Nico
Forum Professor / Завсегдатай форума
Участник № / Member № 5342
отправлено / posted
то есть производится попытка setAtribute изменить значения аргументов у программы в которой данная функция вызывается ?
mev163
Active Forum Member / Активный участник форума
Участник № / Member № 4235
отправлено / posted
нет, не заработало.
quote:значения аргументов у программы в которой данная функция вызывается ?
Именно так. Хочу получить возможность обращаться к аргументам программы как к элементам массива. Чтение получается, а запись - нет. Жду комментариев и помощи Адастры. Сообщения / Posts 66 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Nico
Forum Professor / Завсегдатай форума
Участник № / Member № 5342
Nico
Forum Professor / Завсегдатай форума
Участник № / Member № 5342
отправлено / posted
чем вызывается шаблоны -каналами call каналы класса call могут только содержать данные(например chgreq) создайте в узле такой канал и назначьте ему функцию
Сообщения / Posts 873 | Из / From: Россия
| IP / IP: IP адрес / IP address |
mev163
Active Forum Member / Активный участник форума
Участник № / Member № 4235
отправлено / posted
спасибо, сейчас попробую. Создал Call ChGroupReq параметр поставил 16. создал 4 аргумента. Результат: В ID=2: аргументы скопировались из ID=1 (из ST программы). В Id=2 изменяется аргумент по SetAttribute (2, 1001, 123), но это изменение не передается обратно в аргументы ST программы.
Сообщения / Posts 66 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Nico
Forum Professor / Завсегдатай форума
Участник № / Member № 5342
отправлено / posted
и не будет тк перед вызовом программы TM делает срез значений всех аргументов при выходе создается срез выходных переменных который записывается в аргументы тира OUTPUT и затирают асинхронные присвоения к которым относятся выше используемые функции(имейте входа в call.chgr и результат туда же а алгоритм пересылки содержит программа)
Сообщения / Posts 873 | Из / From: Россия
| IP / IP: IP адрес / IP address |
mev163
Active Forum Member / Активный участник форума
Участник № / Member № 4235
отправлено / posted
у меня сейчас 350 аргументов (по 10 аргументов для массива). получается, что проще оставить массив из глобальных переменных. в начале программы и в конце присвоить ему значения аргументов, чем перепривязывать их... Хотел сократить и оптимизировать код, видимо не получилось. Т.е. получается что SetAttribute не может изменить аргументы той программы из которой она вызывалась?
PS Как вы думаете насколько уменьшится время выполнения одного цикла программы, если убрать из программы около 350 строк присвоения глобальных переменных аргументам, заменив на алгоритм описанный выше?
Сообщения / Posts 66 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Nico
Forum Professor / Завсегдатай форума
Участник № / Member № 5342
отправлено / posted
Верно и это не явдяется ошибкой Использование глобальных переменных эквивалентно использованию дополнительных аргументов
mev163
Active Forum Member / Активный участник форума
Участник № / Member № 4235
отправлено / posted
все же, жду ответа от тех поддержки по поводу SetAttribute. Про boolean - ясно. Спасибо за помощь Nico
Сообщения / Posts 66 | Из / From: Россия
| IP / IP: IP адрес / IP address |
отправлено / posted
"Т.е. получается что SetAttribute не может изменить аргументы той программы из которой она вызывалась?"
Верно. Не стоит пытаться функцией SetAttribute задавать значения аргументов программы, в которой она вызывается. В конце пересчета канала Call.Program выполняется запись во все его аргументы Output , в результате чего будут затерты значения, выставленные асинхронными функциями SetAtribute (выше об этом правильно упомянул Nico).
В данном случае можно создать канал Call с типом вызова ChGroupReq и работать с его аргументами из программы, используя функции SetAttribute и GetAttribute.
mev163
Active Forum Member / Активный участник форума
Участник № / Member № 4235
отправлено / posted
вопрос про эффективность: с точки зрения эффективности использования процессорного времени, что лучше канал Call или глобальными переменными массивы создавать?
Сообщения / Posts 66 | Из / From: Россия
| IP / IP: IP адрес / IP address |