?? motorctrl.c
字號:
{
zeroCount=0;
if(zero<ZEROSPEED)
{
if(read_menudata(JDQ1)==0)
{
Ctrldata[JIDIANQI] |=BIT0;
}
else
{
Ctrldata[JIDIANQI] &=(~BIT0);
}
zeroflag=1;
}
else
{
Ctrldata[JIDIANQI] &=(~BIT0);
zeroflag=0;
}
zero = 0;
}
else
{
zero+=read_menudata(SPDFB)+read_menudata(SPEEDSET);//累加
}
}
}
//----------------------------------------------------------------
// 函數名稱:fact
// 輸入參數:int a:需要定標的值
// unsigned int b:定標用比例因子
// 輸出參數:int :定標后值
// 功能描述:通過定標因子來改變輸入參數的范圍
//----------------------------------------------------------------
int fact(int a,unsigned int b)
{
long x1,x2;
x1=a;
x2=read_menudata(b);
switch(b)
{
case SPDFACT: //速度定標
x1=x1*x2/1024;
break;
case VOLTFACT: //硬速定標
x1=x1*x2/1024;
break;
case CRTFACT: //轉矩定標
x1=x1*x2/1024;
break;
default:
x1=0;
}
return((int)x1);
}
//----------------------------------------------------------------
// 函數名稱:ext_ctrl
// 輸入參數:無
// 輸出參數:無
// 功能描述:選擇給定方式具體如下:
// 如果非運行狀態,點動按下,則為點動給定
// 如果為運行狀態,則
// 給定方式為0則模擬給定,模擬差量
// 1則模擬給定數字差量
// 2則數字給定,在這種方式下,
// 若按下數字升或數字降,則為數字升降
// 3則硬速度給定
// 4則開環控制
//----------------------------------------------------------------
void ext_ctrl()
{
int pbstate;
int speedMax;
int speedMin;
int i,j;
pbstate=read_menudata(ERRSET);
speedMax=read_menudata(SPDMAX);
speedMin=read_menudata(SPDMIN);
//------------------點動給定----------------------
if(pbstate & BIT1)//非運行狀態
{
if(!(pbstate & BIT2))//點動給定按下
{
pointGive=1;
i=read_menudata(POINTSET);//寫速度給定菜單
if(i>=speedMax)
{
i=speedMax;
}
else if(i<=speedMin)
{
i=speedMin;
}
write_menudata(SPEEDSET,i);
if(read_menudata(DIANXIE_EN)==0)//斜率為0則速度不變
{
Ctrldata[GEIDING]=i;
}
else
{
if(Ctrldata[GEIDING]<i)//升斜坡函數
{
j=read_menudata(POINTXIELV);//計算點動斜率
if(j==0)
{
Ctrldata[GEIDING]=i;
}
else
{
Ctrldata[STEP]=1000/j;
if((i-Ctrldata[STEP])>Ctrldata[GEIDING])
Ctrldata[GEIDING]+=Ctrldata[STEP];//斜坡
else
Ctrldata[GEIDING]=i;
}
}
else//穩定給定
{
Ctrldata[GEIDING]=i;
}
}
i=Ctrldata[GEIDING];//回寫最終給定菜單項
write_menudata(SPDSET,i);
return;
}
else//一切中間控制變量歸零
{
e_speed[0]=0;
e_speed[1]=0;
e_current[0]=0;
e_current[1]=0;
Ctrldata[SENDOUT]=0;//30000;
Ctrldata[CRTRF]=0;
pointGive = 0;
Ctrldata[GEIDING]=0;
}
}
//---------------------數字給定-----------------------
if(read_menudata(SETWAY)==2)//運行狀態下-數字給定
{
i=read_menudata(KEYSET);//寫速度給定菜單
if(i>=speedMax)
{
i=speedMax;
}
else if(i<=speedMin)
{
i=speedMin;
}
if(i==0)
{
e_speed[0]=0;
e_speed[1]=0;
e_current[0]=0;
e_current[1]=0;
Ctrldata[SENDOUT]=0;//30000;
Ctrldata[CRTRF]=0;
Ctrldata[GEIDING]=0;
}
write_menudata(KEYSET,i);
write_menudata(SPEEDSET,i);
//鍵盤給定
i=read_menudata(SPEEDSET);// 速度給定
if(read_menudata(XIELV_EN)==0)
{
Ctrldata[GEIDING]=i;
}
else
{
if(Ctrldata[GEIDING]<i)//升斜坡函數
{
j=read_menudata(UPXIELV);//計算點動步進
if(j==0)
{
Ctrldata[GEIDING]=i;
}
else
{
Ctrldata[STEP]=1000/j;
Ctrldata[GEIDING]+=Ctrldata[STEP];//斜坡
if(Ctrldata[GEIDING]>i)
Ctrldata[GEIDING]=i;
}
}
else if(Ctrldata[GEIDING]>i)//降斜坡函數
{
j=read_menudata(DOWNXIELV);//計算點動步進
if(j==0)
{
Ctrldata[GEIDING]=i;
}
else
{
Ctrldata[STEP]=1000/j;
Ctrldata[GEIDING]-=Ctrldata[STEP];//斜坡
if(Ctrldata[GEIDING]<i)
Ctrldata[GEIDING]=i;
}
}
else//穩定給定
{
Ctrldata[GEIDING]=i;
}
disall();
}
i=Ctrldata[GEIDING];//回寫最終給定菜單項
write_menudata(SPDSET,i);
//數字升
if(!(pbstate & BIT3))//數字升 && 非模擬給定
{
i=read_menudata(DUPXIELV);//計算數字升步進
Ctrldata[STEP]=(j==0)? 1000:1000/i;
i=read_menudata(KEYSET);
if(i<speedMax)//斜坡函數
{
i+=Ctrldata[STEP];
if(i>speedMax)
i=speedMax;
}
write_menudata(KEYSET,i);
disall();
}
//數字降
else if(!(pbstate & BIT4))//數字降 && 非模擬給定
{
i=read_menudata(DDOWNXIELV);//計算數字降步進
Ctrldata[STEP]=(j==0)? 1000:1000/i;
i=read_menudata(KEYSET);
if(i>speedMin)//斜坡函數
{
i-=Ctrldata[STEP];
}
write_menudata(KEYSET,i);
disall();
}
if(i<0)
{
i=0;
e_speed[0]=0;
e_speed[1]=0;
e_current[0]=0;
e_current[1]=0;
Ctrldata[SENDOUT]=0;//30000;
Ctrldata[CRTRF]=0;
Ctrldata[GEIDING]=0;
}
}
//硬速度給定
if(read_menudata(SETWAY)==3)//運行狀態下-硬速度給定-無斜坡
{
i=fact(Ctrldata[HARDSPDSET],CRTFACT);
if(i>=speedMax)
{
i=speedMax;
}
else if(i<=speedMin)
{
i=speedMin;
}
write_menudata(SPEEDSET,i);
i=Ctrldata[GEIDING];//回寫最終給定菜單項
write_menudata(SPDSET,i);
i=read_menudata(SPEEDSET);//速度給定
if(i <= 0)
{
e_speed[0]=0;
e_speed[1]=0;
e_current[0]=0;
e_current[1]=0;
Ctrldata[SENDOUT]=0;//30000;
Ctrldata[CRTRF]=0;
Ctrldata[GEIDING]=0;
}
else
{
i=read_menudata(SPEEDSET);// 速度給定
if(read_menudata(XIELV_EN)==0)
{
Ctrldata[GEIDING]=i;
}
else
{
if(Ctrldata[GEIDING]<i)//升斜坡函數
{
j=read_menudata(UPXIELV);//計算步進
if(j==0)
{
Ctrldata[GEIDING]=i;
}
else
{
Ctrldata[STEP]=1000/j;
Ctrldata[GEIDING]+=Ctrldata[STEP];//斜坡
if(Ctrldata[GEIDING]>i)
Ctrldata[GEIDING]=i;
}
}
else if(Ctrldata[GEIDING]>i)//降斜坡函數
{
j=read_menudata(DOWNXIELV);//計算步進
if(j==0)
{
Ctrldata[GEIDING]=i;
}
else
{
Ctrldata[STEP]=1000/j;
Ctrldata[GEIDING]-=Ctrldata[STEP];//斜坡
if(Ctrldata[GEIDING]<i)
Ctrldata[GEIDING]=i;
}
}
else//穩定給定
{
Ctrldata[GEIDING]=i;
}
}
}
}
//開環控制
if(read_menudata(SETWAY)==4)//開環控制
{
i=read_menudata(KEYSET);//寫速度給定菜單
if(i>=speedMax)
{
i=speedMax;
}
else if(i<=speedMin)
{
i=speedMin;
}
if(i==0)
{
e_speed[0]=0;
e_speed[1]=0;
e_current[0]=0;
e_current[1]=0;
Ctrldata[SENDOUT]=0;
Ctrldata[CRTRF]=0;
Ctrldata[GEIDING]=0;
}
Ctrldata[GEIDING]=i;
write_menudata(KEYSET,i);
write_menudata(SPEEDSET,i);
write_menudata(SPDSET,i);
disall();
}
//模擬給定,數字差
if(read_menudata(SETWAY)==1)// 模擬給定
{
i=fact(spdgive,SPDFACT);
if(i>=speedMax)
{
i=speedMax;
}
else if(i<=speedMin)
{
i=speedMin;
}
write_menudata(SPEEDSET,i);
i=read_menudata(SPEEDSET);// 速度給定
if(read_menudata(XIELV_EN)==0)
{
Ctrldata[GEIDING]=i;
}
else
{
if(Ctrldata[GEIDING]<i)//升斜坡函數
{
j=read_menudata(UPXIELV);//計算點動步進
if(j==0)
{
Ctrldata[GEIDING]=i;
}
else
{
Ctrldata[STEP]=1000/j;
Ctrldata[GEIDING]+=Ctrldata[STEP];//斜坡
if(Ctrldata[GEIDING]>i)
Ctrldata[GEIDING]=i;
}
}
else if(Ctrldata[GEIDING]>i)//降斜坡函數
{
j=read_menudata(DOWNXIELV);//計算點動步進
if(j==0)
{
Ctrldata[GEIDING]=i;
}
else
{
Ctrldata[STEP]=1000/j;
Ctrldata[GEIDING]-=Ctrldata[STEP];//斜坡
if(Ctrldata[GEIDING]<i)
Ctrldata[GEIDING]=i;
}
}
else//穩定給定
{
Ctrldata[GEIDING]=i;
}
}
if((read_menudata(SPEEDSET)==0) && (read_menudata(SPDSET)==0))
{
e_speed[0]=0;
e_speed[1]=0;
e_current[0]=0;
e_current[1]=0;
Ctrldata[SENDOUT]=0;//30000;
Ctrldata[CRTRF]=0;
Ctrldata[GEIDING]=0;
}
i=Ctrldata[GEIDING];//回寫最終給定菜單項
write_menudata(SPDSET,i);
}
//模擬給定,模擬差,無斜坡
if(read_menudata(SETWAY)==0)// 模擬給定
{
i=spdgive;
if(i>=speedMax)
{
i=speedMax;
}
else if(i<=speedMin)
{
i=speedMin;
}
Ctrldata[GEIDING]=i;
write_menudata(SPEEDSET,i);
write_menudata(SPDSET,i);
if((read_menudata(SPEEDSET)==0) && (read_menudata(SPDSET)==0))
{
e_speed[0]=0;
e_speed[1]=0;
e_current[0]=0;
e_current[1]=0;
Ctrldata[SENDOUT]=0;
Ctrldata[CRTRF]=0;
Ctrldata[GEIDING]=0;
}
}
return;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -