This is topic Косвенная адресация аргументов в канале CALL.string in forum TRACE MODE 6 бесплатная Базовая версия / TRACE MODE 6 free Base version at Форум TRACE MODE: техническая поддержка.
Канал CALL.string позволяет осуществлять из программы косвенную адресацию массива аргументов. При записи в реальное значение канала номера аргумента в аппаратное значение канала записывается значение самого аргумента. Проблема возникает в случае, если аргументы представляют собой строки длиной более 4 символов, поскольку аппаратное значение имеет формат действительного числа (очевидно короткого, 4-х байтового). Был создан текстовый файл (12 строк: число загружаемых аргументов, сами 10 аргументов и пустая строка). Строки односимвольные. В программе организован циклический вывод 10 аргументов в ГЭ "Текст". Все работает нормально. Длина строк увеличена до 4 символов. Все работает нормально. Длина строк увеличена до 6 символов. Выводятся только первые 4 символа строки, остальные символы теряются. Вопрос: возможно ли обеспечить аналогичный доступ к аргументам строкового типа длиной хотя бы до 20 символов?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Программа должна только изменять значение канала CALL.string. На экран в ГЭ "текст" при этом надо выводить именно АППАРАТНОЕ значение канала CALL.string, как указано в его описании. Надо понимать, что это лишь эксперимент. Реальное сочетание форматов данных следует рассматривать в составе конкретной практической задачи.
Posted by merny (Участник № / Member № 2290) on :
quote:Отправитель / Originally posted by AdAstra Technical Support: Программа должна только изменять значение канала CALL.string. На экран в ГЭ "текст" при этом надо выводить именно АППАРАТНОЕ значение канала CALL.string, как указано в его описании. Надо понимать, что это лишь эксперимент. Реальное сочетание форматов данных следует рассматривать в составе конкретной практической задачи.
собственно я и вывожу аппаратное значение канала. просто в аппаратном значении не помещается вся строка, только первые 4 символа. а нужно 15-20 символов вывод на экран в общем не нужен. нужна последовательная обработка строк в цикле. на экран вывод осуществляется ради контроля процессов: - загрузка текста в аргументы канала: идет нормально - косвенная адресация через реальное значение: идет нормально - загрузка аргумента в аппаратное значение канала: идет с обрезкой строки ... - загрузка аргумента канала CALL.string через его аппаратное значение в канал CALL.move: не проверял (не выводил промежуточный результат на экран), но думаю, что работает, правда все с той же обрезкой строки - передача строки из канала CALL.move в аргументы типа usint канала CALL.string (но уже другого): вроде бы не работает, но до конца не разобрался в чем дело
попытка написать и подключить внешнюю библиотеку не получилась. компилятор ST программы не видит библиотечную функцию
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Передача в программу или в аргумента канала MOVE STRING из АППАРАТНОГО значения канала CALL.String осуществляется правильно (перепроверено). А вот выдача из программы или из аргумента MOVE_STRING больше 4 символов может осуществляться либо в аргументы CALL.String, либо в какой-либо атрибут текстового формата (например, КОММЕНТАРИЙ) - ЭТО ДОКУМЕНТИРОВАНО.
При оформлении вызова внешней библиотеки в соответствии с нашей документацией функция вызывается правильно. Это проверено многократно в реальных проектах. В частности, надо проверить правильность имен функций, экспортируемых внешней DLL. Это можно проверить с помощью утилиты dumpbin.exe. Возможно, в протоколе профайлера есть какие-либо сообщения оп этому поводу (см. документацию).
Posted by merny (Участник № / Member № 2290) on :
да кто же спорит, что в системе все должно работать у меня не все работает, а в чем причина не ясно. освоение идет методом тыка, причем в значительной степени слепого, т.к. справка описывает недостаточно полно спасибо за подсказку, что полноценная выдача из программы строки возможна только в канал CALL.string. в принципе я уже обнаружил опытным путем, что прогон строки именно через программу обрезает ее. по вашей подсказке вывел строку через дополнительный аргумент канала CALL.string и вроде бы все прошло в целости
про внешнюю библиотеку пока говорить не буду, там наверняка мои ошибки, т.к. я не программист. просто скомпилировал такой текст не в приложение, а в dll: unsigned int func() { return 5; } //это всё для простоты внешнее имя и истинное имя сделал одинаковыми, аргументы вообще не использовал. скорее всего ошибка на этапе создания библиотеки, а не ее подключения
в канал CALL.move с параметром 8 строка загружается нормально (в аргумент типа IN). передача в аргумент типа OUT также идет нормально. а вот следующее пока не работает: "Если к аргументу OUT привязан атрибут (140, ARG00) канала CALL.STRING, итоговая строка записывается в аргументы CALL.STRING следующим образом: в аргумент SINT/USINT – 1 символ; в аргумент INT/UINT – 2 символа; в аргумент другого типа данных – 4 символа;" - создал еще один канал CALL.STRING - набил аргументов usint, чтобы влезла любая строка - к аргументу OUT канала CALL.move привязал атрибут 140 нового канала CALL.STRING - привязал первый аргумент (чтобы увидеть число равное коду первого символа строки) к аргументу экрана и вывел значение аргумента в гэ "текст" - не работает неработоспособность проявляется в двух вариантах: - если привязку аргументов осуществлять со стороны аргумента экрана, то просто выводится ноль. - если привязку аргументов осуществлять со стороны аргументов канала CALL.STRING (где должны храниться коды символов строки), то не работает вообще ничего. ни в один из гэ "текст" не выводится ни одна строка, ни одно значение (остается надпись <текст>), графики на трендах показывают нулевые значения. аналогичная ситуация была при попытке привязки аргумента к переменной программы - все зависало тип аргументов в канале CALL.STRING использовал IN, OUT и IN/OUT - это ни на что не повлияло
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
" к аргументу OUT канала CALL.move привязал атрибут 140 нового канала CALL.STRING"
По документации "Если к аргументу OUT привязан атрибут (140, ARG00) канала CALL, отличного (!) от CALL.STRING,"
Вместо канала CALL.STRING к аргументу OUT привяжите канал CALL.ChGroupReq.
Тип данных IN-аргумента канала MOVE, на который передается распаковываемая строка, должен быть целочисленным (чтобы строка воспринималась в виде бинарного кода).
Posted by merny (Участник № / Member № 2290) on :
спасибо, попробую но то, что мной указано в кавычках "Если к аргументу OUT привязан атрибут (140, ARG00) канала CALL.STRING, итоговая строка записывается в аргументы CALL.STRING следующим образом: в аргумент SINT/USINT – 1 символ; в аргумент INT/UINT – 2 символа; в аргумент другого типа данных – 4 символа;" было скопипастено из справки Trace Mode, а не сочинено мной самостоятельно. документацию я получу на руки после покупки профверсии инструментальной системы и мрв, что произойдет лишь после создания работоспособного прототипа проекта. так что пока приходится пользоваться справкой, а в справке написано то, что я процитировал
Posted by merny (Участник № / Member № 2290) on :
спасибо, все заработало. только пришлось для вывода численных значений на экран создавать десятки аргументов экрана, привязанных к десяткам аргументов канала CALL.ChGroupReq. впрочем, при анализе строки по-видимому можно воспользоваться косвенной адресацией как в канале CALL.STRING, загружая индекс в реальное значение канала и считывая аппаратное значение последовательно в элементы массива. и много привязок не понадобится
обнаружилось одно странное неудобство: при осуществлении привязок аргументов система автоматически меняет имена, ранее данные аргументам. при этом, например, в тексте программы ST остаются старые имена переменных, что ведет к ошибкам компиляции. когда аргументов мало это еще воспринимается нормально. но когда каналов и аргументов становится сравнительно много, как и всевозможных перекрестных привязок, то возникает путаница. причем зафиксировать положение невозможно, т.к. при перепривязке имена меняются снова. приходится после перепривязки восстанавливать старые имена вручную, что затрудняет использование длинных имен - просто велика вероятность опечатки при повторных вводах
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Вы цитируете справочную систему релиза 6.08. В релизе 6.09 документация откорректирована.
Указанная косвенная адресация реализуется только в каналах CALL.STRING.
В IDE в меню "Файл/Настройки ИС/Редактор аргументов" уберите флажок в поле "Функции/Переименовывать аргументы при привязке".
Posted by merny (Участник № / Member № 2290) on :
quote:Отправитель / Originally posted by AdAstra Technical Support: Вы цитируете справочную систему релиза 6.08. В релизе 6.09 документация откорректирована.
Указанная косвенная адресация реализуется только в каналах CALL.STRING.
В IDE в меню "Файл/Настройки ИС/Редактор аргументов" уберите флажок в поле "Функции/Переименовывать аргументы при привязке".