实例式编程
Ⅰ 防御式编程的相关实例
1. 在非法输入(Invalid Inputs)中保护你的程序
一个好程序,在非法输入的情况下,要么什么都不输出,要么输出错误信息。有几种方法来防止非法的输入:
(1)检查来自于外部资源(external sources)的所有数据的值,例如来源于网络的数据的值,来源于文件的数据的值。检查的目的是保证数据值在一个允许的范围内。
(2)检查每一个例程(routine)的输入参数值。
一旦非法输入被发现,那么应该根据情况进行处理。防御式编程的最佳的形式是在一开始就不引入错误。
2. 断言(Assertions)
一个断言通常是一个例程(routines)或者一个宏(marcos)。每个断言通常含有两个参数:一个布尔表示式(a boolean expression)和一个消息(a message)。一个布尔表达式的反面表示了一个错误。C 标准库提供了一个 assert 宏,它只带有一个参数,用法如下:
assert(1 == 0); // 注意 boolean expression 不要加引号
使用 assert 宏,需要包含头文件 cassert 或者assert.h,执行上面语句的结果是程序终止运行,输出与下面消息类似的消息:
Assertion failed: 1 == 0, file d:我的文档visual studio projectslearningassertassert.cpp, line 9
通常来说,我们会定义自己的 assert 宏,其目的有两个:
(1)新增参数,例如新增一个消息参数,使得 assert 宏输出更为丰富的信息。
(2)改变 assert 的行为内容。C 标准库中的 assert 宏将中断程序,实际上,我们可以让程序继续运行而不中断或者进入调试状态等,另外还可以控制消息输出的目标,即控制消息是输出到控制台还是文本文件,甚至是通过网络发出。
下面是一个 C++ 实现的断言:
#ifdef _DEBUG
#define Assert(exp, message)
{
if (!(exp))
{
std::cout << Assertion failed: << #exp <<
<< Message: << message <<
<< line: << __LINE__ <<
<< file: << __FILE__ <<
;
exit(EXIT_FAILURE);
}
}
#else
#define Assert(exp, message)
#endif
执行 Assert(1 == 0, Error); 结果为:
Assertion failed: 1 == 0
Message: Error
line: 24
file: d:我的文档visual studio projectslearningassertassert.cpp
使用断言应该注意一下的几个问题:
1)对非预期错误使用断言
断言中的布尔表达式的反面一定要描述一个非预期错误,下面所述的在一定情况下为非预期错误的一些例子:
(1)空指针。
(2)输入或者输出参数的值不在预期范围内。
(3)数组的越界。
非预期错误对应的就是预期错误,我们通常使用错误处理代码来处理预期错误,而使用断言处理非预期错误。在代码执行过程中,有些错误永远不应该发生,这样的错误是非预期错误。断言可以被看成是一种可执行的注释,你不能依赖它来让代码正常工作(《Code Complete 2》)。例如:
int nRes = f(); // nRes 由 f 函数控制, f 函数保证返回值一定在 -100 ~ 100
Assert(-100 <= nRes && nRes <= 100); // 断言,一个可执行的注释
由于 f 函数保证了返回值处于 -100 ~ 100,那么如果出现了 nRes 不在这个范围的值时,就表明一个非预期错误的出现。后面会讲到“隔栏”,那时会对断言有更加深刻的理解。
2)不要把需要执行的代码放入断言中
断言用于软件的开发和维护,而通常不在发行版本中包含断言。
需要执行的代码放入断言中是不正确的,因为在发行版本中,这些代码通常不会被执行,例如:
Assert(f()); // f 函数通常在发行版本中不会被执行
而使用如下方法则比较安全:
res = f();
Assert(res); // 安全
3)对来源于内部系统的可靠的数据使用断言,而不要对外部不可靠的数据使用断言,对于外部不可靠数据,应该使用错误处理代码。再次强调,把断言看成可执行的注释。
前条件(preconditions)和后条件(postconditions)
前条件是调用方代码在调用例程(routines)或者实例化对象之前要确保为真的条件,后条件是例程执行后或者类实例化后应满足的条件。下面是一个例子:
// 前条件,这里 nNum1 和 nNum2 的取值被前面代码所约束并保证取值在 -50 ~ 50
Assert(-50 <= nNum1 && nNum1 <= 50, Add_nNum1);
Assert(-50 <= nNum2 && nNum2 <= 50, Add_nNum2);
int nRes = add(nNum1, nNum2);
// 后条件
Assert(-100 <= nRes && nRes <= 100, Add_nRes);
注意,由于 nNum1 和 nNum2 取值范围已经被约束,因此可以使用断言,但是如果 nNum1 和 nNum2 的值来源于不可靠的外部系统,那么应该使用错误处理代码,而不是使用断言。
3. 错误处理技术
这里主要讲述如何处理预期错误。
(1)终止程序运行
有些错误非常严重,如果出现,那么最好就的做法就是让程序终止并且让用户重启程序。例如,对于显示 X 光片的绘图程序,如果数据出错,那么就关闭程序,这个时候关闭程序要远远好于显示错误的数据。
(2)继续程序运行
有时候,错误出现了,但是没有必要去关闭程序,那么就有两种处理方案:
a. 在例程中处理错误
例如让例程返回一个中立值,这是一种可行的方法,中立值在有些语言里面被描述为“类型的默认值”,例如整型的中立值为 0,指针的中立值为 NULL(或 null 等)
b. 在例程外处理错误
返回一个错误码也是可行的,返回错误码意味着,错误将交由其他程序部分来处理,而不是本例程处理。
对于出现了错误,而没有终止程序的运行,这时候,你可以在日志文件中添加一个警告信息。
抉择:正确性和健壮性
有些程序要求非常高的正确性,而有些程序要求较高的健壮性,通常两者我们只能取其一。
(1)正确性意味着结果永远是正确的,如果出错,宁愿不给出结果也不要给定一个不准确的值。
(2)健壮性意味着通过一些措施,保证软件能够正常运行下去,即使有时候会有一些不准确的值出现。
4. 隔栏(barricades)
隔栏本身就是一组错误处理代码,对于内部类只需要使用断言而无需使用错误处理代码。当断言为假时,表明了问题出在了程序中而不是数据中,需要通过修改代码来消除问题。在此,请读者联系本文开始 --- “在非法输入(Invalid Inputs)中保护你的程序”这一部分进行思考。
Ⅱ SIEMENS数控系统编程指令详解及综合实例的目录
第1章 基本概念
1.1 插补功能
1.2 进给功能
1.3 参考点
1.4 机床零点
1.5 坐标系
1.5.1 机床坐标系
1.5.2 工件坐标系
1.6 主轴功能
1.7 切削速度
1.8 辅助功能
1.9 主程序和子程序
1.10 准备机能
1.11 刀具长度与半径补偿功能
1.11.1 对刀仪测量法
1.11.2 手动测量法
1.12 极坐标
1.13 绝对尺寸/增量尺寸
1.14 模态/非模态
第2章 编程语言详解
2.1 准备功能(G指令)
2.1.1 GOO快速定位(模态指令)
2.1.2 G01直线插补(模态指令)
2.1.3 G02/G03圆弧插补(模态指令)
2.1.4 G02/G03 TURN螺旋线插补
2.1.5 G04暂停时间(非模态指令)
2.1.6 G17、G18、G19平面选择(模态指令)
2.1.7 G40、G41、G42刀具半径补偿功能(模态指令)
2.1.8 G33恒螺距螺纹切削(模态指令)
2.1.9 G53、G153、SUPA(非模态)、(3-500(模态指令)
2.1.10 G54、G65、G56、G57工件坐标系(模态指令)
2.1.11 G09(非模态指令)、G60(模态指令)准确停止
2.1.12 G63攻螺纹方式(非模态指令)
2.1.13 G64/G641连续切削加工方式(模态指令)
2.1.14 G70/G7l/G700/G7lO公制/英制编程单位选择(模态指令)
2.1.15 G74自动返回到参考点(非模态指令)
2.1.16 G90/G91绝对/增量尺寸(模态指令)
2.1.17 G94/G95进给速度单位变换(模态指令)
2.1.18 G110、G111、G112定义极坐标极点(非模态指令)
2.1.19 G331/G332刚性攻螺纹(模态指令)
2.1.20 G450/G451拐角外部补偿(模态指令)
2.1.21 CHF/CHR倒斜线角功能(非模态指令)
2.1.22 RND/RNDM倒圆弧角功能
2.1.23 CIP过中间点的圆弧插补
2.1.24 G25/G26工作区域及主轴转速限定(非模态指令)
2.2 辅助功能(M功能)
2.3 标准循环
2.3.1 MCALL CYCLE81
2.3.2 MCALL CYCLE82
2.3.3 MCALL CYCLE83
2.3.4 MCALL CYCLE84
2.3.5 MCALL CYCLE840
2.3.6 MCALL CYCLE85
2.3.7 MCALL CYCLE86
2.3.8 MCALL CYCLE87
2.3.9 MCALL CYCLE88
2.3.1 MCALL CYCLE89
2.3.11 MCALL CYCLE90
2.3.12 HOLES1
2.3.13 HOLES2
2.3.14 CYCLE801
2.3.15 LONGHOLE
2.3.16 SLOT1
2.3.17 SLOT2
2.4 FRAME功能概述
2.4.1 TRANS、ATRANS可编程零点偏移(非模态指令)
2.4.2 ROT、AROT坐标系旋转(非模态指令)
2.4.3 SCALE、ASCALE可编程比例系数缩放(非模态指令)
2.4.4 MIRROR、AMIRROR镜像功能(非模态指令)
2.5 参数编程与程序跳跃
2.5.1 参数编程
2.5.2 程序跳跃
2.6 子程序与重复语句
2.6.1 子程序调用
2.6.2 重复语句
2.7 特殊功能
2.7.1 TRAILON联动指令打开
2.7.2 TRAILOF联动指令关闭
2.7.3 GEOAX几何轴给定
第3章 编程实例与习题
3.1 基础篇编程实例
3.1.1 钻孔编程实例
3.1.2 圆弧铣削编程实例
3.1.3 整圆编程实例
3.1.4 直线、圆、圆弧综合编程实例
3.1.5 极坐标编程实例1
3.1.6 极坐标编程实例2
3.1.7 坐标旋转编程实例
3.1.8 螺旋线插补编程实例
3.1.9 均布圆周孔加工编程实例
3.1.10 均布直线孔排列编程实例
3.1.11 绝对坐标平移与附加坐标平移编程实例
3.1.12 倒斜角编程实例
3.1.13 倒圆弧角编程实例
3.1.14 比例缩放编程实例
3.1.15 镜像功能编程实例
3.1.16 网状孔排列加工编程实例
3.1.17 重复语句编程实例
3.1.18 G18平面编程实例
3.2 特殊篇编程实例
3.2.1 主程序调用子程序编程实例
3.2.2 条件语句编程实例
3.2.3 凸轮加工编程实例
3.2.4 椭圆加工编程实例
3.2.5 链轮式加工编程实例
3.2.6 三维斜面加工编程实例
3.2.7 三维曲面加工编程实例
3.2.8 球面加工编程实例
3.2.9 标轴旋转编程实例
3.2.10 联动指令编程实例
3.2.11 圆柱面加工编程实例
3.2.12 钻圆盘孔编程实例
3.2.13 半椭圆球加工实例
3.3 综合编程实例
3.3.1 钻、铣、攻螺纹综合编程实例
3.3.2 钻、铰、铣综合编程实例
3.3.3 铣削综合编程实例
3.3.4 综合铣削实例
3.3.5 钻、镗、铣、攻螺纹综合编程实例
附录一
西门子系统通信简易使用说明
一、PCIN软件参数设置
二、机床NC中通信参数设置
三、通信电缆线
四、数据传输、DNC的操作方法与步骤
五、常见问题及解决办法
附录二
常用国产刀具切削用量
附录三
A ISO标准中的G代码
B SIEMENS 840D系统中G功能/预备条件
C SIEMENS 840D系统开机默认功能
参考文献
Ⅲ 数控车床编程实例详解
一、数控车编程特点
(1)可以采用绝对值编程(用X、Z表示)、增量值编程(用U、W表示)或者二者混合编程。
(2)直径方向(X方向)系统默认为直径编程,也可以采用半径编程,但必须更改系统设定。
(3)X向的脉冲当量应取Z向的一半。
(4)采用固定循环,简化编程。
(5)编程时,常认为车刀刀尖是一个点,而实际上为圆弧,因此,当编制加工程序时,需要考虑对刀具进行半径补偿。
Ⅳ 海德汉系统,宏程序编程实例铣圆,铣槽,铣方,谁有,帮下忙啊,谢谢了
参考下新代系统
@MACRO;
G40 G57 G90 G80 G49 G17;
M6T6;
M3 S2500;
M08;
G0 X0 Y0;
Z0;
A0;
#1=0;
WHILE(#1<=315.0)DO;
G0 A#1;
#2=0;
N100 G0 Z-#2;
G1 X-35.0 F1500.0;
Y-8.0;
X0;
Y-16.0;
X-35.0;
Y-24.0;
X0;
G0 X0 Y0;
#2=#2+0.5;
IF(#2<=6)THEN GOTO100;
END_IF;
G0 Z20.0
#1=#1+45.0;
END_WHILE;
G0 Z50.0;
G91 G28 Z0.0;
M09;
M05;
M30;
%
FANUC铣槽程序:
Ⅳ 数控编程的实例!
数控机床编程实例
作者: 来源:
--------------------------------------------------------------------------------
常用的圆弧编程指令是G2和G3,使用时必须编入圆弧起点坐标,终点坐标、圆弧半径或中心坐标,可处理各种类型的圆弧编程。西门子810D/840D系统中的CT和RND指令也可以生成精确的圆弧轨迹,在加工轮廓中出现用圆弧与其他直线或圆弧相切连接的轨迹时,灵活运用CT和RND指令进行圆弧编程比使用G2和G3指令方便得多:
--------------------------------------------------------------------------------
一、两种特殊的圆弧编程指令:CT和RND
常用的圆弧编程指令是G2和G3,使用时必须编入圆弧起点坐标,终点坐标、圆弧半径或中心坐标,可处理各种类型的圆弧编程。西门子810D/840D系统中的CT和RND指令也可以生成精确的圆弧轨迹,在加工轮廓中出现用圆弧与其他直线或圆弧相切连接的轨迹时,灵活运用CT和RND指令进行圆弧编程比使用G2和G3指令方便得多:
1、RND指令处理轮廓拐点的圆弧过渡
RND指令的含义:轮廓拐点处用指定半径的圆弧过渡处理,并且和相关的直线或圆弧相切连接,数控系统自动运算各个切点的坐标。
参照图1 加工内容为底边外的其余轮廓,所用程序如下。
N005 G54 G90 G0 Z100 T1 D1
N010 X-70 Y-50
N015 M03 S1000 F500 Z-10
N020 G41 Y-20
N025 G1 Y70 RND=5
N030 G1 X-40 RND=5
N035 G3 ×0 CR=20 RND=5
N040 G3 ×40 CR=20 RND=5
N045 G1×70 RND=5
N050 G1 Y-30
N055 M30
程序中用RND=5的格式表示轮廓拐点处用半径R5的圆弧过渡处理,并与相关的直线或圆弧相切连接,数控系统自动运算各个切点的坐标,程序中不需写入切点的坐标。而用G2和G3指令编写各处R5圆弧就必须计算各个切点的坐标(共10个点),还多了五条程序。
2、CT指令完成直线和圆弧或圆弧和圆相切边接
CT指令的含义是:经过一段直线或圆弧的结束点P1和另一个指定点P2生成一段圆弧并且和前面的直线或圆弧在P1点处相切,数控系统自动运算圆弧半径CT指令是模态的。
参照图2 加工内容为底边外的其余轮廓,所用程序如下:
N005 G54 G90 G0 Z100 T1 D1
N010 X-90 Y-120
N015 M03 S1000 F500Z-10
N020 G41Y-100
N025 G1 Y20
N030 X-60
N040 Yo
N045 CT X-20(第一个R20圆弧)
N050 X20(第二个R20圆弧)
N055 X60(第三个R20圆弧)
N060 G1 Y20
N065 G1×90
N070 Y-100
N075 M30
用CT在编制程序时只需输入切点坐标而不用写入圆弧半径,也不用判断圆弧的方向,在直线和圆弧或多段圆弧相切连接的轮廓编程时使用非常方便。
3、CT和RND指令在极坐标系中的应用
在极坐标系中用G2和G3指令编程时有一个限制,极点必须设定在所编程圆弧的中心。而用CT和RND指令就很好地克服了这一障碍。
(1)RND指令在极坐标系中的应用
参照图3在数控铣床加工4个30度的V型槽,以90度位置的V型槽为例程序如下。
N005 G54 G0 T1 D1 Z100
N010 G111 Xo YO
N015 AP=90-15 RP=110
N020 M03 S1000 F500 Z10
N025 G42 RP=100
N030 G1 RP=0 RND=10
N035 G1 RP=100
N040 M30
(2)CT指令在极坐标系中的应用。
参照图4 加工上部的3段圆弧和2段直线相切连接的部位,程序如下。
N005 G54 G90 Go Z100 T1 D1
N010 G111 XO YO
N015 AP=90-36-18 RP=150
N020 M03 S1000 F500 Z-10
N025 G42 RP=130
N030 G1 RP=142.66/2
N035 CT AP=90-18
N040 AP=90+18
N045 AP=90+18+36
N050 G1 RP=150
N055 M30
图3和图4 这两种类型的工件加工部位使用算术坐标系编程数据处理比较麻烦,在极坐标系中用G2和G3指令编程圆弧时极点必须设定在所编圆弧的中心,需要一些计算工作,而使用RND和CT指令编程圆弧时,极点就不必设定在所编圆弧的中心,极点可以设定在任意的方便数据处理的位置。图3和图4 这两种类型的工件加工部位在编程时使用极坐标且极点设定在工件中心最为方便。
二、特殊刀具补偿方法在加工扇形段导入板中的应用
1、一般的刀具补偿方法
参照图5 ,在数控铣上用40mm立铣刀加工60H7的槽,按照槽的边界线进行编程,使用的程序如下。
N005 G54 G90 Go Z100 T1 D1
N010 X-150 YO
N020 M03 S300 F100 Z30
N025 G42 Y30
N030 G1×150
N035 Y-30
N040 X-150
N050 M30
实际加工中要经过粗加工、半精加工和精加工运行三次程序,对应的半径补偿值先大后小分别是22mm,20.5mm,20mm(理念值,最终的半径补偿值要经过实际测量确定)。
2、特殊的刀具补偿方法
参照图5,在数控铣床上40mm立铣刀加工60H7的槽,按照中心线进行编程,使用的程序如下。
N005 G54 G90 GO Z100 T1 D1
N010 X-150 YO
N020 M03 S300 F100 Z30
N025 G42 X-140
N030 G1 X150
N035 GO Z100
N040 G40 X-150
N050 Z30
N055 G41 X-140
N060 G1 X150
N065 GO Z100
N070 M30
实际加工中要经过粗加工、半精加工和精加工运行三次程序,对应的半径补偿先小后大分别是8mm、9.5mm,10mm(理论值,最终的半径补偿值要经过实际测量后确定),最终的半径补偿理论值=槽的宽度/2-刀具半径。在程序中分别用G41和G42激活两次刀补,增加了一次空行程,这种使用刀具半径补偿的方式在加工一般类型的工件时显得很麻烦,但是在加工特定类型的工件时使用这种方法就会使编程工作变得非常简单。
3、在加工扇形段导入板中的应用
在一些比较特殊槽体的加工中,图纸中只标注槽的宽度、深度和中心线的形状尺寸,针对这一类型的工件,按照中心线进行编程,加工中应用特殊的刀具补偿方法。
参照图6,这是我公司薄板厂连铸设备中使用的扇形段导入板,它是扇形段导入装置中的关键零件。用Tk6920数控锉铣床的加工七条128×44mm导入槽。该工件的七条导入槽是由多段圆弧和直线相切连接构成,图纸中只标注了槽的宽度、深度和中心线的形状尺寸,以上部第一个导入槽为例说明特殊的刀具补偿使用方法,按照中心线进行编程。
程序名称:CA01
程序内容:N5 G54 G90 G64 GO Wo Z150 T1 D1(调用第一个刀号)
N10 G111 XO YO
N15 X=-1804-100 Y=464.424
N20 M04 S250 F200 Z-44
N25 G41 X=IC(50)(激活刀补开始加工槽体的上边界)
N30 G1 X=-1804+920.617
N35 CT AP=90-16.03 RP=1499.5
N40 G1 AP=90-16.03 RP=1499.5+100
N45 GO G40 X=IC(100)Z150
N50 X=-1804-100 Y=464.424 T1 D2(调用第二个刀号)
N55 G42 X=IC(50)(激活刀补开始加工槽体的下边界)
N60 G1 X=-1804+920.617
N65 CT AP=90-16.03 RP=1499.5
N70 G1 AP90-16.03 RP=1499.5+100
N75 GO G40 X=IC(100)Z150
N80 M30
槽的宽度和中心线不对称,程序中用了两个刀号,加工槽体的上边界时用D1,加工槽体的下边界是时用D2,实际加工中用50mm铣刀要经过粗加工、半精加工和精加工运行三次程序,对应的半径补偿值先小后大分别是D1=100mm,12mm,12.5mm,D2=13mm,15mm,15.5mm.
如果使用一般的刀具补偿使用方法,按照槽的边界线进行编程,就要计算槽的边界线中各段圆弧和直线切点的坐标以及各段圆弧的半径,计算量是非常大的。而按照中心线进行编程就可直接使用力纸上标注的尺寸,避免了大量、繁琐的数据计算工作,保证了程序中所用数据的准确性,极大的提高了编程效率。
其方法有两个特殊:(1)按照中心线进行编程而不是按照真实的加工边界线进行编程。(2)刀具补偿值按照粗加工、半精加工和精加工的顺序逐渐加大,理论补偿值二加工的边界到中心线的距离--刀具半径。优点是直接使用图纸上标注的尺寸进行编程,保证了程序中所用数据的准确性,不需进行大量繁琐的数据计算工作。
Ⅵ 编程中类的实例化是什么
在面向对象的编程中,通常把用类创建对象的过程称为实例化,其格式如下:
类名 对象名 = new 类名(参数1,参数2...参数n)
(这里,“类名”这个类名实例化成了“对象名”这个对象)
如 Date date=new Date();就是用日期类创建了一个日期的对象,就叫对象的实例化。
多数语言中,实例化一个对象 其实就是在内存中开放一个空间 用于存储新的产物,即对象。
例如一个类class A{
.....
}
A a=new A();
Ⅶ 以实例说明VFP如何既支持过程式编程又支持面对对象可视化编程的
摘要 可以直接用VFP支持的两种工作方式来进行说明就可以了。
Ⅷ 是否有函数式编程的优秀实例
是否有函数式编程的优秀实例
泛泛而谈,很多项目都吸取了函数式编程的良好实践。
Ⅸ 单片机c语言编程100个实例
单片机属于嵌入式开发,做单片机编程的都对硬件、软件都要很熟悉,要熟练的使用汇编和c语言。如果是c语言单片机编程的话,可能会对汇编要求不是太严格,但一定得懂,不懂汇编的话,你也基本不会懂单片机的c语言中加入的一些东西。不过用c要比全用汇编开发效率高出很多。
Ⅹ 刚开始接触arm,求简单的嵌入式c编程实例
学了ARM 的 Cortex-M3 再看 51(扩展后的51如8051F040),个人感觉51只能算玩具级了,无论地址空间、外设...还是基本的IO端口都不在一个档次(51FANS别砸我:)。
要熟悉想STM32这样的CPU编程可以看它的固件库,里面有个chm文件讲的很详细,包括所有外设操作的例子都有(每行代码基本都有注释);
要用实时操作系统的话有UCOSII,或者Rt-Thread,需要的话可以留个邮箱或者自己搜索一下。