Просмотр полной версии : Обсуждение: библиотека 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
В дальнейшем мы будем дорабатывать библиотеку, добавляя в нее новые функции и функциональные блоки для того, чтобы упростить Вам написание программ.
Если есть идеи о том, какой функционал стоит добавить в эту библиотеку – смело пишите в этой теме.
Для какого codesys эта библиотека?
Осинский Алексей
23.01.2017, 14:59
Для какого codesys эта библиотека?
CODESYS 3.5 SP4 и выше.
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 символами. Сколько символов поддерживают функции этой библиотеки ?
стандартные строковые функции в codesys могут работать только с 255 символами. Сколько символов поддерживают функции этой библиотеки ?
стандартное значение строки 80 символов, если указывать например STRING(255) то строка будет состоять из не более 255 символов, ради интереса может задать STRING(2048) и поместить туда примерно такое же количество символов, должно сработать. Поэтому если в функции стоит просто STRING строка будет не более 80 символов
Евгений Кислов
21.03.2018, 13:17
стандартные строковые функции в codesys могут работать только с 255 символами. Сколько символов поддерживают функции этой библиотеки ?
Также 255, поскольку они построены на стандартных функциях.
Вы можете описать ситуации, когда требуется работать со строками большей длины?
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));
Не правильно согласуется, т.к. по правилам при разборе выражений всегда выбирается самая длинная лексема. И, если рассматривать разбор слева направо, это будет "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 - с ней бы таких проблем не возникло. )))
всё в винтеке можно, просто кирилический шрифт по умолчанию не поставляется, поэтому всё обычно с юникодом работают
А почти конвертер и в оскате можно подсмотреть
Проблема с OWENStringUtil. Не работает OSU.UNICODE_TO_CP1251 (файл проекта прилагается).
Что надо исправить?
Евгений Кислов
05.04.2021, 04:45
Что именно у вас не получается?
Покажите скриншотами, пожалуйста.
Что именно у вас не получается?
Покажите скриншотами, пожалуйста.
Скриншот прилагается.
Евгений Кислов
05.04.2021, 07:08
У меня с вашим проектом все корректно.
54381
Какой у вас язык выбран в настройках ОС?
У меня с вашим проектом все корректно.
54381
Какой у вас язык выбран в настройках ОС?
Английский. Но как это может влиять на СПК, где все точно так же?
Евгений Кислов
05.04.2021, 07:33
Английский. Но как это может влиять на СПК, где все точно так же?
Так это не на стороне СПК, это на стороне CODESYS, запущенного на вашем ПК.
В байтах строки лежат корректные ASCII-коды сейчас, просто из-за настроек ОС они отображаются вот так - CODESYS цепляет кодировку из настроек ОС.
[QUOTE=Евгений Кислов;353015]Так это не на стороне СПК, это на стороне CODESYS, запущенного на вашем ПК.
В байтах строки лежат корректные ASCII-коды сейчас, просто из-за настроек ОС они отображаются вот так - CODESYS цепляет кодировку из настроек ОС.[/QUOT
Есть проблема и на СПК. Выслать "боевой" проект, где это видно, не могу. Но там это выглядит точно так же.
Евгений Кислов
05.04.2021, 07:43
Так это не на стороне СПК, это на стороне CODESYS, запущенного на вашем ПК.
В байтах строки лежат корректные ASCII-коды сейчас, просто из-за настроек ОС они отображаются вот так - CODESYS цепляет кодировку из настроек ОС.[/QUOT
Есть проблема и на СПК. Выслать "боевой" проект, где это видно, не могу. Но там это выглядит точно так же.
Давайте тогда вы организуете удаленный доступ по TeamViewer и продемонстрируете свою проблему вживую.
Давайте тогда вы организуете удаленный доступ по TeamViewer и продемонстрируете свою проблему вживую.
Попробую несколько позднее.
Давайте тогда вы организуете удаленный доступ по TeamViewer и продемонстрируете свою проблему вживую.
А пока несколько подробнее про проблему. Перекодировка используется для возможности делать названия рецептов на русском языке. До перехода на ПК с английским все работало. И даже если с такого ПК подключиться к СПК, где есть русские буквы в названиях рецептов, то все нормально. А вот после перекомпиляции и записи проекта с такого ПК уже не получается использовать русские буквы. Проблема возникает в момент, которые представлен в выложенном проекте. Ну или еще что-то упущено. Хотя это маловероятно.
Так это не на стороне СПК, это на стороне CODESYS, запущенного на вашем ПК.
В байтах строки лежат корректные ASCII-коды сейчас, просто из-за настроек ОС они отображаются вот так - CODESYS цепляет кодировку из настроек ОС.
И вот еще скриншот. Если бы только с отображением, то при обратной конвертации получилась бы исходная строка. Но этого не происходит.
Евгений Кислов
05.04.2021, 08:24
Перекодировка используется для возможности делать названия рецептов на русском языке.
Так не получится - ОС контроллера не поддерживает кириллицу в названиях файлов (если у вас рецепт - это именно файл).
Так не получится - ОС контроллера не поддерживает кириллицу в названиях файлов (если у вас рецепт - это именно файл).
Рецепты в другом проекте. В приложенном и на скриншоте - момент возникновения проблемы.
Так не получится - ОС контроллера не поддерживает кириллицу в названиях файлов (если у вас рецепт - это именно файл).
До перехода на ПК с английским в настройках русские буквы в названиях рецептов работали (см. скриншот). После перехода - перестали. Момент, когда появляется проблема - неудачная конвертация в 1251.
Евгений Кислов
05.04.2021, 10:27
До перехода на ПК с английским в настройках русские буквы в названиях рецептов работали (см. скриншот). После перехода - перестали. Момент, когда появляется проблема - неудачная конвертация в 1251.
Я понял, вы не про название файла, а про строковую переменную в рецепте.
Хорошо, продолжаю ждать TeamViewer.
Я понял, вы не про название файла, а про строковую переменную в рецепте.
Хорошо, продолжаю ждать TeamViewer.
Со строковыми переменными в самих рецептах все ОК. Проблема с их названиями. Там перекодирование требовалось.
С TeamViewer боюсь, что только после 18:00 по московскому времени получится.
Евгений Кислов
05.04.2021, 10:49
Со строковыми переменными в самих рецептах все ОК. Проблема с их названиями. Там перекодирование требовалось.
С TeamViewer боюсь, что только после 18:00 по московскому времени получится.
Я в этот момент уже не смогу подключиться (доступен до 15-00 по московскому времени).
То, что можно использовать WSTRING с кириллицей в рецептах - у меня сомнений не вызывает.
См. это видео: https://youtu.be/6V2TP4PQ0m0
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot