您现在正在浏览:首页 > 职教文章 > 职教论文 > 如何用C语言编写华中数控系统PLC程序

如何用C语言编写华中数控系统PLC程序

日期: 2010/6/23 浏览: 737 来源: 学海网收集整理 作者: 佚名

如何用C语言编写华中数控系统PLC程序

一、铣床内置式PLC的结构

华中数控铣削数控系统的PLC为内置式PLC,其逻辑结构如图1所示。

图1 华中数控系统内置式PLC的逻辑结构

其中:

X寄存器为机床输出到PLC的开关信号,最大可有128组(或称字节,下同);

Y寄存器为PLC输出到机床的开关信号,最大可有128组;

R寄存器为PLC内部中间寄存器,共有768组;

G寄存器为PLC输出到计算机数控系统的开关信号,最大可有256组;

F寄存器为计算机数控系统输出到PLC的开关信号,最大可有256组;

P寄存器为PLC外部参数,可由机床用户设置(请运行参数子菜单中的PMC用户参数命令),共有100组;

B寄存器为断电保护信息,共有100组。

X、Y寄存器会随不同的数控机床而有所不同,主要和实际的机床输入/输出开关信号(如限位开关、控制面板开关)有关。但X、Y寄存器一旦定义好,软件就不能更改其寄存器各位的定义;如果要更改,必须更改相应的硬件接口或接线端子。

R寄存器是PLC内部的中间寄存器,可由PLC软件任意使用。

G、F寄存器由数控系统与PLC事先约定好的,PLC硬件和软件都不能更改其寄存器各位(bit)的定义。

P寄存器可由PLC程序与机床用户任意定义。

二、铣床内置式PLC的软件结构及其运行原理

和一般C语言程序都必须提供main()函数一样,用户编写内置式PLC的C语言程序必须提供如下系统函数定义及系统变量值:

extern void init(void); //初始化PLC

extern unsigned plc1_time; //函数plc1()的运行周期,单位:毫秒

extern void plc1(void); //PLC程序入口1

extern unsigned plc2_time; //函数plc2()的运行周期,单位:毫秒

extern void plc2(void); //PLC程序入口2

其中,

函数init()是用户PLC程序的初始化函数,系统将只在初始化时调用该函数一次。该函数一般设置系统MSBT功能的响应函数及系统复位的初始化工作;

变量plc1_time及plc2_time的值分别表示plc1()、plc2()函数被系统周期调用的周期时间,单位:毫秒。系统推荐值分别为16毫秒及32毫秒,即plc1_time=16, plc2_time=32;

函数plc1()及plc2()分别表示数控系统调用PLC程序的入口,其调用周期分别由变量plc1_time及plc2_time指定。

系统初始化PLC时,将调用PLC提供的init()函数(该函数只被调用一次)。在系统初始化完成后,数控系统将周期性地运行如下过程:

从硬件端口及数控系统成批读入所有X、F、P寄存器的内容;

如果plc1_time所指定的周期时间已到,调用函数plc1();

如果plc2_time所指定的周期时间已到,调用函数plc2();

系统成批输出G、Y、B寄存器。

因此,用户提供的plc1()函数及plc2()函数必须根据X及F寄存器的内容正确计算出G及Y寄存器的值。

三、PLC程序的编写及其编译

最简单的PLC程序只要包含系统必须的几个函数和变量定义即可编译运行(当然它什么事也不能做)。假设我们建立一个文本文件并命名为plc_null.cld,其文件内容为:

//plc_null.cld:

// PLC程序空框架,保证可以编译运行,但什么功能也不提供

//

// 版权所有?2000,武汉华中数控系统有限公司,保留所有权利。

// http://huazhongcnc.com email: market@huazhongcnc.com

// tel: +86-27-87545256,87542713 fax: +86-27-87545256,87542713

// 最后更改日期: 2000.10.31

// 作者:阳道善email: yang@HuazhongCNC.com

//

#include "plc.h" //PLC系统头文件

void init()//初始化PLC

{

}

void plc1(void) //PLC程序入口1

{

plc1_time=16;

}

void plc2(void); //PLC程序入口2

{

plc2_time=32;

}

如果您安装了MSDOS6.22及Borland C++3.1软件,在铣床数控系统的PLC目录下,输入如下命令:

C:\hcnc2000\plc>makeplc plc_null

系统会响应:

1 file(s) copied

MAKE Version 3.6 Copyright (c) 1992 Borland International

Available memory 64299008 bytes

bcc +plc.CFG -S plc.cld

Borland C++ Version 3.1 Copyright (c) 1992 Borland International

plc.cld:

Available memory 4199568

TASM /MX /O plc.ASM,plc.OBJ

Turbo Assembler Version 3.1 Copyright (c) 1988, 1992 Borland International

Assembling file: plc.ASM

Error messages: None

Warning messages: None

Passes: 1

Remaining memory: 421k

tlink /t/v/m/c/Lc:\BC31\LIB @MAKE0000.$$$

Turbo Link Version 5.1 Copyright (c) 1992 Borland International

Warning: Debug info switch ignored for COM files

1 file(s) copied

并且又回到DOS提示符下:

C:\hcnc2000\plc>

这时表示我们的第一个PLC程序编译成功。编译结果为文件plc_null.com。然后,我们可以更改我们的铣床软件系统配置文件NCBIOS.CFG,并加上如下一行文本让系统启动时加载我们新近编写的PLC程序:

device=c:\hcnc2000\plc\plc_null.com

以上就是在华中数控系统平台上编写并编译C语言PLC程序的全过程,非常简单。

下面,让我们多做一点工作。假设我们在用户按下操作面板的“循环起动”键时,点亮“+X点动”灯。(让我们再一次假定“循环起动”键的输入点为X0.0,“+X点动”灯的输出点位置为Y0.7。)

更改plc_null.cld文件的plc1()函数如下:

void plc1(void) //PLC程序入口1

{

plc1_time=16;

if ( X[0] & 0x01 )

Y[0] |= 0x80;

else

Y[0] &= ~0x80;

}

重新输入命令makeplc plc_null,并将编译所得的文件plc_null.com放入NCBIOS.CFG所指定的位置,重新起动铣床数控系统后,当我们按下“循环起动”键时,“+X点动”灯应该被点亮。

更复杂的PLC程序,可参考您所在数控系统PLC目录下的*.CLD文件,其中应该有一个是您数控系统的PLC源程序(前提是您已定购数控系统的PLC源程序)。

四、铣床内置式PLC的F、G、B寄存器的约定操作及接口函数说明

前面已讲过,PLC的G及F寄存器是数控系统与PLC约定好的,用户不可随便更改其寄存器各位(bit)的含义。为方便用户编程及记忆,系统提供如下宏及函数供用户使用。(建议用户仔细阅读最后一节提供的系统函数C程序实现源代码,学会如何使用系统提供的宏及函数。)

1. 对于各寄存器的访问,系统提供如下变量供用户灵活使用

//以下外部变量声明都指向同一块内存,即PLC中间寄存器R,共有768个字节

extern unsigned char R_uc[]; //以无符号字符型存取R寄存器

extern char R_c[]; //以字符型存取R寄存器

extern unsigned R_ui[]; //以无符号整型存取R寄存器

extern int R_i[]; //以整型存取R寄存器

extern unsigned long R_ul[]; //以无符号长整型存取R寄存器

extern long R_l[]; //以长整型存取R寄存器

extern unsigned char R[]; //以无符号字符型存取R寄存器

//同理,和R寄存器一样,系统提供如下变量定义供用户灵活使用,其中:

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

// _c代表以字符型存取PLC寄存器 _ui代表以无符号整型存取PLC寄存器

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

//_l代表以长整型存取PLC寄存器

extern unsigned char X_uc[], Y_uc[], *F_uc[], *G_uc[], P_uc[], B_uc[];

extern char X_c[], Y_c[], *F_c[], *G_c[], P_c[], B_c[];

extern unsigned X_ui[], Y_ui[], *F_ui[], *G_ui[], P_ui[], B_ui[];

extern int X_i[], Y_i[], *F_i[], *G_i[], P_i[], B_i[];

extern unsigned long X_ul[], Y_ul[], *F_ul[], *G_ul[], P_ul[], B_ul[];

extern long X_l[], Y_l[], *F_l[], *G_l[], P_l[], B_l[];

extern unsigned char X[], Y[];

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

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

2.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 0x0020 //轴已精确定位停止

#define AX_HOME_GOING 0x0040 //轴正在回零

#define AX_MOVING_LAMP 0x0080 //轴正在移动

#define AX_UNLINK_LAMP 0x0100 //轴非连接状态指示

#define AX_FAIL_LAMP 0x0200 //失败指示灯

#define AX_ALARM 0x0400 //警报

#define AX_COORD_SETUP 0x0800 //轴已回零,坐标系已建立

#define AX_SV_ENBL 0x1000 //轴伺服使能允许

#define AX_READY 0x2000 //轴就绪

#define AX_ONLINE 0x4000 //轴联机

#define AX_EXIST 0x8000 //轴存在

例:

unsigned int u1=*axis_stat(i);//轴状态

if ((u1&AX_EXIST) ==0) // 轴不存在

{

……

}

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

#define axis_pout(x) (F_l[(x)*10+1]) //轴的输出位置

其中宏参数x表示轴号,其值可为0,1,2,……15,即系统最大可有16个轴。例,取某轴当前位置的函数可用C语言表述如下:

long get_axis_pos(int axis)

{

long l;

asm cli

l=*axis_pout(axis)+(*axis_pic_a(axis));

asm sti

return l;

}

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

#define axis_pact(x) (F_l[(x)*10+3]) //轴的实际位置

其中宏参数x表示轴号,其值可为0,1,2,……15,即系统最大可有16个轴。

2.4 轴当前移动速度,单位:脉冲当量/插补周期

#define axis_speed(x) (F_i[(x)*10+5]) //轴移动速度

其中宏参数x表示轴号,其值可为0,1,2,……15,即系统最大可有16个轴。

2.5 轴的负载电流,只对华中11型伺服有效,请参见"HCNC2000常见问题解答"

#define axis_current(x) (F_i[(x)*10+6]) //轴的负载电流

其中宏参数x表示轴号,其值可为0,1,2,……15,即系统最大可有16个轴。

2.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

}

2.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;

2.8 通道状态

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

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

#define CH_NORMAL_CUTTING 0x0001 //正在加工,非G00指令

#define CH_THREAD_CUTTING 0x0002 //正在螺纹加工

#define CH_DEN 0x0004 //通道已停止运动

#define CH_FEEDHOLD_LAMP 0x0010 //进给保持指示灯

#define CH_CYCLE_LAMP 0x0020 //循环启动指示灯

#define CH_VERIFY_LAMP 0x0040 //通道校验运行

#define CH_CUT_USE_OUT 0x0080 //通道刀具寿命已到

#define CH_FAIL_LAMP 0x2000 //通道失败

#define CH_ALARM_LAMP 0x4000 //通道报警

#define CH_RESET_LAMP 0x8000 //通道正在复位

2.9 通道MSTB指令状态

#define ch_mst_stb(x) (F_ui[(x)*20+163]) //通道MST指令请求

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

#define CH_M_STB 0x0100 //M指令

#define CH_S_STB 0x0200 //S指令

#define CH_T_STB 0x0400 //T指令

#define CH_B_STB 0x0800 //B指令

#define CH_MSTHOLD_CMD 0x2000 //数控系统请求停止MST

#define CH_MST_CANCEL 0x8000 //数控系统请求取消MST

2.10 通道当前的M代码

#define ch_M_code(x) (F_i[(x)*20+164]) //M代码

其中宏参数x表示通道号,其值可为0,1,2,3,即系统最大可有4个通道。

2.11 通道当前的T代码

#define ch_T_code(x) (F_i[(x)*20+165]) //T代码

其中宏参数x表示通道号,其值可为0,1,2,3,即系统最大可有4个通道。

2.12 通道当前的B代码

#define ch_B_code(x) (F_i[(x)*20+166]) //B代码

其中宏参数x表示通道号,其值可为0,1,2,3,即系统最大可有4个通道。

2.13 通道当前的S代码

#define ch_S_code(x) (F_i[(x)*20+167]) //S代码

其中宏参数x表示通道号,其值可为0,1,2,3,即系统最大可有4个通道。

2.14 通道变量,通道内部参数

#define ch_var(x,n) (F_ui[(x)*20+170+(n)]) //通道变量

2.15 系统状态字

#define sys_stat() (F_ui[250]) //系统状态

系统状态字各位的定义如下:

#define SYS_BBUF_LOSS 0x0001 //系统断电保护区丢失

#define SYS_ACTIVE_LAMP 0x0080 //系统已启动(软件安装完成)

#define SYS_PARM_ERROR 0x1000 //系统参数错

#define SYS_FAIL_LAMP 0x2000 //系统故障

#define SYS_ALARM_LAMP 0x4000 //系统报警

#define SYS_RESET_LAMP 0x8000 //系统复位

2.16 系统插补周期,单位:毫秒

#define sys_iip_time() (F_ui[251]) //

2.17 系统移动轴内部脉冲当量

#define sys_pm1um() (F_ui[252]) //

2.18 系统旋转轴内部脉冲当量

#define sys_pr1md() (F_ui[253]) //

2.19 系统变量组1(系统保留)

#define sys_var1(n) (F_ui[240+(n)]) //系统变量组

3. 对于G寄存器,系统提供如下宏定义,供用户使用:

3.1 轴控制字

#define axis_ctrl(x) (G_ui[(x)*10]) //轴控制

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

#define AX_LSP 0x0001 //设置轴正极限到,并急停

#define AX_LSN 0x0002 /设置/轴负极限到,并急停

#define AX_HOME_SW 0x0004 //轴参考点开关已到

#define AX_PHASE_Z 0x0010 //零相脉冲信号

#define AX_DISABLE_P 0x0020 //正极限到,但不急停

#define AX_HMODE_SW 0x0040 //设置轴自动回零

#define AX_DISABLE_N 0x0080 //负极限到,但不急停

#define AX_UNLINK 0x0100 //设置轴不连接

#define AX_LOCK 0x0200 //轴锁定

#define AX_SVFAIL_IN 0x0400 //外部伺服故障

#define AX_NC_OFF 0x0800 //关NC轴

#define AX_UNCLAMP 0x2000 //设置轴松开,然后可人工转动电机

#define AX_ESTOP 0x4000 //设置轴外部急停

#define AX_RESET 0x8000 //设置轴外部复位

3.2 设置轴移动增量值,单位:内部脉冲当量

#define axis_pic_a(x) (G_l[(x)*10+1]) //轴移动位移

其中宏参数x表示轴号,其值可为0,1,2,……15,即系统最大可有16个轴。

3.3 设置轴增量移动速度,单位:内部脉冲当量/插补周期

#define axis_pic_v(x) (G_i[(x)*10+3]) //轴移动速度

其中宏参数x表示轴号,其值可为0,1,2,……15,即系统最大可有16个轴。

3.4 轴点动速度,单位:内部脉冲当量/插补周期

#define axis_pvcmd(x) (G_i[(x)*10+4]) //

其中宏参数x表示轴号,其值可为0,1,2,……15,即系统最大可有16个轴。

3.5 设置轴补偿值

#define axis_pecmd(x) (G_i[(x)*10+5]) //

其中宏参数x表示轴号,其值可为0,1,2,……15,即系统最大可有16个轴。利用本宏可在PLC中设置相应轴当前的间隙补偿值或螺距补偿值,系统会根据PLC的输入对当前轴进行补偿。

3.6 通道用户自定义输入

#define ch_user_in(x) (G_ul[(x)*20+160]) //通道用户输入屏蔽

其中宏参数x表示轴号,其值可为0,1,2,……15,即系统最大可有16个轴。该宏同上一节2.7所介绍的宏ch_user_out(x)相对应,请参阅。

3.7 通道控制字

#define ch_ctrl(x) (G_ui[(x)*20+162]) //通道控制

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

#define CH_MODE_MSK 0x0007 //通道模式屏蔽位

#define MODE_AUTO 1 //自动模式

#define MODE_JOG 2 //点动模式

#define MODE_STEP 3 //步进模式

#define MODE_HANDWHEEL 4 //手摇模式

#define MODE_REF_RETURN 5 //回零模式

#define CH_SGL_BLK 0x0008 //单段方式

#define CH_FEEDHOLD_SW 0x0010 //进给保持

#define CH_CYCLE_SW 0x0020 //循环启动

#define CH_DRY_RUN 0x0040 //空运行

#define CH_ESC_SW 0x0080 //用户面板要求当前段运行取消

#define CH_FLUSH 0x0100 //通道超前插补数据清除

#define CH_FSTOP 0x0200 //通道已精确定位停止

#define CH_PROC_CANCEL 0x0400 //程序运行结束

#define CH_ESTOP 0x4000 //通道急停

#define CH_RESET 0x8000 //通道复位

3.8 通道MST应答

#define ch_mst_ack(x) (G_ui[(x)*20+163]) //通道对MST指令的响应

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

#define CH_M_ACK 0x0001 //PLC已完成M指令

#define CH_S_ACK 0x0002 //PLC已完成S指令

#define CH_T_ACK 0x0004 //PLC已完成T指令

#define CH_B_ACK 0x0008 //PLC已完成B指令

#define CH_MST_BUSY 0x0010 //通道正在执行MST指令

#define CH_MSTHOLD_LAMP 0x0020 //MST用户锁定

3.9 通道进给速度修调分子(分母为100)

#define ch_feedover(x) (G_ui[(x)*20+164]) //

其中宏参数x表示通道号,其值可为0,1,2,3,即系统最大可有4个通道。

3.10 通道快移速度修调分子(分母为100)

#define ch_rapidover(x) (G_ui[(x)*20+165]) //

其中宏参数x表示通道号,其值可为0,1,2,3,即系统最大可有4个通道。

3.11 通道正在使用的刀具号

#define ch_cut_inuse(x) (G_i[(x)*20+166]) //正在使用的刀具号

其中宏参数x表示通道号,其值可为0,1,2,3,即系统最大可有4个通道。

3.12 通道主轴转速

#define ch_spdl_speed(x) (G_i[(x)*20+167]) //主轴转动速度

其中宏参数x表示通道号,其值可为0,1,2,3,即系统最大可有4个通道。

3.13 通道跳选段控制及其实现说明

#define ch_skip_sw(x) (G_ui[(x)*20+168]) //代码执行时的跳转

其中宏参数x表示通道号,其值可为0,1,2,3,即系统最大可有4个通道。

跳选段的具体实现如下:

数控程序方面

在G代码程序中需要加工时选择运行的G代码行的开头加入‘/’或‘//’,紧跟其后必须有一个数字‘1’-‘9’。这个数字表示跳选段开关的位置,即跳选段波段开关在哪一档时,应该跳过该段程序行。

例,设在数控程序中有如下行:

//7 N0100X100Y100

则跳选段开关处在波段7时,数控系统将跳过这一段程序。

控制面板方面

控制面板上必须有一个跳选段波段开关或其它类型的开关,并标明跳选段的类型(如禁止跳选段、跳1类段、跳2类段、---跳9类段等)。

PLC程序方面

PLC程序中,必须检测跳选段波段开关的状态。如果禁止跳选段功能,则置如下PLC变量值为0:

ch_skip_sw(0)=0;

其中,宏ch_skip_sw(int)的参数为通道号。

如果跳选段功能为“跳1类段”,则置上述变量为:

ch_skip_sw(0)=0x0001;

如果跳选段功能为“跳2类段”,则置上述变量为:

ch_skip_sw(0)=0x0002;

如果跳选段功能为“跳3类段”,则置上述变量为:

ch_skip_sw(0)=0x0004;

-------

如果跳选段功能为“跳9类段”,则置上述变量为:

ch_skip_sw(0)=0x0100;

3.14 通道MST指令模态值

#define ch_mst_mod(x,n) (G_i[(x)*20+170+(n)]) //通道MST模式

其中宏参数x表示通道号,其值可为0,1,2,3,即系统最大可有4个通道;参数n表示状态字节偏移量,具体定义如下:

3.14.1 通道当前的M代码模态值

#define mod_M_code(ch) (*ch_mst_mod(ch,0))//M代码模式

其中宏参数ch表示通道号,其值可为0,1,2,3,即系统最大可有4个通道。

3.14.2 通道当前的S代码模态值

#define mod_S_code(ch) (*ch_mst_mod(ch,1)) //S代码模式

其中宏参数ch表示通道号,其值可为0,1,2,3,即系统最大可有4个通道。

3.14.3 通道当前的T代码模态值

#define mod_T_code(ch) (*ch_mst_mod(ch,2)) //T代码模式

其中宏参数ch表示通道号,其值可为0,1,2,3,即系统最大可有4个通道。

3.14.4 通道当前的B代码模态值

#define mod_B_code(ch) (*ch_mst_mod(ch,3))//B代码模式

其中宏参数ch表示通道号,其值可为0,1,2,3,即系统最大可有4个通道。

3.14.5 通道是否正在执行MST指令

#define mod_mst_busy(ch) (*ch_mst_mod(ch,4))

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

#define CH_M_BUSY 0x0001 //M指令忙,不能再接受M指令

#define CH_S_BUSY 0x0002 //S指令忙,不能再接受S指令

#define CH_T_BUSY 0x0004 //T指令忙,不能再接受T指令

#define CH_B_BUSY 0x0008 //B指令忙,不能再接受B指令

3.14.6 PLC不允许停止MST指令

#define msthold_dis(ch) (*ch_mst_mod(ch,4)) //

其中宏参数ch表示通道号,其值可为0,1,2,3,即系统最大可有4个通道。本宏表示PLC不能按数控系统要求立即停止正在执行的MST指令。其中各位含义如下:

#define CH_M_HDIS 0x0100 //PLC不能停止M指令

#define CH_S_HDIS 0x0200 // PLC不能停止S指令

#define CH_T_HDIS 0x0400 // PLC不能停止T指令

#define CH_B_HDIS 0x0800 // PLC不能停止B指令

3.14.7 通道程序停止M00/程序选择停止M01

#define mod_m00_m01(ch) (*ch_mst_mod(ch,4)) //

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

#define CH_M00 0x1000 //M00指令

#define CH_M01 0x2000 //M01指令

注:华中数控系统M指令中,由于M00及M01为非模态码,它们要求PLC对其进行特殊处理。系统要求在函数plc1()中对“循环起动”按键进行处理之前,对M00及M01进行处理,如:

……

//cycle start sw循环启动处理

if(mod_m00_m01(0)&(CH_M00|CH_M01))//M01及M00指令处理

{

*ch_ctrl(0)|=CH_FEEDHOLD_SW;//进给保持

*ch_ctrl(0)&=~CH_CYCLE_SW;//关闭循环启动

mod_m00_m01(0)&=~(CH_M00|CH_M01);//清M00及M01代码

}

else//程序不停止

{

u1=X[2]&R[12]&R[22]&3; //假设“循环启动”输入位为X2.0

u2=(X[2]|R[12]|R[22])&3; //假设“进给保持”输入位为X2.1

if(u1==3)//循环启动或进给保持

{

……

}

}

……

3.15 系统控制字

#define sys_ctrl() (G_ui[250]) //系统控制

其控制字各位定义如下:

#define SYS_SAVE_BBUF 0x0001 //保存断电缓冲

#define SYS_SAVE_CUTTER 0x0002 //保存刀具状态

#define SYS_SAVE_COORD 0x0004 //保存坐标

#define SYS_SAVE_POS 0x0008 //保存位置

#define SYS_SAVE_ERROR 0x0010 //保存错误

#define SYS_LOAD_PARM 0x1000 //装载参数

#define SYS_ESTOP 0x4000 //系统停止

#define SYS_RESET 0x8000 //系统复位

3.16 系统外部报警

#define sys_ext_alm() (G_ui[251]) //系统外部警报种类

PLC最多可定义15种外部报警信息。报警信息可在参数中设置。这样PLC程序也可以向系统及用户报警。

3.17 系统变量组2(系统保留)

#define sys_var2(n) (G_ui[240+(n)]) //系统变量组2(n)

4. 对于B寄存器,系统提供如下宏定义,供用户使用:

4.1 刀座数

#define tot_mag_pos() (B_ui)

4.1 某一刀座中的刀号(刀库表)

#define cutter_in_mag(x) (B_i+1+(x))

5. 数控系统为PLC程序接供的操作函数有:

5.1 设置轴回零

void set_axis_home( int axis, //所指定的轴号:0-15

int start_stop); //为0:取消回零 非0:回零

注:实际上,本节提供的函数都非常简单,用户也可以根据前面几节的介绍自己编写,如本函数就可以用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

}

5.2 设置轴点动速度

void set_axis_jog( int axis, //所指定的轴号:0-15

int speed); //点动速度,单位:内部脉冲/插补周期

本函数可以用C语言表达如下:

void set_axis_jog(int axis,int speed)

{

*axis_pvcmd(axis)=speed;

}

5.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;

if(v<2)

v=2;

*axis_pic_a(axis)=l;

*axis_pic_v(axis)=v;

asm sti

}

5.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;


如何用C语言编写华中数控系统PLC程序.doc

返回顶部