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

华中数控PLC编程说明书

武汉华中数控股份有限公司

二零零一年七月

华中数控PLC编程说明书

前言

华中数控内置式PLC已集成在数控装置内,具有48路输入/输出点。华中数控PLC采用C语言编程,具有灵活、高效、使用方便等特点。

本说明详细介绍了内置式PLC的基本原理、寄存器操作接口、PLC程序的编写与安装等内容,并给出了大量C语言程序示例代码。

关于PLC硬件接线请参阅《华中数控世纪星硬件联接说明书》 阅读本文之前,必须具有C语言编程的基本知识。

2

华中数控PLC编程说明书

目录

前言 ............................................................................................................................. 2 目录 ............................................................................................................................. 3 第一章 华中数控内置式PLC基本原理 ................................................................. 7

1.1 华中数控内置式PLC的结构及相关寄存器的访问 ................................. 7 1.2 华中数控内置式PLC的软件结构及其运行原理 ..................................... 8 第二章 华中数控内置式PLC的编程与安装 ......................................................... 9

2.1 华中数控PLC程序的编写及其编译 ......................................................... 9 2.2 华中数控PLC程序的安装 ....................................................................... 12 第三章 华中数控PLC寄存器定义与接口函数说明 ........................................... 12

3.1 访问PLC寄存器的系统变量 ................................................................... 13 3.2 寄存器F系统约定 .................................................................................... 14

3.3.1 轴状态字 ......................................................................................... 14 3.3.2 轴移动的指令位置,单位:内部脉冲当量 ................................. 14

3.3.3 轴当前的实际位置,单位:内部脉冲当量 ................................. 15 3.3.4 轴当前移动速度(单位:脉冲当量/插补周期)........................ 15 3.3.5 轴的负载电流(只对本公司生产的华中11型伺服有效) ....... 15 3.3.6 轴的最大速度(可在参数中设置) ............................................. 15 3.3.7 通道用户自定义输出字(32位) ..................................................... 16 3.3.8 通道状态 ......................................................................................... 16 3.3.9 通道MSTB指令状态 ..................................................................... 17 3.3.10 通道当前的M代码 ..................................................................... 17 3.3.11 通道当前的T代码 ....................................................................... 17 3.3.12 通道当前的B代码 ...................................................................... 17 3.3.13 通道当前的S代码 ....................................................................... 17

3

华中数控PLC编程说明书

3.3.14 通道变量,通道内部参数 ........................................................... 17 3.3.15 系统状态字 ................................................................................... 17 3.3.16 系统插补周期,单位:毫秒 ....................................................... 18 3.3.17 系统移动轴内部脉冲当量 ........................................................... 18 3.3.18 系统旋转轴内部脉冲当量 ........................................................... 18 3.3.19 系统变量组1(系统保留) ............................................................. 18 3.4 G寄存器系统约定 ..................................................................................... 18

3.4.1 轴控制字 ......................................................................................... 18 3.4.2 设置轴移动增量值,单位:内部脉冲当量 ................................. 19 3.4.3 设置轴增量移动速度,单位:内部脉冲当量/插补周期............ 19 3.4.4 轴点动速度,单位:内部脉冲当量/插补周期............................ 19 3.4.5 设置轴补偿值 ................................................................................. 19 3.4.6 通道用户自定义输入 ..................................................................... 19 3.4.7 通道控制字 ..................................................................................... 19 3.4.8 通道MST应答 ............................................................................... 20 3.4.9 通道进给速度修调分子(分母为100) ........................................... 20 3.4.10 通道快移速度修调分子(分母为100) ......................................... 20 3.4.11 通道正在使用的刀具号 ............................................................... 20 3.4.12 通道主轴转速 ............................................................................... 21 3.4.13 通道跳选段控制及其实现说明 ................................................... 21 3.4.14 通道MST指令模态值 ................................................................. 22

3.4.14.1 通道当前的M代码模态值 ................................................................... 22 3.4.14.2 通道当前的S代码模态值 ..................................................................... 22 3.4.14.3 通道当前的T代码模态值 .................................................................... 22 3.4.14.4 通道当前的B代码模态值 .................................................................... 22 3.4.14.5 通道是否正在执行MST指令 ............................................................... 22 3.4.14.6 PLC正在执行MST指令,不允许系统停止运行 ............................... 22 3.4.14.7 通道程序停止M00/程序选择停止M01 ............................................... 23

3.4.15 系统控制字 ................................................................................... 23 3.4.16 系统外部报警 ............................................................................... 24 3.17 系统变量组2(系统保留) ................................................................ 24 3.5 寄存器B系统约定 .................................................................................... 24

4

华中数控PLC编程说明书

3.5.1 刀座数 ............................................................................................. 24 3.5.2 某一刀座中的刀号(刀库表) .......................................................... 24 3.6 可被PLC程序调用的系统函数 ............................................................... 24

3.6.1 设置轴回零 ..................................................................................... 24 3.6.2 设置轴点动速度 ............................................................................. 25 3.6.3 设置轴步进指定距离 ..................................................................... 25 3.6.4 设置轴移动距离及速率 ................................................................. 26

3.6.5 设置轴移动的目的地及速率 ......................................................... 26 3.6.6 设置指定轴停止运动 ..................................................................... 26 3.6.7 取指定轴当前位置 ......................................................................... 27 3.6.8 指定轴当是否停止 ......................................................................... 27 3.6.9 设置轴手摇移动 ............................................................................. 27 3.6.10 取手摇状态对应的位移量 ........................................................... 27 3.6.11 设置MST指令的响应函数 ......................................................... 28

第四章 编写PLC程序的常用技巧与示例 ........................................................... 28

4.1 常用运算操作符 ........................................................................................ 28

4.1.1 置1操作符 |= 和 置0操作符 &= ~ ...................................... 28 4.1.2 左移操作符〈〈 和 位右移操作符 〉〉 ....................................... 29 4.2 软件滤波 上升沿信号及下降沿信号的捕捉 ........................................... 30 4.3 顺序动作处理与典型换刀动作的实现 .................................................... 31 第五章 PLC运动控制的实现 ................................................................................ 40

5.1 机床轴回零控制 ........................................................................................ 40 5.2 机床轴点动 ................................................................................................ 43 5.3 机床轴步进 ................................................................................................ 45 5.4 机床轴直线运动 ........................................................................................ 48

5.4.1 设置轴移动距离及速率 ................................................................. 48 5.4.2 设置轴移动的目的地及速率 ......................................................... 48 5.5 停止机床轴运动 ........................................................................................ 48 5.5 机床轴运动状态获取 ................................................................................ 48

5.5.1 取指定轴当前位置 ......................................................................... 48 5.5.2 判断指定轴是否停止 ..................................................................... 48

5

华中数控PLC编程说明书

第六章 辅助指令M、S、T、B的控制 ............................................................... 49

6.1 辅助指令响应函数及其初始化 ................................................................ 49 6.2访问辅助指令模态值 ................................................................................. 50

6.2.1 通道当前的M代码 ....................................................................... 50 6.2.2 通道当前的T代码 ........................................................................ 50 6.2.3 通道当前的B代码 ........................................................................ 50 6.2.4 通道当前的S代码 ......................................................................... 50 6.3 在PLC程序中控制系统辅助指令模态值与系统应答 ........................... 50

6.3.1 通道当前的M代码模态值 ........................................................... 50 6.3.2 通道当前的S代码模态值 ............................................................. 51 6.3.3 通道当前的T代码模态值 ............................................................ 51 6.3.4 通道当前的B代码模态值 ............................................................ 51 6.4 辅助指令控制示例 .................................................................................... 52 第七章 机床手动控制的实现 ................................................................................. 53 第八章 主轴控制 ..................................................................................................... 58 第九章 刀库控制 ..................................................................................................... 61 第十章 断电保护区的使用 ..................................................................................... 62 第十一章 三坐标数控铣PLC编写实例 ............................................................... 63

11.1 机床简介 .................................................................................................. 63 11.2 控制面板图 .............................................................................................. 64 11.3 系统PLC电气原理图 ............................................................................. 65 11.4 系统PLC源程序详解 ............................................................................. 69

6

华中数控PLC编程说明书

第一章 华中数控内置式PLC基本原理

本章介绍了内置式PLC的逻辑结构及其系统运行流程。

1.1 华中数控内置式PLC的结构及相关寄存器的访问

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

G内置式PLCX数控系统F机Y床B、PR寄存器系统函数

图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软件任意使用。

7

华中数控PLC编程说明书

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

P寄存器可由PLC程序与机床用户任意自行定义。 对于各寄存器,系统提供了相关变量供用户灵活使用。

首先,介绍访问中间继电器R的变量定义。对于PLC来说,R寄存器是一块内存区域,系统定义如下指针对其进行访问:

extern unsigned char R[];

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

注:对于C语言,数组即相当于指向相应存储区的地址指针

同时,为了方便对R寄存器内存区域进行操作,系统定义了如下类型指针(无符号字符型、字符型、无符号整型、整型、无符号长整型、长整型)对该内存区进行访问。即这些地址指针在系统初始化时被初始化为指向同一地址。

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

R_uc[];

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

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

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

同理,和R寄存器一样,系统提供如下类似数组指针变量供用户灵活操作各类寄存器:

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[];

1.2 华中数控内置式PLC的软件结构及其运行原理

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

extern void init(void); extern unsigned plc1_time; extern void plc1(void); extern unsigned plc2_time;

//初始化PLC

//函数plc1()的运行周期,单位:毫秒 //PLC程序入口1

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

8

华中数控PLC编程说明书

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

1) 函数init()是用户PLC程序的初始化函数,系统将只在初始化时调用该

函数一次。该函数一般设置系统M、S、B、T等辅助功能的响应函数及系统复位的初始化工作;

2) 变量plc1_time及plc2_time的值分别表示plc1()、plc2()函数被系统周

期调用的周期时间,单位:毫秒。系统推荐值分别为16毫秒及32毫秒,即plc1_time=16, plc2_time=32;

3) 函数plc1()及plc2()分别表示数控系统调用PLC程序的入口,其调用周

期分别由变量plc1_time及plc2_time指定。

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

1) 从硬件端口及数控系统成批读入所有X、F、P寄存器的内容; 2) 如果plc1_time所指定的周期时间已到,调用函数plc1(); 3) 如果plc2_time所指定的周期时间已到,调用函数plc2(); 4) 系统成批输出G、Y、B寄存器。

一般地,plc1_time总是小于plc2_time,即函数plc1()较plc2()调用的频率要高。因此,华中数控称函数plc1()为PLC高速扫描进程、plc2()为低速扫描进程。

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

第二章 华中数控内置式PLC的编程与安装

本章介绍PLC程序的编写、编译及运行安装过程

2.1 华中数控PLC程序的编写及其编译

华中数控 PLC程序的编译环境为:Borland C++3.1+MSDOS6.22。因此,要编写PLC程序您必须在您计算机上安装Borland C++3.1软件及MSDOS6.22或MS Windows 9X操作系统。

9

华中数控PLC编程说明书

华中数控系统约定PLC源程序后辍为“.CLD”,即“*.CLD”文件为PLC源程序。

最简单的PLC程序只要包含系统必须的几个函数和变量定义(请参见1.2节)即可编译运行,当然它什么事也不能做。

在DOS环境下,进入数控软件PLC所安装的目录,如C:\\HCNC2000\\PLC,在DOS提示符下敲入如下命令:

c:\\hcnc2000\\plc> edit plc_null.cld <回车>

建立一个文本文件并命名为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 \系统头文件

void init()//PLC初始化函数 { }

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

plc1_time=16; // 系统将在16毫秒后再次调用plc1()函数 }

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

plc2_time=32; // 系统将在32毫秒后再次调用plc1()函数 }

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

c:\\hcnc2000\\plc> makeplc plc_null.cld <回车> 系统会响应:

1 file(s) copied

MAKE Version 3.6 Copyright (c) 1992 Borland International

10

华中数控PLC编程说明书

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.1,“+X点动”灯的输出点位置为Y2.7。

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

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

plc1_time=16; // 系统将在16毫秒后再次调用plc1()函数 if ( X[0] & 0x02 ) // “循环起动键”被按下 Y[2] |= 0x80; // 点亮“+X点动”灯 else // 循环起动键没有被按下 Y[2] &= ~0x80; // 灭掉“+X点动”灯 }

11

华中数控PLC编程说明书

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

更复杂的PLC程序,可参考您所在数控系统PLC目录下的*.CLD文件,其中应该有一个是您数控系统的PLC源程序。另外,本说明书的最后一章详细讲解了步进电机三坐标铣床的PLC源程序,请参考。

2.2 华中数控PLC程序的安装

从上节,我们已经知道PLC源程序编译后,将产生一个DOS可执行.COM文件。要安装写好的PLC程序,我们必须更改华中数控系统的配置文件NCBIOS.CFG。

在DOS环境下,进入数控软件所安装的目录,如C:\\HCNC2000,在DOS提示符下敲入如下命令:

c:\\hcnc2000> edit ncbios.cfg <回车>

可编辑数控系统配置文件。一般情况下,配置文件的内容如下(具体内容因机床的不同而异,分号后面是为说明方便添加的注释):

DEVICE=C:\\HCNC2000\\bin\\sv_step.drv DEVICE=C:\\HCNC2000\\bin\\hc5904.drv PARMPATH=C:\\HCNC2000\\PARM DATAPATH=C:\\HCNC2000\\DATA PROGPATH=C:\\HCNC2000\\PROG DISKPATH=A:

BINPATH=C:\\HCNC2000\\bin

;步进电机伺服驱动 ;5904驱动程序 ;PLC程序 ;系统参数所在目录 ;系统数据所在目录 ;数控G代码程序所在目录

;软盘 ;系统BIN目录

DEVICE=C:\\HCNC2000\\plc\\plc_null.com

用粗体突出的第三行即设置好了上文编写的PLC程序plc_null.com。

第三章 华中数控PLC寄存器定义与接口函数说明

第一章说明了PLC的逻辑结构及各寄存器的含义。已经知道,PLC的G及F寄存器是数控系统与PLC约定好的,用户不可随便更改其寄存器各位(bit)

12

华中数控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 //通道正在复位

华中数控PLC编程说明书

3.3.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 3.3.10 通道当前的M代码

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

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

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

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

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

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

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

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

#define ch_var(x,n) 3.3.15 系统状态字

#define sys_stat() (F_ui[250]) //系统状态 系统状态字各位的定义如下: #define SYS_BBUF_LOSS #define SYS_ACTIVE_LAMP #define SYS_PARM_ERROR

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

0x0080 //系统已启动(软件安装完成) 0x1000 //系统参数错

17

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

华中数控PLC编程说明书

#define SYS_FAIL_LAMP #define SYS_ALARM_LAMP #define SYS_RESET_LAMP #define sys_iip_time() #define sys_pm1um() #define sys_pr1md() #define sys_var1(n)

0x2000 //系统故障 0x4000 //系统报警 0x8000 //系统复位

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

(F_ui[251]) (F_ui[252]) (F_ui[253])

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

3.3.17 系统移动轴内部脉冲当量 3.3.18 系统旋转轴内部脉冲当量 3.3.19 系统变量组1(系统保留)

3.4 G寄存器系统约定

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

#define axis_ctrl(x) (G_ui[(x)*10]) //轴控制 其中宏参数x表示轴号,其值可为0,1,2,……15,即系统最大可有16个轴。其中各位的含义定义如下:

#define AX_LSP #define AX_LSN #define AX_HOME_SW #define AX_PHASE_Z #define AX_DISABLE_P #define AX_HMODE_SW #define AX_DISABLE_N #define AX_UNLINK #define AX_LOCK #define AX_SVFAIL_IN #define AX_NC_OFF

0x0001 //设置轴正极限到,并急停 0x0002 /设置/轴负极限到,并急停 0x0004 //轴参考点开关已到 0x0010 //零相脉冲信号

0x0020 //正极限到,但不急停 0x0040 //设置轴自动回零 0x0080 //负极限到,但不急停 0x0100 //设置轴不连接 0x0200 //轴锁定

0x0400 //外部伺服故障 0x0800 //关NC轴

18

华中数控PLC编程说明书

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

0x4000 //设置轴外部急停 0x8000 //设置轴外部复位

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

#define axis_pic_a(x) (G_l[(x)*10+1]) //轴移动位移 其中宏参数x表示轴号,其值可为0,1,2,……15,即系统最大可有16个轴。 3.4.3 设置轴增量移动速度,单位:内部脉冲当量/插补周期

#define axis_pic_v(x) (G_i[(x)*10+3]) //轴移动速度 其中宏参数x表示轴号,其值可为0,1,2,……15,即系统最大可有16个轴。 3.4.4 轴点动速度,单位:内部脉冲当量/插补周期

#define axis_pvcmd(x) (G_i[(x)*10+4]) // 其中宏参数x表示轴号,其值可为0,1,2,……15,即系统最大可有16个轴。 3.4.5 设置轴补偿值

#define axis_pecmd(x) (G_i[(x)*10+5]) // 其中宏参数x表示轴号,其值可为0,1,2,……15,即系统最大可有16个轴。利用本宏可在PLC中设置相应轴当前的间隙补偿值或螺距补偿值,系统会根据PLC的输入对当前轴进行补偿。 3.4.6 通道用户自定义输入

#define ch_user_in(x) (G_ul[(x)*20+160]) //通道用户输入屏蔽 其中宏参数x表示轴号,其值可为0,1,2,……15,即系统最大可有16个轴。该宏同上一节2.7所介绍的宏ch_user_out(x)相对应,请参阅。 3.4.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 #define #define

MODE_JOG 2 MODE_STEP 3 MODE_HANDWHEEL 4

//点动模式 //步进模式 //手摇模式

19

华中数控PLC编程说明书

#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 #define CH_PROC_CANCEL #define CH_ESTOP #define CH_RESET 3.4.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.4.9 通道进给速度修调分子(分母为100)

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

其中宏参数x表示通道号,其值可为0,1,2,3,即系统最大可有4个通道。 3.4.10 通道快移速度修调分子(分母为100)

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

其中宏参数x表示通道号,其值可为0,1,2,3,即系统最大可有4个通道。 3.4.11 通道正在使用的刀具号

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

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

0x0200 //通道已精确定位停止 0x0400 //程序运行结束 0x4000 //通道急停 0x8000 //通道复位

20

华中数控PLC编程说明书

3.4.12 通道主轴转速

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

其中宏参数x表示通道号,其值可为0,1,2,3,即系统最大可有4个通道。 3.4.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;

21

华中数控PLC编程说明书

3.4.14 通道MST指令模态值

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

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

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

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

其中宏参数ch表示通道号,其值可为0,1,2,3,即系统最大可有4个通道。 3.4.14.2 通道当前的S代码模态值

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

其中宏参数ch表示通道号,其值可为0,1,2,3,即系统最大可有4个通道。 3.4.14.3 通道当前的T代码模态值

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

其中宏参数ch表示通道号,其值可为0,1,2,3,即系统最大可有4个通道。 3.4.14.4 通道当前的B代码模态值

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

其中宏参数ch表示通道号,其值可为0,1,2,3,即系统最大可有4个通道。 3.4.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.4.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 #define CH_S_HDIS #define CH_T_HDIS

0x0100 //PLC不能停止M指令 0x0200 // PLC不能停止S指令 0x0400 // PLC不能停止T指令

22

华中数控PLC编程说明书

#define CH_B_HDIS 0x0800 // PLC不能停止B指令 3.4.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.4.15 系统控制字

#define sys_ctrl() 其控制字各位定义如下: #define SYS_SAVE_BBUF

(G_ui[250]) //系统控制 0x0001 //保存断电缓冲

23

华中数控PLC编程说明书

#define SYS_SAVE_CUTTER #define SYS_SAVE_COORD #define SYS_SAVE_POS #define SYS_SAVE_ERROR #define SYS_LOAD_PARM #define SYS_ESTOP #define SYS_RESET 3.4.16 系统外部报警

0x0002 //保存刀具状态

0x0004 //保存坐标 0x0008 //保存位置 0x0010 //保存错误 0x1000 //装载参数 0x4000 //系统停止 0x8000 //系统复位

#define sys_ext_alm() (G_ui[251]) //系统外部警报种类 PLC最多可定义15种外部报警信息。报警信息可在参数中设置。这样PLC程序也可以向系统及用户报警。 3.17 系统变量组2(系统保留)

#define sys_var2(n)

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

3.5 寄存器B系统约定

寄存器B为断电保护区。关于断电保护区的应用可参见第九、第十章。对于B寄存器,系统提供如下宏定义,供用户使用: 3.5.1 刀座数

#define tot_mag_pos()

(B_ui) (B_i+1+(x))

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

#define cutter_in_mag(x)

3.6 可被PLC程序调用的系统函数

华中数控为PLC程序提供了足够丰富的系统函数,这些函数具体接口定义如下:

3.6.1 设置轴回零

void set_axis_home( int axis, //所指定的轴号:0-15 int start_stop); //为0:取消回零 非0:回零

24

华中数控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

华中数控PLC编程说明书

4.1.2 左移操作符〈〈 和 位右移操作符 〉〉

在一些PLC源程序中,有时可以使用如下C程序语句: i_e2 = 1 << (P[50]); 这里,<< 就是位操作符。例:

i_e1 = 1 >> (P[50]) ; i_e2 = 1 << (P[50]) ; i_e3 = (P[50]) >> 1 ;

i_e4 = (P[50]) >> 1 ;

如已知 P[50] =403,即 P[50] 等于403 ,那么 (P[50])等于3,上面的表达式就等价于:

i_e1 = 1 >> 3 ; i_e2 = 1 << 3 ; i_e3 = 3 >> 1 ; i_e4 = 3〈〈 1 ;

//1(即0001) //1(即0001) //3(即0011) //3(即0011)

右移 3 位变成 0000,所以 i_e1 等于 0 左移 3 位变成 1000,所以 i_e2 等于 8 右移 1 位变成 0001,所以 i_e3 等于 1 左移 1 位变成 0110,所以 i_e4 等于 6

类似地,应该不难理解如下语句的意义: #define x(g,b) (X[g]&(1<<(b))) #define set_x(g,b) (X[g]|=1<<(b)) #define clr_x(g,b) (X[g]&=~(1<<(b))) #define y(g,b) (Y[g]&(1<<(b))) #define set_y(g,b) (Y[g]|=1<<(b)) #define clr_y(g,b) (Y[g]&=~(1<<(b))) #define r(g,b)

(R[g]&(1<<(b))) (R[g]|=1<<(b)) (R[g]&=~(1<<(b))) (*F[g]&(1<<(b))) (*F[g]|=1<<(b)) (*F[g]&=~(1<<(b))) (*G[g]&(1<<(b))) (*G[g]|=1<<(b))

#define set_r(g,b) #define clr_r(g,b) #define f(g,b) #define set_f(g,b) #define clr_f(g,b) #define g(g,b) #define set_g(g,b)

//取X[g]的第b位 //设置X[g]的第b位 //清X[g]的第b位 //取Y[g]的第b位 //设置Y[g]的第b位 //清Y[g]的第b位 //取R[g]的第b位 //设置R[g]的第b位 //清R[g]的第b位 //取*F[g]的第b位 //设置*F[g]的第b位 //清*F[g]的第b位 //取*G[g]的第b位 //设置*G[g]的第b位

#define clr_g(g,b) #define bit(x,b) #define set_bit(x,b) (*G[g]&=~(1<<(b))) //清*G[g]的第b位 ((x)&(1<<(b))) //取x的第b位 ((x)|=1<<(b)) //设置x的第b位

29

华中数控PLC编程说明书

#define clr_bit(x,b) #define flag(f,m) #define set_flag(f,m) #define clr_flag(f,m) ((x)&=~(1<<(b))) ((f)&(m)) ((f)|=(m)) ((f)&=~(m)) //清x的第b位

//取m标志 //设置m标志 //清m标志

4.2 软件滤波 上升沿信号及下降沿信号的捕捉

虽然华中数控系统在硬件方面采取了很多措施来防止按钮抖动或意外脉冲/浪涌干扰,但在PLC中对输入点信号进行软件滤波可以使系统更加稳定,可靠性更高。

软件滤波的主要思想是始终记录最近几个均匀时间间隔内(如四个采用周期)对输入信号的采样值。

例,要记录第0-3组PLC输入信号X[0]至X[3]最近四个采用周期的采样值,可在周期运行的plc1()函数的尾部加入:

void plc1(void) { plc1_time = 16; //从现在开始,相隔16毫秒后调用plc1()函数 …………

//记住第0-3组信号的最近四次采样值

R_ui[30/2]=R_ui[20/2]; //记录上上次周期的采样值 R_ui[32/2]=R_ui[22/2];

R_ui[20/2]=R_ui[10/2]; //记录上次周期的采样值 R_ui[22/2]=R_ui[12/2];

R_ui[10/2]=X_ui[0/2]; //记录当前周期的采样值 R_ui[12/2]=X_ui[2/2];

}

设当前运行周期为N,在plc1()函数开始时,第0-3组输入信号在第N周期的采样值为X[0]、X[1] 、X[2] 、X[3];第N-1周期的采样值为R[10]、R[11] 、R[12] 、R[13];第N-2周期的采样值为R[20]、R[21] 、R[22] 、R[23];第N-3周期的采样值为R[30]、R[31] 、R[32] 、R[33]。如果输入信号超过10组,可适当增加用来记录最近采样值的R寄存器数量。

在需要判断输入信号X0.0是否从低电平跳为高电平(即上升沿信号)时,可以这样进行比较:

if((X[0]&R[10]&(~R[20])&(~R[30])&0x01)!=0) { //上升沿信号处理

30

华中数控PLC编程说明书

………… }

同样,在需要判断输入信号X0.0是否从高电平跳为低电平(即下降沿信号)时,可以这样进行比较:

if((X[0]&R[10]&(~R[20])&(~R[30])&0x01)!=0x01) { //下降沿信号处理 …………

}

如果不需要提取输入信号的上升沿/下降沿跳变时,可按下述表达式进行X0.0的信号值判断以避免干扰信号:

if( X[0]&R[0]&R[10]&R[20]&0x01 != 0x01 )

{ //零电平处理

………… }

else

{ //高电平处理

………… }

4.3 顺序动作处理与典型换刀动作的实现

编写PLC程序时,经常会碰到多个连续动作的处理要求,如一般换刀动作均需好几步才能完成,不可能在一个PLC扫描周期内实现。这时,可以利用一些R变量来记录当前运行步骤的各种状态。

笔者曾遇到一次四轴镗床系统改造工程,床子没有刀库,但由于床身巨大,客户要求系统能在运行换刀指令M06时,主轴能移动到一固定位置,以便工人师傅手工换刀。

实现这个功能时,用户要求在换刀后,程序能够继续自动运行,可分如下步骤实现:

1. 保存当前各轴位置到临时寄存器,如将X、Y、Z、W等轴的坐标值保

存到R_l[500/4]、R_l[504/4]、R_l[508/4]、R_l[512/4]。

2. 分别按顺序将Z、W、X、Y等轴移动至指定位置,为方便用户,这些

指定位置可放在PLC用户参数P_i[33]、P_i[32]、P_i[30]、P_i[31]中,单位为毫米。为提高安全性,我们用P_i[34]是否为1来表示这些位置参数是否有效,用P_i[35]表示移动的速度。

31

华中数控PLC编程说明书

3. 等待用户按两次循环起动键。

4. 分别按顺序将X、Y、Z、W等轴移回换刀前的位置R_l[500/4]、

R_l[504/4]、R_l[508/4]、R_l[512/4]。

5. 向数控系统给出M06运行完成的应答信号。 6. M06指令运行完成。

同时,在实现这个功能时,应该考虑用户可随时按进给保持信号暂停换刀执行;按MST功能锁住时,可取消换刀动作的执行。

值得注意的是,应该向用户说明:当换刀在中途被取消时,由于PLC改变了系统坐标轴位置,如果在自动方式下继续运行时,数控系统会报错“不在断点位置”,此时,用户必须使用“从任意行开始执行”功能,才能让程序继续自动运行下去。

还应该向用户说明的是:由于换刀后,刀具长度发生变化,调用M06换刀前必须将主轴与刀具移到远离工件的安全地方,同时程序中应该设置正确的刀具长度与半径补偿。

下面是实现该功能的具体C语言程序,我们用R[612]寄存器来记录M06当前运行的步骤。

#define M06_STEP R[612] //当前M06指令运行状态,必须初始化为零

// PLC 初始化 void init(void) {

……………… set_mst_func(0,'M',exec_M); //设置M代码响应函数 ……………… M06_STEP = 0; // 初始化换刀用中间寄存器的状态 ……………… }

// 在M命令处理主函数中设置M06_STEP = 1启动换刀动作 void exec_M(int ch) {

unsigned den,m; if(mstlock) //mst lock { mod_M_code(ch)=-1; return; }

………………

switch(mod_M_code(ch)) {

32

华中数控PLC编程说明书

………………

case 6: // M06:换刀动作处理 if(M06_STEP) //如果正在换刀,等待换刀完成 break; M06_STEP=1; //启动换刀动作 break;

……………… } }

// 换刀实现函数,该函数将被plc1()在每个扫描周期内调用, // 也就是说,该函数将被定期调用。 void Exec_M06(int ch) {

unsigned den=0;

if(M06_STEP==0) // 不用执行M06或M06执行完成 return;

if(mstlock || (*ch_ctrl(0)&CH_ESTOP)) { //取消运行或急停 mod_M_code(ch)=-1; //告诉数控系统:M指令运行完成 stop_move(); //停止所有轴的运动 M06_STEP=0; //M06指令状态为初始状态 return; }

if(*ch_stat(ch)&CH_FEEDHOLD_LAMP) { //进给保持 stop_move(); //停止所有轴的运动 if(M06_STEP>2) M06_STEP--; //M06返回上一步重新执行 return; }

den=*ch_stat(ch)&CH_DEN; //当前通道是否正在运动的标志 switch(M06_STEP) { case 0: //M06初始状态,不做任何动作。 return; case 1: //记录当前各轴位置 R_l[500/4] = get_axis_pos(0); R_l[504/4] = get_axis_pos(1); R_l[508/4] = get_axis_pos(2); R_l[512/4] = get_axis_pos(8); M06_STEP++; //M06可执行下一步动作 return; case 2: // 首先移动Z轴到换刀位置 if(den==0) //系统正在运动,等待运动完成

33

华中数控PLC编程说明书

return; if(*axis_stat(2)&AX_MOVING_LAMP) //确保Z轴没有运动 return; if(P_i[34]) //移动Z轴到指定位置(绝对坐标) set_axis_moveto(2,(long)P_i[32]*1000L,P_i[35]); M06_STEP++; return;

case 3: //等待Z轴运动完成后,再移动W轴 if(den==0) return; if(*axis_stat(2)&AX_MOVING_LAMP) return; M06_STEP++; if(P_i[34]) //移动W轴到指定位置(绝对坐标) set_axis_moveto(8,(long)P_i[33]*1000L,P_i[35]); return;

case 4: //等待W轴运动完成后,再移动X、Y轴 if(den==0) return; if(*axis_stat(8)&AX_MOVING_LAMP) return; M06_STEP++; if(P_i[34]) { //移动XY轴到指定位置(绝对坐标) set_axis_moveto(0,(long)P_i[30]*1000L,P_i[35]); set_axis_moveto(1,(long)P_i[31]*1000L,P_i[35]); } return;

case 5: //等待XY轴运动完成 if(den==0) return; if(*axis_stat(1)&AX_MOVING_LAMP) return; if(*axis_stat(0)&AX_MOVING_LAMP) return; M06_STEP++; return;

case 6: //等待按一次循环起动键,即捕捉该键上升沿信号一次

if((X[0]&R[10]&(~R[20])&(~R[30])&0x01)!=0) { //上升沿信号处理 M06_STEP++;

} return;

case 7: //再等待按一次循环起动键,即捕捉该键上升沿信号一次

if((X[0]&R[10]&(~R[20])&(~R[30])&0x01)!=0) { //上升沿信号处理 M06_STEP++;

34

华中数控PLC编程说明书

} }

// 在plc1()函数中调用M06的实现函数 void plc1(void) {

………………

plc1_time=16; //间隔16毫秒后,再调用plc1()函数 ………………

Exec_M06(0); //调用M06的实现函数 ………………

35

}

return;

case 8: //将XY轴移回换刀前的位置 set_axis_moveto(0, R_l[500/4], P_i[35]); set_axis_moveto(1, R_l[504/4], P_i[35]); M06_STEP++; return;

case 9: //等待XY轴运动完成,再将Z轴移回换刀前的位置 if(den==0) return; if(*axis_stat(1)&AX_MOVING_LAMP) return; if(*axis_stat(0)&AX_MOVING_LAMP) return; set_axis_moveto(2, R_l[508/4], P_i[35]); M06_STEP++; return;

case 10: //等待Z轴运动完成,再将W轴移回换刀前的位置 if(den==0) return; if(*axis_stat(2)&AX_MOVING_LAMP) return; set_axis_moveto(8, R_l[512/4], P_i[35]); M06_STEP++; return;

case 10: //等待W轴运动完成 if(den==0) return; if(*axis_stat(8)&AX_MOVING_LAMP) return; mod_M_code(ch)=-1; //M06指令完成 *ch_ctrl(ch)|=CH_FEEDHOLD_SW; //要求再次按循环起动键才能继续 M06_STEP = 0; return;

华中数控PLC编程说明书

//记住第0-3组信号的最近四次采样值,以实现软件滤波 R_ui[30/2]=R_ui[20/2]; //记录上上次周期的采样值 R_ui[32/2]=R_ui[22/2]; ………………

R_ui[20/2]=R_ui[10/2]; //记录上次周期的采样值 R_ui[22/2]=R_ui[12/2]; ………………

R_ui[10/2]=X_ui[0/2]; //记录当前周期的采样值 R_ui[12/2]=X_ui[2/2]; ……………… }

下面我们看看华中数控教学车床换刀动作的实现。教学车床刀架有四个刀位,PLC通过X3.0至X3.3(即X[3]&0x0F)可得到当前实际刀位号。系统通过数控程序中的T代码可向PLC发送自动换刀指令,用户通过面板(X1.0及X1.1)也可指定目标刀位号,并通过刀架启动按键发送换刀命令。另外,换刀到位后需要反换刀架以便锁住刀具。

我们通过R[48]、R[49]、R[50]这三个寄存器分别记录刀架当前刀位号、目的刀位号及换刀状态。具体C语言程序如下:

#define ToolPos R[48] //刀具当前位置 #define ToolDesPos R[49] //刀具应该到的目的位置 #define ToolChangeState R[50] //刀具换动状态

//PLC初始化 void init(void) { …………… set_mst_func(0,'T',exec_T); //设置自动换刀响应函数 …………… ToolPos=0; // 初始化换刀用的中间寄存器状态 ToolChangeState=0; ToolDesPos=0; }

// 自动换刀T指令的实现函数。数控系统在自动运行T指令时,会调用本函数 void exec_T(int ch) //当前通道号 { int T; if(mac_lock()||mst_lock()) { //机床锁住或MST锁住 mod_T_code(ch)=-1; // 向数控系统发送完成T指令的信号 return;

36

华中数控PLC编程说明书

} if(ToolChangeState != 0) // 正在换刀,立等待换刀完成 return; T=mod_T_code(ch)/100; // 计算目地刀位号 switch(T) { case 1: //刀位1 case 2: //刀位2 case 3: //刀位3 case 4: //刀位4 ToolDesPos = T; // 目地刀位号 ToolChangeState = 1; // 启动换刀 break; case 0: default: // 只有四个刀位,对其它刀位不作处理 mod_T_code(ch)=-1; // 向数控系统发送完成T指令的信号 break; } }

//刀具手动换刀的相关信号输入检测 void ToolManualActionInput(void) { if((X[3]&R[13]&0x80)==0x00) { //急停 Y[0] &= ~0x04; //刀架启动/停止灯灭 Y[2] &= ~0x0C; //清刀架正反转位 return; } if(mst_lock()||mac_lock()) { //机床锁住 Y[0] &= ~0x04; //刀架启动/停止灯灭 Y[2] &= ~0x0C; //清刀架正反转位 return; } if(mode_sel!=MODE_JOG) { //当前不是手动状态 return; } switch(X[1]&0x03) //刀具应该到的位置 { case 0x03: //刀号1 ToolDesPos = 1; break; case 0x01: //刀号2

37

华中数控PLC编程说明书

ToolDesPos = 2; break; case 0x02: //刀号3 ToolDesPos = 3; break; case 0x00: //刀号4 ToolDesPos = 4; break; } if(X[1]&R[11]&(~R[21])&(~R[31])&0x10) { //刀架启动上升沿信号处理 if(ToolDesPos != ToolPos) //需要换刀 if(ToolChangeState==0) //设置换刀状态 ToolChangeState = 1; } }

//换刀控制

void ToolAction(void) { switch(X[3]&0x0f) //当前刀具实际位置 { case 0x01: //刀号1 ToolPos = 1; break; case 0x02: //刀号2 ToolPos = 2; break; case 0x04: //刀号3 ToolPos = 3; break; case 0x08: //刀号4 ToolPos = 4; break; } //目的刀具已到 if(ToolDesPos==ToolPos) { if(ToolChangeState==0) //换刀已完成 { Y[0] &= ~0x04; //刀架启动/停止灯灭 Y[2] &= ~0x0C; //清刀架正反转位 return; } else if (ToolChangeState==1) //换刀到位后,要反转刀架一下

38

华中数控PLC编程说明书

ToolChangeState=2; } switch(ToolChangeState) { case 0: //刀具到位 Y[0] &= ~0x04; //刀架启动/停止灯灭 Y[2] &= ~0x0C; //清刀架正反转位 break; case 1: //转动刀架(正向) start moving tool Y[0] |= 0x04; //刀架启动/停止灯亮 Y[2] &= ~0x0C; //清刀架正反转位 Y[2] |= 0x04; //置刀架正转 break; case 2: //反向转动刀架,然后延时 10*16 ms,以便锁住刀具。 Y[0] |= 0x04; //刀架启动/停止灯亮 Y[2] &= ~0x0C; //清刀架正反转位 Y[2] |= 0x08; //置刀架反转 case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: ToolChangeState++; break; case 13: //换刀完成 ToolChangeState = 0; mod_T_code(0) = -1; // 向数控系统发送完成T指令的信号 break; } }

// 手动方式处理 void manual(void) {

……………… ToolManualActionInput(); //刀具手动换刀的相关信号输入检测 ……………… }

// 在plc1()函数中调用换刀实现函数ToolAction() void plc1(void)

39

华中数控PLC编程说明书

{

………………

plc1_time=16; //间隔16毫秒后,再调用plc1()函数 ……………… if((stat&CH_CYCLE_LAMP)==0) //在非自动运行状态 manual(); //调用手动处理 ………………

ToolAction (); //调用换刀动作的实现函数 ………………

//记住第0-3组信号的最近四次采样值,以实现软件滤波 R_ui[30/2]=R_ui[20/2]; //记录上上次周期的采样值 R_ui[32/2]=R_ui[22/2];

R_ui[20/2]=R_ui[10/2]; //记录上次周期的采样值 R_ui[22/2]=R_ui[12/2];

R_ui[10/2]=X_ui[0/2]; //记录当前周期的采样值 R_ui[12/2]=X_ui[2/2]; }

第五章 PLC运动控制的实现

第三章介绍了PLC程序可调用的一些函数接口,利用其中一些函数便可实现轴运动控制的实现。本章将示例说明各运动控制函数的使用

5.1 机床轴回零控制

在手动方式下需要控制机床轴回零时,调用函数set_axis_home()即可起动相关轴开始回零。该函数的原型为:

void set_axis_home( int axis, //所指定的轴号:0-15 int start_stop); //为0:取消回零 非0:回零 当碰到回零开关时,PLC程序必须通过轴控制字*axis_ctrl(x)|AX_HOME_SW告诉伺服系统回零开关已到。当伺服轴找到机械零位后,系统会通过轴状态字*axis_stat(x)& AX_HOME_LAMP告诉PLC零位已到。因此,在PLC程序中,回零控制的主要流程是:

1) 在手动回零模式下,检测用户按回零起动键(在一些机床上,这些按

键被定义为+X点动、+Y点动、+Z点动等)后,调用函数

40

华中数控PLC编程说明书

set_axis_home()起动相关轴回零。

2) 在PLC扫描程序入口plc1()中检测回零开关是否已到,如果轴碰到

回零开关,通过轴控制字*axis_ctrl(x)|AX_HOME_SW告诉伺服系统回零开关已到,否则清该控制字位。

3) 在PLC扫描程序入口plc2()中检测系统伺服相关轴状态字位

*axis_stat(x)& AX_HOME_LAMP来判断指定轴是否已找到零位,如果轴已完成回零,则点亮回零灯,告诉机床操作员相关轴回零完成。 例:

………… #define Speed_MAX 420 //坐标轴移动速度最大值 #define mode_sel R[0] //模式选择 #define axis_sel R_c[1] //轴选择 #define step_mul R_i[2/2] //步进倍率 #define jog_speed R[4] //点动速率 ………… void manual( ) //手动方式控制处理函数 {

…………

switch(mode_sel) //根据手动操作模式分别进行处理 { ………… case MODE_REF_RETURN: //回零模式 set_axis_jog(0,0); //禁止X轴点动 set_axis_jog(1,0); //禁止Y轴点动 set_axis_jog(2,0); //禁止Z轴点动 //如果进给保持设定(进给保持键X1.1为常闭点) if((X[1]&R[11]&R[21]&R[31]&2)==0) { //进给保持键被按下,取消所有轴回零 set_axis_home(0,0); //取消X轴回零 set_axis_home(1,0); //取消Y轴回零 set_axis_home(2,0); //取消Z轴回零 } else { //X、Y、Z轴正点动的输入点分别为X2.1、X2.3、X2.5 if(X[2]&R[12]&(~R[22])&(~R[32])&0x02) set_axis_home(0,1); //起动X轴回零 if(X[2]&R[12]&(~R[22])&(~R[32])&0x08) set_axis_home(1,1); //起动Y轴回零 if(X[2]&R[12]&(~R[22])&(~R[32])&0x20) set_axis_home(2,1); //起动Z轴回零 }

41

华中数控PLC编程说明书

return; ………… }

…………

}

………… void plc1( ) //PLC扫描入口函数1 {

………… plc1_time=16; //间隔16毫秒后,再调用plc1()函数

…………

//回零信号处理

//X、Y、Z轴回零的输入点分别为X3.3、X3.4、X3.5 u1=X[3]&R[13]&R[23]; u2=X[3]|R[13]|R[23]; if(u1&0x08) *axis_ctrl(0)|= AX_HOME_SW; // X轴回零 else if((u2&0x08)==0)

*axis_ctrl(0)&=~AX_HOME_SW; if(u1&0x10) *axis_ctrl(1)|= AX_HOME_SW; // Y轴回零 else if((u2&0x10)==0) *axis_ctrl(1)&=~AX_HOME_SW; if(u1&0x20) *axis_ctrl(2)|= AX_HOME_SW; // Z轴回零 else if((u2&0x20)==0) *axis_ctrl(2)&=~AX_HOME_SW; //记住输入信号最后三次的采样值 R_ui[30/2]=R_ui[20/2]; R_ui[32/2]=R_ui[22/2]; R_ui[20/2]=R_ui[10/2]; R_ui[22/2]=R_ui[12/2]; R_ui[10/2]=X_ui[0/2]; R_ui[12/2]=X_ui[2/2]; } void plc2( ) //PLC扫描入口函数2 {

………… plc2_time=32; //间隔32毫秒后,再调用plc2()函数

………… //回零灯 Y[2]&=~0xe0; //熄灭X、Y、Z轴回零灯

42

华中数控PLC编程说明书

if(*axis_stat(0)&AX_HOME_LAMP) Y[1]|=0x10; //点亮X轴回零灯(输出点为Y1.4) else Y[1]&=~0x10; //灭掉X轴回零灯(输出点为Y1.4) if(*axis_stat(1)&AX_HOME_LAMP) Y[1]|=0x20; //点亮Y轴回零灯(输出点为Y1.5) else Y[1]&=~0x20; //灭掉Y轴回零灯(输出点为Y1.5) if(*axis_stat(2)&AX_HOME_LAMP) Y[1]|=0x40; //点亮Z轴回零灯(输出点为Y1.6) else Y[1]&=~0x40; //灭掉Z轴回零灯(输出点为Y1.6) ………… //记住输入信号最后三次的采样值 R_ui[130/2]=R_ui[120/2]; R_ui[132/2]=R_ui[122/2]; R_ui[120/2]=R_ui[110/2]; R_ui[122/2]=R_ui[112/2]; R_ui[110/2]=X_ui[100/2]; R_ui[112/2]=X_ui[102/2]; }

5.2 机床轴点动

点动控制方式下,只要用户按下点动键,机床轴便不停止运动。在手动方式下需要点动控制机床轴运动时,调用函数set_axis_jog()即可点动相关轴运动。该函数的原型为:

void set_axis_jog( int axis, //点动轴号:0-15 int speed); //点动速度,单位:内部脉冲/插补周期 在PLC程序中,点动控制的主要流程为:

1) 在手动操作点动方式下,根据面板按键计算点动速度

2) 检测点动按键状态,调用函数set_axis_jog()点动/停止相关轴。 例:

………… #define Speed_MAX 420 //坐标轴移动速度最大值 #define mode_sel R[0] //模式选择 #define jog_speed R[4] //点动速率 ………… void manual( ) //手动方式控制处理函数

43

华中数控PLC编程说明书

{

…………

switch(mode_sel) //根据手动操作模式分别进行处理 { ………… case MODE_JOG: //点动模式 //计算X轴点动速度 i = (long) jog_speed*(*axis_vmax(0))/Speed_MAX; if(X[2]&R[12]&R[22]&0x80) //快进(输入点为X2.7) i*=3; switch(X[2]&R[12]&R[22]&0x06) //X轴点动按键状态检测 { case 0x02: //+X(输入点为X2.1) i=i; break; case 0x04: //-X(输入点为X2.2) i=-i; break; default: i=0; } set_axis_jog(0,i); //X轴点动 //计算Y轴点动速度 i = (long) jog_speed*(*axis_vmax(1))/Speed_MAX; if(X[2]&R[12]&R[22]&0x80) //快进(输入点为X2.7) i*=3; switch(X[2]&R[12]&R[22]&0x18) //Y轴点动按键状态检测 { case 0x08: //+Y(输入点为X2.3) i=i; break; case 0x10: //-Y(输入点为X2.4) i=-i; break; default: i=0; //点动速度为零,即停止运动 } set_axis_jog(1,i); //Y轴点动 //计算Z轴点动速度 i = (long) jog_speed*(*axis_vmax(2))/Speed_MAX; if(X[2]&R[12]&R[22]&0x80) //快进(输入点为X2.7) i*=3; switch(X[2]&R[12]&R[22]&0x60) //Z轴点动按键状态检测 {

44

华中数控PLC编程说明书

case 0x20: i=i; break; case 0x40: i=-i; break; default: i=0; } set_axis_jog(2,i); return; ………… }

………… }

//+Z(输入点为X2.5)

//-Z(输入点为X2.6)

//点动速度为零,即停止运动

//Z轴点动

5.3 机床轴步进

机床轴步进要求用户按一次步进轴,相关轴便步进指定的距离,因此PLC程序必须捕捉步进按钮的上升沿(或下降沿)脉冲信号。在手动方式下需要步进控制机床轴运动时,调用函数set_axis_step()即可步进相关轴运动。该函数的原型为:

void set_axis_step( int axis, //步进轴号:0-15 long displacement); //步进增量,单位:内部脉冲当量 在PLC程序中,步进控制的主要流程为:

1) 在手动操作步进方式下,根据面板按键计算步进轴及步进增量。 2) 检测步进按键上升沿脉冲后,调用一次函数set_axis_step(),步进相

关轴。 例:

………… #define Speed_MAX 420 //坐标轴移动速度最大值 #define mode_sel R[0] //模式选择 #define axis_sel R_c[1] //轴选择 #define step_mul R_i[2/2] //步进倍率 #define jog_speed R[4] //点动速率 ………… void manual( ) //手动方式控制处理函数 {

…………

45

华中数控PLC编程说明书

switch(mode_sel) //根据手动操作模式分别进行处理 { ………… case MODE_STEP: //步进模式 switch(X[2]&R[12]&(~R[22])&(~R[32])&0X7e) { // 根据不同按键的上升沿信号进行处理 case 0x02: //+X步进 set_axis_step(0,step_mul); break; case 0x04: //-X步进 set_axis_step(0,-step_mul); break; case 0x08: //+Y步进 set_axis_step(1,step_mul); break; case 0x10: //-Y步进 set_axis_step(1,-step_mul); break; case 0x20: //+Z步进 set_axis_step(2,step_mul); break; case 0x40: //-Z步进 set_axis_step(2,-step_mul); break; } return; ………… }

………… } ………… void plc2( ) //PLC扫描入口函数2 {

………… plc2_time=32; //间隔32毫秒后,再调用plc2()函数

………… if( (R_ui[110/2]==X_ui[100/2] && R_ui[120/2]==X_ui[100/2]) ||(R_ui[112/2]==X_ui[102/2] && R_ui[122/2]==X_ui[102/2]) ) { mode_sel=(auto_enable)? MODE_AUTO:0; switch(X_ui[100/2]&0xf0) //进给修调波段开关状态处理 { //进给修调指定

case 0x00: feedover=10; break; case 0x10: feedover=30; break; case 0x20: feedover=50; break; case 0x30: feedover=80; break; case 0x40: feedover=100; break;

46

华中数控PLC编程说明书

case 0x50: feedover=140; break; default: feedover=100; } mode_sel=(auto_enable)? MODE_AUTO:0; //取工作方式 switch(X[100]&R[110]&0xf) { case 0: //自动方式 *ch_ctrl(0) &= ~CH_SGL_BLK; mode_sel=(auto_enable)? MODE_AUTO:0; break; case 1: //单段方式 *ch_ctrl(0) |= CH_SGL_BLK; mode_sel=(auto_enable)? MODE_AUTO:0; break; case 2: //点动方式 mode_sel=MODE_JOG; break; case 3: //步进方式 mode_sel=MODE_STEP; break; case 4: //回零方式 mode_sel=MODE_REF_RETURN; break; case 5: //手动攻丝 mode_sel=MODE_JOG; break; default: mode_sel=0; } } if((X[100]&R[110]&0xf0)&&(mode_sel==MODE_STEP)) { //取增量倍率 switch(X[100]&R[110]&0xf0) { case 0x10: step_mul=1; break; case 0x20: step_mul=10; break; case 0x30: step_mul=100; break; case 0x40: step_mul=1000; break; case 0x50: step_mul=1000; break; default: step_mul=100; break; } }

………… }

47

华中数控PLC编程说明书

5.4 机床轴直线运动

除点动、步进等机床轴运动外,华中数控系统还为PLC提供了如下控制轴运动的函数,以便用户灵活控制轴运动: 5.4.1 设置轴移动距离及速率

void set_axis_move( int axis,

//轴号:0-15

long displacement, //移动距离增量

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

int axis, //轴号:0-15

long position, //移动的目的地,绝对坐标

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

5.4.2 设置轴移动的目的地及速率

void set_axis_moveto(

5.5 停止机床轴运动

要停止机床相关轴运动,在PLC程序中,调用set_axis_stop()即可。该函数的原型定义为:

//设置指定轴停止运动

void set_axis_stop(int axis); //轴号:0-15

5.5 机床轴运动状态获取

在PLC程序中,可能会需要判断某些轴是否正在运动、取轴的当前绝对位置等。系统提供了如下函数供PLC使用: 5.5.1 取指定轴当前位置

long get_axis_pos(int axis); //轴号:0-15

返回值为指定轴当前位置的绝对坐标,单位为内部脉冲当量,一般为1微米。

5.5.2 判断指定轴是否停止

int get_axis_den(int axis);

//轴号:0-15。

48

华中数控PLC编程说明书

该函数返回1表示指定轴已停止运动;返回0表示轴正在移动

第六章 辅助指令M、S、T、B的控制

在PLC程序中,对辅助指令进行控制涉及到辅助指令响应函数及其初始化、PLC与数控系统的通信等过程。本章将示例说明对辅助指令的控制方法。 数控系统在自动运行过程中碰到辅助指令MSTB时,将向PLC发送MSTB指令信号、调用相应的响应函数并等待PLC给出动作完成的应答信号。MSTB响应函数在执行完相关动作后,应向数控系统给出应答信号,否则数控系统将一直等待。

PLC向数控系统给出应答信号有两种方式:

1) PLC在完成所有相应动作后再给出应答信号;

2) PLC记录下相应指令,马上给出应答信号,然后再执行相应动作。

6.1 辅助指令响应函数及其初始化

数控系统在自动运行过程中碰到辅助指令MSTB时,将向PLC发送MSTB指令信号并调用相应的响应函数。这些响应函数必须在PLC初始化时,即在函数init()中,调用函数set_mst_func()来指定,如果不指定,系统将调用缺省的响应函数,该函数将对MSTB指令不作实际处理,只是对数控系统给出辅助指令执行完的信号。该函数的原型定义为:

void set_mst_func( int ch, //通道 char name, //代码类型:M、S、T、B、E void (*mst_func)(int)); //响应函数地址 PLC辅助指令的初始化可示例如下,E指令稍后便会说明:

void exec_M(int ch) { mod_M_code(ch)=-1; } void exec_S(int ch) { mod_M_code(ch)=-1; } void exec_T(int ch) { mod_M_code(ch)=-1; } void exec_B(int ch) { mod_M_code(ch)=-1; } void exec_MST_mod(int ch) { ; } void init(void) //系统初始化程序 {

set_mst_func(0,'M',exec_M); //辅助功能M指令响应函数设置 set_mst_func(0,'T',exec_T); //刀库功能T指令响应函数设置

49

华中数控PLC编程说明书

}

set_mst_func(0,'S',exec_S); //主轴速度功能S指令响应函数设置 set_mst_func(0,'B',exec_B); //刀库功能T指令响应函数设置 set_mst_func(0,'E',exec_MST_mod); //MST模态指令响应函数设置 …………

6.2访问辅助指令模态值

对于MSTB的当前命令值,即数控加工程序传递过来的辅助指令,PLC程序可通过如下宏进行访问: 6.2.1 通道当前的M代码

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

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

通道0当前的M代码为 ch_M_code(0) 6.2.2 通道当前的T代码

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

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

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

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

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

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

6.3 在PLC程序中控制系统辅助指令模态值与系统应答

PLC程序可以更改数控系统的MSTB模态值,即向数控系统发送辅助指令或其运行情况。具体实现是对宏ch_mst_mod(ch,x)进行赋值相关值。为便于记忆方便,系统提供了如下宏对辅助指令进行控制: 6.3.1 通道当前的M代码模态值

#define mod_M_code(ch)

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

50