Home page > Fórum > Programação IEC 61131 (LogicLab) > Copie um caractere de uma string para uma variável
- Este tópico tem 5 respostas, 3 participantes e foi atualizado pela última vez 4 anos, 2 meses atrás da Sergio Bertana.
-
autorPublique
-
Novembro 30, 2010 em 7: 08 am #34933Anônimoinativo
Na CPU SlimLine, Eu não posso fazer isso:
Dada uma string 'ABCDEFGHIL' na variável DString de 10 caracteres, eu gostaria de extrair o iº elemento e copiá-lo após uma conversão ASCII em um byte. Você tem alguma dica sobre isso?
Novembro 30, 2010 em 7: 11 am #36596Sergio BertanaAdministrador do fórumA solução mais simples é usar um ponteiro. Estou anexando uma impressão de um programa em ST que faz o que você precisa. Download do programa fonte (Trabalha no emulador do PLC).
VAR
DString: STRING [10]: = 'ABCDEFGHIL'; (* String de dados *)
Ch: ARRAY [0..9] DO USINT; (* Caráter *)
ChPtr: @USINT; (* Ponteiro de caracteres *)
END_VARCHPTR: = ADR (DString); (* Ponto de origem da corda *)
Ch[0]:=@ChPtr+0; (*leio caractere na posição 0 'A'*)
Ch[1]:=@ChPtr+1; (* li caractere na posição 1 'B' *)CHPTR: = ADR (DString) + 2; (* Ponto de caractere em string *)
Ch[2]:=@ChPtr; (*eu leio caractere na posição 2 'C'*)Fevereiro 3, 2020 em 7: 13 am #52904MarcoparticipanteEssa solução não funciona mais na CPU MPS054? Não consigo fazer esse exemplo funcionar.
Fevereiro 3, 2020 em 7: 30 am #52910Sergio BertanaAdministrador do fórumO exemplo também funciona no MPS054, não entendo a sua dificuldade em fazer funcionar.
No entanto, continuei importando o projeto String com a versão mais recente do LogicLab, tente executar o download deste exemplo. O funcionamento do programa também pode ser testado utilizando o ambiente de simulação SimuLab integrado no LogicLab. Ali está ele imagem de tela do programa simulado.
Fevereiro 5, 2020 em 7: 13 am #53005MarcoparticipanteNão consigo anexar a imagem da captura de tela que pretendo inserir, mas se a string de exemplo variar, eu insiroelsistmp ”obviamente alongando a codificação para vários caracteres, o resultado dos ponteiros não corresponde aos caracteres inseridos
PROGRAM ST VAR DString : STRING[ 10 ] := 'elsistmp'; (* Data string *) Ch : ARRAY[0..9] OF USINT; (* Character *) ChPtr : @USINT; (* Character pointer *) END_VAR (* -------------------------------------------------------------------------- *) (* ESTRAZIONE CARATTERE DA STRINGA *) (* -------------------------------------------------------------------------- *) ChPtr:=ADR(DString); (* Punto origine stringa *) Ch[0]:=@ChPtr+0; (* Leggo carattere in posizione 0 *) Ch[1]:=@ChPtr+1; (* Leggo carattere in posizione 1 *) Ch[2]:=@ChPtr+2; (* Leggo carattere in posizione 2 *) Ch[3]:=@ChPtr+3; (* Leggo carattere in posizione 3 *) Ch[4]:=@ChPtr+4; (* Leggo carattere in posizione 4 *) Ch[5]:=@ChPtr+5; (* Leggo carattere in posizione 5 *) Ch[6]:=@ChPtr+6; (* Leggo carattere in posizione 6 *) Ch[7]:=@ChPtr+7; (* Leggo carattere in posizione 7 *) (* [End of file] *)
resultado:
Ch [0] 101
Ch [1] 102
Ch [2] 103
Ch [3] 104
Ch [4] 105
Ch [5] 106
Ch [6] 107
Ch [7] 108... Eu provavelmente não entendi qual codificação é usada para os caracteres, a partir do exemplo com "ABCD .." era 65,66,67 ... porque 'elsistresultados da MP como relatados acima?
Onde eu estou errado?
Fevereiro 5, 2020 em 1: 26 pm #53018Sergio BertanaAdministrador do fórumCometi o erro de dar o exemplo (também trabalho com a linguagem C e às vezes tomo liberdades que não são possíveis na ST).
Tendo usado a string de exemplo "ABCD ..." os códigos ascii dos vários caracteres são consecutivos e não percebi que o programa foi escrito incorretamente ... Peço desculpas ... Veja como você pode escrever:
DString:='elsistmp'; ChPtr:=ADR(DString); //Character pointer Ch[0]:=@ChPtr; //Leggo carattere in posizione 0 ChPtr:=ChPtr+1; //Character pointer Ch[1]:=@ChPtr; //Leggo carattere in posizione 1 ChPtr:=ADR(DString)+5; //Character pointer Ch[5]:=@ChPtr; //Leggo carattere in posizione 5
-
autorPublique
- Você deve estar logado para responder a este tópico.