Diskuse Elektrika.cz

HYBRIDNÍ zóna => Technická podpora výrobce TECO Kolín radí odborníkům => Téma založeno: Jiri Dvorak 14.09.2020, 18:02



Název: Jak převést ascii cód znaku v usint na string ?
Přispěvatel: Jiri Dvorak 14.09.2020, 18:02
Mám pole usintu ve kterém mám číselne kódy znaků a potřebuji je převést na string.
Jediné řešené na které jsem přišel je vytvořit pointer to string a do nej vložit počáteční  adresu,
....
VAR
   RxData : array[0..5] of usint := [84,101,115,116,0];
   PntStr : ptr_to string;
   Str : String[4];

  END_VAR


  PntStr := adr(RxData[0]);
  Str := PntStr^;


což funguje ... ale ..


Název: Re: Jak převést ascii cód znaku v usint na string ?
Přispěvatel: Pavel Sovička 14.09.2020, 20:10
Programovací jazyk v příkladu vypadá jako strukturovaný text. Podle konkrétního prostředí (já znám Codesys 2) by mohly být k dispozici konverzní funkce. V nápovědě prostředí bych tedy zkusil pohledat "Type conversion",  měla by to být samostatná kategorie funkcí a někde v ní by mohla být funkce "uint_to_string()",  která toto korektně řeší. Popř. by mohla být k dispozici "int_to_string()" a jelikož rozsah "usint" je jen podmnožinou "int" tak by to stále mělo fungovat správně.


Název: Re: Jak převést ascii cód znaku v usint na string ?
Přispěvatel: Jiri Dvorak 14.09.2020, 23:11
int_to_string k dispozici je, ale ten proste vem cislo trabas 97 a z int udela string se znaky 97
ja potebuju dle ascii prevest "97" na "a"
a ano je to ST-cko


Název: Re: Jak převést ascii cód znaku v usint na string ?
Přispěvatel: Jakub Steklý 15.09.2020, 09:47
možná trochu zaostale, ale jestli je potřebovat převádět pouze několik písmen/čísel tak je možná rychlejší si napsat dekodér...

Kdysi jsem si ho takhle psal na dekódování znaků ASCII ze stringu, ale pouze čísla, kterých je méně  ;)


Název: Re: Jak převést ascii cód znaku v usint na string ?
Přispěvatel: Jiri Dvorak 15.09.2020, 13:11
od externi zařízení mi příjde toto:
Cmd#12#Heslo#12.1#12.3#12.4;
a to potřebuji rozbrourat na:
 TOutCmdPrs : struct
            Cmd : string[10]; 
            Id  : usint;       
            Pswd : string[10]; 
            RValues : array[0..CTOutCmdPrs_NmVl] of real;
 end_struct;


ale v podstatě, vyřešeno, použil jsem tu vopičárnu s tím poiterem ....


Název: Re: Jak převést ascii cód znaku v usint na string ?
Přispěvatel: Pavel Sovička 15.09.2020, 19:58
Tak dobrá vůle kompilátoru je mnohdy postačující. V Cčku se to řeší přetypováním, což nevím jestli strukturovaný text umí. Co by ale umět měl je datový typ union:
https://help.codesys.com/webapp/_cds_datatype_union;product=codesys;version=3.5.12.0 (https://help.codesys.com/webapp/_cds_datatype_union;product=codesys;version=3.5.12.0)
https://forge.codesys.com/forge/talk/Engineering/thread/c408834957/ (https://forge.codesys.com/forge/talk/Engineering/thread/c408834957/)

Ve stručnosti, union je zapsaný podobně jako struktura (shodný je i přístup přes tečku),  ale je to jeden paměťový prostor reprezentovaný několika různými datovými typy. Podle toho na který datový typ se přistupuje, tak se kompilátor chová. Takže je možné vytvořit union z typů "usint" a "string". Do "usint" části zapsat číslo a ze "string" části přečíst písmeno.


Název: Re: Jak převést ascii cód znaku v usint na string ?
Přispěvatel: Juraj Rojko 15.09.2020, 21:43
...Co by ale umět měl je datový typ union...

UNION je obsažen až v novější verzi jazyka ST, kterou (BOHUŽEL!) Foxtrot nepodporuje.


Název: Re: Jak převést ascii cód znaku v usint na string ?
Přispěvatel: Luboš Urban 16.09.2020, 16:49
Pokud by deklarace byla globální, tak lze vytvořit Str jako alias

VAR_GLOBAL
   RxData : array[0..5] of usint := [84,101,115,116,0];
   Str AT RxData : String[6];
END_VAR

a pak při zobrazení proměnné Str bude vidět 'Test'.