华中数控世纪星PLC编程说明书 下载本文

华中数控PLC编程说明书

的含义。为方便用户编程及记忆,系统提供如下大量宏及函数供用户使用。本章将详细给出这些宏及函数的接口说明。建议您阅读本书提供的PLC例子程序时,再至本章查阅相关函数细节。

3.1 访问PLC寄存器的系统变量

第一章已经说明,以下地址指针变量都指向同一块内存,即PLC中间寄存器R,共有768个字节:

extern unsigned char extern char extern unsigned extern int extern unsigned long extern long extern unsigned char

R_uc[]; R_c[]; R_ui[]; R_i[]; R_ul[]; R_l[]; R[];

//以无符号字符型存取R寄存器 //以字符型存取R寄存器 //以无符号整型存取R寄存器 //以整型存取R寄存器

//以无符号长整型存取R寄存器 //以长整型存取R寄存器

//以无符号字符型存取R寄存器

同理,和R寄存器一样,系统提供如下变量定义供用户灵活使用,其中: 1) 2) 3) 4) 5) 6)

_uc表示以无符号字符型存取PLC寄存器 _c代表以字符型存取PLC寄存器

_ui代表以无符号整型存取PLC寄存器 _i代表以整型存取PLC寄存器

_ul代表以无符号长整型存取PLC寄存器 _l代表以长整型存取PLC寄存器

X_uc[], Y_uc[], *F_uc[], *G_uc[], P_uc[], B_uc[]; X_c[], Y_c[], *F_c[], *G_c[], P_c[], B_c[]; X_ui[], Y_ui[], *F_ui[], *G_ui[], P_ui[], B_ui[]; X_i[], Y_i[], *F_i[], *G_i[], P_i[], B_i[]; X_ul[], Y_ul[], *F_ul[], *G_ul[], P_ul[], B_ul[]; X_l[], Y_l[], *F_l[], *G_l[], P_l[], B_l[]; X[], Y[];

*F[], *G[], P[], B[];

extern unsigned char extern char extern unsigned extern int extern unsigned long extern long extern unsigned char extern unsigned

对于输入信号寄存器X,为了方便高低速扫描进程进行滤波处理及上升/下降沿信号的捕捉,系统复制了所有X[0…N]信号到X[100…(100+N)],其中N为系统PLC输入信号组数。一般约定高速扫描进程plc1()函数使用X[0…N],而低速扫描进程plc2()函数则使用X[100…(100+N)]。

关于输入信号滤波、上升/下降沿信号的捕捉,可参阅第四章“编写PLC程序的常用技巧与示例”。

13

华中数控PLC编程说明书

3.2 寄存器F系统约定

对于F寄存器(请注意F、G均为地址指针),系统提供如下宏定义,供用户使用: 3.3.1 轴状态字

#define axis_stat(x) (F_ui[(x)*10])

//轴状态字,共16位(bit)

其中宏参数x表示轴号,其值可为0,1,2,……15,即系统最大可有16个轴。其中各位的含义定义如下:

#define AX_SLSP 0x0001 //轴正极限到 #define AX_SLSN 0x0002 //轴负极限到 #define AX_HOME_LAMP 0x0004 //轴正在回零 #define AX_CMP_LAMP 0x0008 //轴正在进行间隙或螺距补偿 #define AX_HOME_FIN 0x0010 //回零结束

#define AX_FSTOP_LAMP #define AX_HOME_GOING #define AX_MOVING_LAMP #define AX_UNLINK_LAMP #define AX_FAIL_LAMP #define AX_ALARM #define AX_COORD_SETUP #define AX_SV_ENBL #define AX_READY #define AX_ONLINE #define AX_EXIST 例:

0x0020 //轴已精确定位停止 0x0040 //轴正在回零 0x0080 //轴正在移动

0x0100 //轴非连接状态指示 0x0200 //失败指示灯 0x0400 //警报

0x0800 //轴已回零,坐标系已建立 0x1000 //轴伺服使能允许 0x2000 //轴就绪 0x4000 //轴联机 0x8000 //轴存在

unsigned int u1=*axis_stat(i);//轴状态 if ((u1&AX_EXIST) ==0) // 轴不存在 { …… }

3.3.2 轴移动的指令位置,单位:内部脉冲当量

#define axis_pout(x) (F_l[(x)*10+1]) //轴的输出位置 其中宏参数x表示轴号,其值可为0,1,2,……15,即系统最大可有16个轴。

14

华中数控PLC编程说明书

例,取某轴当前位置的函数可用C语言表述如下:

long get_axis_pos(int axis) { long l; asm cli l=*axis_pout(axis)+(*axis_pic_a(axis)); asm sti return l; }

3.3.3 轴当前的实际位置,单位:内部脉冲当量

#define axis_pact(x) (F_l[(x)*10+3]) //轴的实际位置 其中宏参数x表示轴号,其值可为0,1,2,……15,即系统最大可有16个轴。 3.3.4 轴当前移动速度(单位:脉冲当量/插补周期)

#define axis_speed(x) (F_i[(x)*10+5]) //轴移动速度 其中宏参数x表示轴号,其值可为0,1,2,……15,即系统最大可有16个轴。 3.3.5 轴的负载电流(只对本公司生产的华中11型伺服有效)

#define axis_current(x) (F_i[(x)*10+6]) //轴的负载电流 其中宏参数x表示轴号,其值可为0,1,2,……15,即系统最大可有16个轴。 3.3.6 轴的最大速度(可在参数中设置)

#define axis_vmax(x) (F_i[(x)*10+7]) //轴的最大速度 其中宏参数x表示轴号,其值可为0,1,2,……15,即系统最大可有16个轴。例,设置某一个轴步进的函数可用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; if(v<2) v=2;

*axis_pic_a(axis)=l; *axis_pic_v(axis)=v; asm sti

15

华中数控PLC编程说明书

}

3.3.7 通道用户自定义输出字(32位)

#define ch_user_out(x) (F_ul[(x)*20+160]) //通道用户自定义输出字 其中宏参数x表示通道号,其值可为0,1,2,3,即系统最大可有4个通道。 用户在G代码程序中,可定义自已特有的PLC输出点。其应用可举例如下:

设数控机床在生产流水线上运行,我们希望数控机床加工完一道工序后(我们假定在系统的1通道),输出某一个寄存器信号(在PLC中,设该寄存器为Y7.0)通知生产线这台数控机床已完成某工序,这时,我们可以在G代码的最后加上这样一行(请参见华中数控铣削系统数控编程说明中的宏指令编程):

#1190=1

这样华中数控系统运行到这一行时,会设置*ch_user_out(1)的值为0x01。而在PLC中,我们可以加上这样一段C程序来控制Y7.0继电器:

unsigned long uo=*ch_user_out(1); if (uo & 0x01) Y[7] |= 0x01; else Y[7] &= ~0x01;

3.3.8 通道状态

#define ch_stat(x) (F_ui[(x)*20+162]) //通道状态

其中宏参数x表示通道号,其值可为0,1,2,3,即系统最大可有4个通道。其值各位的意义定义如下:

#define CH_NORMAL_CUTTING #define CH_THREAD_CUTTING #define CH_DEN #define CH_FEEDHOLD_LAMP #define CH_CYCLE_LAMP #define CH_VERIFY_LAMP #define CH_CUT_USE_OUT

#define CH_FAIL_LAMP #define CH_ALARM_LAMP #define CH_RESET_LAMP

16

0x0001 //正在加工,非G00指令 0x0002 //正在螺纹加工 0x0004 //通道已停止运动 0x0010 //进给保持指示灯 0x0020 //循环启动指示灯 0x0040 //通道校验运行

0x0080 //通道刀具寿命已到 0x2000 //通道失败 0x4000 //通道报警 0x8000 //通道正在复位