📄 main.c
字号:
/**
*---------------------------------------------------*
* 功能描述: *
* 输出: 一路脉冲+方向输出、继电器延时、报警 *
* 输入: 起动、停止 *
* 参数: *
* 通信: 三菱FX系列通信兼容RS232(9600,1,0.1) *
*---------------------------------------------------*
* 硬件描述 PCB:MPA101.DDB(20060610) *
* CPU:LPC2103(16MHz) *
*---------------------------------------------------*
* 软件描述: 开发软件ADS1.2 *
*---------------------------------------------------*
* 版本修订: *
*---------------------------------------------------*/
//-------------------- IO描述 ------------------------
//
// Y1:脉冲 Y2:方向 Y3:继电器延时 Y4:报警
// X3:启动 X4:停止 X5:单切一刀
//-------- 运行程序 --------------------------------------------------------------
// D0: U16 站号
// D1-11: system
// D14: U16 flag
// D15: U16 画面延时
// D16-17: U32 设定长度 123.45mm
// D18-19: U32 设定数量 123456
// D20-21: U32 完成数量 123456
// D22: U16 加工速度 999/min
// D23: U16 速度 1-5
// D24-25: U32 比例 1.23456mm/p
// D26-27: U32 延时 1.234秒
// D28: U16 起步速度 12345Hz
// D29: U16 加速度 12345Hz/秒
// D30: U16 减速度 12345Hz/秒
// D31-35: U16 最高速度 12345Hz
//
#include "Main.h"
U32 speed_temp;
/*------------------------------------------*/
/* Function : int main(void) */
/* Description: 主程序 */
/*------------------------------------------*/
int main(void)
{
U32 *p1, *p2, *p3, *p5;
S32 *p4,*p6,*p7;
U32 inold, innew;
U8 runf;
U8 number;
system_init();
FM_ReadSeq(0, (U8 *)&DREG[0], MAXDREG*2);
if((FM_RByte(0)!=0) && (FM_RByte(2)!=0x5a)){ // 如果是第一次初始化
Dreg_Init();
FM_WriteSeq(0, (U8 *)&DREG[0], MAXDREG*2);
}
DREG[15]=1; // 开始画面延时1秒
DelayMs(2000);
DREG[15] = 2;
DREG[14] = 0;
runf = 0;
DREG[57]=0;
p1 = (U32*)&DREG[24];
p2 = (U32*)&DREG[20];
p3 = (U32*)&DREG[26];
p4 = (S32*)&DREG[12];
p5 = (U32*)&DREG[22];
p6 = (S32*)&DREG[44];
p7 = (S32*)&DREG[42];
count = (*p7);
xposi = (*p4);
yposi = (*p6);
count1 = abs(count);
xscale = (U32)(DREG[24])+(U32)(DREG[25]<<16);
yscale = (U32)(DREG[20])+(U32)(DREG[21]<<16);
iscale = (U32)(DREG[38])+(U32)(DREG[39]<<16);
pause = 0;
number=0;
xposi=0;
while(1){
inold = innew;
if(temp_in==(FIO0PIN&INDATA)){
if(in_count>8){
innew = temp_in;
in_count = 0;
}
} else {
in_count = 0;
}
temp_in = FIO0PIN&INDATA;
//===========================================================
if(innew&IN10){SETSTOP();CLRSTART(); } // 停止
if(WSTOP){//----------------停止
CLRSTOP();
DREG[58] =0;
runf = 0;
X_Stop();
Y_Stop();
}
//-------------------------------------
if(innew&IN9){ // 启动
SETSTART();
DREG[57]=0;
number=0;
}
//-----------------------------
if((relay&bit5)&&(!WSTART)){ //手动/自动
relay&=0xffdf;
if(!WAUTOF){SETAUTOF(); relaysd|=bit5; }
else {CLRAUTOF(); relaysd&=0xffdf; }
}
//----------------------------
if(WAUTOF){//手动操作
if((innew&IN6)||(relay&bit1)){
if(X_Status()==CP_STOP) X_HandMove(CCW); //X正转
SETF5();
}else if((innew&IN5)||(relay&bit2)){
if(X_Status()==CP_STOP) X_HandMove(CW); //X反转
SETF5();
}else if(WF5){
if(X_Status()!=CP_STOP) X_Stop();
CLRF5();}
//------------------
if((innew&IN4)||(relay&bit3)){
if(Y_Status()==CP_STOP) Y_HandMove(CCW); //Y正转
SETF6();
}else if((innew&IN3)||(relay&bit4)){
if(Y_Status()==CP_STOP) Y_HandMove(CW); //Y反转
SETF6();
}else if(WF6){
if(Y_Status()!=CP_STOP) Y_Stop();
CLRF6();}
}
//----------------------------------------------------
if((WSTART)&&(!WAUTOF)){
if(runf==0){
if(Y_Status()==CP_STOP){
FIO0SET = Y8; //气缸
FIO0SET = Y7;
speed_temp=DREG[32];
xposi=0;
setxpara(CW);
DREG[58] =1; //test
runf++;
}
}
else if(runf==1){
if(X_Status()==CP_STOP){
out1dtime_c=400;
runf++;
}
}
else if(runf==2){
if(out1dtime_c==0){
DREG[58] =2; //test
speed_temp=DREG[51];
setxpara(CCW);
runf++;
}
}
else if(runf==3){
if(X_Status()==CP_STOP){
++DREG[57];
if(DREG[57]<DREG[50]){
DREG[58] =3; //test
setypara(0);
runf=0;
}
else if(DREG[57]>DREG[50]) {
CLRSTART();
DREG[58] =4; //完成
DREG[57]--;
FIO0CLR = Y8;
FIO0CLR = Y7;
runf=0;
}
}
}
DREG[53] = abs(xposi*(S32)(xscale)/(S32)(1000)); //显示位置
}
//==================================================
SendRS(); // 串口发送数据
if(FIO0PIN&WDI) FIO0CLR = WDI; else FIO0SET = WDI;
}
return(0);
}
//----------------------------------------------//
// Function : setpara //
// Description: x轴自动运行 //
//----------------------------------------------//
void setxpara(U32 dir)
{
xscale = (U32)(DREG[24])+(U32)(DREG[25]<<16);
xpara.lowsp = DREG[28];
xpara.upsp = DREG[29];
xpara.downsp = DREG[30];
xpara.hisp = speed_temp*100000/xscale;// (U32)(DREG[32])*100000/xscale;
xpara.distance = (U32)(DREG[16])*1000/xscale;
xpara.dir = dir;
xpara.mode = 0; //定长
X_Motion(xpara);
}
//----------------------------------------------//
// Function : setpara //
// Description: Y轴自动运行 //
//----------------------------------------------//
void setypara(U8 dir)
{
yscale = (U32)(DREG[20])+(U32)(DREG[21]<<16);
iscale = (U32)(DREG[38])+(U32)(DREG[39]<<16);
ypara.lowsp = DREG[35];//起加速
ypara.upsp = DREG[36];//加
ypara.downsp = DREG[41];//咸
ypara.hisp = DREG[34]*100000/yscale;//运行速度
ypara.mode = 0; //定长
ypara.dir = dir;//放向
ypara.distance =(U32)(DREG[37])*1000/yscale;
Y_Motion(ypara);//发脉冲
}
//----------------------------------------------//
// Function : setpara //
// Description: x 轴 手动运行 //
//----------------------------------------------//
void X_HandMove(U8 dir)
{
xscale = (U32)(DREG[24])+(U32)(DREG[25]<<16);
xpara.lowsp = DREG[28];
xpara.upsp = DREG[29];
xpara.downsp = DREG[30];
xpara.hisp = (U32)(DREG[31])*100000/xscale;
xpara.dir = dir;
xpara.mode = 1;
xpara.distance = 10000;
X_Motion(xpara);
}
//----------------------------------------------//
// Function : setpara //
// Description: //
//----------------------------------------------//
void Y_HandMove(U8 dir)
{
yscale = (U32)(DREG[20])+(U32)(DREG[21]<<16);
ypara.lowsp = DREG[35];
ypara.upsp = DREG[36];
ypara.downsp = DREG[41];
ypara.hisp = (U32)(DREG[33])*100000/yscale;
ypara.dir = dir;
ypara.mode = 1;
ypara.distance = 10000;
Y_Motion(ypara);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -