This is topic Работа со строками в TRACE MODE in forum TRACE MODE 6 бесплатная Базовая версия / TRACE MODE 6 free Base version at Форум TRACE MODE: техническая поддержка.


To visit this topic, use this URL:
http://forum.adastra.ru/ultimatebb.php/ubb/get_topic/f/31/t/001317.html

Posted by merny (Участник № / Member № 2290) on :
 
Задача примерно следующая
аппаратная часть:
рабочее место оператора - ноутбук или РС
внешний контроллер, обмен по Modbus ТСР
устройства удаленного ввода-вывода, подключенные к контроллеру

программная часть:
МРВ TRACE MODE на операторском рабочем месте
некоторые служебные программки на операторском рабочем месте
специализированные программы на контроллере

необходимо: читать данные из текстового файла в строковые переменные и далее
- либо неизменными транслировать в контроллер через Modbus ТСР, где будет происходить вся обработка
- либо производить первичную обработку на компьютере под управлением МРВ и уже переработанные данные пересылать в контроллер уже не как строковые данные, а как действительные и целые числа

теоретически необходима возможность загружать данные из произвольного файла, но можно использовать файл с фиксированным именем, в который будет копироваться необходимый файл служебной программкой

справочная система TRACE MODE говорит о такой возможности:
Для канала CALL.STRING
...
если значение атрибута Синхр/Дамп канала не задано ("…"), при старте монитора значения аргументов считываются из файла ../<папка узла>/<имя канала>.txt. Формат файла:

<число задаваемых аргументов, N>
<значение arg0>
<значение arg1>

<значение argN>
<пустая строка>

Для принудительного считывания значений аргументов из файла ../<папка узла>/<имя канала>.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 [Улыбка / Smile] )
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, то целое . Теперь с плавающей точкой
Что дальше. Помощь по реализации возможна при
четкой задаче. Иначе вопрос времени и денег.
Это не троллинг [Улыбка / Smile] ) удачи
 
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.

Конкретная реализация задачи требует более детального изучения предложенной документации.

Топик закрывается.
 


Новости АСУ ТП / News | SCADA / HMI | Обучение / Trainings | Свяжитесь с нами / Contact Us



Powered by Infopop Corporation
UBB.classic™ 6.7.2