第2章绘图仪项目设计_第1页
第2章绘图仪项目设计_第2页
第2章绘图仪项目设计_第3页
第2章绘图仪项目设计_第4页
第2章绘图仪项目设计_第5页
已阅读5页,还剩269页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第2章绘图仪项目设计

2.2.1主程序模块相关代码

//library.h

#ifndeflibrary_h

#definelibrary_h

//标准库

#include<avr/io.h>

#include<avr/pgmspace.h>

#include<avr/interrupt.h>

#include<avr/wdt.h>

#include<util/delay.h>

#include<math.h>

#include<inttypes.h>

#include<string.h>

#include<stdlib.h>

#include<stdint.h>

#include<stdbool.h>

//模块库

#include"config.h"//设置相关

#includenshared.h"〃共享的定义、变量、函数

#include"settings.h"//参数相关设置

#includendefaults.h"〃默认设置

#includencpu_map.h"//CPU映射

#includeneeprom.hH//EEPROM内容存储

#include“geode.h"//GCode解读代码

#includenmotion_control・h”//运动控制

#include"planner.h"//指令队列缓存

#include"print.h"//格式化输出字符串

#include"probe.hH//系统状态探测

#include"protocol.h"//控制执行协议

#include"serial.hn//发送/接收串口通信

#includeHspindle_control.h"//主轴控制模块

#include"stepper.h"//步进电机驱动

#endif

//main.c

#include"library.h"

//系统全局变量结构

system_tsys;

intmain(void){

//初始化系统

serial_init();〃设置波特率和中断

settings_init();//从内存中加载设置

stepper_init();〃配置步进电机和中断计时器

system_init();//配置引脚

memset(&sys,0,sizeof(system_t));

sys.abort=true;

sei();//中断

//加电后初始化循环

for(;;){

serial_reset_read_buffer();

gc_init();

spindle_init();

probe_init();

plan_reset();

st_reset();

//同步系统位置

plan_sync_position();

gc_sync_position();

//重置系统变量

sys.abort=false;

sys_rt_exec_state=0;

sys_rt_exec_alarm=0;

sys.suspend=false;

//主循环

protocol_main_loop();

}

return0;

#ifndefcpu_map_h

#definecpu_map_h

#definePLATFORM”Atmega328p”

#defineSERIAL_RXUSART_RX_vect

#defineSERIAL_UDREUSART_UDRE_vect

#defineSTEP_DDRDDRD

#defineSTEP_PORTPORTD

#defineX_STEP_BIT2

#defineY_STEP_BIT3

#defineSTEP_MASK((1«X_STEP_BIT)|(1«Y_STEP_BIT))

#defineDIRECTION_DDRDDRD

#defineDIRECTION_PORTPORTD

#defineX_DIRECTION_BIT5

#defineY_DIRECTION_BIT6

#defineDIRECTION_MASK((1«X_DIRECTION_BIT)|(1«Y_DIRECTION_BIT))

#defineSTEPPERS_DISABLE_DDRDDRB

#defineSTEPPERS_DISABLE_PORTPORTB

#defineSTEPPERS_DISABLE_BIT0

#defineSTEPPERS_DISABLE_MASK(1«STEPPERS_DISABLE_BIT)

#defineSPINDLE_ENABLE_DDRDDRB

#defineSPINDLE_ENABLE_PORTPORTB

#ifdefVARIABLE_SPINDLE

#ifdefUSE_SPINDLE_DIR_AS_ENABLE_PIN

#defineSPINDLE_ENABLE_BIT5

#else

#defineSPINDLE_ENABLE_BIT3

#endif

#else

#defineSPINDLE_ENABLE_BIT4

#endif

#ifndefUSE_SPINDLE_DIR_AS_ENABLE_PIN

#defineSPINDLE_DIRECTION_DDRDDRB

#defineSPINDLE_DIRECTION_PORTPORTB

#defineSPINDLE_DIRECTION_BIT5

#endif

//定义输入引脚

#defineCONTROL_DDRDDRC

#defineCONTROL_PINPINC

#defineCONTROL_PORTPORTC

#defineRESET_BIT0//弓I脚AO

#defineFEED_HOLD_BIT1//引脚Al

#defineCYCLE_START_BIT2//弓|脚A2

#defineCONTROL_INTPCIE1

#defineCONTROL_INT_vectPCINTl_vect

#defineCONTROL_PCMSKPCMSK1

#defineCONTROL_MASK((1«RESET_BIT)|(1«FEED_HOLD_BIT)|(1«CYCLE_START_BIT))

#defineCONTROL_INVERT_MASKCONTROL_MASK

#definePROBE_DDRDDRC

#definePROBE_PINPINC

#definePROBE_PORTPORTC

#definePROBE_BIT5

#definePROBE_MASK(1«PROBE_BIT)

#ifdefVARIABLE_SPINDLE

#definePWM_MAX_VALUE255.0

#defineTCCRA_REGISTERTCCR2A

#defineTCCRB_REGISTERTCCR2B

#defineOCR_REGISTEROCR2A

#defineCOMB_BITCOM2A1

#defineWAVEOREGISTERWGM20

#defineWAVE「REGISTERWGM21

#defineWAVE2_REGISTERWGM22

#defineWAVE3_REGISTERWGM23

#defineSPINDLE_PWM_DDRDDRB

#defineSPINDLE_PWM_PORTPORTB

#defineSPINDLE_PWM_BIT3

#endif

#endif

//shared.h

#ifndefshared_h

#defineshared_h

#definefalse0

#definetrue1

//轴定义

#defineN_AXIS2//轴数量

#defineX_AXIS0

#defineY_AXIS1

//XY步进电机定义

#ifdefCOREXY

#defineA_MOTORX_AXIS

#defineB_MOTORY_AXIS

#endif

〃定义参数

#defineMM_PER_INCH(25.40)

#defineINCH_PER_MM(0.0393701)

#defineTICKS_PER_MICROSECOND(F_CPU/1000000)

#defineclear_vector(a)memset(az0,sizeof(a))

#defineclear_vector_float(a)memset(a,0.0,sizeof(float)*N_AXIS)

#defineclear_vector_long(a)memset(az0.0,sizeof(long)*N_AXIS)

#definemax(a,b)(((a)>(b))?(a):(b))

#definemin(a,b)(((a)<(b))?(a):(b))

#definebit(n)(1«n)

#definebit_true_atomic(xzmask){uint8_tsreg=SREG;cli();(x)|=(mask);SREG

=sreg;}

#definebit_false_atomic(x,mask){uint8_tsreg=SREG;cli();(x)&=~(mask);

SREG=sreg;}

A

#definebit_toggle_atomic(xzmask){uint8_tsreg=SREG;cli();(x)=(mask);

SREG=sreg;}

#definebit_true(x,mask)(x)|=(mask)

#definebit_false(x,mask)(x)&=-(mask)

#definebit_istrue(x,mask)((x&mask)!=0)

#definebit_isfalse(x,mask)((x&mask)==0)

uint8_tread_float(char*line,uint8_t*char_counterzfloat*float_ptr);

//延迟函数

voiddelay_ms(uintl6_tms);

voiddelay_us(uint32_tus);

floathypot_f(floatx,floaty);

#endif

//shared.c

#include"library.h"

#defineMAX_INT_DIGITS8//最大位数

uint8_tread_float(char*linezuint8_t*char_counter,float*float_ptr)

{

char*ptr=line+*char_counter;

unsignedcharc;

〃找到第一个字符用指针指向它

c=*ptr++;

boolisnegative=false;

if(c==•-'){

isnegative=true;

c=*ptr++;

}elseif(c=='+'){

c=*ptr++;

)

uint32_tintval=0;

int8_texp=0;

uint8_tndigit=0;

boolisdecimal=false;

while(1){

c-=101;

if(c<=9){

ndigit++;

if(ndigit<=MAX_INT_DIGITS){

if(isdecimal){exp―;}

intval=(((intval<<2)+intval)<<1)+c;

}else{

if(!(isdecimal)){exp++;}//丢弃溢出字符

)

}elseif(c==(('.1'01)&Oxff)&&!(isdecimal)){

isdecimal=true;

}else{

break;

}

c=*ptr++;

}

//如果没有数据就返回

if(!ndigit){return(false);};

//整形转浮点

floatfval;

fval=(float)intval;

if(fval!=0){

while(exp<=-2){

fval*=0.01;

exp+=2;

)

if(exp<0){

fval*=0.1;

}elseif(exp>0){

do{

fval*=10.0;

}while(一-exp>0);

)

}

if(isnegative){

*float_ptr=-fval;

}else{

*float_ptr=fval;

)

*char_counter=ptr-line-1;

return(true);

)

voiddelay_ms(uintl6_tms)

{

while(ms-){_delay_ms(1);}

)

voiddelay_us(uint32_tus)

{

while(us){

if(us<10){

_delay_us(1);

us--;

}elseif(us<100){

_delay_us(10);

us-=10;

}elseif(us<1000){

_delay_us(100);

us-=100;

}else{

_delay_ms(1);

us-=1000;

}

//斜边计算函数.

floathypot_f(floatx,floaty){return(sqrt(x*x+y*y));

2.2.2串口通信模块相关代码

//serial.h

#ifndefserial_h

#defineserial_h

#ifndefRX_BUFFER_SIZE

#defineRX_BUFFER_SIZE128

#endif

#ifndefTX_BUFFER_SIZE

#defineTX_BUFFER_SIZE64

#endif

#defineSERIAL_NO_DATAOxff

#ifdefENABLE_XONXOFF

#defineRX_BUFFER_FULL96

#defineRX_BUFFER_LOW64

#defineSEND_XOFF1

#defineSEND_XON2

#defineXOFF_SENT3

#defineXON_SENT4

#defineXOFF_CHAR0x13

#defineXON_CHAR0x11

#endif

voidserial_init();

〃写Ibyte数据到TXbuffer中

voidserial_write(uint8_tdata);

//读取buffer中最前方的Ibyte数据

uint8_tserial_read();

//清空读取buffer

voidserial_reset_read_buffer();

//返回数据数量

uint8_tserial_get_rx_buffer_count();

//返回已完成数据量

uint8_tserial_get_tx_buffer_count();

#endif

//serial.c

#include"library.hn

uint8_tserial_rx_buffer[RX_BUFFER_SIZE];

uint8_tserial_rx_buffer_head=0;

volatileuint8_tserial_rx_buffer_tail=0;

uint8tserialtxbuffer[TXBUFFERSIZE];

uint8_tserial_tx_buffer_head=0;

volatileuint8_tserial_tx_buffer_tail=0;

#ifdefENABLE_XONXOFF

volatileuint8_tflow_ctrl=XON_SENT;

#endif

//返回RXbuffer里的数据量

uint8_tserial_get_rx_buffer_count()S{

uint8_trtail=serial_rx_buffer_tail;

if(serial_rx_buffer_head>=rtail){return(serial_rx_buffer_head-rtail);}

return(RX_BUFFER_SIZE-(rtail-serial_rx_buffer_head));

)

//返回RXbuffer里完成的数据量

uint8_tserial_get_tx_buffer_count(){

uint8_tttail=serial_tx_buffer_tail;

if(serial_tx_buffer_head>=ttail){return(serial_tx_buffer_head-ttail);}

return(TX_BUFFER_SIZE-(ttail-serial_tx_buffer_head));

}

voidserial_init(){

//设置波特率

#ifBAUD_RATE<57600

uintl6_tUBRR0_value=((F_CPU/(8L*BAUD_RATE))-1)/2;

UCSROA&=-(1«U2X0);

#else

uintl6_tUBRR0_value=((F_CPU/(4L*BAUD_RATE))-1)/2;

UCSROA|=(1«U2X0);

#endif

UBRROH=UBRR0_value»8;

UBRROL=UBRR0_value;

UCSROB|=l«RXEN0;

UCSROB|=1«TXENO;

UCSROB|=1«RXCIEO;

)

voidserial_write(uint8_tdata){

uint8_tnext_head=serial_tx_buffer_head+1;

if(next_head==TX_BUFFER_SIZE){

next_head=0;

}

while(next_head==serial_tx_buffer_tail){

if(sys_rt_exec_state&EXEC_RESET){

return;

)

)

serial_tx_buffer[serial_tx_buffer_head]=data;

serialtxbufferhead=nexthead;

UCSROB|=(1«UDRIEO);

)

ISR(SERIAL_UDRE){

uint8_ttail=serial_tx_buffer_tail;

#ifdefENABLE_XONXOFF

if(flow_ctrl==SEND_XOFF){

UDRO=XOFF_CHAR;

flow_ctrl=XOFF_SENT;

)

elseif(flow_ctrl==SEND_XON){

UDRO=XON_CHAR;

flow_ctrl=XON_SENT;

}else

#endif{

//发送数据

UDRO=serial_tx_buffer[tail];

tail++;

if(tail==TX_BUFFER_SIZE){tail=0;}

serial_tx_buffer_tail=tail;

}

if(tail==serial_tx_buffer_head){

UCSROB&=~(1«UDRIEO);

}

)

//读取buffer里队首数据

uint8_tserial_read(){

uint8_ttail=serial_rx_buffer_tail;

if(serial_rx_buffer_head==tail){

returnSERIAL_NO_DATA;

)

else{

uint8_tdata=serial_rx_buffer[tail];

tail++;

if(tail==RX_BUFFER_SIZE){tail=0;}

serial_rx_buffer_tail=tail;

#ifdefENABLE_XONXOFF

if((serial_get_rx_buffer_count()<RX_BUFFER_LOW)&&flow_ctrl

XOFF_SENT)(

flow_ctrl=SEND_XON;

UCSROB|=(1«UDRIEO);//ForceTX

)

#endif

returndata;

)

//中断

ISR(SERIAL_RX){

uint8_tdata=UDRO;

uint8_tnext_head;

switch(data){

caseCMD_STATUS_REPORT:

bit_true_atomic(sys_rt_exec_state,EXEC_STATUS_REPORT);

break;

caseCMD_CYCLE_START:

bit_true_atomic(sys_rt_exec_state,EXEC_CYCLE_START);

break;

caseCMD_FEED_HOLD:

bit_true_atomic(sys_rt_exec_state,EXEC_FEED_HOLD);

break;

caseCMD_RESET:

mc_reset();

break;

default:

next_head=serial_rx_buffer_head+1;

if(next_head==RX_BUFFER_SIZE){next_head=0;}

if(next_head!=serial_rx_buffer_tail){

serial_rx_buffer[serial_rx_buffer_head]=data;

serial_rx_buffer_head=next_head;

#ifdefENABLE_XONXOFF

if((serial_get_rx_buffer_count()>=RX_BUFFER_FULL)&&flow_ctrl

XON_SENT){

flow_ctrl=SEND_XOFF;

UCSROB|=(1«UDRIEO);

)

#endif

}

)

)

〃重置读取buffer

voidserial_reset_read_buffer(){

serial_rx_buffer_tail=serial_rx_buffer_head;

#ifdefENABLE_XONXOFF

flow_ctrl=XON_SENT;

#endif

2.2.3指令队列模块相关代码

//system.h

#ifndefsystem_h

#definesystem_h

#include"library.h"

//定义系统映射图

#defineEXEC_STATUS_REPORTbit(0)//位掩码00000001

#defineEXEC_CYCLE_STARTbit(1)//位掩码00000010

#defineEXEC_CYCLE_STOPbit(2)//位掩码00000100

#defineEXEC_FEED_HOLDbit(3)//位掩码00001000

#defineEXEC_RESETbit(4)//位掩码00010000

#defineEXEC_SAFETY_DOORbit(5)//位掩码00100000

#defineEXEC_MOTION_CANCELbit(6)//位掩码01000000

#defineEXEC_CRITICAL_EVENTbit(0)//位掩码00000001

#defineEXEC_ALARM_ABORT_CYCLEbit(3)//位掩码00001000

#defineEXEC_ALARM_PROBE_FAILbit(4)//位掩码00010000

〃定义系统状态图

#defineSTATE_IDLE0

#defineSTATE_ALARMbit(0)

#defineSTATE_CHECK_MODEbit(1)

#defineSTATE_HOMINGbit(2)

#defineSTATE_CYCLEbit(3)

#defineSTATE_HOLDbit(4)

#defineSTATE_SAFETY_DOORbit(5)

#defineSTATE_MOTION_CANCELbit(6)

//定义系统暂停

#defineSUSPEND_DISABLE0

#defineSUSPEND_ENABLE_HOLDbit(0)

#defineSUSPEND_ENABLE_READYbit(1)

#defineSUSPEND_ENERGIZEbit(2)

#defineSUSPEND_MOTION_CANCELbit(3)

//系统全局变量

typedefstruct{

uint8_tabort;

uint8_tstate;

uint8_tsuspend;

int32_tposition[N_AXIS];

int32_tprobe_position[N_AXIS];

uint8_tprobe_succeeded;

}system_t;

externsystem_tsys;

volatileuint8_tsys_probe_state;

volatileuint8_tsys_rt_exec_state;

volatileuint8_tsys_rt_exec_alarm;

//初始化系统

voidsystem_init();

uint8_tsystem_execute_line(char*line);

voidsystem_execute_startup(char*line);

floatsystem_convert_axis_steps_to_mpos(int32_t*stepszuint8_tidx);

voidsystem_convert_array_steps_to_mpos(float*position,int32_t*steps)

#ifdefCOREXY

int32_tsystem_convert_corexy_to_x_axis_steps(int32_t*steps);

int32_tsystem_convert_corexy_to_y_axis_steps(int32_t*steps);

#endif

#endif

//system.c

#include"library.h"

voidsystem_init()

(

CONTROL_DDR&=­(CONTROL_MASK);//配置输入弓|脚

#ifdefDISABLE_CONTROL_PIN_PULL_UP

CONTROL_PORT&=~(CONTROL_MASK);

#else

CONTROL_PORT|=CONTROL_MASK;

#endif

CONTROL_PCMSK|=CONTROL_MASK;

PCICR|=(1«CONTROL_INT);//修改中断

)

ISR(CONTROL_INT_vect)

{

uint8_tpin=(CONTROL_PIN&CONTROL_MASK);

#ifndefINVERT_ALL_CONTROL_PINS

pinA=CONTROL_INVERT_MASK;

#endif

〃任何控制指令输入都可以触发

if(pin){

if(bit_istrue(pin,bit(RESET_BIT))){

mc_reset();

}elseif(bit_istrue(pin,bit(CYCLE_START_BIT))){

bit_true(sys_rt_exec_statezEXEC_CYCLE_START);

)

}

)

//执行启动脚本

voidsystem_execute_startup(char*line)

uint8tn;

for(n=0;n<N_STARTUP_LINE;n++){

if(!(settings_read_startup_line(n,line))){

report_status_message(STATUS_SETTING_READ_FAIL);

}else{

if(line[0]!=0){

printstring(line);

report_status_message(gc_execute_line(line));

}

uint8_tsystem_execute_line(char*line)

{

uint8_tchar_counter=1;

uint8_thelper_var=0;

floatparameter,value;

switch(line[char_counter]){

case0:report_grbl_help();break;

case'$1:case*G':case1C*:case1X':

if(line[(char_counter+l)]!=0){return(STATUS_INVALID_STATEMENT);}

switch(line[char_counter]){

case1$'://打印设置

if(sys.state&(STATE_CYCLE|STATE_HOLD))

{return(STATUS_IDLE_ERROR);}

else{report_grbl_settings();}

break;

case*G*://打印GCode打印模式

report_gcode_modes();

break;

case://检查GCode代码模式

if(sys.state==STATE_CHECK_MODE){

mc_reset();

report_feedback_message(MESSAGE_DISABLED);

}else{

if(sys.state){return(STATUS_IDLE_ERROR);}//Requiresnoalarmmode,

sys.state=STATE_CHECK_MODE;

report_feedback_message(MESSAGE_ENABLED);

)

break;

casefX'://关闭警报锁

if(sys.state==STATE_ALARM){

report_feedback_message(MESSAGE_ALARM_UNLOCK);

sys.state=STATEIDLE;

break;

break;

default:

if(!(sys.state==STATE_IDLE||sys.state==STATE_ALARM))

(return(STATUS_IDLE_ERROR);}

switch(line[char_counter]){

case:

if(line[++char_counter]!=0){return(STATUS_INVALID_STATEMENT);

else{report_ngc_parameters();}

break;

case11'://打印信息

if(line[++char_counter]==0){

settings_read_build_info(line);

report_build_info(line);

}else{//存储启动行

if(line[char_counter++]!=*=»){return(STATUS_INVALID_STATEMENT);

helper_var=char_counter;

do{

line[char_counter-helper_var]=line[char_counter];

}while(line[char_counter++]!=0);

settings_store_build_info(line);

)

break;

case1R*://恢复默认设置

if(line[++char_counter]!=S){return(STATUS_INVALID_STATEMENT);

if(line[++char_counter]!=T){return(STATUS_INVALID_STATEMENT);

if(line[++char_counter]!=,=,){return(STATUS_INVALID_STATEMENT);

if(line[char_counter+2]!=0){return(STATUS_INVALID_STATEMENT);

switch(line[++char_counter]){

casesettings_restore(SETTINGS_RESTORE_DEFAULTS);break;

case'#T:settings_restore(SETTINGS_RESTORE_PARAMETERS);break;

case***:settings_restore(SETTINGS_RESTORE_ALL);break;

default:return(STATUS_INVALID_STATEMENT);

}

report_feedback_message(MESSAGE_RESTORE_DEFAULTS);

mc_reset();

break;

case*N':

if(line[++char_counter]==0){

for(helper_var=0;helper_var<N_STARTUP_LINE;helper_var++){

if(!(settings_read_startup_line(helper_varzline))){

report_status_message(STATUS_SETTING_READ_FAIL);

}else{

report_startup_line(helper_varzline);

)

}

break;

}else{

if(sys.state!=STATE_IDLE){return(STATUS_IDLE_ERROR);}

helper_var=true;

)

default:

if(!read_float(line,&char_counter,¶meter))

{return(STATUS_BAD_NUMBER_FORMAT);}

if(line[char_counter++]!==){return(STATUS_INVALID_STATEMENT);

if(helper_var){

helper_var=char_counter;

do{

line[char_counter-helper_var]=line[char_counter];

}while(line[char_counter++]!=0);

helper_var=gc_execute_line(line);

if(helper_var){return(helper_var);}

else{

helper_var=trunc(parameter);

settings_store_startup_line(helper_var,line);

}

}else{

if(!read_float(line,&char_counterzSvalue))

{return(STATUS_BAD_NUMBER_FORMAT);}

if((line[char_counter]!=0)||(parameter>255))

{return(STATUS_INVALID_STATEMENT);}

return(settings_store_global_setting((uint8_t)parameter,value));

)

}

)

return(STATUS_OK);

)

floatsystem_convert_axis_steps_to_mpos(int32_t*steps,uint8_tidx)

(

floatpos;

#ifdefCOREXY

if(idx==X_AXIS){

pos=(float)system_convert_corexy_to_x_axis_steps(steps)/

settings.steps_per_mm[A_MOTOR];

}elseif(idx==Y_AXIS){

pos=(float)system_convert_corexy_to_y_axis_steps(steps)/

settings.stepspermm[BMOTOR];

}else{

pos=steps[idx]/settings.steps_per_mm[idx];

}

#else

pos=steps[idx]/settings.steps_per_mm[idx];

#endif

return(pos);

)

voidsystem_convert_array_steps_to_mpos(float“position,int32_t*steps)

(

uint8_tidx;

for(idx=0;idx<N_AXIS;idx++){

position[idx]=system_convert_axis_steps_to_mpos(steps,idx);

)

return;

)

//计算X/Y轴运动

#ifdefCOREXY

int32_tsystem_convert_corexy_to_x_axis_steps(int32_t*steps){

return((steps[A_MOTOR]+steps[B_MOTOR])/2);

}

int32_tsystem_convert_corexy_to_y_axis_steps(int32_t*steps){

return((steps[A_MOTOR]-steps[B_MOTOR])/2);

)

#endif

//protocol.h

#ifndefprotocol_h

#defineprotocol_h

//读取队列大小

#ifndefLINE_BUFFER_SIZE

#defineLINE_BUFFER_SIZE80

#endif

//启动主循环

voidprotocol_main_loop();

//实时命令执行

voidprotocol_execute_realtime();

//执行自动循环

voidprotocol_auto_cycle_start();

//同步队列

voidprotocol_buffer_synchronize();

#endif

//protocol.c

#includenlibrary.h"

//定义不同对话类型

#defineCOMMENT_NONE0

#defineCOMMENT_TYPE_PARENTHESES1

#defineCOMMENT_TYPE_SEMICOLON2

staticcharline[LINE_BUFFER_SIZE];//执彳亍彳亍号

//执行一行

staticvoidprotocol_execute_line(char*line){

protocol_execute_realtime();

if(sys.abort){return;}

#ifdefREPORT_ECHO_LINE_RECEIVED

report_echo_line_received(line);

#endif

if(line[0]==0){

report_status_message(STATUS_OK);

}elseif(line[0]==T$'){

//系统指令

report_status_message(system_execute_line(line));

}elseif(sys.state==STATE_ALARM){

report_status_message(STATUS_ALARM_LOCK);

}else{

report_status_message(gc_execute_line(line));

}

)

voidprotocol_main_loop()

(

//打印初始信息

report_init_message();

//警报

if(sys.state==STATE_ALARM){

report_feedback_message(MESSAGE_ALARM_LOCK);

}else{

system_execute_startup(line);

)

uint8_tcomment=COMMENT_NONE;

uint8_tchar_counter=0;

uint8_tc;

for(;;){

while((c=serial_read())!=SERIAL_NO_DATA){

if((c==,\n,)||(c==f\rr)){//行结束的标志

line[char_counter]=0;//设置字符终止标志

protocol_execute_line(line);//执行

comment=COMMENT_NONE;

char_counter=0;

}else{

if(comment!=COMMENT_NONE){//忽略无效对话

if(c尸){

if(comment==COMMENT_TYPE_PARENTHESES){comment=COMMENT_NONE;}

}

}else{

if(c<=11){

}elseif(c==*/*){

}elseif(c=='(*){

comment=COMMENT_TYPE_PARENTHESES;

}elseif(c==*;1){

comment=COMMENT_TYPE_SEMICOLON;

}elseif(char_counter>=(LINE_BUFFER_SIZE-1)){

report_status_message(STATUS_OVERFLOW);

comment=COMMENT_NONE;

char_counter=0;

}elseif(c>='a*&&c<=*z*){//大小写转化

line[char_counter++]=c-'a,+*A*;

}else{

line[char_counter++]=c;

}

)

}

}

protocol_auto_cycle_start();〃自动循环

protocol_execute_realtime();//实时执行

if(sys.abort){return;}

)

return;

)

voidprotocol_execute_realtime()

(

uint8_trt_exec;

do{//系统暂停循环

rt_exec=sys_rt_exec_alarm;

if(rt_exec){

sys.state=STATE_ALARM;

if(rt_exec&EXEC_ALARM_HARD_LIMIT){

report_alarm_message(ALARM_HARD_LIMIT_ERROR);

}elseif(rt_exec&EXEC_ALARM_SOFT_LIMIT){

report_alarm_message(ALARM_S0FT_LIMIT_ERROR);

}elseif(rt_exec&EXEC_ALARM_ABORT_CYCLE){

report_alarm_message(ALARM_ABORT_CYCLE);

}elseif(rt_exec&EXEC_ALARM_PROBE_FAIL){

report_alarm_message(ALARM_PROBE_FAIL);

)

if(rt_exec&EXEC_CRITICAL_EVENT){

report_feedback_message(MESSAGE_CRITICAL_EVENT);

bit_false_atomic(sys_rt_exec_state,EXEC_RESET);

do(

}while(bit_isfalse(sys_rt_exec_statezEXEC_RESET));

)

bit_false_atomic(sys_rt_exec_alarmzOxFF);//情况警报

)

//检查并执行实时命令

rt_exec=sys_rt_exec_state;

if(rt_exec){

//系统终止

if(rt_exec&EXEC_RESET){

sys.abort=true;

return;

)

//执行并报告串口填充

if(rt_exec&EXEC_STATUS_REPORT){

report_realtime_status();

bit_false_atomic(sys_rt_exec_state,EXEC_STATUS_REPORT);

}

//保持状态

if(rt_exec&(EXEC_MOT

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论