PDA

Просмотр полной версии : Строковые функции языка ST в MasterScada



ks21
29.05.2019, 08:33
Есть несколько вопросов по работе строковых функций:
1. Функция FIND(Str1, Str2) должна бы, по идее, возвращать значение 0, если Str2 не найдена в Str1. Не возвращает, или, можно сказать, возвращает неправильно. А если Str2 = '.' возвращает 1 всегда, где бы эта точка не находилась. Если искать ',' и запятая есть в Str1, возвращается правильный номер в строке. Но если запятую из строки убрать, то возвращается номер позиции где запятая была. Ноль возвращать не хочет.

2. Если на строковый вход скрипта ST вместо непустой строки подать пустую строку, то скрипт не обрабатывает её. Например, можно написать внутри скрипта функцию LEN(in_string), надеясь получить длину 0, но ничего подобного не произойдёт.

Опрос объектов периодический. Почему пустые строки не обрабатываются? Замеченные особенности действительно имеют место быть или это я неправильно использую строковые функции?

SCADAMaster
29.05.2019, 09:19
У нас все корректно. Попробуйте проверить на текущей Beta версии.

ks21
29.05.2019, 10:08
У меня стояла версия 3.9.0.2484. Скачал с сайта версию 3.10.0.8093 3.10(RT32ReleaseMax)_19_02_01_23_46. В ней эти функции работают корректно. Спасибо за подсказку. А это и есть Beta версия? Или Beta лежит где-то в другом месте?

melky
29.05.2019, 10:44
Поиск подстроки всегда возвращает первое вхождение, при отсутствии указания позиции с какой начинать поиск.
Если речь про точки, запятые и повторяющиеся данные.

Мне так кажется...
И вы собственно 1 получаете, что что-то найдено, нет ?

з.ы. не знаток ST но обычно так, если реализация самого ST на языке другого уровня.
Должно вернуть bool = true если нашел, и еще в некую переменную указать номер позиции первого вхождения.

SCADAMaster
29.05.2019, 11:00
У меня стояла версия 3.9.0.2484. Скачал с сайта версию 3.10.0.8093 3.10(RT32ReleaseMax)_19_02_01_23_46. В ней эти функции работают корректно. Спасибо за подсказку. А это и есть Beta версия? Или Beta лежит где-то в другом месте?
Beta лежит там же.
Но если работает эта, то используйте ее

ks21
29.05.2019, 11:48
[QUOTE=melky;306530]Поиск подстроки всегда возвращает первое вхождение, при отсутствии указания позиции с какой начинать поиск.
Если речь про точки, запятые и повторяющиеся данные.

Мне так кажется...
И вы собственно 1 получаете, что что-то найдено, нет ?

В функции FIND на языке ST два аргумента: FIND(строка в которой ищем, строка которую надо найти). Негде ей указать с какой позиции начать поиск. В версии Скады 3.9 FIND(строка, '.') всегда возвращала 1, независимо от того, где в строке точка и есть ли она вообще. В версии 3.10 функция работает правильно. А если что-то не найдено в языке ST должно возвращаться 0.

melky
29.05.2019, 11:54
Хм, че за странная функция на ST, а если у меня в строке 2 одинаковые записи, а мне нужна определенная ? или обработать одну, потом обработать следующую ?

ks21
29.05.2019, 13:18
Ага. Вот такая странная функция. Из описания: "FIND(STR1, STR2) означает: найти позицию в строке STR1, где впервые встречается подстрока STR2." А дальше, если надо найти повторения, именно как Вы говорите - отрезать кусок строки с найденным включением, повторить поиск в оставшемся обрезке строки, и т. д. В принципе, элементарных строковых функций ST вполне хватает для несложной обработки строк. А для особо причудливых извращений есть C#.

melky
29.05.2019, 13:23
Я так понимаю, если ничего не нашла, FIND=0, если что-то нашла то FIND = число, начало позиции первого вхождения?

может у вас там точка всегда на первой позиции ? :)