PDA

Просмотр полной версии : Как получить ASCII-код символа в Codesys?



-=Vovka=-
22.01.2021, 15:35
Мне нужно получить байтовый код символа в Codesys (на языке ST). Как это сделать?
Например, в C++ все довольно просто:
int c = 'h';
А в Codesys как?
т.е. есть строка:
sTmp: STRING(10) := '12345678';
мне нужно получить 5-й символ:
IF sTmp[4] = 5 THEN .... - ошибка!

Николай Суриков
22.01.2021, 15:45
FUNCTION CODE : BYTE
VAR_INPUT
STR : STRING(STRING_LENGTH); (*Строка*)
POS : INT; (*Позиция*)
END_VAR
VAR
PT : POINTER TO BYTE;
END_VAR

IF pos < 1 OR pos > LEN(str) THEN
CODE := 0;
RETURN;
ELSE
PT := ADR(STR) + INT_TO_DWORD(pos - 1);
CODE := pt^;
END_IF;

Почитайте про библиотеку Oscat

-=Vovka=-
22.01.2021, 15:55
Почитайте про библиотеку Oscat
Ругается, что не определено STRING_LENGTH

Николай Суриков
22.01.2021, 16:12
VAR_GLOBAL CONSTANT
STRING_LENGTH : INT := 250;
END_VAR

Спорягин Кирилл
22.01.2021, 16:15
В библиотеках оскат есть функция code, она возвращает код символа.

Но можно просто навести указатель на нужный байт.

-=Vovka=-
22.01.2021, 16:20
Спасибо, получилось!

-=Vovka=-
14.06.2021, 12:50
Еще вопрос по работе со строками.


s1 : STRING := "12345678';
s2 : STRING := '';
x : INT;

FOR x := 0 TO LEN( s1 ) DO
...
s2 := CONCAT( s2, s1[x] );
END_FOR

по идее на выходе s2 должна быть копией s1, но там коды символов вместо самих символов.
я так понимаю, что s1[x] нужно перевести в строку?
как исправить?

saii
14.06.2021, 13:13
а чем

s2 := s1;
не нравится?

Евгений Кислов
14.06.2021, 13:13
Еще вопрос по работе со строками.


s1 : STRING := "12345678';
s2 : STRING := '';
x : INT;

FOR x := 0 TO LEN( s1 ) DO
...
s2 := CONCAT( s2, s1[x] );
END_FOR

по идее на выходе s2 должна быть копией s1, но там коды символов вместо самих символов.
я так понимаю, что s1[x] нужно перевести в строку?
как исправить?

Какую именно задачу вы пытаетесь решить и какой у вас контроллер?

-=Vovka=-
14.06.2021, 13:22
а чем

s2 := s1;
не нравится?
не нравится тем, что это цикл парсинга строки! И я привел проблемный фрагмент, остальное заменив многоточием

petera
14.06.2021, 13:24
Еще вопрос по работе со строками.


s1 : STRING := "12345678';
s2 : STRING := '';
x : INT;

FOR x := 0 TO LEN( s1 ) DO
...
s2 := CONCAT( s2, s1[x] );
END_FOR

по идее на выходе s2 должна быть копией s1, но там коды символов вместо самих символов.
я так понимаю, что s1[x] нужно перевести в строку?
как исправить?


VAR
s1 : STRING := '12345678';
s2 : STRING := '';
x : INT;
END_VAR
IF LEN(s1) <> LEN(s2) THEN
FOR x := 1 TO LEN( s1 ) DO
s2 := CONCAT( s2, MID(s1,1,x) );
END_FOR
END_IF

-=Vovka=-
14.06.2021, 13:25
Какую именно задачу вы пытаетесь решить и какой у вас контроллер?
Парсинг строки в структуру (в ней строки и числа). Данные разделены либо 0x0A либо 0x0D 0x0A
ПЛК210

Евгений Кислов
14.06.2021, 13:40
Парсинг строки в структуру (в ней строки и числа). Данные разделены либо 0x0A либо 0x0D 0x0A
ПЛК210

А зачем в рамках этой задачи посимвольное копирование строк?

saii
14.06.2021, 13:49
не нравится тем, что это цикл парсинга строки! И я привел проблемный фрагмент, остальное заменив многоточием

Тогда так:

FOR xxx := 1 TO LEN(s1) - 1 DO
s2 := CONCAT(s2, MID(s1, 1, xxx));
END_FOR

-=Vovka=-
14.06.2021, 14:00
petera, спасибо!
Оказывается в кодесисе поменяны местами два последних параметра!
В си, php сначала идет позиция, а потом длина!
И самое приятное это то, что первая позиция начинается с 1

ВладОвен
05.12.2022, 16:47
Подскажите, в как получить символ по его коду?
Например, мне нужен символ с кодом 0.

Евгений Кислов
05.12.2022, 16:55
Подскажите, в как получить символ по его коду?
Например, мне нужен символ с кодом 0.

Для CODESYS V3.5 (вы же о нем спрашиваете? тогда написали вопрос не в том разделе):



VAR
sChar: STRING(1);
END_VAR

sChar[0] := 0;