s
#include "stdio.h"
typedef struct S_CTRL{
#define SSPD_BUF_LEN 100
struct{
float aMax;
float aMin;
float vMax;
float J;
int t[ 7 ] ;
int T[ 7 ] ;
int tMax;
} in ;
struct{
float accBuf[ SSPD_BUF_LEN] ;
float decBuf[ SSPD_BUF_LEN] ;
long S[ 7 ] ;
long V[ 7 ] ;
} out;
} S_CTRL;
S_CTRL sCR = {
{
. aMax = 1400000.0 ,
. aMin = - 1400000.0 ,
. vMax = 3000.0 ,
. J = 30.0 ,
{
0
} ,
{
40 , 20 , 40 , 0 , 40 , 20 , 40
} ,
. tMax = 200
}
} ;
#define _T ( sCTRL, i) ( ( sCTRL) . in . T[ ( i) - 1 ] )
#define s ( sCR)
int main ( ) {
float v = 0 ;
float pos = 0 ;
float tao = 0 ;
int t1 = 40 ;
int t2 = 60 ;
int t3 = 100 ;
sCR. in . t[ 0 ] = sCR. in . T[ 0 ] ;
sCR. in . t[ 1 ] = sCR. in . T[ 1 ] + sCR. in . t[ 0 ] ;
sCR. in . t[ 2 ] = sCR. in . T[ 2 ] + sCR. in . t[ 1 ] ;
sCR. in . t[ 3 ] = sCR. in . T[ 3 ] + sCR. in . t[ 2 ] ;
sCR. in . t[ 4 ] = sCR. in . T[ 4 ] + sCR. in . t[ 3 ] ;
sCR. in . t[ 5 ] = sCR. in . T[ 5 ] + sCR. in . t[ 4 ] ;
sCR. in . t[ 6 ] = sCR. in . T[ 6 ] + sCR. in . t[ 5 ] ;
for ( int i= 0 ; i< 7 ; i++ ) {
printf ( "t[%d] = %d\n" , i, sCR. in . t[ i] ) ;
}
float J_tmp = 0 ;
J_tmp = - ( sCR. in . J) ;
int flag = 0 ;
for ( int time = 0 ; time< sCR. in . tMax; time++ )
{
if ( time< sCR. in . t[ 0 ] ) {
tao = time;
v = ( sCR. in . J) * ( tao) * ( tao) / 2 ;
pos = ( sCR. in . J) * tao* tao* tao/ 6 ;
flag = 1 ;
} else if ( time< sCR. in . t[ 1 ] ) {
if ( time == sCR. in . t[ 0 ] ) {
sCR. out. S[ 0 ] = ( sCR. in . J) * tao* tao* tao/ 6 ;
sCR. out. V[ 0 ] = ( sCR. in . J) * ( tao) * ( tao) / 2 ;
}
tao = time- t1;
v = ( sCR. in . J) * _T ( s, 1 ) * ( _T ( s, 1 ) / 2 + tao) ;
pos = sCR. out. S[ 0 ] + ( sCR. out. V[ 0 ] ) * tao + ( sCR. in . J) * _T ( s, 1 ) * tao* tao/ 2 ;
flag = 2 ;
} else if ( time< sCR. in . t[ 2 ] ) {
if ( time == sCR. in . t[ 1 ] ) {
sCR. out. S[ 1 ] = sCR. out. S[ 0 ] + ( sCR. out. V[ 0 ] ) * tao + ( sCR. in . J) * _T ( s, 1 ) * tao* tao/ 2 ;
sCR. out. V[ 1 ] = ( sCR. in . J) * _T ( s, 1 ) * ( _T ( s, 1 ) / 2 + tao) ;
}
tao = time- t2;
v = ( sCR. in . J) * ( _T ( s, 1 ) * _T ( s, 2 ) + _T ( s, 1 ) * _T ( s, 1 ) / 2 + _T ( s, 1 ) * tao- tao* tao/ 2.0 ) ;
pos = sCR. out. S[ 1 ] + sCR. out. V[ 1 ] * tao+ ( sCR. in . J) * _T ( s, 1 ) * tao* tao/ 2 - ( sCR. in . J) * tao* tao* tao/ 6 ;
flag = 3 ;
} else if ( time< sCR. in . t[ 3 ] ) {
if ( time == sCR. in . t[ 2 ] ) {
sCR. out. S[ 2 ] = sCR. out. S[ 1 ] + sCR. out. V[ 1 ] * tao+ ( sCR. in . J) * _T ( s, 1 ) * tao* tao/ 2 - ( sCR. in . J) * tao* tao* tao/ 6 ;
sCR. out. V[ 2 ] = ( sCR. in . J) * ( _T ( s, 1 ) * _T ( s, 2 ) + _T ( s, 1 ) * _T ( s, 1 ) / 2 + _T ( s, 1 ) * tao- tao* tao/ 2.0 ) ;
}
v = ( sCR. in . J) * _T ( s, 1 ) * ( _T ( s, 1 ) + _T ( s, 2 ) ) ;
pos = sCR. out. S[ 2 ] + sCR. out. V[ 2 ] * tao;
} else if ( time< sCR. in . t[ 4 ] ) {
if ( time == sCR. in . t[ 3 ] ) {
sCR. out. S[ 3 ] = sCR. out. S[ 1 ] + sCR. out. V[ 1 ] * tao+ ( sCR. in . J) * _T ( s, 1 ) * tao* tao/ 2 - ( sCR. in . J) * tao* tao* tao/ 6 ;
sCR. out. V[ 3 ] = ( sCR. in . J) * ( _T ( s, 1 ) * _T ( s, 2 ) + _T ( s, 1 ) * _T ( s, 1 ) / 2 + _T ( s, 1 ) * tao- tao* tao/ 2.0 ) ;
}
tao = time- sCR. in . t[ 3 ] ;
v = ( sCR. in . J) * ( _T ( s, 1 ) * _T ( s, 1 ) + _T ( s, 1 ) * _T ( s, 2 ) - tao* tao/ 2 ) ;
pos = sCR. out. S[ 3 ] + sCR. out. V[ 3 ] * tao- ( sCR. in . J) * tao* tao* tao/ 6 ;
} else if ( time< sCR. in . t[ 5 ] ) {
if ( time == sCR. in . t[ 4 ] ) {
sCR. out. S[ 4 ] = sCR. out. S[ 3 ] + sCR. out. V[ 3 ] * tao- ( sCR. in . J) * tao* tao* tao/ 6 ;
sCR. out. V[ 4 ] = ( sCR. in . J) * ( _T ( s, 1 ) * _T ( s, 1 ) + _T ( s, 1 ) * _T ( s, 2 ) - tao* tao/ 2 ) ;
}
tao = time- sCR. in . t[ 4 ] ;
v = ( sCR. in . J) * _T ( s, 1 ) * ( _T ( s, 2 ) + _T ( s, 1 ) / 2 - tao) ;
pos = sCR. out. S[ 4 ] + sCR. out. V[ 4 ] * tao- ( sCR. in . J) * _T ( s, 1 ) * tao* tao/ 2 ;
} else if ( time< sCR. in . t[ 6 ] ) {
if ( time == sCR. in . t[ 5 ] ) {
sCR. out. S[ 5 ] = sCR. out. S[ 4 ] + sCR. out. V[ 4 ] * tao- ( sCR. in . J) * _T ( s, 1 ) * tao* tao/ 2 ;
sCR. out. V[ 5 ] = ( sCR. in . J) * _T ( s, 1 ) * ( _T ( s, 2 ) + _T ( s, 1 ) / 2 - tao) ;
}
tao = time- sCR. in . t[ 5 ] ;
v = ( sCR. in . J) * ( _T ( s, 1 ) * _T ( s, 2 ) + _T ( s, 1 ) * _T ( s, 1 ) / 2 - ( _T ( s, 1 ) * _T ( s, 6 ) ) - _T ( s, 1 ) * tao+ tao* tao/ 2 ) ;
pos = sCR. out. S[ 5 ] + sCR. out. V[ 5 ] * tao- ( sCR. in . J) * _T ( s, 1 ) * tao* tao/ 2 + ( sCR. in . J) * tao* tao* tao/ 6 ;
}
printf ( "%f\n" , pos) ;
}
return 0 ;
}