华中数控PLC编程说明书
注:实际上,本节提供的函数都非常简单,用户也可以根据前面几节的介绍自己编写,如本函数就可以用C语言表达如下:
void set_axis_home( int axis, //轴号 int start_stop) //起动或结束回零 {
asm cli
if(start_stop) //起动轴回零 {
*axis_ctrl(axis) |= AX_HMODE_SW; }
else //停止轴回零 {
*axis_ctrl(axis) &= ~AX_HMODE_SW; }
asm sti }
3.6.2 设置轴点动速度
void set_axis_jog( int axis,
//所指定的轴号:0-15
int speed); //点动速度,单位:内部脉冲/插补周期 本函数可以用C语言表达如下: void set_axis_jog(int axis,int speed) {
*axis_pvcmd(axis)=speed; }
3.6.3 设置轴步进指定距离
void set_axis_step( int axis, //所指定的轴号:0-15 long displacement); //步进增量,单位:内部脉冲当量 本函数可以用C语言表达如下:
void set_axis_step(int axis,long displacement) {
long l,l1,v,v1;
if(displacement==0)
return;
asm cli
l=*axis_pic_a(axis)+displacement; l1=abs(l);
v=l1/200*(*sys_iip_time()); //速度计算。单位:内部脉冲当量/插补周期 v1=*axis_vmax(axis);
if(v>v1) // 速度限制控制
v=v1;
25
华中数控PLC编程说明书
if(v<2)
v=2;
*axis_pic_a(axis)=l; *axis_pic_v(axis)=v; asm sti }
3.6.4 设置轴移动距离及速率
void set_axis_move( int axis,
//所指定的轴号:0-15
long displacement, //移动距离增量
int speed); //移动速率,单位:内部脉冲/插补周期
本函数可以用C语言表达如下:
void set_axis_move(int axis,long displacement,int speed) {
long l1,l2; int v1,v2;
if(displacement==0)
return;
asm cli
l1=abs(*axis_pic_a(axis)); v1=abs(*axis_pic_v(axis)); l2=abs(displacement); v2=abs(speed);
*axis_pic_v(axis)=(long) (l1*v1+l2*v2)/(l1+l2); *axis_pic_a(axis)+=displacement; asm sti }
3.6.5 设置轴移动的目的地及速率
void set_axis_moveto(int axis, long position,
//所指定的轴号:0-15
//移动的目的地
int speed); //移动速率,单位:内部脉冲/插补周期 本函数可以用C语言表达如下:
void set_axis_moveto(int axis,long position,int speed) {
set_axis_move(axis,position-get_axis_pos(axis),speed); }
3.6.6 设置指定轴停止运动
void set_axis_stop(int axis); //所指定的轴号:0-15 本函数可以用C语言表达如下:
void set_axis_stop(int axis) {
long l,l1,v; asm cli
l=*axis_pic_a(axis);
26
华中数控PLC编程说明书
v=*axis_pic_v(axis);
l1=v*(*sys_iip_time())/200; if(l>0) {
if(l>l1) l=l1; } else
if(-l>l1) l=-l; *axis_pic_a(axis)=l; asm sti
set_axis_jog(axis,0); set_axis_home(axis,0); }
3.6.7 取指定轴当前位置
long get_axis_pos(int axis); //所指定的轴号:0-15 本函数可以用C语言表达如下:
long get_axis_pos(int axis) {
long l;
asm cli
l=*axis_pout(axis)+(*axis_pic_a(axis)); asm sti return l; }
3.6.8 指定轴当是否停止
int get_axis_den(int axis); //所指定的轴号:0-15。 返回1:已停,0:没有停
本函数可以用C语言表达如下:
int get_axis_den(int axis) {
return (*axis_pic_a(axis)!=0||*axis_pvcmd(axis)!=0)? 0:1; }
3.6.9 设置轴手摇移动
void handwheel( int h_no, //手摇号 int axis, //轴号 int step_mul); //步进倍率 3.6.10 取手摇状态对应的位移量
int get_handwheel(int handwheel);
//手摇号
27
华中数控PLC编程说明书
3.6.11 设置MST指令的响应函数
void set_mst_func( int ch, //通道 char name, //代码类型:M、S、T void (*mst_func)(int)); //响应函数入口地址
第四章 编写PLC程序的常用技巧与示例
本章将通过两个常用的PLC编程技巧与示例来加快您掌握如何用C语言编写华中数控PLC程序的进度与质量。首先,我们复习一下C语言中有关操作运算符的知识。
4.1 常用运算操作符
对于基本的&(与)、~(非)、|(或)、^(异或)、/ (求整除之商)、%(求整除之余)操作符,这里就不赘述。如果您学习过C语言,可以跳过本小节。 4.1.1 置1操作符 |= 和 置0操作符 &= ~
一般地,在PLC中,X0.1表示的是X寄存器第0组的第一位,Y2.7表示的是Y寄存器第二组的第七位。数字以0x开头的是十六进制表示法,在这里用十六进制是为了更清楚地判断位的序数。
低位: 0x01 表示第0位
0x02 0x04 0x08
高位: 0x10
0x20 0x40 0x80
表示第1位 表示第2位 表示第3位 表示第4位 表示第5位 表示第6位 表示第7位
由此可见:
Y[2] | = 0x80; 是将Y2寄存器第七位的值置1 Y[2] &= ~0x80; 是将Y2寄存器第七位的值置0
因此完全可以把“|=”当作置1操作符,而把“&= ~”当作置0操作符。
28