This is topic Работа со строками в TRACE MODE in forum TRACE MODE 6 бесплатная Базовая версия / TRACE MODE 6 free Base version at Форум TRACE MODE: техническая поддержка.
Задача примерно следующая аппаратная часть: рабочее место оператора - ноутбук или РС внешний контроллер, обмен по Modbus ТСР устройства удаленного ввода-вывода, подключенные к контроллеру
программная часть: МРВ TRACE MODE на операторском рабочем месте некоторые служебные программки на операторском рабочем месте специализированные программы на контроллере
необходимо: читать данные из текстового файла в строковые переменные и далее - либо неизменными транслировать в контроллер через Modbus ТСР, где будет происходить вся обработка - либо производить первичную обработку на компьютере под управлением МРВ и уже переработанные данные пересылать в контроллер уже не как строковые данные, а как действительные и целые числа
теоретически необходима возможность загружать данные из произвольного файла, но можно использовать файл с фиксированным именем, в который будет копироваться необходимый файл служебной программкой
справочная система TRACE MODE говорит о такой возможности: Для канала CALL.STRING ... если значение атрибута Синхр/Дамп канала не задано ("…"), при старте монитора значения аргументов считываются из файла ../<папка узла>/<имя канала>.txt. Формат файла:
Для принудительного считывания значений аргументов из файла ../<папка узла>/<имя канала>.txt нужно послать (0-255) в атрибут (41, AB). Для принудительного считывания значений аргументов из файла ../<папка узла>/<имя канала>_<N>.txt (N>255) нужно послать N в атрибут (41, AB).
т.е. загрузить данные из файла с фиксированным именем можно. но возникают несколько вопросов 1) загрузка текстовых строк производится в аргументы канала. т.о. аргументы канала необходимо создать заранее при создании проекта. причем аргументов должно быть не меньше, чем строк в файле. а если в файле 10000 строк, что вполне реально? допускается ли такое количество аргументов? и сколько времени надо потратить на создание такого числа аргументов? а если количество строк в файле 100000, что маловероятно, но все же возможно? 2) справка сообщает, что "аргументы программы читают и пишут в аргументы CALL.STRING, привязанные через атрибуты и аргументы". т.е. вроде бы программа позволяет прочитать и обработать строку, но как это сделать, если канал предоставляет простой набор аргументов - не привязывать же каждый из, например, 10000 аргументов канала к соответствующему аргументу программы. программа допускает структурированные данные вроде массивов, но аргументы канала массивом не являются. или все-таки являются и к ним можно обращаться через одну переменную массива путем индексирования аргументов? 3) даже загрузив аргументы канала в строковые переменные программы неясно как осуществлять их анализ и обработку. в описании отсутствуют функции для работы со строковыми переменными. нет функций по преобразованию типов, т.е. нельзя даже преобразовать строку в последовательность целых чисел для передачи по протоколу Modbus ТСР в контроллер
возможно справочная система по причине краткости и беглости чего-то недоговаривает и все эти вопросы легко разрешимы. было бы интересно услышать ответы
Posted by Nico (Участник № / Member № 5342) on :
.представление чисел в текстовом виде и текстовые строки это разные вещи .128-129 атрибуты любого канала CALL .TVC_RSZ=<макс число аргументов> .10000 можно .>127 словных регистров записать нельзя(огранич ModBus)
Posted by merny (Участник № / Member № 2290) on :
сударь, позвольте мне прокомментировать ваш ответ 1) числа в текстовом формате и текстовые строки разные вещи и это мне известно. меня интересуют именно данные строкового типа, т.к. строки содержат не только цифры, но и буквы. никакого массива чисел в текстовом виде не имеется. 2) атрибуты 128 и 129 определяют запись/чтение в текстовый файл со странным расширением .dat. вот думаю нет ли подвоха какого в этом файле, действительно ли он текстовый. и потом мне нужно чтение не чисел в текстовом виде, а именно строк. неясно возможно ли это. хотя если тип аргумента string, то почему нет. вот это мне и надо уточнить. с другой стороны написано "текстовый файл <имя канала>_<N>.dat, каждая строка которого содержит обозначение аргумента и его значение". как разделяется "обозначение аргумента" и его "значение" если и то, и другое текстовая строка? ведь разделитель (например пробел) может трактоваться как часть строки. или TRACE MODE отрезает подстроку, совпадающую с именем аргумента от считанной из файла строки? а если строк много и порядок наименований аргументов и строк не совпадает? я понимаю, что нужно избегать такого, но если случается, то система производит сортировку? а если строк тысячи? 3) TVC_RSZ=<макс число аргументов>: честно говоря не понял смысла этого пункта 4) вопрос не столько в том можно ли 10000 строк (хотя и это тоже интересовало), сколько в том как зафигачить такое количество аргументов. когда в программке (имеется в виду обычное программирование на компутере, а не программа в TRACE MODE) объявляешь массив, то как бе нет необходимости вручную объявлять каждый элемент массива, которых может быть миллиарды (у меня был случай, когда обсчитывался 5-мерный массив со 150 млрд элементов). в TRACE MODE же каждый аргумент канала это независимая переменная.то есть выхода нет? садиться за компьютер и сутки напролет стучать по клавиатуре создавая аргументы? 5) это абсолютно ни на что не влияет. предполагается, что по Modbus будет перегоняться каждый раз 1 строка (в пределах 20-30 символов) или результаты дешифровки строки (не более 10 регистров). использоваться должно одно и то же адресное пространство регистров
так что мои вопросы остались не проясненные: 1) возможно ли как-нибудь аргументы объявлять массивом или надо набивать их вручную сколько бы их не было? 2) надо ли в рукопашную привязывать аргументы канала к аргументам программы сколько бы их не было или возможна привязка на уровне массивов? кстати, возможна ли вообще привязка отдельного элемента массива, объявленного в программе, к аргументу канала? 3) как обрабатывать текстовые строки, если в языке Техно ST отсутствуют операторы и функции для работы с текстовыми строками? не то что для анализа строки и выделения из нее команд, но даже для преобразования строки в символы для передачи в регистры по протоколу Modbus нужны подобные функции, но в справке о них ни слова. или они все-таки существуют?
с уважением
Posted by Nico (Участник № / Member № 5342) on :
1 "нет функций по преобразованию типов" из строки куда??? наверное не понял 2 есть еще 41 атрибут 3 TVC_RSZ=<макс число аргументов> в канале типа САLL создаваемых в RTM 4 TM не база данных на диске для миллиардов строк 150 * 10^9 = 139 Gb ) 5 строку побайтно можно получить
1 нет пользуются функциями {get/set}Attribute{I/F} или обработкой векторов в CALL.math 2 = 3 можно даже свою внешнюю функцию написать
С уважением, удачных алгоритмов
Posted by merny (Участник № / Member № 2290) on :
1) ну в си строка трактуется как одномерный массив char. соответственно и доступ к любому символу строки осуществляется напрямую в паскале тоже можно выделить отдельный символ строки и преобразовать его из символьного типа в байтовый. в Техно ST похоже нет никаких операций над строками кроме присваивания ну вот задача: есть переменная типа string, надо разбить на символы, преобразовать в целый тип и передать по протоколу модбаз (строка по модбазу не передается). в си как бе это вообще не проблема, хотя я не программист, но и то знаю как сделать. как можно в Техно ST из строковой переменной получить массив целых беззнаковых, где каждый элемент массива соответствует коду символа? 2) есть еще много других атрибутов. и что? 3) опять не понятно, вы бы еще кванторами изъяснялись. или иероглифами 4) не отвечаете на вопрос, цепляетесь к несущественной детали. троллите? 5) вы о чем? я писал о том, что мне не нужно загонять весь файл в маленькое адресное пространство протокола модбаз. опять троллите?
1) пользуются для чего? и где про это прочитать? 2) ??? 3) можно много чего сделать. можно на голове постоять, можно колесом пройтись. можно ли без написания для всего и вся внешних функций обойтись?
Posted by Nico (Участник № / Member № 5342) on :
call.move с параметром=8 ------------------------------------ 1 HELP Специальные функции в ST-программе -------------------------------------
Posted by merny (Участник № / Member № 2290) on :
quote:Отправитель / Originally posted by Nico: call.move с параметром=8 ------------------------------------ 1 HELP Специальные функции в ST-программе -------------------------------------
мне неясен смысл программного изменения атрибутов канала при решении моих проблем. я не собираюсь манипулировать атрибутами канала извините, но мне вообще неясно, на какой из моих исходных вопросов вы отвечаете. давайте последовательно можно ли задать аргументы канала группой с одним идентификатором по типу массива?
Posted by Nico (Участник № / Member № 5342) on :
"есть переменная типа string, надо разбить на символы, преобразовать в целый тип" -> "call.move с параметром=8"
аргументы это тоже атрибуты
Posted by merny (Участник № / Member № 2290) on :
quote:Отправитель / Originally posted by Nico: "есть переменная типа string, надо разбить на символы, преобразовать в целый тип" -> "call.move с параметром=8"
аргументы это тоже атрибуты
посмотрел я канал call с типом вызова move. как я понял для дешифрации строки нужно создать дополнительный канал call.string, в нем ряд аргументов (общее количество равно максимальной длине строки), желательно SINT/USINT, чтобы можно было обрабатывать посимвольно (если просто ретранслировать по modbus, то можно и 4 байтовые форматы). первый аргумент ARG00 привязываем к аргументу OUT другого канала call, где находится предназначенная для анализа строка. после этого данная строка записывается посимвольно в ряд байтовых аргументов канала call.string, которые уже можно обрабатывать в программе. так?
Posted by Nico (Участник № / Member № 5342) on :
не так нужно создать дополнительный канал call.chgr привязанным к OUT аргументу call.move;
Из In аргументов call.move собирается строка и распихивается OUT аргументы: в call.chgr зависит от типа аргументов; как текстовая строка при другой привязке
Posted by Nico (Участник № / Member № 5342) on :
такой chgr должен быть привязан своим 140 атрибутом
Posted by merny (Участник № / Member № 2290) on :
по-видимому, все же придется писать отдельную программу правда возникает вопрос на хрена нужна TRACE MODE, если 90-99% всей обработки приходится делать внешней по отношению к TRACE MODE ладно, будем думать...
Posted by Nico (Участник № / Member № 5342) on :
какой анализ строки нужен? В тм есть масса возможностей но описание страдает
Posted by merny (Участник № / Member № 2290) on :
1) сформировать массив строк из данных текстового файла 2) последовательный анализ каждого элемента массива - разбиение на подстроки (каждая подстрока буква-цифры) - преобразование цифр подстроки в число
в си пункт 2 вообще никаких проблем не вызывает. а здесь какое-то чередование каналов, передача данных из одних каналов в другие, потом в третьи, привязки, перепривязки, создание аргументов
Posted by Nico (Участник № / Member № 5342) on :
к примеру исходная строка "A123BC45" что должно уйти по ModBus "<41><7b><42><43><2D>" ? если просто на С то и написать на нем и подключить
Posted by merny (Участник № / Member № 2290) on :
quote:Отправитель / Originally posted by Nico: к примеру исходная строка "A123BC45" что должно уйти по ModBus "<41><7b><42><43><2D>" ? если просто на С то и написать на нем и подключить
в самом простом случае 0x0041,0x0031,0x0032,0x0033,0x0042,0x0043,0x0034,0x0035 по адресам 0x0000-0x0007 или 0x4131,0x3233,0x4243,0x3435 по адресам 0x0000-0x0003 принципиального значения это не имеет, т.к. влезет как сжатая, так и не сжатая строка
в более сложном случае, например, 0x007b(=123) по адресу 0х0000 0х0000(=0) по адресу 0х0010 0х002d(=45) по адресу 0х0020
ну я попробую. отдельные приложения я писал на си, а все эти подключаемые библиотеки - еще разбираться надо (не программист я, а технолог)
Posted by Nico (Участник № / Member № 5342) on :
в самом простом случае тогда проблем никаких нет
групповая запись по не идущим подряд адресам в ModBus отсутсвует
Posted by merny (Участник № / Member № 2290) on :
quote:Отправитель / Originally posted by Nico: в самом простом случае тогда проблем никаких нет
никаких проблем нет в случае подключения самостоятельно написанной внешней библиотеки?
quote:Отправитель / Originally posted by Nico: групповая запись по не идущим подряд адресам в ModBus отсутсвует
во втором случае групповая запись и не нужна. строка дешифрируется, коды команд разбрасываются по соответствующим аргументам (или каналам) и передаются в модбас-регистры индивидуально
Posted by Nico (Участник № / Member № 5342) on :
"в самом простом случае 0x0041,0x0031,0x0032,0x0033,0x0042,0x0043,0x0034,0x0035 по адресам 0x0000-0x0007 или 0x4131,0x3233,0x4243,0x3435 по адресам 0x0000-0x0003" = посылка ASCII строки без всяких преобразований
"0x007b(=123) " а здесь преобразование ASCII числа в целое в бинарный вид
Posted by merny (Участник № / Member № 2290) on :
quote:Отправитель / Originally posted by Nico: "в самом простом случае 0x0041,0x0031,0x0032,0x0033,0x0042,0x0043,0x0034,0x0035 по адресам 0x0000-0x0007 или 0x4131,0x3233,0x4243,0x3435 по адресам 0x0000-0x0003" = посылка ASCII строки без всяких преобразований
"0x007b(=123) " а здесь преобразование ASCII числа в целое в бинарный вид
как мне заметили раньше, строковые типы по модбасу не пересылаются. их нужно преобразовать в массив целых и уже его пересылать группой или поштучно. но ведь речь не о методике передачи по модбасу, а о получении из строки массива целых средствами TRACE MODE, но без извращений. будет массив целых - дальше все более менее понятно
Posted by Nico (Участник № / Member № 5342) on :
"1234" одна тысяча двести тридцать четыре в десятичой сс шлется как ASCII: <31><32><33><34> 4байта 2 регистра ModBus или BIN: <04><D2> 2байта 1 регистр ModBus
где <xx> - байт записанный в 16 виде CALL.move в частности предназначен для конвертации из ASCII в BIN и обратно
Posted by merny (Участник № / Member № 2290) on :
quote:Отправитель / Originally posted by Nico: "1234" одна тысяча двести тридцать четыре в десятичой сс шлется как ASCII: <31><32><33><34> 4байта 2 регистра ModBus или BIN: <04><D2> 2байта 1 регистр ModBus
где <xx> - байт записанный в 16 виде CALL.move в частности предназначен для конвертации из ASCII в BIN и обратно
ну понятно, в программе напрямую ASCII в BIN нельзя, только через запись строки в канал CALL.move. а как обращаться к аргументам строкового типа канала CALL.string из программы с помощью индексирования аргументов? это вообще возможно?
Posted by Nico (Участник № / Member № 5342) on :
.да не нужна никакая программа по тому что описано 18-04-2014 09:08 .. обращаться к аргументам строкового типа канала CALL.string из программы с помощью индексирования аргументов нельзя
Posted by merny (Участник № / Member № 2290) on :
quote:Отправитель / Originally posted by Nico: .да не нужна никакая программа по тому что описано 18-04-2014 09:08 .. обращаться к аргументам строкового типа канала CALL.string из программы с помощью индексирования аргументов нельзя
если косвенно адресовать аргумент канала CALL.string нельзя значит ли, что каждому из нескольких тысяч аргументов канала CALL.string потребуется свой канал CALL.move для преобразования ASCII в BIN (ведь невозможно передавать в один канал CALL.move аргументы канала CALL.string по очереди)?
Posted by Nico (Участник № / Member № 5342) on :
.возможно ..не надо держать в ОЗУ несколько тысяч строк если одновременно они не нужны
Posted by merny (Участник № / Member № 2290) on :
quote:Отправитель / Originally posted by Nico: .возможно ..не надо держать в ОЗУ несколько тысяч строк если одновременно они не нужны
так то оно так, но канал call.string закачивает в аргументы весь текстовый файл целиком, а не считывает одну следующую строку в каждом цикле пересчета каналов. и в программе техно st нет функции чтения переменной (хоть целой, хоть вещественной, хоть строковой) из файла
опять же возвращаемся к написанию внешней функции на си придется все же писать нечто внешнее. буду экспериментировать
Posted by Nico (Участник № / Member № 5342) on :
Если грубо: опишите по человечески что нужно сделать ! То ascii, то целое . Теперь с плавающей точкой Что дальше. Помощь по реализации возможна при четкой задаче. Иначе вопрос времени и денег. Это не троллинг ) удачи
Posted by merny (Участник № / Member № 2290) on :
да все было описано: загрузка текстовых строк (неопределенного количества, вплоть до тысяч или даже десятков тысяч) из файла (пусть с фиксированным именем) последовательное преобразование строк (в каждом цикле пересчета одну строку) в массив целых (каждый элемент массива - ascii код символа строки)
когда получен такой массив, то остальное уже дело техники - с ним уже возможны любые манипуляции
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
В АППАРАТНОМ значении канала CALL.STRING отображается аргумент этого канала с номером, равным его РЕАЛЬНОМУ значению. Таким образом можно выбрать для обработки любую строку из текстового файла, считанного каналом CALL.STRING.
Однако обработать выбранную строку в соответствии с изложенными выше требованиями штатными средствами Trace Mode 6 будет весьма проблематично. Видимо, лучше подключить внешнюю библиотеку.
В частных случаях возможны решения на основе предложений в постах от 17.04 и 18.04.
Конкретная реализация задачи требует более детального изучения предложенной документации.