Go Down

Topic: Criação de Biblioteca para Implementação de Controladores Digitais  (Read 410 times) previous topic - next topic

florindoayres

Olá, estou tentando montar uma biblioteca com as estruturas de controle digital RST e Compensação pela malha de realimentação.As funções já foram testadas, porém agora na hora de empacotar em uma biblioteca, acontece o seguinte erro:

request for member 'RST' in 'control', which is of non-class type 'Control_Loop(int, float, float, float, float)'.

Segui o tutorial de Biblioteca que o site nos disponibiliza para implementar código morse,porém na hora de fazer este projeto de biblioteca tive problemas. o código do header e do cpp da biblioteca é este aqui:

/*
  Control_Loop.h - Library for Implementation of Digital Controllers Using Arduino.
  This Library was made with the goal to implementation of RST control Structure,and others.
  Created by M.Sc. Engineer Florindo Antonio de Carvalho Ayres Júnior, November 24, 2015.
 
*/
#ifndef Control_Loop_H
#define Control_Loop_H

#include "Arduino.h"

class Control_Loop
{
  public:
   Control_Loop(volatile int sensorValue,volatile float R_ef,float R[10],float S[10],float TT);
   ~Control_Loop();
    volatile unsigned int RST();
    volatile unsigned int FC();
 
  private:
   float ro;
   float r1;
   float r2;
   float r3;
   float r4;
   float r5;
   float r6;
   float r7;
   float r8;
   float r9;
   float so;
   float s1;
   float s2;
   float s3;
   float s4;
   float s5;
   float s6;
   float s7;
   float s8;
   float s9;
   float T;
   float Ref;
   float sensorValue;
   float u[10] =  {0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000};
   float y[10] =  {0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000};
   volatile float d;
};

#endif


Abaixo o código do .cpp:


/*
  Control_Loop.cpp - Library for flashing Morse code.
  Created by M.Sc. Engineer Florindo Antonio de Carvalho Ayres Júnior, November 24, 2015.
  Not yet Released into the public domain.
*/

#include "Arduino.h"
#include "Control_Loop.h"

Control_Loop::Control_Loop(volatile int sensorValue,volatile float R_ef,float R[10],float S[10],float TT)
{


   ro = R[0];
   r1 = R[1];
   r2 = R[2];
   r3 = R[3];
   r4 = R[4];
   r5 = R[5];
   r6 = R[6];
   r7 = R[7];
   r8 = R[8];
   r9 = R[9];

   so = S[0];
   s1 = S[1];
   s2 = S[2];
   s3 = S[3];
   s4 = S[4];
   s5 = S[5];
   s6 = S[6];
   s7 = S[7];
   s8 = S[8];
   s9 = S[9];
   T  = TT;
   Ref = R_ef; 
   float u[10] =  {0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000};
   float y[10] =  {0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000};
   
}
Control_Loop::~Control_Loop(){}

volatile unsigned int Control_Loop::RST()
{
 volatile float d;
float ya = (float)(5.0000*sensorValue)/1023.0; 
y[0]= ya;
 
 //u[0] = (r-y[0])*ro +(r-y[1])*r1+(r-y[2])*r2-s1*u[1]-s2*u[2];
 u[0] = T*Ref-(ro*y[0]+r1*y[1]+r2*y[2]+r3*y[3]+r4*y[4]+r5*y[5]+r6*y[6]+r7*y[7]+r8*y[8]+r9*y[9])-(s1*u[1]+s2*u[2]+s3*u[3]+s4*u[4]+s5*u[5]+s6*u[6]+s7*u[7]+s8*u[8]+s9*u[9]);
 
 if(u[0]>=1.0000)u[0]=1.0000;
 if(u[0]<=0.0000)u[0]=0.0000;
 

//  y[10] = y[9];
  y[9]  = y[8];
  y[8]  = y[7];
  y[7]  = y[6];
  y[6]  = y[5];
  y[5]  = y[4];
  y[4]  = y[3];
  y[3]  = y[2];
  y[2]  = y[1];
  y[1]  = y[0];

//  u[10] = u[9];
  u[9]  = u[8];
  u[8]  = u[7];
  u[7]  = u[6];
  u[6]  = u[5];
  u[5]  = u[4];
  u[4]  = u[3];
  u[3]  = u[2];
  u[2]  = u[1];
  u[1]  = u[0];


  d = (u[0]);
  return d; 
}

volatile unsigned int Control_Loop::FC()
{
  // float u[10] =  {0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000};
//   float y[10] =  {0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000};

volatile float d_2;
 
 float ya = (float)(5.0000*sensorValue)/1023.0; 
 
 y[0]= ya;
 
 u[0] = -(s1*u[1]+s2*u[2]+s3*u[3]+s4*u[4]+s5*u[5]+s6*u[6]+s7*u[7]+s8*u[8]+s9*u[9])+(ro*y[0]+r1*y[1]+r2*y[2]+r3*y[3]+r4*y[4]+r5*y[5]+r6*y[6]+r7*y[7]+r8*y[8]+r9*y[9]);
 
 if(u[0]>=1.0000)u[0]=1.0000;
 if(u[0]<=0.0000)u[0]=0.0000;
 

  //y[10] = y[9];
  y[9]  = y[8];
  y[8]  = y[7];
  y[7]  = y[6];
  y[6]  = y[5];
  y[5]  = y[4];
  y[4]  = y[3];
  y[3]  = y[2];
  y[2]  = y[1];
  y[1]  = y[0];

 // u[10] = u[9];
  u[9]  = u[8];
  u[8]  = u[7];
  u[7]  = u[6];
  u[6]  = u[5];
  u[5]  = u[4];
  u[4]  = u[3];
  u[3]  = u[2];
  u[2]  = u[1];
  u[1]  = u[0];


  d = (u[0]);
  return d; 


}


Alguma sugestão por favor, e desde já grato.

luisilva

Leia as regras do fórum e coloque o código conforme as regras sff. Assim é bastante mais difícil de ler.

bubulindo

Qual e a linha em que o erro aparece?

Isto e uma classe... sem ver o codigo fonte onde esta classe e utilizada, torna-se dificil de ver o erro, nao?

A proposito... tanto float... Ja viste o tempo de ciclo da tua aplicacao?
This... is a hobby.

florindoayres

Sim ,eu utilizei antes de fazer a biblioteca esta mesma quantidade de variáveis float, mais envio e recebimento pela serial e consegui implementar controladores com período de amostragem de 2.5 ms.Por isso agora estou tentando fazer uma biblioteca para deixar o código da rotina principal mais enxuta.

bubulindo

Eu fiz 3 perguntas... tu respondeste a terceira pergunta que nao tem nada a ver com o teu problema.

Responde as 2 primeiras perguntas e podemos dar mais uma ajuda.
This... is a hobby.

florindoayres

O erro acusado é este aqui:
Request for member 'RST' in 'control',wich is of non-class type 'Control_Loop(int,float,float,float,float)'.

bubulindo

Custa muito fazer copy paste (dentro das tags correctas) do codigo?

Eu nao tenho muito tempo e sinceramente fazer um download, abrir num editor de texto e analisar e trabalho a mais para mim.

Afinal de contas, o interessado aqui es tu...
This... is a hobby.

luisilva

Eu não consegui compilar o programa porque não sei o que é "Leds_Load.h".

florindoayres

Desculpa demorar para responder. Leds_Load.h é uma biblioteca que eu criei para auxiliar na exibição de 4 leds que eu coloquei na minha planta de bolso (Para testes de sistemas de controle de primeira,segunda ordem e de fase não mínima que eu montei com opamp).Bom descobri o problema da biblioteca.Pelo menos quando eu criei o arquivo e faltava alguns ajustes, eu quis mexer nas funções que eu tinha criado e não estava alterando a minha pasta de exemplo.No primeiro momento funcionou o código,mas depois que eu inseri a função de compensador pela malha de realimentação, começou a acusar que as classes declaradas no programa não existiam.Copiei os arquivos e gerei novos a partir dos anteriores e salvei na pasta e começou a funcionar de novo não acusando erro algum.

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy