PDA

Просмотр полной версии : Обсуждение: библиотека OwenStringUtils



Осинский Алексей
23.01.2017, 14:47
Внимание! Эта тема для обсуждения библиотеки OwenStringUtils. Скачать последнюю версию библиотеки и ознакомиться с изменениями Вы можете в СООТВЕТСТВУЮЩЕЙ теме (http://www.owen.ru/forum/showthread.php?t=25981).

Мы разработали библиотеку OwenStringUtils, которая содержит наиболее востребованные функции для работы со строками.
Использовать библиотеку Вы можете в CODESYS 3.5 SP4 и выше.

1) Конвертация кодировок:
Часто при программировании в среде разработки CODESYS 3.5 приходится работать с кодировками символов (например: пользователь вводит текст сообщения с визуализации как WSTRING, а модем работает со строками STRING).
Функции CP1251_TO_UNICODE и UNICODE_TO_CP1251 решают эту проблему и позволяют конвертировать содержимое строк STRING в WSTRING и обратно.
В этой части библиотека OwenStringUtils полностью перекрывает функционал библиотеки ASCII_TO_UNICOD

2) Выделение части строки
Часто необходимо выделить часть строки (например: обработать команду, полученную по SMS).
Эта задача решается при помощи функций библиотеки Standard: Len, Find, Left, Mid, и Right, но код может получиться достаточно объемным:
Например, если по SMS получена команда Уставка=25.6
получить имя команды и значение на языке ST можно таким образом

28874

На языке CFC, FBD и др. решение задачи будет гораздо более объемным и гораздо менее читабельным.
С использованием функций Before и After библиотеки OwenStringUtils количество кода (на ST) уменьшиться вдвое.

28875

На CFC решение будет выглядеть не менее элегантно:

28876

Для того, чтобы облегчить выделение средней части строки между 2мя известными подстроками мы добавили функцию Between.

Например: для того, чтобы определить текущий баланс на SIM-карте по SMS от оператора:
«Ваш баланс: 156,30 руб. Ваш Билайн» достаточно будет написать 1 строку в программе:

28877

В дальнейшем мы будем дорабатывать библиотеку, добавляя в нее новые функции и функциональные блоки для того, чтобы упростить Вам написание программ.
Если есть идеи о том, какой функционал стоит добавить в эту библиотеку – смело пишите в этой теме.

Scream
23.01.2017, 14:57
Для какого codesys эта библиотека?

Осинский Алексей
23.01.2017, 14:59
Для какого codesys эта библиотека?

CODESYS 3.5 SP4 и выше.

Scream
23.01.2017, 15:18
CODESYS 3.5 SP4 и выше.

Какой процент устройств от овен работает на этом codesys?

Осинский Алексей
23.01.2017, 15:42
Какой процент устройств от овен работает на этом codesys?

Вы, вероятно, ведете к тому, что Вам необходим функционал из этой библиотеки в CODESYS 2.3?
Что именно необходимо?

Эдуард_Н
15.03.2017, 04:16
Пример выделение баланса хороший, но только возможно для Билайна. У каждого сотового оператора текст сообщения свой и меняет его как хочет, поэтому опираться надо на цифры в сообщении для их выделения и для универсальности, да и то у одного оператора разделителем служит точка у другого запятая (125,25; 125.25).

Осинский Алексей
16.03.2017, 13:19
Пример выделение баланса хороший, но только возможно для Билайна. У каждого сотового оператора текст сообщения свой и меняет его как хочет, поэтому опираться надо на цифры в сообщении для их выделения и для универсальности, да и то у одного оператора разделителем служит точка у другого запятая (125,25; 125.25).

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

дате,
в рекламе, которая может содержаться в ответе,
так и быть записаны в формате 16 руб 50 коп.

приборист
18.07.2017, 10:49
Добрый день!
Планируется ли портировать библиотеку на 2.3?
Требовалась ASCII_TO_UNICOD в 2.3, пока обходимся без нее.

Нелия Зеленова
10.08.2017, 11:36
Добрый день! Подскажите, пожалуйста, какую задачу Вы решаете преобразованием ASCII в UNICODE? Т.к. кодировка UNICODE не поддержана в Codesys v2.3

приборист
10.08.2017, 11:42
Добрый день! Подскажите, пожалуйста, какую задачу Вы решаете преобразованием ASCII в UNICODE? Т.к. кодировка UNICODE не поддержана в Codesys v2.3

Добрый день!
Необходимо осуществлять запись данных на USB, затем вычитываем данные с USB и отправлять на сервер.
На СПК преобразовывали данные перед записью на SD карту через функцию BYTE_TO_HEXinASCII, а затем сразу читали и отправляли на сервер.

Нелия Зеленова
10.08.2017, 12:04
Спасибо, я передала Вашу просьбу разработчикам

Владислав3095
21.03.2018, 12:46
стандартные строковые функции в codesys могут работать только с 255 символами. Сколько символов поддерживают функции этой библиотеки ?

capzap
21.03.2018, 13:02
стандартные строковые функции в codesys могут работать только с 255 символами. Сколько символов поддерживают функции этой библиотеки ?

стандартное значение строки 80 символов, если указывать например STRING(255) то строка будет состоять из не более 255 символов, ради интереса может задать STRING(2048) и поместить туда примерно такое же количество символов, должно сработать. Поэтому если в функции стоит просто STRING строка будет не более 80 символов

Евгений Кислов
21.03.2018, 13:17
стандартные строковые функции в codesys могут работать только с 255 символами. Сколько символов поддерживают функции этой библиотеки ?

Также 255, поскольку они построены на стандартных функциях.
Вы можете описать ситуации, когда требуется работать со строками большей длины?

saii
16.08.2020, 13:22
sTmp := OSU.DT_TO_STRING_FORMAT(TargetVars.stRtc.dtDateAnd Time, '%t[yyyyMMdd-HHmmss]');


В результате получаю:

20200816-13120001
20200816-13120002
20200816-13120003
20200816-13120004
20200816-13120005
20200816-13120006
20200816-13120007
20200816-13120008
20200816-13120009
20200816-131200010
20200816-131200011
...
20200816-131200058
20200816-131200059
20200816-13130000

И как это согласуется со строкой форматирования "yyyyMMdd-HHmmss"?

Если использовать строку форматирования "mm" или "ss", то результат адекватный, а если "mmss", то аналогично приведенному выше, между минутами и секундами вставляется лишних 2-3 нуля.

Евгений Кислов
17.08.2020, 07:19
И как это согласуется со строкой форматирования "yyyyMMdd-HHmmss"?

Согласуется следующим образом:

yyyyMMdd-HHmmss

В использованном в функции алгоритме сначала выполняется подстановка миллисекунд, поэтому получается приведенный выше результат.

В вашем случае, на мой взгляд, проще всего сделать так:



sTmp := OSU.DT_TO_STRING_FORMAT(TargetVars.stRtc.dtDateAnd Time, '%t[yyyyMMdd-HHmm]');
sTmp := CONCAT(sTmp, OSU.ADD_CHAR(TO_STRING(TargetVars.stRtc.usiGetSeco nd), 2, '0', FALSE));

saii
17.08.2020, 10:06
Не правильно согласуется, т.к. по правилам при разборе выражений всегда выбирается самая длинная лексема. И, если рассматривать разбор слева направо, это будет "mm", и тогда останется "ss". А у Вас получается, что сначала вычленили "m", потом вычленили "ms", потом вычленили "s".

P.S. Я так и сделал, как Вы написали. Но ошибку все-таки надо исправлять.

Филоненко Владислав
17.08.2020, 14:39
стандартное значение строки 80 символов, если указывать например STRING(255) то строка будет состоять из не более 255 символов, ради интереса может задать STRING(2048) и поместить туда примерно такое же количество символов, должно сработать. Поэтому если в функции стоит просто STRING строка будет не более 80 символов
Не будет работать с 2048 символами, только 255. Строковые функции в CoDeSys по причинам безопасности рантайма работают совсем не так, как обычные строковые в том же С.

Спорягин Кирилл
14.11.2020, 13:41
Подскажите, так будет аналог функций CP1251_TO_UNICODE и UNICODE_TO_CP1251 для версии V2?

Поясню где понадобилось.

Из кассы получаю название фирмы в кодировке 1251. Это название передаю на панель weintek. А последняя воспринимает только unicode.

Евгений Кислов
14.11.2020, 14:10
Нет, не будет - версия V2.3 логично завершила свое развитие.
Сами 3S уже год как официально прекратили выпуск каких-либо патчей (а реально обновлений функционала не было уже лет 7-8), поддержку и продажу рантайм тулкитов.

Я удивлюсь, если у Weintek нету способов выводить строки в Win1251.
Но даже если это и так - то есть примеры макросов для конвертации кодировок (https://www.weintek.net/macros.html).

В следующий раз рекомендую рассмотреть СП3xx - с ней бы таких проблем не возникло. )))

capzap
14.11.2020, 14:17
всё в винтеке можно, просто кирилический шрифт по умолчанию не поставляется, поэтому всё обычно с юникодом работают
А почти конвертер и в оскате можно подсмотреть

Boris_R
04.04.2021, 21:25
Проблема с OWENStringUtil. Не работает OSU.UNICODE_TO_CP1251 (файл проекта прилагается).
Что надо исправить?

Евгений Кислов
05.04.2021, 04:45
Что именно у вас не получается?
Покажите скриншотами, пожалуйста.

Boris_R
05.04.2021, 07:02
Что именно у вас не получается?
Покажите скриншотами, пожалуйста.
Скриншот прилагается.

Евгений Кислов
05.04.2021, 07:08
У меня с вашим проектом все корректно.

54381

Какой у вас язык выбран в настройках ОС?

Boris_R
05.04.2021, 07:14
У меня с вашим проектом все корректно.

54381

Какой у вас язык выбран в настройках ОС?
Английский. Но как это может влиять на СПК, где все точно так же?

Евгений Кислов
05.04.2021, 07:33
Английский. Но как это может влиять на СПК, где все точно так же?

Так это не на стороне СПК, это на стороне CODESYS, запущенного на вашем ПК.
В байтах строки лежат корректные ASCII-коды сейчас, просто из-за настроек ОС они отображаются вот так - CODESYS цепляет кодировку из настроек ОС.

Boris_R
05.04.2021, 07:38
[QUOTE=Евгений Кислов;353015]Так это не на стороне СПК, это на стороне CODESYS, запущенного на вашем ПК.
В байтах строки лежат корректные ASCII-коды сейчас, просто из-за настроек ОС они отображаются вот так - CODESYS цепляет кодировку из настроек ОС.[/QUOT

Есть проблема и на СПК. Выслать "боевой" проект, где это видно, не могу. Но там это выглядит точно так же.

Евгений Кислов
05.04.2021, 07:43
Так это не на стороне СПК, это на стороне CODESYS, запущенного на вашем ПК.
В байтах строки лежат корректные ASCII-коды сейчас, просто из-за настроек ОС они отображаются вот так - CODESYS цепляет кодировку из настроек ОС.[/QUOT

Есть проблема и на СПК. Выслать "боевой" проект, где это видно, не могу. Но там это выглядит точно так же.

Давайте тогда вы организуете удаленный доступ по TeamViewer и продемонстрируете свою проблему вживую.

Boris_R
05.04.2021, 07:53
Давайте тогда вы организуете удаленный доступ по TeamViewer и продемонстрируете свою проблему вживую.

Попробую несколько позднее.

Boris_R
05.04.2021, 08:03
Давайте тогда вы организуете удаленный доступ по TeamViewer и продемонстрируете свою проблему вживую.

А пока несколько подробнее про проблему. Перекодировка используется для возможности делать названия рецептов на русском языке. До перехода на ПК с английским все работало. И даже если с такого ПК подключиться к СПК, где есть русские буквы в названиях рецептов, то все нормально. А вот после перекомпиляции и записи проекта с такого ПК уже не получается использовать русские буквы. Проблема возникает в момент, которые представлен в выложенном проекте. Ну или еще что-то упущено. Хотя это маловероятно.

Boris_R
05.04.2021, 08:21
Так это не на стороне СПК, это на стороне CODESYS, запущенного на вашем ПК.
В байтах строки лежат корректные ASCII-коды сейчас, просто из-за настроек ОС они отображаются вот так - CODESYS цепляет кодировку из настроек ОС.

И вот еще скриншот. Если бы только с отображением, то при обратной конвертации получилась бы исходная строка. Но этого не происходит.

Евгений Кислов
05.04.2021, 08:24
Перекодировка используется для возможности делать названия рецептов на русском языке.

Так не получится - ОС контроллера не поддерживает кириллицу в названиях файлов (если у вас рецепт - это именно файл).

Boris_R
05.04.2021, 08:31
Так не получится - ОС контроллера не поддерживает кириллицу в названиях файлов (если у вас рецепт - это именно файл).

Рецепты в другом проекте. В приложенном и на скриншоте - момент возникновения проблемы.

Boris_R
05.04.2021, 10:25
Так не получится - ОС контроллера не поддерживает кириллицу в названиях файлов (если у вас рецепт - это именно файл).

До перехода на ПК с английским в настройках русские буквы в названиях рецептов работали (см. скриншот). После перехода - перестали. Момент, когда появляется проблема - неудачная конвертация в 1251.

Евгений Кислов
05.04.2021, 10:27
До перехода на ПК с английским в настройках русские буквы в названиях рецептов работали (см. скриншот). После перехода - перестали. Момент, когда появляется проблема - неудачная конвертация в 1251.

Я понял, вы не про название файла, а про строковую переменную в рецепте.
Хорошо, продолжаю ждать TeamViewer.

Boris_R
05.04.2021, 10:34
Я понял, вы не про название файла, а про строковую переменную в рецепте.
Хорошо, продолжаю ждать TeamViewer.

Со строковыми переменными в самих рецептах все ОК. Проблема с их названиями. Там перекодирование требовалось.
С TeamViewer боюсь, что только после 18:00 по московскому времени получится.

Евгений Кислов
05.04.2021, 10:49
Со строковыми переменными в самих рецептах все ОК. Проблема с их названиями. Там перекодирование требовалось.
С TeamViewer боюсь, что только после 18:00 по московскому времени получится.

Я в этот момент уже не смогу подключиться (доступен до 15-00 по московскому времени).
То, что можно использовать WSTRING с кириллицей в рецептах - у меня сомнений не вызывает.
См. это видео: https://youtu.be/6V2TP4PQ0m0