Oscat - работа со строками CDS V2.3

Большинство начинающих программистов CoDeSys задают один и тот же вопрос об ущербности CoDeSys V2.3 при работе со строками. Да, действительно, функционал CoDeSys 2.3 для работы со строками, скажем так, не богат. Все функции работы со строками находятся в библиотеке standart.lib.
Вот эти функции:

  • LEN - возвращает длину строки
  • LEFT - возвращает часть строки от исходной слева на указанное количество символов
  • RIGHT - то же самое только справа
  • MID - вырезает строку из центра исходной строки от и до указанных позиций
  • CONCAT - склеивает две строки
  • INSERT - вставляет одну строку в другую с указанной позиции
  • DELETE - удаляет указанное количество символов из строки с указанной позиции.
  • REPLACE - меняет в строке указанное количество символов с указанного положения на заданную подстроку.
  • FIND - возвращает местоположение подстроки в строке.

Разработчики 3S приняли во внимание этот вопрос и в CoDeSys V3 функционал работы со строками был несколько расширен. Но что же делать пользователям широко распространенной версии 2.3? - спросит начинающий. Oscat- шепнет непонятное слово бывалый.

Существует бесплатная библиотека oscat.lib с открытым кодом, разрабатываемая группой независимых разработчиков. Любой желающий может стать членом этой группы. На официальном сайте http://www.oscat.de/ так и сказано:

"Мы сердечно приглашаем Вас принять участие в разработке OSCAT.LIB. Вы можете вступить в общество разработчиков на форуме нашего сайта, либо связавшись с нами по электронной почте. Целью проекта является создание по возможности максимально ясной библиотеки, которая включает в себя наиболее важные функции и функциональные блоки для проектов автоматизации."

Заманчиво, не правда ли? Давайте же познакомимся с этой полезной библиотекой поближе. Для осознания размеров этой библиотеки скажу, что описание ее располагается на 516 страницах текста на немецком языке, в то время как описание CoDeSys 2.3 только на 460.

Библиотека включает в себя множество функций различного назначения: математических, работа с датой и временем, работы со строками, работой в области автоматизации зданий, различные сетевые, логические, измерений и обработки сигналов. И это не полный список.

Сейчас нас интересуют возможности этой библиотеки при работе со строками. Для работы со строками Oscat предлагает 74 инструмента - функций и функциональных блоков.

Я постарался сгруппировать их по логическому назначению и привести их краткое описание ниже.
Работа с бинарными строками:

BIN_TO_BYTE преобразования строки бинарных символов в переменную типа byte BIN_TO_BYTE ('101') = 5
BIN_TO_DWORD то же самое в тип dword
BYTE_TO_STRB обратное преобразование байта в строку битов BYTE_TO_STRB(123)= '01111011'
DWORD_TO_STRB обратное преобразование dword в строку битов

Работа с десятичными строками:

DEC_TO_BYTE преобразование десятичной строки в байт DEC_TO_BYTE('123')= 123
DEC_TO_DWORD преобразование десятичной строки в DWORD
DEC_TO_INT преобразование десятичной строки в INT с учетом знака DEC_TO_INT('-34') = -34
DWORD_TO_STRF Преобразует dword в десятичную с фиксированной длиной строки DWORD_TO_STRF(123456,4) вернет строку '3456', DWORD_TO_STRF(123456,8)= '00123456'
REAL_TO_STRF перевод REAL в строку с заданной точностью. REAL_TO_STRF(3.14159,4) = '3.1416'
FLOAT_TO_REAL преобразует строку с числом FLOAT в переменную типа REAL. При этом '.' и ',' интерпретируется как точка, а буквы 'e' или 'E' расцениваются как экспоненциальная запись. FLOAT_TO_REAL('12e3')= 12000

Работа с шестнадцатеричными строками:

HEX_TO_BYTE преобразует строку с шестнадцатеричной цифрой в byte. Нечувствителен к регистру символов
HEX_TO_DWORD преобразует строку с шестнадцатеричной цифрой в DWORD. Нечувствителен к регистру символов
BYTE_TO_STRH преобразование байта в шестнадцатеричную строку BYTE_TO_STRH(5) = '0B'
DWORD_TO_STRH преобразует dword в шестнадцатеричную строку

Работа с восьмеричными строками:

OCT_TO_BYTE переводит строку с восьмеричной цифрой в BYTE
OCT_TO_DWORD переводит строку с восьмеричной цифрой в DWORD

Общие функции для нескольких форматов:

FSTRING_TO_BYTE преобразует форматированную строку с числом в BYTE. Форматы строки: 2#0101 (бинарный), 8#345 (восмеричный), 16# (шестнадцатеричный) и десятичный. FSTRING_TO_BYTE('16#33')=51.
FSTRING_TO_DWORD аналогично преобразует форматированную строку с числом в DWORD

Функции поиска, замены, удаления:

FIND_CHAR возвращает позицию первого неуправляющего символа в строке, поиск ведется с указанной позиции. Управляющие символы - символы с кодом до 32 и после 127
FIND_CTRL возвращает позицию первого управляющего символа в строке, поиск ведется с указанной позиции. Управляющие символы - символы с кодом до 32 и после 127
FIND_NONUM возвращает позицию первого символа, не являющегося номером, поиск ведется с указанной позиции FIND_NONUM('12j34',1)=3
FIND_NUM возвращает позицию первого символа, являющегося номером,поиск ведется с указанной позиции FIND_NUM('wej34',1)=4
FINDB возвращает позицию последнего вхождения подстроки в строку FINDB('abs12fir12bus12', '12') = 14
FINDB_NONUM возвращает позицию последнего символа, не являющегося цифрой
FINDB_NUM возвращает позицию последнего символа, являющегося цифрой
FINDP возвращает последнюю позицию вхождения подстроки в строку, поиск ведется с указанной позиции
COUNT_CHAR возвращает количество вхождений символа в строке COUNT_CHAR('afsfdfg', 102)=3
REPLACE_ALL Заменяет подстроки в исходной строке на заданное выражение REPLACE_ALL('123BB456BB789BB','BB','/') = '123/456/789/'
REPLACE_CHARS Заменяет символы строки на символы подстроки, соответствующие символам в маске REPLACE_CHARS('abc123','0123456789',' ABCDEFGHIJ') = 'abcABC'
REPLACE_UML Заменяет УМЛЯУТЫ в строке.Ä > Ae, Ö > Oe, Ü > Ue, ä > ae, ö > oe, ü > oe, ß > ss. Функция далекая от русского человека:)
CLEAN чистит строку по заданной маске, оставляя в строке символы, входящие в маску CLEAN('Nr.1 23#', '0123456789') = '123'
DEL_CHARS аналогично CLEAN чистит строку по маске, но, в отличие от первой, удаляет из строки символы, входящие в маску DEL_CHARS('#Nr. 123abc','abc#')= 'Nr. 123'
TRIM Удаляет все пробелы в строке TRIM('find BX12') = 'findBX12'
TRIM1 Удаляет двойные пробелы в строке, также удаляет пробелы в начале и в конце строки TRIM1(' find BX12 ') = 'find BX12'
TRIME Удаляет пробелы только в начале и конце строки

Различные проверки:

IS_ALNUM проверяет строку на содержание только цифр и букв алфавита IS_ALNUM('1@23rfg')= false,IS_ALNUM('123rfg')=true
IS_NUM проверяет строку на содержание только цифр
IS_ALPHA проверяет строку на содержание только букв алфавита
IS_CC проверяет вхождение символов в строку по заданному шаблону. Если обнаруживается в строке символ, не содержащийся в шаблоне, возвращает false IS_CC('3.14', '0123456789.') = TRUE
IS_CC('-3.14', '0123456789.') = FALSE
IS_NCC обратная IS_CC - проверяет на НЕвхождение символов строки в шаблон
IS_CTRL проверяет строку на содержание только управляющих символов
ISC_ALPHA проверяет символ, является ли он цифрой или буквой
ISC_CTRL проверяет символ, является ли он управляющим
ISC_NUM проверяет символ, является ли он цифрой
IS_HEX проверяет строку на содержание символов только из шестнадцатеричной системы счисления
ISC_HEX проверяет символ на принадлежность к шестнадцатеричной системы счисления
IS_LOWER проверяет строку на содержание только строчных символов
IS_UPPER проверяет строку на содержание только заглавных символов
ISC_LOWER проверяет символ, является ли он строчным
ISC_UPPER проверяет символ, является ли он заглавным

Работа с символами по таблице ASCII:

CHARCODE возвращает код символа по таблице ascii CHARCODE('f') = 102
CHARNAME - возвращает наименование символа по таблице ascii CHARNAME(128) = 'euro'
CHR_TO_STRING возвращает символ в строке по коду ascii CHR_TO_STRING(102) ='f'
CODE возвращает код указанного символа в строке CODE ('asdfghj',4) = 102
TO_UML переводит код символов УМЛЯУТОВ в строку: Ä >> Ae ä >> ae Ö >> Oe ö >> oe Ü >> Ue ü >> ue ß >> ss

Работа с датой и временем:

FSTRING_TO_MONTH преобразование названий месяцев в число (порядковый номер месяца) с немецкого, английского языков (указывается вторым параметром 1-Английский, 2- Немецкий)

FSTRING_TO_MONTH('Januar',2) = 1 FSTRING_TO_MONTH('Jan',2) = 1 FSTRING_TO_MONTH('11',0) = 11

MONTH_TO_STRING Переводит номер месяца в строку с названием месяца. Язык немецкий/английский задается параметром LANG. Параметр LX задает формат отображения месяца. 0- название полностью, 3- название в три буквы

MONTH_TO_STRING(1,2,0) = 'Januar' или MONTH_TO_STRING(1,2,3) = 'Jan'

FSTRING_TO_WEEK Преобразует названия дней недели в строке в Byte с немецкого или английского (задается вторым параметром 1-Английский, 2- Немецкий), при этом Понедельник отображается 7-м битом в байте, Вторник- 6-м, Воскресенье-1м. Несколько дней в строке преобразуются в один байт по соответствующим битам. Регистр не учитывается
FSTRING_TO_WEEK('Mo',1) = 2#01000000
FSTRING_TO_WEEK('Mo,TU,wE,th,fr,sa,su',1)= 2#01111111
FSTRING_TO_WEEKDAY возвращает цифру, соответствующую дню недели в строке на немецком, английском (задается вторым параметром 1-Английский, 2- Немецкий) Mo=1 Tu=2...Su=7
WEEKDAY_TO_STRING Переводит номер дня недели в строку с названием дня недели. Язык немецкий/английский задается параметром LANG. Параметр LX задает формат отображения названия дня. 0- название полностью, 2- название в две буквы

DT_TO_STRF - преобразует дату и время в строку (рис 1.)
1_9.png
Рис 1.
на вход функции подаются параметры DTI типа DATETIME - дата, конвертируемая в строку, MS типа int добавляет миллисекунды, FMT - формат преобразования даты, LANG- язык преобразования: 0- по умолчанию, 1- Английский, 2- Немецкий. Русского нет, но не забываем что библиотека "опенсорсная" - легко исправляется.

Форматы преобразования FMT:

#A год в 4 цифры (2008)
#B год в 2 цифры (08)
#C Месяц 1-2 цифры (1,12)
#D Месяц 2 цифры (01, 12).
#E Месяц 3 буквы (Jan)
#F Месяц полностью(Januar)
#G День в 1 или две цифры (1, 31)
#H День в две цифры.
#I День недели цифрой
#J День недели 2 буквы (Tu)
#K День недели полностью
#L вывод формата времени AM или PM
#M Час в 24-х часовом формате в 1-2 цифры (1,13)
#N Час в 24-х часовом формате в 2 цифры(01,13).
#O Час в 12-ти часовом формате в 1 - 2 цифры (1, 12)
#P Час в 12-ти часовом формате в 2 цифры (01,12)
#Q Минуты 1-2 цифры (0, 43)
#R Минуты в две цифры (00, 43)
#S Секунды в 1 - 2 цифры (0, 59)
#T Секунды в 2 цифры.
#U Миллисекунды в 1- 3 цифры(12,123).
#V Миллисекунды в 3 цифры (000, 999).
#W День в две цифры с пробелом перед днями в 1 цифру (' 1' ..'31')
#X Месяц в две цифры с пробелом перед месяцами в 1 цифру (' 1' ..'12')

FSTRING_TO_DT - преобразует форматированную строку в тип DATE-TIME: FSTRING_TO_DT('25. September 2008 um 10:01:00', '#D. #N #Y **
#h:#m:#s'); FSTRING_TO_DT('13:14', '#h:#m')
Форматы:
#Y Год в строке 2-х или 4-х символьный (08 или 2008)
#M Месяц в строке 2-х или односимвольный цифровой (01 или 1)
#N Месяц в буквенном написании, регистр игнорируется('JAN' или 'Januar')
#D День в цифровом написании в 1-2 символа (01 или 1)
#h Час в 1-2-х символьном написании (01 или 1)
#m Минуты в 1-2-х символьном написании (01 или 1)
#s Секунды в 1-2-х символьном написании (01 или 1)

Заполнение строк:

FILL заполняет строку указанными кодом символами заданным количеством раз FILL(102,5)='fffff'

FIX - преобразует строку до заданной длины. Функция имеет 4 параметра. STR - преобразуемая строка. L- количество символов, до которой надо увеличить или уменьшить строку,C - код символа, которым надо заполнить дополняемые позиции в строке (код 102 = f), M - режим дополнения (М=0 - добавляет (или удаляет) в конец строки, М=1 - добавляет (или удаляет) в начало, М=2 добавляет равномерно в начало и в конец строки.)
Примеры:
2_9.png
Рис 2.

Функциональные блоки:
MESSAGE_4R(FB) - функциональный блок. Выдает по циклу на выход MX одно из значений входов M0..M3. Выход MN показывает, какое по номеру значение выдано на выход MX. TR импульсом обозначает смену MX. Смена сообщений MX происходит по времени, заданному на вход T1. Вход ММ указывает, между какими сообщениями производить переключение. ММ=3 - выдаются на выход сообщения M0-M2, MM=4 соответственно M0-M3. Вход ENQ разрешает работу блока по TRUE и сбрасывает значения выходов по FALSE. Вход CLK разрешает работу блока по TRUE и фиксирует значение по FALSE. (рис 3. и рис 4.)
3_9.png
Рис 3.
4_9.png
Рис 4.Временная диаграмма блока MESSAGE_4R

MESSAGE_8(FB) коммутирует на выход одно из входных выражений (констант). Выход М получает одно из значений входных констант S1-S8 в соответствии со входом IN1-IN8.
Входы с меньшим номером имеют больший приоритет. (рис 5.)
5_9.png
Рис 5.
TICKER - Выдает подстроку длинной N каждые TD миллисекунд. (не получилось заставить эту штуку работать)

Работа с заглавными/строчными символами:

CAPITALIZE превращает в заглавные первые буквы слов в строке CAPITALIZE('хливкие шорьки. пырялись по наве, и хрюкотали зелюки, как мюмзики в мове.') = 'Хливкие Шорьки. Пырялись По Наве, И Хрюкотали Зелюки, Как Мюмзики В Мове.'
LOWERCASE преобразует все символы в строке в прописные
UPPERCASE преобразует все символы в строке в заглавные

TO_LOWER - переводит по коду ascii символ в нижний регистр. (рис 6.)
TO_UPPER - переводит по коду ascii символ в верхний регистр. (рис 6.)
6_9.png
Рис 6.

Разное:

EXEC Выполняет операции в строке, результат выводит в строку: EXEC('3^2') = '9' или EXEC('3-2') = '1'

Обсуждение