Большинство начинающих программистов CoDeSys задают один и тот же вопрос об ущербности CoDeSys V2.3 при работе со строками. Да, действительно, функционал CoDeSys 2.3 для работы со строками, скажем так, не богат. Все функции работы со строками находятся в библиотеке standart.lib.
Вот эти функции:
Разработчики 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.
на вход функции подаются параметры 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.
Функциональные блоки:
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.
Рис 4.Временная диаграмма блока MESSAGE_4R
MESSAGE_8(FB) коммутирует на выход одно из входных выражений (констант). Выход М получает одно из значений входных констант S1-S8 в соответствии со входом IN1-IN8.
Входы с меньшим номером имеют больший приоритет. (рис 5.)
Рис 5.
TICKER - Выдает подстроку длинной N каждые TD миллисекунд. (не получилось заставить эту штуку работать)
Работа с заглавными/строчными символами:
CAPITALIZE | превращает в заглавные первые буквы слов в строке | CAPITALIZE('хливкие шорьки. пырялись по наве, и хрюкотали зелюки, как мюмзики в мове.') = 'Хливкие Шорьки. Пырялись По Наве, И Хрюкотали Зелюки, Как Мюмзики В Мове.' |
LOWERCASE | преобразует все символы в строке в прописные | |
UPPERCASE | преобразует все символы в строке в заглавные |
TO_LOWER - переводит по коду ascii символ в нижний регистр. (рис 6.)
TO_UPPER - переводит по коду ascii символ в верхний регистр. (рис 6.)
Рис 6.
Разное:
EXEC | Выполняет операции в строке, результат выводит в строку: | EXEC('3^2') = '9' или EXEC('3-2') = '1' |