Просмотр полной версии : Как получить 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] нужно перевести в строку?
как исправить?
а чем
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;
не нравится?
не нравится тем, что это цикл парсинга строки! И я привел проблемный фрагмент, остальное заменив многоточием
Еще вопрос по работе со строками.
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
А зачем в рамках этой задачи посимвольное копирование строк?
не нравится тем, что это цикл парсинга строки! И я привел проблемный фрагмент, остальное заменив многоточием
Тогда так:
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;
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot