Neste tutorial estão descritas orientações e procedimentos para cálculo de velocidade de rotação a partir da variação de pulsos de um contador rápido dos CPs de entradas rápidas da série Nexto e Xpress.
Componentes
Software: MasterTool IEC XE 3.20
CLP: XP325
Seções do Tutorial
1. ARQUITETURA
2. CONFIGURAÇÕES NO MASTERTOOL
2.1. Entradas Rápidas
2.2. DESENVOLVIMENTO DO CÓDIGO
2.2.1. Código 1
2.2.2. Código 2
2.2.3. Observações
2.2.4. Diferenças entre Código 1 e Código 2
2.2.5. Cálculo de RPM
2.2.6. Sugestão
1. ARQUITETURA
Na arquitetura desse exemplo vamos considerar um Xpress fazendo a detecção de RPM do eixo de um motor utilizando um sensor indutivo.
Uma observação importante é as características do sinal. Devem ser verificadas as especificações do CP.
No caso do Xpress, a frequência de pulsos máxima é de 100kHz e deve haver uma largura de pulsos mínima de 2µs.
No caso do NX 3003, a frequência de pulsos máxima é de 200kHz e deve haver uma largura de pulsos mínima de 1µs.
A Ligação do Sensor indutivo no Xpress segue o seguinte esquema:
2. CONFIGURAÇÕES NO MASTERTOOL
No MasterTool IEC XE, software de programação de ambas as séries mencionadas, não tem disponível uma função ou memória pronta que informa a frequência de pulsos ou período entre pulsos dos contadores rápidos. Para obter essas grandezas é necessário fazer um tratamento matemático na contagem de pulsos. Sendo assim, existem inúmeras formas de obter RPM a partir de pulsos rápidos, nesse documento descrevemos apenas duas possibilidades.
2.1. Entradas Rápidas
No caso do Xpress, será necessário apenas definir a entrada rápida I00 como UP/DOWN em Configuration/XP325 (XP325)/Integrated I/O/ Entradas Rápidas.
Nesse exemplo a entrada deve ser tipo UP/DOWN em função do tipo de sinal, que será proveniente de um sensor Indutivo. No entanto, caso forem utilizados sensores com outras características, como Encoder do tipo quadratura, a entrada rápida deve ser configurada respectivamente.
Repare que no caso do Xpress o Contador 0 como UP/DOWN tem uma entrada para direção, outra para zeramento e outra para Contagem de pulsos. Desse modo, são reservadas 3 entradas digitais para o contador 0.
A entrada pertinente no nosso caso é a I02, que recebe os pulsos do sensor. O valor do contador é incrementado em uma unidade toda vez que um pulso é detectado em I02.
Assim, no MasterTool IEC XE, você consegue acessar o valor do Contador 0 pela estrutura de FastInputs, a seguir um exemplo para Texto Estruturado (ST).
2.2. DESENVOLVIMENTO DO CÓDIGO
Cálculo da Frequência ou período de Pulsos
Vamos exemplificar duas formas para calcular Frequência ou período de Pulsos. Ambas são códigos em ST que podem ser inseridos na UserPrg da Main Task ou em outra POU chamada pela UserPrg. No caso desse exemplo inserimos o código em uma POU chamada pela UserPrg.
Somente é necessário a utilização de um dos códigos.
2.2.1. Código 1
Nesse código a frequência ou período é calculada toda a fez que o CP executa a tarefa.
PROGRAM RPM
VAR
// VARIÁVEIS CÓDIGO 1
NdePulsos: ULINT;
NdePulsosAnterior: ULINT;
time_1: ULINT;
time_2: ULINT;
Freq_Hz: REAL;
Period_s: REAL;
END_VAR
NdePulsos := DINT_TO_ULINT(FastInputs.Counter0.Counter);
//CÓDIGO 1
IF NdePulsos = NdePulsosAnterior THEN
SysTimeGetUs(time_1);
ELSE
SysTimeGetUs(time_2);
Freq_Hz := 1000000*ULINT_TO_REAL(NdePulsos - NdePulsosAnterior)/ULINT_TO_REAL(time_2-time_1);
Period_s := ULINT_TO_REAL(time_2-time_1)/(ULINT_TO_REAL(NdePulsos - NdePulsosAnterior)*1000000);
NdePulsosAnterior := NdePulsos;
SysTimeGetUs(time_1);
END_IF
2.2.2. Código 2
Para este código a frequência é calculada aproximadamente a cada 100ms.
A Frequência é obtida na variável Freq_Hz_2
PROGRAM RPM
VAR
// VARIÁVEIS CÓDIGO 2
time_10: UDINT;
first_cicle: BOOL := TRUE;
pulso_inicial: UDINT;
NdePulsos_2: UDINT;
Freq_Hz_2: REAL;
time_11: REAL;
END_VAR
//CÓDIGO 2
NdePulsos_2 := DINT_TO_UDINT(FastInputs.Counter0.Counter);
IF first_cicle THEN
pulso_inicial := NdePulsos_2;
time_10 := SysTimeGetMs();
first_cicle := FALSE;
END_IF
time_11 := DINT_TO_REAL(SysTimeGetMs() - time_10);
IF time_11 >= 100 THEN
Freq_Hz_2 := DINT_TO_REAL(NdePulsos_2 - pulso_inicial)*1000/time_11;
first_cicle := TRUE;
END_IF
2.2.3. Observações
Ambos os códigos estão utilizando funções da Biblioteca SysTimeCore, caso em seu projeto esta biblioteca não esteja inserida, é necessário adiciona-la.
Para isso, você dever entrar em Library Manager e Adicionar biblioteca (1).
Clicar em avançado (2).
Feito isso, pesquise por "Systime" (3) e dê duplo Clique na biblioteca SysTimeCore (4).
2.2.4. Diferenças entre Código 1 e Código 2
No código 1 a frequência é calculada toda vez que a tarefa é executada, então o valor em Freq_Hz é praticamente instantâneo.
No código 2 a frequência é calculada aproximadamente a cada 100ms, em termos de monitoramento isso pode não ser significante, mas dependendo a necessidade o tempo pode ser pertinente.
Atenção: No caso do código 1, como o calculo é executado no toda vez que a tarefa é chamada. Dependendo o tempo da tarefa, 20ms na maioria das aplicações, é possível que as amostragens de pulsos sejam muito pequenas dependendo da frequência. Assim, quando existe a possibilidade de uma frequência inferior a 100 Hz, podem haver erros na medição.
Nesse caso seria necessário criar uma lógica para aumentar a amostragem de pulsos ou usar o Código 2, por exemplo.
2.2.5. Cálculo de RPM
Com a Frequência de pulsos, o RPM do eixo do motor vai depender da quantidade de pulsos por volta que são gerados.
Essa quantidade de pulsos, no nosso caso, é a quantidade de dentes da roda dentada que está acoplada ao Eixo do motor.
Se você estiver usando um encoder do tipo quadratura, por exemplo. Você deve verificar nas especificações do equipamento qual a quantidade de pulsos por volta.
Outra coisa também, se o acoplamento não for direto com o eixo que do motor, se houverem polias ou caixas de transmissão, devem ser observadas as devidas relações de rotação e integradas ao cálculo para obter o valor correto.
Em nosso exemplo a roda tem 16 Dentes.
Então, nosso código fica:
a imagem abaixo, que mostra o código em execução vemos que nesse momento o eixo do motor estava girando a aproximadamente 3500 RPM.
2.2.6. Sugestão
Você pode também usar a função Statistics pra obter uma média de valor em um intervalo de tempo, desse modo o valor não ficará oscilando.
Nesse exemplo, observe que temos uma variável que conta a quantidade de vezes que o código da Freq é executado (cont_calc).
Foi criada uma lógica que "reseta" a função Statisctics em um determinado número de execuções do código, no caso do exemplo, 100 execuções o que equivale a aproximadamente 2 segundos.
Comentários
0 comentário
Por favor, entre para comentar.