1.DMIS简介(历史、发展、通讯相关、原理、作用、意义)
DMIS全称为Dimensional Measuring Interface Standard(尺寸测量接口标准),DMIS标准的最初开发是由计算机辅助制造国际公司(CAM-I)资助的。在1985年2月开始作为三坐标尺寸测量的接口规范项目, 这个规范是自动化系统间检测数据的通讯标准,是由用户和三坐标测量设备厂商共同努力的结果。
DMIS 的目标是开发一套计算机系统和测量设备之间检测数据双向通信的标准。它提供一种数据格式,形成各类分系统之间进行数据交换的中性文件。它的内容也具有检测规划和分析检测结果的作用。它由一套术语词汇表建立起一个用于检测规划和检测结果数据表达的中性格式。DMIS 是为了测试设备的信息交换、自动化操作和系统集成而设计的,但也照顾到了测量知识的表达,因而它设计成可以人工读出和编写,在不使用计算机的情况下也可以编写检测程序和分析检测结果。
DMIS 提供一套词汇表用来将检测规划提供给尺寸测量设备以及将测量设备的检测结果传递给接收设备。一台通过DMIS 与其它设备相连的设备必须有一个前置处理器,它将自己内部的数据格式转化为DMIS 格式,同时还需要一个后置处理器,将DMIS 格式转换为自己的数据结构。
DMIS 标准的诞生,改变了传统机械设计和检测之间信息交流的方式,为CMM供应商和用户带来了极大的便利。首先,通过在CAD系统和CMM之间提供双向通讯的标准,DMIS更加方便了系统的自动化和集成;其次,CMM和CAD公司只需编写惟一的解释程序;第三,用户不必再局限于单一的CAD系统和CMM来源。另外,由于不必再为CMM的专用语言培训和学习,所以既节约了时间,又减少了开支。而且DMIS 标准便于数据和路径规划,能够开发远程零件检测规划和平衡机器之间的负载。
使用DMIS格式作为数据交换标准的环境描述见(图1-DMIS 环境),正如图所示,一个测量程序可以由多种不同的方法生成。测量程序可以由CAD系统、非图形系统、自动化系统,或者手工构建生成。一个编程系统可能需要一个将程序转换成DMIS格式的预处理器,这样DMIS测量程序就能在不同的三坐标测量设备(DME)上运行。在(图1—DMIS环境)中,DME I具有一个DMIS预处理器和后处理器,这些处理器把DMIS数据转化成机器自己独有的数据格式。DME IV用DMIS作为它的内在格式,所以就不需要预处理器和后处理器。同样,一个主机被用于控制DME II 和DME III。这个主机有一个后处理器,此后处理器将DMIS程序解码,并同时驱动两台DME,即使用了DMIS格式又使用了用户自定义的数据交换格式。
结果数据可能通过不同的方式被返回并转变成DMIS格式。例如,这个数据可以被直接转换成DMIS格式或通过后处理器转换。结果数据会传递到分析系统或者存贮系统,比如质量信息系统(QIS)。
手工输入接口表明DMIS程序在没有计算机辅助的情况下手动编辑,并进行结果分析。另外,许多其他的DMIS数据交换格式也可以被应用。
DMIS 的应用依赖于用户自己。DMIS只是简单地定义了利用ASCII文件从一个支持DMIS的系统传输到其他系统的数据交换格式。传输、存贮、管理这些文件的方法由用户自己决定。
这个版本的DMIS组合了可以驱动三坐标测量机、影象测量设备、测量离散机械部件和电子元件的加工混合校验系统的指令。DMIS的主要目的是为所有测量设备提供一个通讯标准。将来应用软件可能扩展到支持以下功能:
1) 实现识别工件和测量工件自动化。
2) 在闭环制造单元加工工件的过程中提供实时的校验和调整。
一致性:
DMIS的主要用途是使组织内部不同的三坐标测量设备以及计算机应用软件之间相互交换数据和存储测量数据,当然也包括和其它组织之间的数据交换。DMIS 已被广泛地应用且拓宽了测量系统和应用的范围。然而,在一个 DMIS设备创建的 DMIS 文件并不能完全的或者准确的被另一个 DMIS 设备识别,除非 DMIS 应用软件完全执行 DMIS规范并完全执行标准的、公认的DMIS应用程序协议,这样才能成功的实现DMIS数据交互。DMIS是一个大而复杂的标准。供应商无需实现所有的标准,只需实现功能子集,这些子集被认为是规范协议。
DMIS 协议的主要好处是:能确保符合DMIS标准要求的数据间的互用性,以及证明应用软件执行DMIS标准的能力。一旦应用软件通过了测试鉴定,在协议的约束下我们可以预见应用程序执行的结果。
DMIS一致性测试:
DMIS一致性测试的服务将专门由DNSC提供。DMIS一致性测试目的是确定:采用DMIS标准的产品是否能够准确地执行DMIS规则及其关联的应用程序协议。
严格来说,DMIS规则只是一个规定数据交换格式的文本。然而,“DMIS”通常却包含:一个程序编辑器(产生DMIS的程序),一个解释器(识别DMIS的程序),以及元文件(实际的DMIS输入和输出文件)。总的来说,一个程序编辑器、元文件和一个解释器组成了一个整地DMIS系统。
在详细的DMIS协议的一致性条款中有关于DMIS一致性的说明。因此,DMIS规则以及相关联的应用程序协议对于测试整个DMIS系统的一致性是很重要的。
做DMIS一致性测试必须包含以下一项或多项:
A) 检验元文件在语法上是否准确
B) 校验程序编辑器符合元文件,准确地、恰当地描述预期的结果
C) 校验解释器能恰当地、完全地识别元文件,并输出预期的结果。
D) 校验DMIS描述文件在语句描述上是准确的,这个精确地描述应用软件的能力。
如果应用程序的所有语句都按照此标准定义,那么这个应用程序符合DMIS标准。
如果应用软件能根据这个标准定义所有语句,并能解析所有的符合的 DMIS协议,那么这个应用软件符合DMIS标准。
2.基础编程:
(1)环境定义(速度、加速度、接近回退、安全距离)
在测量之前,需要对测量的环境有一个定义,我们以软件产生程序时自动产生的环境定义做一个解释:
$$/* Header
DMISMN/'Created by [爱科腾瑞科技(北京)有限公司-090119-DEMO-11023(力合)] on 星期三, 七月 10, 2019', 4.0
UNITS/MM, ANGDEC, MMPS
WKPLAN/XYPLAN
PRCOMP/ON
TECOMP/ON
FLY/1.00000
MODE/PROG, MAN
SNSET/APPRCH, 2.00000
SNSET/RETRCT, 2.00000
SNSET/DEPTH, 0.00000
SNSET/SEARCH, 10.00000
SNSET/CLRSRF, 20.00000
RECALL/D(MCS)
SNSLCT/S(L20-D2.0)
GEOALG/BF, LSTSQR
GEOALG/ANGLB, DEFALT
GEOALG/CIRCLE, LSTSQR
GEOALG/ARC, LSTSQR
GEOALG/PLANE, LSTSQR
$$
$$
$$*/
定义圆、圆弧、平面的拟合算法为最小二乘法,其中圆的算法可以根据程序进行选择,有4种算法可供选择:
最小外接圆:(最小覆盖圆)将所有的测量点都包含在圆内,直径最小的那个圆。
最大内接圆:(最大空圆)所有测量点都在圆外,直径最大的那个圆。
最小区域圆:(最小半径)从这个圆的圆心出发,画两个同心圆,将所有测量点都包含在这两个同心圆内,在所有符合上面条件的同心圆中,径向距离最小的那一组。
最小二乘圆:(最小平方差)所有测量点到该圆的距离平方和最小。
实际中应用最多的是最小平方差,给出的为参数的平均值,计算方便,同时个别点的偏差对测量结果影响不大。
在配合中,为了顺利进入装配,轴的尺寸应采用最小覆盖圆,而最小半径,主要用于形状差的评定。
(2)元素定义
所有元素在测量前,都必须先有理论值,这个理论值或从图纸上获得,或直接从CAD模型中拾取。
作为测量程序,所有的元素在使用前,都必须先有理论值。
在进行各项元素的检测前,都必须先有理论定义:
1、定义点的DMIS格式为:
F(LABEL) = FEAT/POINT, VAR_1, I,J,K
VAR_1为Cart,x,y,z
POL,r,a,h
那么如果我需要定义一个坐标值为10,20,30,方向为Z轴正方向的点定义语句即为:
F(PT1) = FEAT/POINT, CART,10, 20, 30, 0, 0, 1
运行上面的这行语句后,即会出现一个坐标值为10,20,30,方向为0,0,1的点。
2、定义直线元素:
F(LABEL) = FEAT/ LINE,var_1,ni,nj,nk
VAR_1为 UNBND,var_2
或者 BND,var_3
VAR_2为 CART,x,y,z,i,j,k
或者 POL,r,a,h,i,j,k
VAR_3为 CART,e1x,e1y,e1z,e2x,e2y,e2z
或者 POL,e1r,e1a,e1h,e2r,e2a,e2h
上面的部分参数意义:
UNBND: 为一条未限制边界的直线(无限长)
BND: 为一条限制范围的直线(定长)
e1x,e1y,e1z:
e2x,e2y,e2z: 为限制直线的两个端点的直角坐标值
e1r,e1a,e1h:
e2r,e2a,e2h: 为限制直线的两个端点的极坐标值
i,j,k: 为沿直线方向第一点到第二点的向量
ni,nj,nk: 为直线所在平面的向量,可以用来做探头补偿
如语句:
F(LINE1) = FEAT/LINE, BND, CART, -40, -45, -6, 20, -45, -6, 0, -1, 0
所定义的直线LINE1的两个端点坐标为 (-40, -45, -6) (20, -45, -6) 所在平面的方向为0,-1,0
3、定义球元素
F(LABEL) = FEAT/SPHERE,var_1,var_2,diam var_3
Var_1为 INNER
或者 OUTER
Var_2为 CART,x,y,z
或者 POL,r,a,h
Var_3为 i,j,k var_8
或者 不存在
Var_8为 angle
或者 不存在
上面部分参数意义:
INNER: 为一个内球
OUTER: 为一个外球
i,j,k: 为球的法向量(如下面图示)
angle: 为指示球的可测范围(如下面图示)的角度
4. FEAT/CIRCLE(定义圆元素)
5.定义平面元素
F(label)=FEAT/PLANE,var_1,i,j,k
Var_1为 Cart,x,y,z
或者 Pol,r,a,h
上面部分参数的意义:
x,y,z 为平面上某一点的坐标
6.定义曲线元素
F(label)=FEAT/GCURVE,var_1
Var_1为 CART,x,y,z,i,j,k或者POL,r,a,h,i,j,k
CART,x,y,z,i,j,k,PTDATA,xd,yd,zd,id,jd,kd var_7
POL,r,a,h,i,j,k,PTDATA,rd,ad,hd,id,jd,kd var_8
Var_7为 xd,yd,zd,id,jd,kd var_7或者 xd,yd,zd,id,jd,kd
Var_8为 rd,ad,hd,id,jd,kd var_8或者 rd,ad,hd,id,jd,kd
上面部分参数的意义
x,y,z 曲线所在平面上任意一点的坐标
i,j,k 曲线所在平面的向量.
PTDATA 表示为曲线上每个点的数据(由测量曲线时的实测点来确定)
xd,yd,zd,id,jd,kd 曲线上每一个测量点的坐标和法向
7.定义理论圆柱
F(label)=FEAT/CYLNDR,var_1,var_2,i,j,k,diam var_3
Var_1为 INNER
OUTER
Var_2为 CART,x,y,z
或者 POL,r,a,h
Var_3为 len
或者 不存在
上面部分参数的意义啊
x,y,z 圆柱为没有边界时,为轴上任意一点的坐标.
圆柱有边界时,为圆柱轴线中点的坐标
i,j,k 为圆柱轴线方向
8.定义理论椭圆
F(label)=FEAT/ELLIPS,var_1,var_2,var_3,i,j,k,diam
Var_1为 INNER
或者 OUTER
Var_2为 CART,f1x,f1y,f1z,f2x,f2y,f2z
或者 POL,f1r,f1a,f1h,f2r,f2a,f2h
Var_3为 MAJOR
或者 MINOR
部分参数的意义
f1x,f1y,f1z 为椭圆的两个焦点的直角坐标
f2x,f2y,f2z
f1r,f1a,f1h 为椭圆的两个焦点的极坐标
f2r,f2a,f2h
MAJOR 表示下面定义的为椭圆的大直径
MINOR 表示下面定义的为椭圆的小直径
椭圆在DMIS标准里是两点定义,为椭圆上任意一点,到两个焦点的距离之和为定值,这样来进行椭圆二次曲线的几何定义.
在RationalDMIS中,元素定义窗口是用椭圆的圆心点坐标,长短轴长度,长轴方向来唯一确定一个椭圆.
9.定义理论圆锥
F(label)=FEAT/CONE,var_1,var_2,i,j,k,ang
Var_1为 INNER
或者 OUTER
Var_2为 CART,x,y,z
或者 POL,r,a,h
部分参数的意义
CART,x,y,z 为圆锥顶点直角坐标
POL,r,a,h 为圆锥顶点极坐标
i,j,k 为圆锥轴线方向,方向如图示
10.定义圆弧
圆弧有两种定义方式:四点定义和角度定义
四点定义格式:
F(label)=FEAT/ARC,4POINT,var_1,e1x,e1y,e1z,mx,my,mz,e2x,e2y,e2z,cx,cy,cz
Var_1 为INNER或者OUTER
e1x,e1y,e1z 为圆弧第一个边缘点的坐标值
mx,my,mz 为圆弧中点的坐标值
e2x,e2y,e2z 为圆弧第二个边缘点的坐标值
cx,cy,cz 为圆弧圆心的坐标
角度定义格式:
F(label)=FEAT/ARC,var_1,var_2,i,j,k,rad,ang1,ang2 var_3
Var_1 为INNER或者OUTER
Var_2 为CART,x,y,z或者POL,r,a,h
Var_3 为is,js,ks或者不存在
部分参数意义
i,j,k 为圆弧所在平面的向量
rad 为一个正整数表示圆弧的半径
ang1 为由Var_3参数确定的主轴所确定的角度
ang2 为对于角度1包含圆弧的角度
is,js,ks 为圆弧起始点在平面上的向量
(3)坐标系建立
坐标系需要使用基准元素进行建立,在DMIS中,定义坐标系基准的语句为
DATDEF/var_1
Var_1 为FA(label1),DAT(x)
或者FA(label2),DAT(x-x)
或者F(label3),DAT(x)
DAT(x) 为基准标签名,X为任意大写希腊字母,如图纸上的A等等。
DAT(x-x) 为建立的共同基准,对应定义语句中的FEAT/COMPOUND。
F(label3) 以元素理论值建立基准
FA(label2) 以元素实际值建立基准
建立完基准之后,指定建立完的基准建立坐标系时,限制相应空间自由度。
建立坐标系的格式为
D(label)=DATSET/var_1
此函数的作用为定义并且激活一套基准,或为一个工件坐标系,赋于一个坐标系标签名,基准的顺序遵从标准ASME Y14.5M-1994。
以常见的面、线、点为例,假设面定义的基准标
签名为A,线为B,点为C
那么建立坐标系的DMIS语句即为:
D(CRD1) = DATSET/DAT(A), ZDIR, ZORIG, DAT(B), XDIR, YORIG, DAT(C), XORIG
该语句是意思是建立一个新的坐标系名称为CRD1。
使用基准A,也就是平面,确立该坐标系的Z轴方向和Z轴位置。
使用基准B,也就是直线,确立该坐标系的X轴方向和Y轴的位置。
使用基准C,也就是圆心,确定该坐标系的X轴的位置。
所建立的坐标系可以根据需要灵活调整,但是按照顺序,元素进行坐标系自由度的限制,不超出,XYZ三个轴的位置,和XYZ三个轴的方向。
3.元素测量
常用的DMIS测量语句的格式为
MEAS/var_1,F(label),n
Var_1 为各个元素类型的关键字,如CIRCLE\CONE\SPHERE等等
F(label) 为需要测量元素的标签名
n 为测量点数。在扫描被激活的时候,点数会根据软件算法重新生成,n不会生效.
以测量圆为例。
MEAS/CIRCLE, F(CIR1), 3
GOTO/ -15.500000, -0.000000, 10.000000
PTMEAS/CART, -12.500000, -0.000000, -2.000000, -1.000000, -0.000000,$
0.000000
GOTO/ -13.423394, -7.750000, -2.000000
GOTO/ -7.750000, -13.423394, -2.000000
GOTO/ 0.000000, -15.500000, -2.000000
PTMEAS/CART, 6.250000, -10.825318, -2.000000, 0.500000, -0.866025, 0.000000
GOTO/ 13.423394, -7.750000, -2.000000
GOTO/ 15.500000, 0.000000, -2.000000
GOTO/ 13.423394, 7.750000, -2.000000
PTMEAS/CART, 6.250000, 10.825318, -2.000000, 0.500000, 0.866025, 0.000000
GOTO/ 7.750000, 13.423394, 10.000000
ENDMES
MEAS和ENMES中间是机器的定位点和测量的分布。上面的语句表示,对圆元素,CIR1
进行测量,3表示所使用的测量点数。
注意的地方:
1. 在测量点的情况下,如果n设置为1,那么将按照定义的理论值去测量。如果n设置为0,将记录此时测头红宝石球心的坐标,将此作为当前测量点实际值。
2. 当打开AUTO模式时,测量设备将使用内部定义的算法来分布测量点进行测量。如果内部对于该元素没有对应算法分布测量点,默认将会切换到下一个所定义的模式状态下。
3. 当使用PROG模式时,测量设备会按照下面所给的PAMEAS、PTMEAS和GOTO语句去测量元素。
4. 程序块后必须跟ENDMES为结束标志。中间可以插入高级语句以及其他主关键字。
4.公差评价及输出
进行元素理论值的定义,并且测量得到实际值后,需要对该元素进行评价。
形位公差同样为标签名定义,定义格式为
T(LABEL) = TOL/var_1
Var_1 为所需要评价的公差次关键字,这里打开软件自学习可以得到所有公差标签名的次字,列表如下:
FLAT 平面度
TRNOUT 全跳动
SYM 对称度
STRGHT 直线度
PROFS 曲面轮廓度
PROFP 点轮廓度
PROFL 线轮廓度
PARLEL 平行度公差
PERP 垂直度公差
ANGL 锥角公差
ANGLB 角度公差
ANGLR 倾斜度公差
POS 位置度公差
CRNOUT 圆跳动公差
DIAM 直径公差
CYLCTY 圆柱度公差
CONCEN 同心度公差
CIRLTY 圆度公差
RAD 半径公差
WIDTH 宽度公差
例如,定义一个平面度公差,定义的语句为:
T(AAA) = TOL/FLAT,0.1
定义了一个名称为AAA的平面度公差,公差带为0.1。
评价并输出一个平面例如PLN1的平面度公差的语句即为:
OUTPUT/FA(PLN1),TA(AAA)
5.变量、输入提示
一、变量声明、赋值。
变量声明的函数为
DECL/var_1 var_2 var_3
定义变量的作用范围
其中 Var_1 为COMMON 普通
或者GLOBAL 全局变量
或者LOCAL 局部变量
或者不存在
定义变量的类型
Var_2 为BOOL 布尔型
或者INTGR 整数型
或者LONG 长整型
或者REAL 实数型
或者DOUBLE 双精度型
或者CHAR,n 字符型
或者VECTOR 向量型
Var_3 为Varname 变量名称
相同类型的变量可以在同一个DECL语句中声明
所有的变量在使用前都需要进行声明,变量的名称由1到16个字母数字、下划线组成,名称的第一个字符只能为希腊字母。变量名称不能使用DMIS预留字,预留字包括DMIS主字、次字、常用函数等等。如果这里不指定Var_1,DMISMN声明的程序块用GLOBAL为默认值,在MACRO声明的程序块中用LOCAL为默认值。变量数组的起始从1开始,而其它常用的高级编程语言如C、JAVA从0开始。
声明完变量后,即可对其赋值,在DMIS中进行变量赋值并不像只用“=”号那样简单
DECL/COMMON,CHAR,40,TCDIRS
DECL/COMMON,INTGR,TCNSLT
TCDIRS=ASSIGN/'山涧果子'
TCNSLT=ASSIGN/6
变量同样可提示由用户输入后获得,使用的关键字为PROMPT
PROMPT/TEXT, 'hello,world'---------------界面出现一行提示 hello world
PROMPT/EDIT, var_1 --------------------出现对话框,把对话框内输入的数据赋值给var_1
PROMPT/CHECK, '直径',var_1-------------出现勾选项,在"直径"后面,如果勾选上,var_1的值为1,反之var_1的值为0
PROMPT/LIST,var_1,"圆度","位置度","直径公差"-----------出现一个下拉菜单,中间包含圆
度\位置度\直径公差,选则一项就将值赋给var_1,例如我在下拉菜单中选择了"位置度",那么字符串变量var_1的值就为"位置度"
PROMPT/TITLE,'校验程序'------------出现的窗口的标题栏即为'校验程序'
PROMPT/PICTURE,'filename'------------出现一个图片,filename为此文件和路径和文件名
下面是一个范例的提示窗口,如图
DMIS语句如下:
DECL/CHAR,20,List_var1
DECL/DOUBLE,edit_var1,edit_var2,edit_var3
DECL/INTGR,Check_var1,Check_var2,Check_var3
Tempchar = Prompt/Title,'孔测量程序',$
Text,'孔的数量',edit,edit_var1,$
Text,'孔的直径',edit,edit_var2,$
Text,'直径公差带',edit,edit_var3,$
List,List_var1,'直角坐标系','极坐标系',$
Check,'位置度',Check_var1,Check,'圆度',Check_var2,Check,'直径公差',Check_var3
二.分支结构
DMIS和其它语言一样,有逻辑操作符和关系操作符。
逻辑操作符
.AND. 逻辑与
.OR. 逻辑或
.NOT. 逻辑非
关系操作符
.EQ. equal to 等于
.NE. NOT equal to 不等于
.LT. less than 小于
.LE. less than or equal 小于等于
.GT. greater than 大于
.GE. greater than or equal to 大于等于
结构语句上有
条件判断 IF,例如
IF/(NCYCLE .EQ. 10)
$$instructions
ELSE
$$instructions
ENDIF
DO循环 例如
DECL/INTGR,i
DECL/CHAR,20,elnm
DECL/DOUBLE,xx,yy,zz
DO/i,1,3,1
elnm=ASSIGN/CONCAT('poi_',STR(i))
xx=OBTAIN/FA(@elnm),3
yy=OBTAIN/FA(@elnm),4
zz=OBTAIN/FA(@elnm),5
elnm=ASSIGN/CONCAT('newpoi_',STR(i))
F(@elnm)=FEAT/POINT,CART, xx,yy,zz, 0,0,0
FA(@elnm)=FEAT/POINT,CART, xx,yy,zz, 0,0,0
ENDDO
以上表示 DO 和ENDDO之间的内容循环3次。
每循环一次,变量i的值加1,到3后结束。
分枝选择 SELECT CASE
DECL/INTGR,i
DECL/CHAR,50,tx
i=ASSIGN/10
SELECT/i
CASE/10
tx=ASSIGN/CONCAT('THE ACTUAL VALUE OF X IS: ',STR(i))
TEXT/OPER,tx
ENDCAS
CASE/20
tx=ASSIGN/CONCAT('THE ACTUAL VALUE OF X IS: ',STR(i))
TEXT/OPER,tx
ENDCAS
DFTCAS
TEXT/OPER,'X is not equal to the 2 cases'
ENDCAS
ENDSEL
以上语句判断i,如果为10,执行某项操作。
如果为20,执行某项操作。
程序跳转 JUMPTO
JUMPTO/(CONTINUEFROMHERE)
$$ instructions
$$ instructions
(CONTINUEFROMHERE)
$$ instructions
$$ instructions
表示运行该句的时候,会跳转到所对应的程序行上继续运行。
DMIS里提供常用的字符串函数和数学函数供程序使用,列出部分仅供参考:
ABS(X) 绝对值
ACOS(X) 反余弦
ASIN(X) 反正弦
ATAN(X) 反正切
ATAN2(Y,X) 取回角度(输入XY坐标,然后返回这个点到坐标原点的角度,以X轴线上为0值开始,两个值不能同时为0,返回值在正负PIE之间)
COS(X) 余弦
DBLE(X) 将数字变量'x'变为双精度型类型变量
DTOR(X) 角度转弧度
EXP(X) 指数函数
INT(X) 取整数部分
LN(X) 自然对数
LOG(X) 以10为底的对数
MN(val1, val2, …) 取出列表值中的最小值
MOD(x,y) x/y的求余运算
MX(val1, val2, …) 取出列表值中的最大值 (这两个以前不知道,居然写了个宏用冒泡法来求,汗~~~)
NINT(X) 四舍五入取整
ORD(x) 顺序返回一个值,如果x为BOOL型,flase返回0,true返回1.如果x为字符型,返回第一个字符的ASCII值
RL(X) 返回实数型数据
RTOD(X) 弧度转角度
SIN(X) 正弦
SQRT(X) 返回平方根
TAN(X) 正切
三.属性取值、宏程序介绍
取值函数OBTAIN的作用是把之前设定的一些参数通过变量赋值得到.
例如各个元素的坐标值和参数值,在HLL编程中用到很频繁.
以圆为例,圆的定义语句为
F(CIR1) = FEAT/CIRCLE,OUTER,CART, 10, 20, 30, 0, 0, 1,25
上面的定义语句定义了一个X值为10,Y值为20,Z值为30,直径为25,所在平面方向为0,0,1的外圆
那么我的取值语句为,假设前面声明过一个DOUBEL型变量为Demo1
Demo1 = OBTAIN/F(CIR1),X
那么当X为4的时候,Demo1取得的是该圆的X值.
当X为5的时候,Demo1取得的是该圆的Y值.
当X为6的时候,Demo1取得的是该圆的Z值.
当X为7的时候,Demo1取得的是该圆的i值.
当X为8的时候,Demo1取得的是该圆的j值.
当X为9的时候,Demo1取得的是该圆的k值.
当X为10的时候,Demo1取得的是该圆的直径.
很明显,在对元素的参数进行取值的时候,刚好是从元素定义语句的第一个参数依次向后数,如上面的例子,取值的顺序刚好就是元素定义的顺序.
其它元素参数的取得也遵循这个规律.
使用这些变量,在编程计算中有重要作用,下面是常见元素取值的列表:
上面是常用元素的属性列表,数字1234……是OBTIAN函数取得的位置.
宏(Macro)详解
Macro是DMIS中类似于定义一个函数,可以传递一些参数,我们可以这样来理解宏.
我们新做了一个函数,通过CALL来输入对应的参数,即可完成设计的功能.
例如,之前论坛上有一个写曲线投影到平面的程序,大概程序的结构为
定义一个宏,假设为M(SSJ)
CALL/M(SSJ),'FA(GCV1)','FA(PLN1)'
那么在定义这个宏语句的时候,只需要两个参数:曲线的标签名和投影平面的标签名.
其它的计算和处理都在前面所定义的宏中完成.
宏的好处不言而喻,他使得程序的通用性更强,更模块化,更利于查错.
宏定义的语法为:M(LABEL) = Macro/varname,'lable'
ENDMAC
以一个简单例子说明
输出圆CIR1的直径\X坐标\Y坐标\Z坐标
通常我们的语句为
DECL/COMMON,DOUBLE,DATAC[4]
DATAC[1] = OBTAIN/FA(CIR1),4
DATAC[2] = OBTAIN/FA(CIR1),5
DATAC[3] = OBTAIN/FA(CIR1),6
DATAC[4] = OBTAIN/FA(CIR1),10
WRITE/DID(DEFAULTSCREEN),DATAC[1]
WRITE/DID(DEFAULTSCREEN),DATAC[2]
WRITE/DID(DEFAULTSCREEN),DATAC[3]
WRITE/DID(DEFAULTSCREEN),DATAC[4]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
但是如果这个用宏定义来做,语句是这样
M(demo) = MACRO/'CIR1'
DECL/COMMON,DOUBLE,DATAC[4]
DATAC[1] = OBTAIN/FA(CIR1),4
DATAC[2] = OBTAIN/FA(CIR1),5
DATAC[3] = OBTAIN/FA(CIR1),6
DATAC[4] = OBTAIN/FA(CIR1),10
WRITE/DID(DEFAULTSCREEN),DATAC[1]
WRITE/DID(DEFAULTSCREEN),DATAC[2]
WRITE/DID(DEFAULTSCREEN),DATAC[3]
WRITE/DID(DEFAULTSCREEN),DATAC[4]
ENDMAC
CALL/M(demo),(CIR1)
表面上来看,结果没有变,但是代码好象增多了.
如果同样我需要输出CIR2的这些值,我不需要再修改源程序,只需要将CALL语句中的CIR1替换为CIR2即可.
但是如果是第一种代码,我们需要把所有的CIR1替换为CIR2,不仅不方便,而且容易出错.
我再需要输出其它圆的这几项实际值,只需要调用这个宏M(demo)即可以,不用重复再去写代码,保证程序的模块化.
PS: 宏定义的参数有两种,标签名和变量.
在用CALL语句做调用时,同样也只有两种参数.
定义的时候标签名为单引号,变量没有什么限制,例如 M(demo) = macro/'CIR1',tempchar
调用宏的时候,标签名为括号,变量无限制,例如CALL/M(demo),(CIR1),tempstring
宏在测量程序上的很有意义,很多写好的程序,可以用宏的方式写出来,方便以后做调用,节省不必要的代码工作.
6.实际DMIS编写流程。
按照前面介绍的内容,一个完整的DMIS编写流程即为:
1、先进行元素定义 FEAT
2、手动测量 MODE/MAN MEAS
3、建立基准和坐标系 DATDEF DETSET
4、对需要测量和评价的元素,进行理论定义 FEAT
5、测量 MODE/AUTO,PROG MEAS
6、定义公差 TOL
7、评价并输出 OUTPUT
$$/* Header
DMISMN/'Created by [爱科腾瑞科技(北京)有限公司-090119-DEMO-11023(力合)] on 星期三, 七月 10, 2019', 4.0
UNITS/MM, ANGDEC, MMPS
WKPLAN/XYPLAN
PRCOMP/ON
TECOMP/ON
FLY/1.00000
MODE/PROG, MAN
SNSET/APPRCH, 2.00000
SNSET/RETRCT, 2.00000
SNSET/DEPTH, 0.00000
SNSET/SEARCH, 10.00000
SNSET/CLRSRF, 20.00000
RECALL/D(MCS)
SNSLCT/S(L20-D2.0)
GEOALG/BF, LSTSQR
GEOALG/ANGLB, DEFALT
GEOALG/CIRCLE, LSTSQR
GEOALG/ARC, LSTSQR
GEOALG/PLANE, LSTSQR
$$
$$
$$*/
MODE/MAN
F(PLN1)=FEAT/PLANE,CART,2.34934,-1.53842,0.00000,0.00000,0.00000,1.00000
$$ Measurement points are created through actual points
MEAS/PLANE, F(PLN1), 4
PTMEAS/CART, -41.69239, 9.07213, -0.00000, 0.00000, 0.00000, 1.00000
PTMEAS/CART, -15.52735, -36.87179, -0.00000, 0.00000, 0.00000, 1.00000
PTMEAS/CART, 37.41857, -18.16015, -0.00000, 0.00000, 0.00000, 1.00000
PTMEAS/CART, 29.19855, 39.80614, -0.00000, 0.00000, 0.00000, 1.00000
ENDMES
D(CRD1) = DATSET/FA(PLN1), ZDIR
F(LN1)=FEAT/LINE,BND,CART,-45.31325,-45.00000,-3.15718,26.78221,-45.00000,-3.86352,0.00000,-1.00000,0.00000
$$ Measurement points are created through actual points
MEAS/LINE, F(LN1), 2
PTMEAS/CART, -45.31325, -45.00000, -3.15718, 0.00000, -1.00000, 0.00000
PTMEAS/CART, 26.78221, -45.00000, -3.86352, 0.00000, -1.00000, 0.00000
ENDMES
F(CIR1)=FEAT/CIRCLE,INNER,CART,0.00000,0.00000,-4.53749,0.00000,0.00000,1.00000, 30.00000
$$ Measurement points are created through actual points
MEAS/CIRCLE, F(CIR1), 4
PTMEAS/CART, 9.33191, 11.74374, -4.53749, -0.62213, -0.78292, -0.00000
PTMEAS/CART, 11.34974, -9.80732, -4.53749, -0.75665, 0.65382, -0.00000
PTMEAS/CART, -11.26759, -9.90159, -4.53749, 0.75117, 0.66011, -0.00000
PTMEAS/CART, -12.13613, 8.81557, -4.53749, 0.80908, -0.58770, -0.00000
ENDMES
D(CRD2) = DATSET/FA(PLN1), ZDIR, ZORIG, FA(LN1), XDIR, FA(CIR1), XORIG
D(CRD2) = TRANS/ZORIG, -0, YORIG, FA(CIR1), XORIG, -0
$$ Set.CAD2PCS.CADM_1
$$ Set.CADViewCenter.CADM_1
MODE/PROG,MAN
$$ MACRO: EASI_CLEARPLN_GOTO
$$ FUNCTION: CLEARANCE SURFACE IMPLEMENTATION
$$ Move machine CLEAR SURFACE DIST above the current clear surface
$$ plane and then move machine parallel to the clear surface plane
$$ ALL Macro parameters are in PCS and Current UNITS
$$ Last update: 3-1-04 Add mode checking. only works in PROG MODE
$$ Last update: 8-24-04 Clear position is based on the surface of
$$
$$ This sample DMIS Macro is provided by External-Array Software, Inc.
$$ It should be modified for your own use. There is no guarantee for
$$ the quality of this Macro. November, 2003
M(EASI_CLEARPLN_GOTO) = MACRO/ISNOM, TARX, TARY, TARZ
DECL/LOCAL, REAL, CCX, CCY, CCZ, CCI, CCJ, CCK
DECL/LOCAL, REAL, CURX, CURY, CURZ, TD, CLRDIST, SDIAM
DECL/LOCAL, CHAR, 255, CLRLABEL, FLABEL, MMODE, SNAME
MMODE = VALUE/MODE
CLRLABEL = VALUE/SNSET, CLRSRF
IF/ ( (LEN(CLRLABEL) .GT. 0) .AND. (MMODE .EQ. 'PROG,MAN') )
CLRDIST = VALUE/SNSET, CLRSRF, DIST
FLABEL = ASSIGN/'FA'
IF/ ISNOM .EQ. 0
FLABEL = ASSIGN/'F'
ENDIF
CCX = OBTAIN/FLABEL(@CLRLABEL), 3
CCY = OBTAIN/FLABEL(@CLRLABEL), 4
CCZ = OBTAIN/FLABEL(@CLRLABEL), 5
CCI = OBTAIN/FLABEL(@CLRLABEL), 6
CCJ = OBTAIN/FLABEL(@CLRLABEL), 7
CCK = OBTAIN/FLABEL(@CLRLABEL), 8
SNAME = VALUE/SNSLCT
SDIAM = OBTAIN/SS(SNAME), 8
CCX = ASSIGN/CCX + CCI * SDIAM/2
CCY = ASSIGN/CCY + CCJ * SDIAM/2
CCZ = ASSIGN/CCZ + CCK * SDIAM/2
CURX = VALUE/GOTOM, XAXIS
CURY = VALUE/GOTOM, YAXIS
CURZ = VALUE/GOTOM, ZAXIS
TD = ASSIGN/(CURX - CCX) * CCI + (CURY - CCY) * CCJ + (CURZ - CCZ) * CCK
IF/ TD .LT. CLRDIST
TD = ASSIGN/(CLRDIST - TD)
GOTO/CURX+CCI*TD, CURY+CCJ*TD, CURZ+CCK*TD
ENDIF
TD = ASSIGN/(TARX - CCX) * CCI + (TARY - CCY) * CCJ + (TARZ - CCZ) * CCK
IF/ TD .LT. CLRDIST
TD = ASSIGN/(CLRDIST - TD)
GOTO/TARX+CCI*TD, TARY+CCJ*TD, TARZ+CCK*TD
ENDIF
ENDIF
ENDMAC
SNSET/APPRCH, 2.0000
SNSET/RETRCT, 2.0000
SNSET/DEPTH, 0.0000
SNSET/SEARCH, 10.0000
SNSET/CLRSRF, FA(PLN1), 20.0000
F(PT1)=FEAT/POINT,CART,-41.91031,-18.10864,0.00000,0.00000,0.00000,1.00000
$$ CALL/M(EASI_CLEARPLN_GOTO), 1, -41.91031, -18.10864, 3.00000
MEAS/POINT, F(PT1), 1
GOTO/CART, -41.91031,-18.10864,21.00000
PTMEAS/CART, -41.91031,-18.10864,0.00000,0.00000,0.00000,1.00000
ENDMES
F(PT2)=FEAT/POINT,CART,-15.58399,38.26691,0.00000,0.00000,0.00000,1.00000
$$ CALL/M(EASI_CLEARPLN_GOTO), 1, -15.58399, 38.26691, 3.00000
MEAS/POINT, F(PT2), 1
GOTO/CART, -15.58399,38.26691,21.00000
PTMEAS/CART, -15.58399,38.26691,0.00000,0.00000,0.00000,1.00000
ENDMES
F(PT3)=FEAT/POINT,CART,35.85900,30.41144,0.00000,0.00000,0.00000,1.00000
$$ CALL/M(EASI_CLEARPLN_GOTO), 1, 35.85900, 30.41144, 3.00000
MEAS/POINT, F(PT3), 1
GOTO/CART, 35.85900,30.41144,21.00000
PTMEAS/CART, 35.85900,30.41144,0.00000,0.00000,0.00000,1.00000
ENDMES
F(PT4)=FEAT/POINT,CART,17.71968,-37.66482,0.00000,0.00000,0.00000,1.00000
$$ CALL/M(EASI_CLEARPLN_GOTO), 1, 17.71968, -37.66482, 3.00000
MEAS/POINT, F(PT4), 1
GOTO/CART, 17.71968,-37.66482,21.00000
PTMEAS/CART, 17.71968,-37.66482,0.00000,0.00000,0.00000,1.00000
ENDMES
F(PT5)=FEAT/POINT,CART,73.18713,-25.77463,-13.18713,0.70711,-0.00000,0.70711
$$ CALL/M(EASI_CLEARPLN_GOTO), 1, 75.30845, -25.77463, -11.06580
MEAS/POINT, F(PT5), 1
GOTO/CART, 75.30845,-25.77463,21.00000
PTMEAS/CART, 73.18713,-25.77463,-13.18713,0.70711,-0.00000,0.70711
ENDMES
F(PT6)=FEAT/POINT,CART,76.04841,26.04698,-16.04841,0.70711,-0.00000,0.70711
$$ CALL/M(EASI_CLEARPLN_GOTO), 1, 78.16973, 26.04698, -13.92709
MEAS/POINT, F(PT6), 1
GOTO/CART, 78.16973,26.04698,21.00000
PTMEAS/CART, 76.04841,26.04698,-16.04841,0.70711,-0.00000,0.70711
ENDMES
F(CIR2)=FEAT/CIRCLE,INNER,CART,-0.00000,0.00000,-5.58180,0.00000,0.00000,1.00000, 68.00000
$$ Measurement points are created through nominal points
$$ CALL/M(EASI_CLEARPLN_GOTO), 1, 29.41027, 9.79981, 21.00000
MEAS/CIRCLE, F(CIR2), 5
GOTO/CART, 29.41027, 9.79981, 21.00000
PTMEAS/CART, 32.25642, 10.74818, -5.58180, -0.94872, -0.31612, 0.00000
GOTO/CART, 24.94252, 18.40844, -5.58180
GOTO/CART, 18.03322, 25.21513, -5.58180
GOTO/CART, 9.35871, 29.55359, -5.58180
PTMEAS/CART, -0.25434, 33.99905, -5.58180, 0.00748, -0.99997, 0.00000
GOTO/CART, -9.79981, 29.41027, -5.58180
GOTO/CART, -18.40844, 24.94252, -5.58180
GOTO/CART, -25.21513, 18.03322, -5.58180
PTMEAS/CART, -32.41361, 10.26439, -5.58180, 0.95334, -0.30189, 0.00000
GOTO/CART, -30.99913, -0.23190, -5.58180
GOTO/CART, -29.41027, -9.79981, -5.58180
GOTO/CART, -24.94252, -18.40844, -5.58180
PTMEAS/CART, -19.77837, -27.65531, -5.58180, 0.58172, 0.81339, 0.00000
GOTO/CART, -9.35871, -29.55359, -5.58180
GOTO/CART, 0.23190, -30.99913, -5.58180
GOTO/CART, 9.79981, -29.41027, -5.58180
PTMEAS/CART, 20.18991, -27.35631, -5.58180, -0.59382, 0.80460, 0.00000
GOTO/CART, 18.40844, -24.94252, 21.00000
ENDMES
T(TCOR1)=TOL/CORTOL,XAXIS,-0.03000,0.03000
T(TCOR2)=TOL/CORTOL,YAXIS,-0.03000,0.03000
T(TCOR3)=TOL/CORTOL,ZAXIS,-0.03000,0.03000
T(TPFP1)=TOL/PROFP,-0.03000,0.03000
OUTPUT/FA(PT1),TA(TCOR1),TA(TCOR2),TA(TCOR3),TA(TPFP1)
OUTPUT/FA(PT2),TA(TCOR1),TA(TCOR2),TA(TCOR3),TA(TPFP1)
OUTPUT/FA(PT3),TA(TCOR1),TA(TCOR2),TA(TCOR3),TA(TPFP1)
OUTPUT/FA(PT4),TA(TCOR1),TA(TCOR2),TA(TCOR3),TA(TPFP1)
OUTPUT/FA(PT5),TA(TCOR1),TA(TCOR2),TA(TCOR3),TA(TPFP1)
OUTPUT/FA(PT6),TA(TCOR1),TA(TCOR2),TA(TCOR3),TA(TPFP1)
OUTPUT/FA(CIR2),TA(TCOR1),TA(TCOR2)