您好,欢迎访问三七文档
华中数控培训讲义·PLC编程C语言编程PLC控制的范围数控机床所受到的控制可分为两类:数字控制和顺序控制。数字控制主要指对各进给轴进行精确的位置控制,包括:轴移动距离、插补、补偿等。顺序控制主要指以CNC内部和机床各行程开关,传感器,按钮,继电器等的开关量信号状态为条件,并按照预先规定的逻辑顺序对诸如主轴的起停,刀具的转换,工件的夹紧松开,液压,冷却,润滑系统的运行等进行的控制。与“数字控制”比较,“顺序控制”的信息主要是开关量信号。PLC控制的范围包括全部顺序控制和简单的数字控制(如:轴点动)寄存器是数控系统、PLC、机床三者之间交流的载体,是PLC控制的主要对象,也是PLC程序的最小单元。寄存器的分类寄存器的个数PLC源代码的基本构成初始化函数voidinit();仅上电时调用一次高速扫描函数voidplc1();每隔8ms被调用一次低速扫描函数voidplc2();每隔128ms被调用一次PLC执行程序的生成运行环境---MSDOS6.22编译器---BorlandC++3.1BC31的路径需要加入OS的环境变量编译环境---各种信息定义文件(*.inc)PLC源文件铣---plc_21mu.cld车---plc-21.cppPLC头文件车---plc_map.h(主要包含IO点的定义)PLC头文件的生成plctab_t.dat(IO点信息文件)standplc.exe(标准PLC配置软件)plc_map.h寄存器的数值说明以R寄存器为例,不同的类型有着不同的取值范围。(注:PLC不支持浮点运算)定义自己的R寄存器正确的定义方式#definespdl_ctrlR[20]//主轴控制(0停止1正转2反转)#definespdl_cmdR_i[22/2]//主轴转速#definespdl_dwellR_ui[24/2]//主轴定时器#defineLube_dwellR_ul[28/4]//润滑定时器C语言编程中,使用带有含义的变量,往往比直接对R寄存器操作更加直观。定义自己需要的R寄存器,是编程的第一步。一般说来,类似记录开关量的状态,用char型的变量。如果需要记录类似主轴转速或用作短时间计时器的话,则用int型的变量,而记录轴的位置或用作长时间计时器,则需要用long型的变量。错误的定义方式#definespdl_ctrlR[20/2]//主轴控制(0停止1正转2反转)#definespdl_cmdR_i[22]//主轴转速#definespdl_dwellR_ui[23/2]//主轴定时器#defineLube_dwellR_ul[26/4]//润滑定时器PLC常用指令浅析一#definebit(x,b)((x)&(1(b)))//获取某一位的状态#defineset_bit(x,b)((x)|=1(b))//将某一位置1#defineclr_bit(x,b)((x)&=~(1(b)))//将某一位置0plc常用宏、寄存器的定义和函数的声明都可以在sys目录下的plc.h中找到,而部分函数的定义则放在sys目录下plc_sub.c中。实例:手动方式下,Z轴正向点动时,灯信号的处理(假设面板按键X33.5,灯信号Y33.5)if(bit(X[33],5))set_bit(Y[33],5);//点亮+Z灯elseclr_bit(Y[33],5);//熄灭+Z灯PLC常用指令浅析二#defineaxis_ctrl(x)(G_ui[(x)*10])//轴控制#defineaxis_stat(x)(F_ui[(x)*10])//轴状态#definech_ctrl(x)(G_ui[(x)*20+162])//通道控制#definech_stat(x)(F_ui[(x)*20+162]//通道状态不同的G和F寄存器代表不同的意义,这些已经由CNC控制软件定义定义在plc.h中,这里只针对几个常用的寄存器作一个简单的讲解。实例一:X轴负限位的处理(假设X轴负限位X0.1,当前通道为0)if(bit(X[0],1))*axis_ctrl(0)|=AX_LSN;//通知CNC,X轴已到负限位else*axis_ctrl(0)&=~AX_LSN;//清除标记(注:AX_LSN的定义详见plc.h)PLC常用指令浅析二实例二:循环启动的处理(按键X31.6,灯Y31.6)if(bit(X[31],6)){*ch_ctrl(0)&=~CH_FEEDHOLD_SW;//取消进给保持*ch_ctrl(0)|=CH_CYCLE_SW;//循环启动开始}else*ch_ctrl(0)&=~CH_CYCLE_SW;//取消循环启动if(*ch_stat(0)&CH_CYCLE_LAMP)set_bit(Y[31],6);//点亮循环启动灯elseclr_bit(Y[31],6);//熄灭循环启动灯PLC常用函数浅析一除了宏定义,函数也是PLC必不可少的组成部分。前面我们已经介绍了PLC不可或缺的三个函数init()、plc1()和plc2(),这里我们再介绍几个常用的函数。voidset_axis_home(intaxis,intstart_stop);voidset_axis_jog(intaxis,intspeed);voidset_axis_step(intaxis,longdisplacement);voidhandwheel(inth_no,intaxis,intstep_mul);if(bit(X[35],3))//-Zjogset_axis_jog(2,-100);elseset_axis_jog(2,0);注:这里速度单位是脉冲/秒。若设计单位是毫米/分钟,需要先乘上(插补周期/60)。假设插补周期为4ms,那么1500毫米/分钟等同于100脉冲/秒PLC常用函数浅析一实例:X轴回零的处理(正点动X35.4,回零挡块X1.0)#defineFinding_Axis_ZeroR[7]if(*axis_stat(0)&AX_HOME_LAMP)//回零完成clr_bit(Finding_Axis_Zero,0);elseif(bit(X[35],4))set_axis_home(0,1);//回零开始if(get_bit(X[1],0))//遇到回零开关{*axis_ctrl(0)|=AX_HOME_SW;if(*axis_stat(0)&AX_HOME_GOING)set_bit(Finding_Axis_Zero,0);}else*axis_ctrl(0)&=~AX_HOME_SW;if((*ch_ctrl(0)&CH_MODE_MSK)!=MODE_REF_RETURN)set_axis_home(0,0);PLC常用函数浅析二M(辅助)、S(主轴速度)、T(刀具)指令是PLC经常会用到的功能,它们可以让用户在G代码中自动控制机床的动作而不需要手工干预。M、S、T分别对应函数exec_M()、exec_S()、exec_T()。它们需要在初始化的时候就加载到扫描周期中。voidinit(void){set_mst_func(0,'M',exec_M);set_mst_func(0,'T',exec_T);set_mst_func(0,'S',exec_S);}PLC常用函数浅析二M代码编程实例一:吹气,假设开关Y2.3voidexec_M(intch){switch(*ch_M_code(ch)){case88://吹气开set_bit(Y[2],3);mod_M_code(ch)=-1;//M代码完成break;case89://吹气关clr_bit(Y[2],3);mod_M_code(ch)=-1;//M代码完成break;}}C语言编程实例一·触发器intget_raise(intg,intb)//取上升沿{intv=0;if(bit(X[g],b)){if(bit(R[600+g],b)==0)v=1;elseset_bit(R[600+g],b);}elseclr_bit(R[600+g],b);returnv;}#definecoolantR[100]voidplc1(void){if(get_raise(30,5)){if(coolant)coolant=0;elsecoolant=1;}if(coolant)set_bit(Y[30],5);//点亮冷却灯elseclr_bit(Y[30],5);//熄灭冷却灯}C语言编程实例一·触发器intget_fall(intg,intb)//取下降沿{intv=0;if(bit(X[g],b)==0){if(bit(R[600+g],b))v=1;elseclr_bit(R[600+g],b);}elseset_bit(R[600+g],b);returnv;}C语言编程实例二·定时器#definetcntR_i[300/2]#defineTMR[302]voidplc1(void){TM=0;if(bit(X[1],0))//压力报警{if(tcnt2000/8)tcnt++;elseTM=1;}elsetcnt=0;if(TM==1)报警…}当检测到压力报警,延时2S后输出报警,假设压力报警点1.0C语言编程实例三·M代码Switch语句
本文标题:PLC编程-C语言
链接地址:https://www.777doc.com/doc-2341263 .html