程序开发

2024-10-16

程序开发(共12篇)

程序开发 篇1

0 引言

高级业务应用编程语言(Advanced Business Application Programming,简称ABAP,是SAP/R3目前唯一的系统开发工具,目前已经发展到第四代语言(4GL),所以我们用ABAP/4来代表第四代ABAP编程语言。在语法上类似于Visual Basic或JAVA。在早期ABAP/4产生的最初目的是用以生成简单打印报表程序,因为SAP最初就是为解决财务实时数据处理问题;现在它已经用于编写SAP AG的几乎全部产品源代码。ABAP/4不仅仅是一个开发工具,而且是一套完整的client/server开发环境,它包括支持程序开发的一些函数和包等。

ABAP/4程序模块(Program Structure Module)可分为过程块内的顺序编码、报表、对话框三部分:

(1)过程块内的顺序编码与一般语言语法近似,如IF,WHILE等,但并没有GOTO语法。

(2)报表是调用一个独立的事件(Depending Event),读取数据库产生数据列表。

(3)屏幕参数输入的对话框是专门处理数据库读取或更改的事务过程。

1 ABAP语言开发基础

1.1 SAP ABAP/4的开发环境及开发环境架构。

ABAP/4开发具备SAP正式系统环境、SAP IDES系统环境、MINISAP环境三种环境。三种环境中均含有大量的例子程序,事务代码(TCODE)。三种环境都能够实现全部功能的ABAP开发(包括数据库编程)。其中SAP正式环境含有业务功能并能进行开发,需要经过较复杂的系统配置,才能使用业务功能。但没有任何业务数据;SAP IDES环境含有业务功能并能进行开发,而且含有一套完整演示数据,能直接使用各类业务功能,同时,对于例子程序,也有演示数据,能进行ABAP/4的真实业务程序开发;MINISAP没有业务功能,只有开发和维护功能,对于例子程序,也没有演示数据。

另外,SAP正式环境和SAP IDES环境开发都需要向SAP公司申请开发关键字,后台的数据库可以是SQL SERV-ER,ORACLE等,需要很高的配置。而MINISAP需要的配置很低,需要使用Microsoft的MSDE数据库(Microsoft Data Engine)。

1.2 SAP开发环境也属于三层架构

SAP开发环境和Delphi的三层逻辑架构相似,(如图1所示),即数据层、应用层、表示层。

数据层是系统后台数据库,集中存储来自各个SAP客户端即SAP GUI的数据。反之它也是SAP客户端的数据源;而应用层用来处理SAP各个模块应用的业务逻辑,然后返回结果;通常SAP GUI会话管理器就是是所谓的表示层,它是通过TCP/IP、SAP演示协议或RFC和应用服务器与应用层和后台数据层进行数据传输的,用户看到的只是处理后的数据返回。

1.3 ABAP/4开发基础和常用的数据定义及变量申明语法

1.3.1 基本数据类型

ABAP/4中预定义的基本数据类型,有效大小以字节为单位。见表1:

其中数据类型D、F、I和T都是预定义的,但数据类型C、N、P和X可以有附加说明。

1.3.2 ABAP/4字典

ABAP/4数据字典(Data Dictionary,DDIC)是SAP系统中定义和管理数据元素和数据库的中心工具,是ABAP/4Workbench的一个重要组成部分,所有其他开发平台工具组件都可以访问在数据字典中定义的对象。SAP项目中所有的数据库表结构和系统全局数据类型等,都要在数据字典中创建并维护。数据字典的重要功能是自定义系统公用数据类型(基本类型、结构和表);定义数据库对象结构(数据库表,视图和索引等),同时相关的数据库对象将在数据库中被创建;数据字典也是SAP系统管理各种底层物理数据的通用接口;另外,数据字典还提供了一些工具进行屏幕字段的格式化,编辑。

1.3.3 ABAP/4开发语言的语法元素

ABAP/4编程语言包括1语句、2关键字、2注释三种元素类型,ABAP/4程序包括单个ABAP/4语句,每条语句以关键字开头,以句号结束;关键字是语句的第一个词,它决定整个语句的意义,其具有说明性关键字、事件关键字、控制关键字、操作关键字有四种类型;注释是写在ABAP/4程序语句之间用来向读者解释其目的文本摘要,注释可以帮助其他用户理解和更改程序,注释以星号(*)开始,在次序编译是自动被系统忽略。

1.3.4 常量定义

在ABAP/4/4开发基本数据类型中,数字常量主要是P与I两种数据类型;文本常量主要有C与N两种类型。我们在进行程序开发时一般使用指令CONSTANTS定义常量,如定义一个常量DATA_RETURN等于1.41421,小数点保留5位,我们可以这样定义:

CONSTANTS DATA_RETURN TYPE P DECI—MALS 5 VALUE‘1.41421’。

1.3.5 变量定义

变量是用于以一定名称按一定格式保存并参考数据,可能在名称、类型、长度、结构方面不同,我们在进行程序开发时可以用DATA语句在程序中声明变量。变量声明包含name,type,length和structure四个部分,使用DATA命令,如

常量和变量一起统称为ABAP/4程序的内部数据对象,它仅供当前所开发程序内部使用,在该程序之外无效。

1.3.6 系统定义数据

这是由系统所定义的专有名词,如:

SPACE“空格字符串;

SY-SUBRC"系统执行返回值,0表示成功;

SY-UNAME"登录帐号;

SY-DATUM"系统日期;

SY-UZEIT"系统时间;

SY-TCODE“目前的事务码;

1.3.7 字符串数据类型申明

其中字段串是其它数据类型的集合,可以用TYPES语句或DATA语句定义字段串。语法如下:

S2 TYPE P.

END OF MRYSRING.

表示定义了一个长度为l8的字段串MRYSTRING。

1.3.8 内表申明

内表是SAP的突出特点,在程序开发可以使用DATA或TYPES语

句定义内表,内表在ABAP/4程序开发中被大量使用,其目的是为了避免频繁的数据库访问。当程序中需要处理大批量数据时,一般采用先建立内表,然后结合LOOP—ENDLOOP、LOOP AT‘内表’WHERE‘限制条件’、SELECT—END SELECT循环将需要的数据读取到内表中,再进行数据处理,这样在大数量级的处理上就有明显的性能优势。使用内表后,相当于把数据放在一个缓存中,然后在这个开辟的缓存空间中再次进行循环使用,这样就可以减少搜索数据的时间。由于SELECT—END SELECT循环开发的程序代码执行效率比较低,在程序中应尽量减少SELECT—END SELECT的使用。在语法结构上类似字符串数据类型申明,只是内表申明带有OCCURS参数。例如:

字符串数据和内表是ABAP/4程序中的一种特殊的数据类型,因为它是用户定义的。结构化类型数据系ABAP/4程序外部数据对象,它独立于应用程序,在所开发的应用程序中不能直接使用外部数据对象,但能将其复制到内部数据对象,并在完成后将它们回写到内表中,可以在整个系统环境中全局使用外部数据对象。但是内表和字符串数据不同,它由相同类型的几行组成;字段串仅“水平地”扩展不同,内表还“垂直地”扩展。

1.3.9 工作区

工作区是用来在操作数据库和数据传输的时候,存储数据的一个临时区域,在ABAP/4程序进行数据库访问的时候是先将数据取到库到工作区中,然后再将数据读到内表中;最后在操作内标。ABAP/4这种程序设计在进行SQL查询的时候可以大大节省查询时间,提高程序运行效率。

一般情况下,在使用DATA语句申明内标的同时就会自动开辟一个临时工作区,只是这种工作区分为显式工作区和隐式工作区。语法结构如:

DATAOCCURS[WITH HEAD-ER LINE]。“WITH HEADER LINE”是可选参数,如果带有该参数就表示该工作区为显式,反之则为隐式。

2 在ABAP/4开发中经常使用的事件和主要的程序开发类型。

2.1 常用的ABAP/4开发事件

2.1.1 INITIALIZATION事件

启动已定义选择屏幕的程序时,系统通常先处理选择屏幕。如果希望在处理选择屏幕之前执行过程块,可以把它分配给事件关键字INITIALIZATION。在此块中,可以指定初始化选择屏幕的语句,例如更改选择参数的默认值。

2.1.2 AT SELECTION—SCREEN事件

在选择屏幕仍然活动时,处理选择屏幕上输入之后的点,提供系统处理选择屏幕时执行过程块的不同方法。例如选择屏幕上的CHECKBOX的选择与否;RA—DIOBUTTON与LISTBOX的选择情况等等。

2.1.3 START—OF—SELECTION事件

处理离开选择屏幕之后的点,在进入第二屏幕之前触发。

2.1.4 END~OF—SELECTION事件

在系统读取和处理完所有数据库表之后定义的过程块。表明第二屏幕显示完毕,结束处理。ABAP/4程序中的每个语句都属于特别的事件关键字,即使在程序中没有指定任何事件关键字,所有语句都自动归属于事件关键字START—OF—SELECTION中。

2.2 ABAP/4程序主要的开发类型。

在ABAP/4程序开中最基本的也是最常使用的开发有四种:一是报表开发,主要使用到数据库读取、ALV报表显示、LIST等技术;二是采购订单、财务账单等单据的打印程序,主要使用到数据库读取、SmartForms、Form等技术;三是数据上载功能开发,主要使用到数据库存取、CATT、BDC等技术;四是系统功能模块开发与配置。

3 ABAP/4程序开发六步法

ABAP/4程序总的来说都是以REPORT或PROGRAM语句开头;数据声明在程序的起始部分中;每个语句必须以句号结尾,词与词之间至少有一个或者以上的空格,语句可以缩进几列,也可以跨越几行。笔者结合自己的开发经验,总结出ABAP/4程序开发遵循六步法。

3.1 客户开发需求分析。

ABAP/4程序员在接到需求开发任务后,要做的也是必不可少的第一项工作就是做开发需求分析,通过详细分析可以更加准确地把握开发需要,避免因性能和使用方面的问题导致不满;同时还可以大大降低开发费用和减少因为没有准确理解开发需求而带来大量的程序修改和反工。总之,需求分析是ABAP/4程序开发的开始,也是质量控制的开始,同时,需求分析还具有决策性、方向性、策略性的作用,在需求分析阶段如果需求分析不到位或不彻底,在后面的程序开发中,诸如致使设计、编码、测试无法顺利进行或大大增加程序修改工作量以及开发成本等等问题也会随之而来。

3.2 启动开发平台,定义程序基本属性。

ABAP/4编辑启动事务代码为SE38,输入要创建的程序名(如图2所示)。命名格式一般为Z【项目阶段】_【子项目】_【aa】【tt】【nnn】,其中【项目阶段】与【子项目】对应项目阶段代码和子项目代码,是根据系统实施的实际情况赋予的一个值,它在一段时间内恒定;Z代表SAP系统中客户自开发程序;【aa】代表项目SAP标准应用模块;【tt】代表程序类型;【nnn】代表递增序号。例如某某单位实施SAP过程中需要开发一个物资模块的统计报表程序,如果项目阶段是PILOT01,其单位开发子项目是CDOR,物资模块对应的代码为MM,所开发的程序为统计报表,那么其程序类型应该属于RP,递增序号可以根据开发实际情况自定义。综上所述,这个需要开发的程序即可命名为ZPILOT01_CDOR_MMRP00*。

输入程序名后,接下来就需要一一定义开发程序基本属性,包括程序描述或功能说明(Title)、执行模式(Type)、程序开发状态(Status)、程序所属的应用模块(Application)以及程序开发类,由于篇幅问题这里不再详细介绍ABAP程序的以上属性。程序基本属性定义完成后就可以正式进入程序开发,实现客户需求,如图3所示:

3.3 常量、变量等数据定义和字符串、内表、工作区等结构化数据申明

一个ABAP/4程序一般以REPORT开始,之后接的就是程序名,一般在程序开头就需要对在程序中可能使用到的常量、变量等简单数据类型,字符串、内表、工作区等结构化数据类型,输入屏幕等进行定义。

3.4 功能模块语句编程,调用系统功能事件块和函数组,实现客户开发需求

客户的开发需求是通过程序代码中的功能模块编程来实现,ABAP/4程序一般具有标准的程序结构和模式,对标准的程序结构和模块进行再编程和二次开发就能实现大部分客户的开发需求。在程序编写中,核心代码开发就在于数据库操作和取数逻辑,通过程序代码将数据库数据读取到工作区和内表中,然后再调用系统的ALV显示函数、SMARTFORM技术、数据库操作函数、表单显示函数或模块将工作区或内表中的数据展示给用户或将内表中的数据写入数据库表中。程序员在进行程序开发中必须具备较高的SQL语言操作能力和水平。

在ABAP/4程序核心开发有:

(1)使用选择屏幕是报表程序的一部分,可以设计选择屏幕以便交互输入字段值和选择标准,使用户能够控制报表程序的数据库选择。在ABAP/4程序中,可以使用下列语句设计选择屏幕:

1)PARAMETERS为变量定义输入字段;

2)SELECT—OPTIONS为选择标准定义输入字段;

3)SEU CTIONEN格式化选择屏幕。

(2)读取并处理数据库表,ABAP/4集成了标准的SQL,即Open SQL,作为其数据操作语言。

在ABAP/4报表程序中,从数据库表读取数据常使用SELECT语句。如:SELECT SINGLE*FROM SPFLI WHERE(CARRID EQ‘LH’AND CONNID EQ‘2407’.该SELECT语句表示只从SPFLI数据库表中读取CARRID字段中包含“LH”并且CONNID字段中包含“2407”的行到内表中。

(3)输出缓存中的数据,显示在输出屏幕上。

ABAP/4用来在屏幕上输出数据的是WRITE语句。WRITE的一般语法为:WRITE[][].其中主要用来定义输出是否换行、位置及长度等格式规定,主要指格式选项,如:LEFT JUIFIED(靠左对齐显示)、CENTERED(居中)等。

3.5 程序调试和优化

在程序开发结束后,需要做的工作就是程序调试和进行程序效能分析,评估所开发程序的执行频率。一般情况下,如果测试过程中有可能程序无法执行,或者执行程序异常中止,无法得到客户需求的结果,或者取出的数据根本不符合客户需求,就说明所开发的应用程序代码中有错误;另一方面,新开发的程序执行效率比较低,这就要求我们对应用程序进行调试和优化。程序调试和优化工作是一个测试到修改,再到测试,然后再修改循环反复的过程,如此反复才能开发出符合客户需求和高质量、高效率的应用程序。通过程序优化开发出最优数据结构、最优执行语句,设计最优执行流程,达到程序执行速度最快、占用系统资源最少的程序代码,大大提升应用程序执行效率。

3.6 测试、传输

SAP在一般情况下会存在开发系统、测试系统以及生产系统等三组服务器,ABAP/4程序编写在开发系统进行,程序编写完成后就会请求测试组进行程序测试,在测试系统中有虚拟的测试数据用以程序测试,程序通过测试,能完全满足用户需求后,再将应用程序从测试系统中传输到生产系统中后。

4 结语

ABAP程序设计是企业ERP实施过程中必不可少的一环,ABAP程序开发直接影响着企业ERP的实施以及客户开发需求是否能满足和系统功能能否实现。ABAP/4程序开发经验需要大量的项目开发锻炼,通过日积月累,才能掌握更多的经验和技巧。本文是笔者在结合自身的开发经验的基础上总结得出的ABAB/4程序开发基础知识和程序开发六步法,它只是ABAP/4程序中最基本也是ABAB/4程序员必须掌握的基础和方法,仅供ABAP/4程序员参考。

参考文献

[1]高卫红.ABAP程序执行效率的优化.扬子石油化工,2006,(6).Gaoweihong.ABAP program to optimize the efficiency.Yangzi Petrochemical,2006,(6).

[2]李锦宪.白新江等.SAP系统中ABAP编程概述.内蒙古石油化工,2006,(10)Lijinxian,Baixinjiang.Overview of ABAP programming in SAP system.Inner Mongolia Petrochemical,2006,(10).

[3]施权,张忠能.利用SAP-ABAP语言解决客户特制要求的方法,计算机工程,2004,30(Z).Shiquan,Zhangzhongnegn.The use of SAP-ABAP language approach to solve customer-specific requirements.Computer Engineering,2004,30(z).

[4]查洋.应用ABA P/4在SA P R/3系统中进行报表开发.浙江冶金,2006,(3).Zhayang,Application of ABA P/4in the SA PR/3system for report development,Zhejiang Metallurgical,2006,(3)

程序开发 篇2

大学毕业后,四年中的苦与乐都伴随着毕业的铃声而渐渐远去。毕业2年多之后,我辗转过2个行业,慢慢的,开始对自己的职业方向产生怀疑,看到和自己的同窗之间渐行渐远,渐渐找不到自己的方向,我开始陷入迷惘。偶然的机会,和同事们交流了解到安卓程序开发程序员培训,和安卓手机现在巨大的发展空间,并通过自己的了解和朋友的介绍,我发现这个行业是真正适合我的方向!Android 是一个年轻的、有待开发的平台,它有潜力同时涵盖移动电话的两个不同消费群体,甚至可能缩小工作和娱乐之间的差别。于是,我毅然决定辞去原本还不错的工作,跟我的一个哥们从南方的家乡来到遥远的北京。我要来一次:重走青春!

初来到千锋学习安卓,感受到了与自学安卓程序开发不同的温馨和暖意。授课老师不仅给你传授专业的安卓程序开发程序员培训所要掌握的必备知识,而且课后会经常和同学们沟通和交流,并鼓励和引导大家更好的学习。经过了几个月的培训,我们和老师建立了深厚的友谊。老师每天开始上课前,会先复习前一天的知识,做到温故而知新。然后结合实例,现场演示教授当天的知识。并在课后留下相关的练习,让我们课后更好的消化和吸收。经过了复习,讲解和练习的过程,对知识有了更深的理解。在经过每个阶段性学习之后,是项目实战。我觉得这是个人能力提高最快的时候。老师会给予真实的项目开发文档和案例,采用小组分配的方式,充分调动每一位学员的思考和动手能力,真实体会公司实际的开发场景。

除了自己的坚定选择,最需要感谢的就是这里的老师和课程体系,还有我可爱的朝夕相处过共同为了安卓程序开发而拼搏过的同窗们。

我能有今天的一份成绩,站在这样的一个位置,不只是薪资,也不仅仅是在安卓程序开发程序员培训机构学习的短短四个月就能决定的这一切。更主要的是收获了属于自己的一个平台,认识了更多的朋友,让我有能去挑战移动互联网,成为一名真正的安卓程序开发程序员,并能在安卓程序开发的路上,开创属于自己人生中的新起点。

算法与程序·程序框图 篇3

[开始] [产生0~1之间的两个随机数 分别赋给[xi,yi]] [输出[P]][结束] [是][否] [是]

A. [P=N1000] B. [P=4N1000]

C. [P=M1000] D. [P=4M1000]

2. 执行如图所示的程序框图,输出的[S]的值为( )

[开始] [输出[S]][结束] [否] [是]

A.1 B. [23] C. [1321] D. [610987]

3. 如图所示的程序框图中,令[a=x,b=-x,][c=12x+1],若给定一个[x]值,输出的结果仅仅适合[12x+1],则这样的[x]的取值范围是( )

[开始] [输出[a]][结束] [是][否] [输入[a,b,c]] [是] [否]

A. [-∞,-23] B. [-23,2]

C. [-23,2] D. [2,+∞]

4. 如图所示,程序框图的输出结果是( )

[开始] [输出[S]][结束] [否] [是]

A. [16] B. [2524] C. [34] D. [1112]

5. 执行如图所示的程序框图,如果输出的[S=3],那么判断框内应填入的条件是( )

[开始] [输出[S]][结束] [否] [是]

A. [K≤6] B. [K≤7]

C. [K≤8] D. [K≤9]

6. 执行如图所示的程序框图,如果输入的[N=10],那么输出的[S]的值为( )

[开始] [输出[S]][结束] [否] [是] [输入[N]]

A. [1+12+13+…+110]

B. [1+12!+13!+…+110!]

C. [1+12!+13!+…+110!+111!]

D. [1+12+13+…+110+111]

7. 如果执行如图所示的程序框图,输入正整数[N]([N]≥2)和实数[a1,a2,a3,]…,[aN],输出[A,B],则( )

A. [A+B]为[a1,a2,a3,]…,[aN]的和

B. [A+B2]为[a1,a2,a3,]…,[aN]的算术平均数

C. [A]和[B]分别是[a1,a2,a3,]…,[aN]中最大的数和最小的数

D. [B]和[A]分别是[a1,a2,a3,]…,[aN]中最大的数和最小的数

[开始] [输出[A,B]][结束][是][否] [输入[N1,a1,a2,a3,…,aN]] [是][否] [是][否]

8. 如图,[x1,x2,x3]为某次考试三个评阅人对同一道题的独立评分,[p]为该题的最终得分,当[x1=6,x2=9,p=8.5]时[x3]等于( )

[开始] [输出[p]][结束] [否] [是] [输入[x1,x2]] [输入[x3]] [是][否]

A. 11 B. 10 C. 8 D. 7

9. 执行如下图所示的程序框图,输入[l=2,][m=3,][n=5],则输出的[y]的值是 .

[开始] [输出[y]][结束] [否] [是] [输入非负整数[l,m,n]] [否][是]

通用网关程序开发 篇4

现在假定有这样的需求。一个局域网中有一台电脑, 安装一至两块网卡, 可以访问一个或两个不同的网络, 就可以将该电脑设置成网关。该局域网中其他的电脑要进行网络访问, 可以将默认网关和DNS都指向这台网关电脑, 只要这台网关电脑真正能够实现网关的功能, 则客户机访问外网络的数据包都会发给该网关机, 网关机读取到客户机发来的数据包后, 进行必要的转换, 然后将转换后数据包发给适当的网卡, 网关机读到返回的数据包后, 也要进行一系列转换, 并判定该数据包应该发给哪台客户机, 并且将数据包返回给相应的客户机。这样, 客户机的网络请求就能及时得到回应, 从而完成客户机的网络操作。

应该承认, 要完成上述网关的功能, 不是一件简单的事情。一般来说, 要进行网关开发, 最好在NDIS中间层进行。而NDIS中间层, 正好提供了一个例子程序passthru。这个例程提供了基本的网络中间层驱动开发框架, 但其本身并未提供任何有用的功能。可以在这个例程基础上, 增加相关的代码, 以实现网关程序的功能。

1 程序实现原理和开发思路

用户程序主要是向驱动程序传递一些参数。

用户端程序目录下有配置文件commongate.ini。

其中:

excludeip默认情况下同网段数据包都将由网关进行转发, 可以设置不进行数据包转发的IP, 最多可设置10个。

如果网卡上运行的是PPPOE协议, 则本配置文件不起作用, 所有配置都自动获得。

网关程序的功能由passthru这个中间层驱动完成。要完成网关的功能, 包括数据包的读取、转换、发送3个必要的环节。

1.1 数据包的读取

数据包的读取在protocol.c中的PtReceive和PtReceivePack et函数中完成。这两个函数都可能读到数据包, 系统会根据不同情况而决定调用两个函数中的哪一个。PtReceivePacket函数中直接得到完整的数据包, 可以从此包中读取收到的数据。PtReceive使用一个缓冲区存放收到的数据, 但缓冲区中可能不是完整的数据。如果收到完整的数据包, 则可从缓冲区中直接读取数据, 否则需调用NdisTransferData函数传输剩余数据, 如NdisTransferData返回值为NDIS_STATUS_SUCCESS, 则可以将剩余数据追加到缓冲区之后, 以构成完成的数据包。如NdisTransferData返回NDIS_STATUS_PENDING, 则需要在PtTransferDataComplete函数中才能完成数据包的读取。

1.2 数据包转换

收到数据包后, 要进行数据包转换。经过转换后的数据包才能进行转发。

需要修改的内容有目标MAC、源MAC、源IP、目标IP、源端口、目的端口, 以及IP校验和、TCP/UDP校验和。另外对于TCP包, 可能还要修改包生存时间和最大数据包长度。

本网关支持IP包, 包括UDP/TCP, 用于传递数据。PPPOE包, 如果是通过虚拟拨号连接网络, 会涉及到此类数据包。ICMP包, 传递控制信息。其中IP包是最为重要的。

网络中数据包基本结构如表1所示。

以太头之后是IP头如表2所示。

如为PPPOE包, 则IP头之前还有一个PPPOE头, 如表3所示。

IP头之后是UDP头或TCP头, 如表4和表5所示。

UDP或TCP头之后是实际的数据。

对于客户机发来的数据包, 需修改目的MAC为网卡的远程路由器MAC。源MAC修改为本地网卡MAC。源IP修改为本地网卡IP。对于DNS请求包, 需修改目的IP地址为DNS服务器IP地址。修改源端口为某一选定端口。包生存时间通过一个网关, 值要减一。对于TCP连接建立包, 要修改最大包长度。相应需修改IP校验和和TCP/UDP校验和。

对于返回的数据包, 先要根据目的端口号, 找到原始数据包记录。修改目的MAC为对应客户机MAC, 修改源MAC为本地网卡MAC。修改目的IP为客户机IP。如为DNS应答包, 需修改源IP地址为网关机IP地址。修改目的端口为对应客户机原始端口号。相应修改IP校验和和TCP/UDP校验和。

对于网关机只有一块网卡的情况, 则发送网卡只能是这一块网卡。对于网关机有两块网卡的情况, 则需要根据IP地址确定应该将数据包交给哪块网卡。

对于涉及到PPPOE包时, 还要增加或去掉PPPOE头。

使用一个结构数组, 用于保存收到的客户机数据包。返回数据包也要使用此结构数组, 从中找到匹配的数据包记录。此结构数组中有源MAC, 目的MAC, 源IP, 目的IP, 源端口号, 目的端口号, 另外还要记录收到包时间, 以判断返回包是否超时。

1.3 数据包的写入

要向网卡写数据包, 首先要构造一个数据包, 然后挂接数据缓冲区, 调用NdisSend函数进行数据包发送。如NdisSend返回值不为NDIS_STATUS_PENDING, 说明发送立即完成, 此时可执行撤销数据包, 释放内存等操作, 否则要在PtSendComplete中进行包的撤销和释放内存等操作。应该为自定义数据包设置标记, 以区别系统数据包。对于自定义数据包, 要自行完成包的撤销, 撤销完成立即返回。

2 代码解析

在protocol.c中定义如下函数:

在PtReceivePacket函数中, 增加如下代码:

PtReceive和PtTransferDataComplete函数中代码和PtReceivePacket中代码类似, 在此不再重复。其他代码全部略去。

用户程序主要就是向passthru传递参数, 代码略。

3 结语

程序全部开发完成后, 经过大量测试, 实现了既定的网关程序的功能。程序可在实际环境中进行应用, 具有较高实用价值。

参考文献

[1]王艳平.Windows网络与通信程序设计.人民邮电出版社, 2009.

电脑程序开发个人简历 篇5

个人基本简历 
简历编号: 更新日期: 无照片
姓 名:DD先生国籍:中国
目前所在地:广州民族:汉族
户口所在地:广东省身材:170 cm kg
婚姻状况:未婚年龄:26 岁
培训认证: 诚信徽章: 
求职意向及工作经历
人才类型:普通求职
应聘职位:计算机类:电脑程序开发,软件开发,电脑程序设计、仓库管理员、市场销售/营销类:
工作年限:6职称:无职称
求职类型:全职可到职日期:随时
月薪要求:--3500希望工作地区:广州
个人工作经历:
公司名称:德胜物流公司起止年月:-11 ~ 2008-12
公司性质:所属行业:
担任职务:仓库管理 
工作描述: 
离职原因: 
 
公司名称:广州五羊摩托车有限公司起止年月:-09 ~ 2007-10
公司性质:所属行业:
担任职务:装配师傅 
工作描述: 
离职原因: 
 
教育背景
毕业院校:广州市广播电视大学
最高学历:大专毕业日期:2008-07-01
所学专业一:计算机应用软件开发所学专业二: 
受教育培训经历:
起始年月终止年月学校(机构)专 业获得证书证书编号
-09-06广东省船员技工学校电工中专 
2005-032008-07广州市广播电视大学计算机应用软件开发大专 
 
语言能力
外语:英语 一般  
国语水平:良好粤语水平:良好
 
工作能力及其他专长
 获得证书:电工中级维修与安装、电工中级证书。

获得奖励:被广州五羊摩托车有限公司评为优秀团员称号。

职业技能:流利的普通话、粤语;熟悉C++,VB以及相关编程软件的.使用;懂得电脑操作WORD,EXCEL,PPT等办公软件的操作。

主修课程:C++语言程序设计,VB程序开发与运用,软件工具与环境,汇编语言程序设计,COOL 3D,计算机数学,FLASH动画制作,微机组装与维修等。

 
详细个人自传
 个人特点:乐观开朗,善于与人交往,人际关系良好,有强烈的团队合作精神,责任心强,勇于挑战,爱好学习,刻苦耐劳,工作踏实。

求职意向:本人希望从事仓库管理,销售,跟单软件开发,电脑程序设计,软件开发,电脑程序设计等计算机相关方面的工作。

技工院校校本课程开发程序探究 篇6

关键词:技工院校校本课程 开发程序 探究

中图分类号:G64 文献标识码:A 文章编号:1673-9795(2014)03(b)-0153-02

所谓“校本”就是以校为本,基于学校,立足学校,校本课程开发就是以学校为基地,在充分、合理利用本校优势资源的基础上进行的课程开发。校本课程的开发是是区别于国家和地方课程,彰显学校办学特色,以学校教师为主体,通过对本校学生的需求进行科学评估,充分利用地方、行业和学校的课程资源,根据学校的办学思想而开发的多样的、可供学生选择的课程。在职业教育迅猛发展的今天,校本课程的开发成为技工院校增强办学实力,彰显学校办学特色,培养具有竞争优势的学生,适应经济社会快速发展,促进学校发展和壮大的有效途径。在此,本文试结合学生特点和学校特色对技工院校校本课程的开发程序及方法谈以下几点粗浅认识。

1 明确目标 理念先行

面对激烈的人才市场竞争和学生生源大战,瞄准目标,抓住优势专业,进行校本课程开发,突显学校办学特色,增强办学实力,已成为发展壮大学校的利器。校本课程开发不仅仅是一种方法或技巧,更是一种理念,关涉一种教育哲学。

技工院校的校本课程开发与国家、地方课程开发有着截然不同的理念,它在培养目标、课程结构、教学方法等方面都有自己独特的思想。技工院校进行校本课程开发,首先要评估学校的发展需要,评价学校及周边地区经济发展的需求,根据学生实际确定课程的总体目标,并设计专业课程结构。

技工院校的培养目标是培养技师或高级、中级技术工人,根据国家职业资格标准的要求,技师学院教学行为上应以岗位(工种)为本位,特别注重学生技能培养。技工院校进行校本课程开发,首先必须明确其指导思想,受到正确理念的支配。即专业课程体系应改变传统的“学科本位”课程观,向“能力本位”方向发展,形成一种技能型的课程观。根据企业需要培养高技能人才,引导“企业文化”早期进入校园,突出学生综合职业能力的培养。突出专业课程的职业定向性,强化学生职业能力训练,注重人文与技能的结合,增强课程的灵活性,形成模块化、弹性化的课程体系,适应行业和社会对应用人才规格多变的需求。

在明确理念的前提下,学校自主决策,教师参与课程设计,在集体合作、探究与共享中酝酿校本课程开发的土壤。

2 建立规范的开发运行机制

2.1 建立健全组织与制度

校本课程的开发方案包括两种:一种是学校成立校本课程开发指导委员会,由教学院长、教师代表、学生代表、企业代表、家长代表构成,负责审定学校校本课程开发的专业目标,形成开发指南或方案。同时,指导委员会负责校本课程开发的管理、督促、指导学习和分析、评估等事项;另一种是由教师组成的课程开发小组,主要负责制定具体某一门类的课程方案(课程标准)及方案实施,其主要包括:课程目标、课程内容、参考资料、教学组织方式、课程实施说明、考核评价说明等。

2.2 寻找理论支撑,理论指导实践

对教师进行适时理论培训。前人成功的校本课程开发理论已有很多,但不同学校实际情况不同,教师学习理论也可以从中得到启示,少走弯路,同时,也能在学习过程中提升自己的专业素养。

3 校本课程开发的组织与实施

技工院校培养的学生是以就业为主导的,培养的是直接面向企业的技术工人。因此,技工院校校本课程开发绝不是简单地教材开发,而应是从市场调研开始,确定市场需要什么样的人才,然后确定培养目标,再到课程目标、课程标准、教学内容再到教学模式、教学方法乃至教学手段等一系列教学过程的变革。它是一个环环相扣、教学环节全方位的开发过程。

(1)市场调研。通过问卷、观察、访谈等方式,针对不同的目标和对象进行调查,获取资料,在此基础上,进行系统分析,形成调研报告。学生学习内容的改革需要与社会、与企事业单位对接,与学校对接。职业教育就是就业教育,以就业为导向,提高就业率,是职业教育的核心目标。因此,市场调研要充分论证周边、社会目前乃至未来几年需要什么样的技术人才,既包括专业知识,也包括人文综合素质。依据需求,确定人才培养目标。

(2)确定具体课程目标,制定课程标准。在调研的基础上,各專业小组根据学生的实际情况和国家职业资格标准需求,确立课程目标,然后,从人才培养目标、教学内容、教学计划、课时安排、教学评价等方面制定课程标准。

(3)校本教材的开发。教材开发一般要邀请企业专家或技术人员参与,以职业实践活动为主线,突破学科界限,组织教学内容。制定教材编写计划,确立相关教材的编写方向,设计教材内容,各专业小组可根据自己的专长负责编制教材里的某个模块。企业技术人员的参与对于职业实践活动的步骤及细节注意事项更熟悉,更有发言权。

(4)教学验证。以职业活动为主线的教学内容怎样传授给学生呢?我国教育家陶行知提出的“做中学、学中做”教学理念应是最好的教学模式。目前技工院校正在探索的工学结合一体化教学模式就是根据工作过程安排教学内容的。各专业小组根据学生特点和教材内容设计教学方案,引入新的教学方法,如:任务驱动、项目式教学法、案例式等。在这些教学方法的实施过程中,要注意模拟真实工作情境,做到理论与实践一体,教学做一体。同时要注意学生综合职业能力的培养,比如:职业道德、职业习惯、安全卫生等方面。

4 校本课程的检验

对校本课程的检验要从三个时间段进行,一是学生校内生活时期,看学生的学习热情与学习效果及职业资格证的成绩;二是学生走上工作岗位接受市场的检验,看学生能否适应社会市场需求,各专业课程开发小组要到企事业用人单位进行回访调研;三是跟踪调查,看企事业单位对学生的综合素质评价及学生的发展潜力。

5 评价修订与推广使用

校本课程开发不是一蹴而就的,它应是一个逐步完善、成熟的过程。一个较为成熟的校本课程,至少需要2~3年一个学生学习周期。它要求各开发小组建立学生学习发展档案,从设计评价方案、观察、追踪实施效果、收集反馈意见,到分析研究开发策略,最后进行课程与课程开发方案的修订。一个轮回下来,如果不理想,还要在原因分析、调研,征求意见等基础上,再次论证修改,直至完善成熟。

校本课程开发的最终目标要发挥作用,让更多的学生能从中受益,提升学生的培养质量,那么,最终,学校将推广教材的使用,并进一步开发更多的校本课程。

参考文献

[1]石伟平,徐国庆.职业教育课程开发技术[M].上海教育出版社,2006.

[2]崔允郭.校本课程开发:理论与实践[M].北京:教育科学出版社,2000.

[3]钟启泉.课程的逻辑[M].上海:华东师范大学出版社,2008.

[4]吴刚平.校本课程开发[M].成都:四川教育出版社,2002.

Delphi程序开发特点分析 篇7

我们经常会问这样的问题:“到底什么使得Delphi如此优秀?”和“为什么和别的编程工具相比,我更愿意选择Delphi?”等等。简而言之就是:高效性。决定一个软件开发工具效率的因素归结为以下五点:(1)可视化开发环境的性能。(2)编译器的速度和已编译代码的效率。(3)编程语言的功能及其复杂性。(4)数据库结构的灵活性和可扩展性。(5)框架对设计和使用模式的扩充。

2. Del phi的特点

2.1 可视化集成开发环境

可视化开发环境通常分为三个组成部分:编辑器、调试器和窗体设计器。和大多数现代RAD(快速应用开发)工具一样,这三部分是协同工作的。当你在窗体设计器中工作时,Delphi在后台自动为你正在窗体中操纵的控件生成代码。你还可以自己在编辑器中加入代码来定义应用程序的行为,同时还可以在同一个编辑器中通过设置断点和监控点等来调试程序。

在版本5里,Delphi的调试器具备了许多先进的功能,如远程调试、过程关联、DL断口包调试、自动本地监控以及CPU窗口等。Delphi还支持在调试时随意放置和停靠窗口并把这一状态保存为命令的桌面设置。由此,Delphi的IDE实现了对调试功能的良好支持。对RAD工具(如Delphi、Visual Basic、C++Builder和Power Builder等)来说,窗体设计器是一项独特的功能。一些更为经典的开发环境,如VC++和BC++,都提供了对话编辑器,但却没有将窗体设计器集成到开发流程中,没有窗体设计器将会降低开发工具的整体效率。几年来,Delphi与Visual Basic在完善窗体设计器的功能方面展开了激烈的竞争。Delphi的窗体设计器的与众不同之处在于,Delphi是建立在一个真正面向对象的框架结构基础之上的。这样,你对基类所做的改变都将会传递给所有的派生类。这里涉及的一项关键技术就是VFI(visual form inheritance),即可视化窗体继承。VFI技术使你能够动态地继承当前项目或对象库中的任何其他窗体。一旦基窗体发生改变,派生的窗体会立即予以更新。

2.2 编译器的速度和已编译代码的效率

Pascal编译器最著名的特点就是速度快,而Delphi正是建立在这种编译器的基础之上的。事实上,它可能是针对windows的最快的高级语言本地代码编译器。以往速度很慢的C++编译器在近年来取得了很大的进步,增加了链接和各种缓存策略,尤其是在VISua1C++和C++Builder中。但即便如此,C++的编译器还是比Delphi的慢了几倍。Delphi和C++Builder共享同一种编译器后端,是一个公司的产品,因此生成的代码等效于由一个优秀的C++编译器生成的代码。

2.3 编程语言的功能及其复杂性

C++是非强类型语言,有些错误编译器无法发现。Object Pascal和Java很相似,它们很好地把握住了复杂性和功能性的平衡。它们都采取了这样一种途径,即限制其可用功能以加强开发者的逻辑设计。例如,两者都避免了完全面向对象但却容易被滥用的多重继承的观念,而是实现了一个执行多重接口功能的类。两者都不支持美观却危险的操作符加载。两者都有一些强大的功能,诸如异常处理、运行期类型信息(RTT工)和生存期内存自管理字符串。特别是运行期类型信息(RTTI),对我们设计仿真培训系统中的操作站与现场站很重要,用它我们可根据组态数据库的数据在运行期自动创建组件和自动识别组件而赋给相应的数据。同时,Delphi使用编程语言是Object Pascal,是面对对象、强类型语言。有利编制稳健的应用程序,减少调试、检错时间以提高开发效率;有利描述真实世界的事物和系统,如控制系统、工艺数学模型。

2.4 数据库结构的灵活性和可扩展性

由于Borland缺少一种数据库计划,因此Delphi保留了我们认为是所有工具中最灵活的数据库结构。对大多数基于本地、客户服务器和ODBC数据库平台的应用程序来说,BDE的功能都非常强大。如果你对此不满意,可以避开使用BDE以支持新的本地ADO组件。如果你没有装ADO,可以自己创建数据访问类或者购买第三方数据访问解决方案。此外,MIDAS使对数据源的多层访问更易于实现。而Microsoft的工具(ODBC、OLEDB或者其他)从逻辑上来说趋向于支持Microsoft自己的数据库和数据访问解决方案。

2.5 框架对设计和使用模式的扩充

这是一项经常被其他软件设计工具忽略了的重要功能。VCL是Delphi最重要的组成部分。在设计时操纵组件、创建组件、使用面向对象技术继承其他组件的行为,这些能力都是决定Delphi效率的关键因素。在许多场合,编写VCL组件都采用固定的00设计方法。相比之下,其它基于组件的框架经常过于死板或过于复杂。比如Active X控件具有和VCL控件相同的设计期性能,但却不能被继承以创建一个具有其他不同行为的新类。传统的类框架,如OWL和MFC,需要你有大量的内部结构知识,而且如果没有RAD工具的设计期支持,其功能将会受到抑制。

3. Del phi的事件驱动机制

3.1 无约定编程

与传统的Windows消息机制相比,Delphi的事件处理机制的最大优势在于所有的事件都是无约定的。对程序员而言,无约定就是指可以在事件处理程序中什么都不干。而在传统的Windows消息机制中,就不得不调用基类的消息处理程序,还要把信息回传给Windows。当然,Delphi的事件处理机制的无约定的编程方式可能无法对消息进行直接的灵活有效的处理,你要受制于谁引发了这一事件以及应用程序对这一事件要做出什么响应等。例如,可以在On Key Press处理程序中修改和取消击键,但on Resize事件处理程序却只能提供这一事件已发生的通知而无法进一步防止或控制尺寸的改变。

不过,Delphi仍然允许在事件处理程序中直接处理Windows消息。只是这就不像事件处理机制那么简单,因为消息处理需要程序员对要处理的消息有详细了解。可以通过message这个关键字处理所有Windows消息。使用Delphi开发应用程序的好处是,你既可以用高级的、易于理解的方式来编程,也可以在需要时直接访问低层的信息。

3.2 Delphi的VCL消息系统

所有的Delphi类有一个处理消息的内置机理,称之为消息处理方法或者Message handlers。Message handlers的基本思想就是:类获取一些种类的消息,然后再分发(dispatch)它们,由响应的处理函数或者过程进行处理(调用哪一个处理函数或过程取决于所接受的消息)。对于一个特殊的消息,如果没有一个指定的方法存在的话,则由一个缺省的消息处理。

VCL定义了消息分发系统,该系统将所有的windows消息(包括用户定义的消息)传递给相应的对象,由各对象的消息分发系统进行处理。VCL对象用于接收消息的方法叫做Main Wnd Proc()。通过Main Wnd Proc()可以对消息进行任何特殊的处理。不过,一般情况下很少直接调用Main Wnd Proc()来处理消息,除非不想让消息通过VCL的消息系统分发。从Main Wnd Proc()返回后,消息被传递给对象的Wnd Proc()方法,这就是该对象的窗体过程,然后进入VCL的分发机构。分发机构使用Dispatch()方法把消息分发给一个消息句柄。消息到达该消息的处理句柄(Handler)后,经过该句柄的处理,这个消息处理过程就结束了。没有必要改变这个消息分发机理,所要做的只是产生一个消息处理方法或者句柄,即一个消息处理函数。

3.3 加速原型化

当对Delphi使用了一段时间后,即使你只是一个Delphi新手,你也会发现,用Delphi编写第一个项目就能马上获益:开发周期短、应用程序稳健。设计用户界面(UI)是许多windows程序员头疼的问题,而这恰好是Delphi的长处。用户界面的设计和程序的布局被称为原型化。在非可视化的开发环境中,应用程序的原型化经常比真正实现程序的时间还要长。一个简洁直观、令人愉悦的用户界面是应用程序的一大部分。

Delphi能够用它的自定义控件或自己开发的控件来快速建立您需要的用户界面。当你能熟练运用窗口、控件和事件响应方法以后,将发现过去要花很大精力的原型化工作现在大大简化了。同时,用Delphi开发的用户界面丝毫不比用传统的开发工具建立的用户界面逊色。在Delphi中你在设计期看到的往往就是最终的产品。

4. 结束语

综上所述,大家可发现Delphi 5本身就是一个功能十分强大的面向对象开发平台,它的可视组件库VCL(Visual Component Library)是一个易学、易用、高效的可重用的软件对象,还包含有丰富的数据库应用,通讯组件。Delphi自身就是使用VCL编写而成的;不仅界面开发方便迅速,而且对于系统所带组件和自编组件的运用就如同组态一样。只要将组件放置在窗体中,用鼠标移动到你要求的位置,改变某些属性以满足你的要求。

参考文献

[1]黄文兰.Delphi语言开发教务管理系统[J].电脑知识与技术,2006,(20).

[2]向继文.Delphi与汇编语言的混合编程[J].吉林大学学报(自然科学版),2006,(3).

[3]林瑜华.如何在DELPHI中使用SQL语言[J].福建电脑,2005,(10).

MP3解码程序开发 篇8

MP3, 全称为MPEG1 Layer-3音频文件 , 是一种常 见的音频文件格式。MPEG1标准, 按照压缩质量和编码复杂程度分为3层, MP3就位于第3层。MP3的压缩率可达10: 1至12: 1。一分钟未压缩的原始音频数据需要10MB空间 , 经过MP3压缩就只需要1MB空间 , 而且MP3解码后数据在回放时能达到比较接近原音源的效果, 因此MP3文件得到了广泛的应用。

WAV文件是Microsoft公司开发的音频文件 , 其中的数据一般是未经压缩的PCM原始数据。

下面开发一个实现MP3解码的程序, 结果存为WAV格式。本程序目前只支持MPEG版本为1, 层为3, CRC校验位为无, 比特率为128kbps, 采样率为44.1khz, 频道为联合立体声, 强调位为0的MP3文件解码。

2 MP3 文件结构

MP3文件由若干帧组成 , 各帧编码数据相互独立。

每帧数据由帧头、帧边和主数据3部分组成。

帧头数据总长32比特, 具体如表1所示。

帧边数据总长32字节, 包括解码中需要的一些辅助信息具体如表2所示。

MP3每一帧分为2个粒度组 , grunale0和grunale1, 每个粒度组再分为2个声道, channel0和channel1。因此每个帧边信息包括4个单元, 按照gr [0] ch [0]、gr [0] ch [1]、gr [1]ch [0]、gr [1] ch [1] 的顺序排列。

main_data_begin: 该数值指出主数据在该帧同步之前多少个字节开始。MP3每帧数据是不定长的, 为增加空间利用率,当前帧未使用完的空间可以保留起来给后面帧使用, main_data_begin指出了这个开始位置 , 该值忽略帧头和帧边信息。

part2_3_length: 表示主数据中缩放因子和哈夫曼编码共占用多少比特。

global_gain、preflag、scalefac_scale: 逆量化用的参量。

subblock_gain: 短窗块逆量化用的参量。

window_switching_flag: 不同的窗类型 , 接下来的相应字段也有区别 。该值为0, 块类型为0; 该值为1, 块类型由blocktype字段取得。

block_type: 块类型 , 0-缺省1-开始块3-结束块2-短块 ,其中0、1、3表示长块、2表示短块。MP3有3种块类型, 长块、短块、混合块。MP3块分为32个子带, 长块每个子带18个样本, 短块每个子带6个样本, 混合块对低频2个子带使用长块, 其余30个子带使用短块。MP3帧既可以全部使用长块,也可以全部使用短块, 也可以长块短块混合使用。

mixed_block_flag: 混合块标 志 , 和block_type =2配合使用, 值为0时, 表示短块; 值为1时表示混合块。

2.1 子带和缩放因子频带

MP3每个单元解码可以得到576个数据。这576个数据在不同的块类型下有不同的含义:

2.1.1 长 块

这576个值表示576条频率线上的值。这576条频率线从低到高分为32个子带, 每个子带18条频率线。解出来的这576个值是整数 , 需要进行逆量化变成浮点数 , 逆量化的过程并不是一条频率线为单位进行的, 而是若干条频率线为单位进行的, 这若干条频率线组成了频带 (band), 叫做缩放因子频带 (scalefactor band) ,顾名思义, 在一个缩放因子频带内的频率线在逆量化时共用缩放因子。在44.1khz的采样率下, 缩放因子频带的划分如表3所示。

频率线418至575不需要归属于以上频带, 这个范围的频率线进行逆量化时, 使用默认的逆量化因子。

2.1.2 短 块

这576个值表示192条频率线上的值。这192条频率线从低到高分为32个子带, 每个子带包含6条频率线。每一条频率线上 有3个值 , 分别属于3个窗 (window0、window1和window2) 。这192条频率线被划分为若干缩放 因子频带 , 在44.1khz情况下 , 划分如表4所示。

频率线136至192不需要归属于以上频带, 这个范围的频率线在进行逆量化时, 使用默认的逆量化因子。按先后顺序解出来的这576个值先是按缩放因子频带从低到高排列, 在每一个缩放因子频带内, 按window0, window1, window2排列, 在每一个window中, 频率线从低到高排列。

2.1.3 混 合块

在这种情况下, 按先后顺序解出来的576个值分为两部分, 第一部分 (前36个值) 是长块部分, 故它们代表36条频率线 , 这36条频率线 划分为8个缩放因 子频带 ; 第二部分(后540个值 ) 是短块部分 , 它们代表180个频率线 , 每个频率线上有3个值, 分别属于window0、window1和window2, 这180个频率线 划分为9个缩放因 子频带 ( scalefactor band3 ->scalefactor band11)。

综合上述3种情况, 这576个值排列方式如图1所示。

2.2 哈夫曼码表选择

缩放因子、大值区、count1区和零值区分布如图2所示。

MP3帧 , 主数据分为缩放因子和哈夫曼码两部分 , 哈夫曼码部分又分为大值区bigvalue, count1区, 零值区rzero。大值区得到的值比较大, 一共有bigvalue*2个值, 每两个值一起编码。count1区值只能为-1、0、1三者之一, 每4个值一起编码。零值区值全为0, 不需要编码。主数据仍然按照gr [0] ch [0]、gr [0] ch [1]、gr [1] ch [0]、gr [1] ch [1] 的顺序进行存放。

在不同区域编码时, 用到的huffman表是不一样的。

在对大值区bigvalue进行编码时, 为了进一步提高MP3的编码效率, 当window_switching_flag [gr] [ch] 为0时, 大值区又分为3个区域: region0、region1和region2, 在不同区域用不同的huffman表编码。region的划分是以缩放因子频带为单位划分的。帧边信息中, region0_count [gr] [ch] 和region1_count [gr][ch] 提供了划分信息。region0_count+1表示在region0区的缩放因子频带的个数, region1_count+1表示在region1区的缩放因子频带的个数。region2区的长度在帧边信息中并没有给出, 但是根据big_values [gr] [ch]、region0_count [gr] [ch] 和region1_count[gr] [ch] 可以计算出来。当window_switching_flag [gr] [ch] 为1时 , 大值区只 分为两个 区域 , region0和region1, 这时regio0_count是系统默认的。长块时 , region0为长块前8个缩放因子频带sfb0至sfb7, 短块时, region0为短块前3个缩放因子频带sfb0至sfb2, 混合块时, region0为长块前8个缩放因子频带sfb0至sfb7。在得到大值区region的划分之后, 就可以根据table_select [gr] [ch] [region] 来选择在 每个区域 所用的huffman码表, 一共有32个huffman码表可供选择。

在count1区, 所用huffman表的选择信息由count1table_select [ gr] [ch] 提供。需 要说明的 是 , count1区的长度 是count1*4, 虽然在帧边信息中并没有count1, 但解码程序知道在耗尽part2_3_length [gr] [ch] 长度的码流之后就可以判断已经达到了count1区的末尾。count1区用到2个huffman码表。

零值区只需将576个值中除去大值区和count1区的其余数值直接置0即可。

大值区的huffuman表一个入 口项可得 到两个值x、ycount1区的huffman表一个入口项可得到4个值v、w、x、y大值区的huffman表有一个参数为linbits。当linbit为0时, 该huffman表只能用来编码小于等于15的数。当linbit不为0时该huffman表可用来编码值大于15的数, 当用这样的huffma码表编码时, 如果x或y的值为15, 在hcod [|x|] [|y|] 之后的码流中有linbit位, 这长度为linbit的位串表示无符号整数, 它与x (或者y) 相加后表示x (或者y) 真正的编码值。如果得到的值 (x、y或v、w、x、y) 不为0, 还要读取1位符号位, 以确定数值的正负。

2.3 缩放因子

一个缩放因子频带内的频率线在逆量化时共用缩放因子在码流中, 缩放因子被编码于main_data中。要解码得到缩放因子, 首先需要知道该缩放因子所占的比特数, 在帧边信息中scalefac_compress [gr] [ch] 提供了这样的信息 , 首先需要查找如表5所示。

针对不同的块类型说明slen1和slen2的含义。

2.3.1 长 块

slen1表示缩放 因子频带0到10所用缩放 因子的长 度slen2表示缩放因子频带11到20所用缩放因子的长度。

2.3.2 短 块

slen1表示缩放 因子频带0到5所用缩放 因子的长 度slen2表示缩放因子频带6到11所用缩放因子的长度。

2.3.3 混 合块

在这种情 况下 , 长块部分 (sfb0到sfb7) 和短块部 分(sfb3到sfb5) 所用的缩放因子的长度相同 , 为slen1; 短块部分 (sfb6到sfb11) 所用的缩放因子长度相同, 为slen2。

为了进一步地减少MP3码流的大小, granule1有时会共用granule0的缩放因 子信息 , 是否共用 由字段scfsi [ scfsi_band]来决定, 只有granule1的长块才可以共用granule0的缩放因子信息, 如表6和表7所示。

3 WAV 文件结构

WAV文件结构如表8所示。

4 MP3 解码流程

MP3解码以帧为单位进行 , 每一帧解码分为帧同步、帧头信息读取、 帧边信息读取、主数据读取、逆量化、重排序、 立体声解码、混叠消减、IMDCT、频率反转、子带合成 几个步骤。下面分别说明:

4.1 帧同步

找到每一帧的开始。在MP3码流中, 相邻两个同步字之间的距离 (也就是一帧的长度) 是slot的整数倍, 其中slot就是一个字节。一帧的长度要么是N个字节, 要么是N+1字节。帧头信息中padding字段决定了是否有1个附加字节。其中N=144*bitrate/samplerate, 当采样率为44100, 比特率为128000时, N=417。

4.2 帧头和帧边信息读取

按照帧头和帧边数据定义进行读取。

4.3 主数据读取

包括缩放因子解码和哈夫曼解码。

根据帧边信息中的scalefac_compress和标准中的对应表格来确定的slen1和slen2对缩放因子进行解码, 即直接从主数据块中读取缩放因子信息并存入表scalefac_l [gr] [ch] [sfb和scalefac_s [gr] [ch] [sfb] [window] 中。

根据帧边信息中的table_select和count1table_select对哈夫曼编码进行解码。

这一步完成应该得到4套缩放因子和4*576个解码后的哈夫曼值。

4.4 逆量化

经过Huffman解码之后的值必须经过逆量化的处理, 逆量化过程根据块类型使用不同的逆量化运算公式, 其逆量化的公式如下:

4.4.1 长块

4.4.2 短块

4.4.3 混合块

长块部分按长块公式逆量化, 短块部分按短块公式逆量化。

isi:第i个完成哈夫曼解码的值

scalefac_multiplier: (scalefac_scale [gr] [ch] +1) /2

pretab: 逆量化用的一个表

4.5 重排序

在MP3编码算法的MDCT步骤中, 长块类型的频域值按频率由低到高排列; 对于短块类型, 频域值则是按缩放因子频带、频率、窗的顺序排列。为了提高Huffman编码效率, 短块类型的数据被按照缩放因子频带、窗、频率的顺序重新排列因此解码时, 需要把短块的频域值还原为初始的缩放因子频带、频率、窗的顺序。需要重排的数据类型包括短块以及混合块中的短块部分。

重排序示意图如图3所示。

4.6 立体声解码

在联合立体声模式中, 有两种立体声模式, 强度立体声和MS立体声。

在强度立 体声模式 中 , 左声道传 的是幅值 , 右声道的scalefactor传的是立体声的位置is_pos。需要转换的频率线使用右声道的缩放因子来作为is_pos。

在MS立体声模式中, 传送的是规格化的中间/旁边声道的信息。

其中Mi是channel [0] 的值, Si是channel [1] 的值。

4.7 混叠消减

为了避免相邻的两个子频带之间的混叠, 在编码和解码中都需要进行去混叠的处理, 这个运算可以看成是对任意两个相邻子频带连续做8次的butterfly运算, 该运算只对长块和混合块中的长块部分使用。具体算法如下:

其中Ci可从混叠消减用的表查得。

计算流程如下 (pascal描述):

4.8 IMDCT

MDCT的目的在于进行时域到频域的转换 , 减少信号的相关性, 使得信号的压缩可以更加高效地完成, 而它的反变换IMDCT的目的在于将信号还原为没有变换之前的数值 , 使频域值向时域值过渡。

其公式如下:

在进行了IMDCT变换之后, 需对频率信号进行加窗、覆盖、叠加。

4.8.1 加窗

(1) 长块

(2) 开始块

(3) 结束块

(4) 短块的每个窗口分别计算

4.8.2 叠加

将每一块变换出来的值的前半部分与前一块的后半部分相加, 并把后半部分保留来和下一块的前半部分相加。

4.9 频率反转

在IMDCT之后, 进入子带合成之前必须进行频率反 转方法是将奇数号子带的奇数个采样值乘以-1。

4.10 子带合成

该步算法如下:

(1) 将从32个子带抽来的32个sample值通过一个矩阵运算算出64个中间值。

(2) 将这64个中间值放入一个长度为1024的FIFO缓冲区, 这个缓冲区初始化为0。

(3) 从这个缓冲区中每连续的128个值中取头尾各32个值, 合为64个值。完成后组成512值的向量U。

(4) 加窗 , 即将Ui与窗口系数Di相乘 , 得到另一512值向量W。

(5) 最后将这512值向量W每连续的32个值中顺次取一个值, 一次共取得512/32 = 16个值相加, 然后将该值乘上一个常数, 取得最终的数值。完成后一共取得4*18*32个最终的PCM数值。最 后将PCM数据写入WAV文件中 , 就完成了MP3解码

5 结语

程序开发 篇9

由于传统的程序设计 (包括现在市场上主流的安卓编程软件-Eclipse) 虽然存在着功能全面、技术成熟等优点, 但同时也存在入门难、要求高、难以大规模普及应用等缺点。而随着安卓技术的普及, 尤其是APP inventor编程环境因其采用了抛弃复杂的程式代码而使用积木式的堆叠法来完成程序的方法, 用户甚至不需要掌握任何的程序编制知识。只需要根据自己的需求向其中添加服务选项即可, 这使得APPinvtor的推广和普及应用成一种可能。

2 设计思路

在运行程序的时候, 弹出一个界面, 由易到难提供4种不同难度的迷宫供用户选择。当用户选择完毕后, 进入相对应的屏幕后, 通过用户在屏幕上对小球的控制来实现对小球的控制。

3 程序设计

整个程序主要分两个部分界面设计功能设计以及实现方法。

3.1 界面设计及功能描述

主界面 (下用Screen1代替) 分析及功能描述, 如图1所示。

(1) 图片精灵组件 , 可视组件 , 放置在画 布组件之 上 ,背景图片为心形图片。

(2) 画布组件 , 可视容器组件 , 用来盛放其他图片组件。

(3) 按钮组件 , 可视组件4个按钮的功能都是切换到功能界面, 不同之处在于点击不同的按钮时, 功能界面所载入的迷宫图片不同。

(4) 音频播放器 , 非可视组件 , 用来设置在屏幕初始化的时候自动播放音乐

(5) 计时器组件 , 非可视组件 , 在屏幕初始化时候开始计时, 用来设置图片精灵组件每隔1s在移动到画布组件中的任何一个随机位置。

功能界面 (下用Screen2代替 ) 分析及功 能描述如 图2所示。

(1) 按钮组件 , 可视组件 , 当点击时候返回主界面。

(2) 球形精灵组件 , 可视组件 , 可通过控制小球 , 实现小球在迷宫中的移动, 实现走出迷宫的效果。

(3) 标签组件 , 可视组件 , 用来显示时间。

(4) 图片精灵组件 , 可视组件 , 放置在画布组件之上。

(5) 画布组件 , 可视组件 , 用来盛放图片精灵组件及球形精灵组件, 是迷宫图片的载体。

(6) 音频组件 , 非可视组件 , 用来播放背景音乐。

(7) 计时器组件 , 非可视组件 , 在屏幕初始化时候开始计时, 并将计时结果显示在标签组件中。

3.2 设计思路及实现方法

本部分主要重点介绍在完成本程序的时候一些突出的较难解决的问题。

当用户在主界面点击选择按钮组件时候, 如何把用户的选择传递值给功能界面, 让图片能够正确地载入。

解决此问题的思路和方法, 在Screen中, 当每个不同的按钮被点 击时候 , 把不同的 图片名称 作为初始 值传递到Screnn2中 , 在Sceen2初始化的时候 , 设置Screen2的画布组件背景图片会获得的初始值。如图3, 图4所示。

如何迷宫边距判断, 让小球在移动的时候不会超出边界,只准在迷宫内移动。

解决此问题的思路和方法: 以上边距为例, 因迷宫图片是作为背景图片放置在画布之中的, 并非整张图片从上到下是迷宫, 迷宫只是占据了整幅图片的大约85~90%左右, 且在中间位置, 而其余的部分均为白色像素的背景。因此可以获取x值为画布的图片宽度/2, y值为0, 判断当前坐标像素是否为白色, 如果是白色, 则表明这个点不是边距, 必须在当前横坐标下, 继续下移; 如果不是白色, 则表明此点已经到达边距的, 取当前纵坐标值即为上边距。主要代码如图5所示。

当小球在迷宫内移动时候, 迷宫图片中路径是否存在的判断方法。

解决此问题的思路和方法: 每次小球在迷宫移动到一个新的位置的时候, 进行提前预判, 预判小球当前位置下上下左右4个方向的坐标是否超出边界, 如果超出边界, 该方向设置为不移动; 同时也判断当前位置下上下左右4个方向的坐标是否为白色, 如果是白色, 则可继续移动, 如果某个方向的坐标为其他颜色, 则表示此方向不可通行。主要代码如图6, 图7所示。

当屏幕被划动时候, 小球加速度的处理方法。

解决问题的思路和方法: 当屏幕被划动的时候, 用加速度传感器组件获取加速度变量, 然后让小球每秒移动的次数增多。核心代码部分如图8, 图9所示。

4 实验测试

本次测验通过App Inventor环境下的AI伴侣程序 运行 ,通过在安卓手机里面安装MIT AI2 Companion手机AI伴侣软件及条码扫描软件Barcode Scanner, 利用Wi Fi信号进行连接,进而实现对程序的测验。最后的运行结果如图10所示。

5 结语

程序开发 篇10

1 JSR82规范

2002年,Java开发社区发布了基于Java平台的蓝牙API规范JSR82。JSR82规范对支持JAVA嵌入式设备的JAVA应用编程接口做出了明确规定,提供了一系列的标准API,可以帮助JAVA嵌入式设备无缝集成蓝牙环境。

Java蓝牙无线技术API包含两个包,javax.bluetooth和javax.obex。javax.bluetooth包含了核心的蓝牙API,如蓝牙设备管理,蓝牙设备发现,蓝牙服务查找、L2CAP等类。javax.obex属于高级API,是一个不依赖于蓝牙核心API的数据交换包。

javax.bluetooth包定义了4个接口,6个类和3个异常。其中LocalDevice类、RemoteDevice类和DeviceClass类属于设备管理API;UUID类、DataElement类、Discorylistener接口、DiscoveryAgent类和SeviceRecord接口属于服务发现API;L2CAPconnection接口和L2CAPconnectionNotifier接口属于连接API。

2 蓝牙应用程序模型

每一个蓝牙应用都表现为一个蓝牙服务,提供服务的一方为服务端,消费服务的一方为客户端。蓝牙客户端的行为包括初始化、发现周围服务和设备、消费服务等,蓝牙服务端的行为包括初始化、创建服务、注册服务、等待客户端访问、创建连接提供客户端消费等。

具备蓝牙功能的应用程序必须先要初始化蓝牙堆栈,一个客户端对远端服务进行消费时首先要发现所有附近的设备,然后对每一个发现的设备搜索它感兴趣的服务,而提供服务的服务端在服务发现数据库(SDDB,Service Discovery Database)中对客户端进行注册,对他们进行有效广播,然后等待引入的连接,在他们进入时接受他们并为他们提供服务。最后,当不再需要服务时,应用程序会在服务发现数据库中将他们移除。

2.1 初始化

无论蓝牙客户端还是服务端,都首先要进行初始化,通常为初始化UUID类、获得LocalDevice类等操作。服务端需要设置LocalDevice,让设备处于可发现状态,设置发现模式,而客户端不用设置发现模式。

在javax.bluetooth中,UUID类用来唯一识别一个蓝牙服务,每一个这样的标识符都要在时空上保证唯一。UUID类有16位或32位的简短UUID或128位的完整UUID。一般在创建时要生成自己的UUID,在服务搜索时要同时给出指定的UUID和通信协议的UUID。

设备管理API中的LocalDevice类代表本地蓝牙设备,初始化时首先通过getLocalDevice()方法取得LocalDevice对象实例,然后调用setDiscoverable()方法设置发现模式。有三种发现模式:DiscoveryAgent.GIAC代表无时间限制模式,DiscoveryAgent.LIAC代表在规定的时间内可被搜索,超时就进入不可搜索状态,DiscoveryAgent.NOT_DISCOVERABLE代表不可搜索状态。

示例代码如下:

2.2 服务端操作

1)创建服务并注册:

利用UUID计算URL,创建L2CAPConnectionNotifier连接(对应L2CAP)或StreamConnectionNotifier连接(对应SPP)。利用LocaIDevice取得对应此L2CAPConneCtionNotifier连接的服务ServiceRecord。如有必要,可以使用DataElement来设置ServiceRecord的属性。

2)等待客户访问:

调用ConnectionNotifier的方法,等待连接。

2.3 客户端操作

1)发现周围设备和服务:

在蓝牙网络中,客户端通常不能直接得到服务端的蓝牙地址,要使用服务发现API搜索周围的设备和服务。为消费一项指定的服务,客户端需要经过三个步骤:搜索设备、搜索服务和连接通信。服务发现API包括DataElement类、Discoverylistener接口、DiscoveryAgent类和ServiceRecord接口。

首先通过LocaIDevice取得DiscoveryAgent对象。利用该对象发起一次设备查询,设备找到后会调用DiscoveryListener接口对应的方法,记录下远端设备RemoteDevice。再次通过DiscoveryAgent对象,并提供刚刚找到的远端设备,发起一次服务查询来查询感兴趣的远端服务。服务找到后会调用DiscoveryListener接口对应的方法,将ServiceRecord服务记录下来。至此,一次完整的搜索结束,得到了感兴趣的ServiceRecord列表。

示例代码如下:

2)消费服务:

通过ServiceRecord的相应方法可以取得远端服务的URL。这样就可根据服务的类型选择创建对应SPP的StreamConnection或对应L2CAP的L2CAPConnection来进行数据通信了。

2.4 蓝牙连接

蓝牙支持RFCOMM和L2CAP两种类型的连接。蓝牙API使用通用连接框架的StreamConnection和StreamConnectionNotifier支持RFCOMM,连接类型L2CAPConnection和L2CAPConnectionNotifier用于支持L2CAP。创建连接需要使用Connection.open(String urlName)方法,参数urlName代表了连接的URL,格式如下所示:

sheme://host:port;parameters

其中scheme代表了连接的类型,对应RFCOOM为btspp,对应L2CAP为btl2cap。

host对应服务端为localhost,对应客户端为远端蓝牙地址。

port对应服务端为UUID,对应客户端为服务端口。

parameters指定了可选的设置,如服务名称或MTU大小。

使用服务端连接时,首先通过L2CAPConnectionNotifier或StreamConnectionNotifier建立连接,同时创建一个蓝牙服务。

L2CAPConnectionNotifier notifier=(L2CAPConnectionNotifier)Connector.open(url);

然后调用acceptAndOpen()方法,该方法会自动将服务注册到蓝牙发现数据库SDDB中,之后就可以被客户端搜索了。

L2CAPConnection con=notifier.acceptAndOpen();

使用客户端连接时,也是通过Connector.open(url)建立连接,参数url通过serviceRecord.getConnectionURL()取得,例如:

3 结束语

蓝牙技术拥有连接简单、互操作性强的特点,在无线办公、电子支付、汽车工业、信息家电、医疗设备等领域中有着广泛的应用。基于Java的JSR82规范开发无线蓝牙应用程序,继承了Java语言优秀的平台无关特性,可以大大增加程序的可移植性。

摘要:介绍了Java蓝牙无线技术API规范JSR82,并给出了采用JSR82规范开发蓝牙无线应用程序的具体实现方法和部分实例代码。

关键词:蓝牙,Java,JSR82

参考文献

[1]詹建飞.J2ME开发精解[M].北京:电子工业出版社,2006.

[2]詹建飞.JavaME核心技术与最佳实践[M].北京:电子工业出版社,2007.

开发汽车独事应用程序 篇11

如果有部智能手机,你可能经常下载新应用软件增加其功能。不过升级你车里的计算机系统却通常需要花不少时间找经销商,让公司技术员使用专门的接口安装新软件。

福特已开始利用其Sync和MyFord Touch系统改变这一模式,并向手机应用程序开发者们开放Sync编程接口。1月份,福特、Pandora、Stitcher以及Orangatame首次推出支持Sync的软件,使得司机可以使用车载语音识别和语音合成系统与运行于司机手机上的互联网流媒体广播和Twitter应用程序进行交互。

目前福特想做的远不止简单地制作现有智能手机应用程序的车载版。福特携手密歇根大学安阿伯分校和微软,向名为“云计算在交通中的应用”的计算机科学与工程课程提供专业知识。班上的学生以小组为单位设计、构建并展示车载远程信息处理应用程序。“你在驾驶时需要的服务与在走路使用手机时是不一样的,”福特信息电子研究与高级工程部门的软件工程师T·J·朱利(T.J.Giuli)如是说,他与来自密歇根的教授布莱恩·诺贝(Brian Noble)和杰森·福利恩(Jason Flinn)共同教授这门课程。班上用的软件开发平台基于微软Windows 7和机器人开发工作室(Robotics Developer Studio),这个平台可以访问车辆性能数据、网络服务、语音识别、语音合成、社交网络平台之类的互联网服务以及Windows Azure云计算环境。

诺贝表示:“我们对于将运行于智能手机上的应用程序移植到车上并不感兴趣。”相反,学生们在开发独一无二的应用程序,比如一款“绿色里程表(green mileage)”的应用程序,或者一款根据行人数据跟踪路况和交通堵塞的应用程序。他说到:“我们的挑战是发现一款杀手级应用,然后把它构建出来。”他特别强调利用福特Sync系统现有的语音识别和语音合成功能简化司机与车载应用程序的交互。

目前支持Sync的应用程序需要编程接口为其提供与汽车语音引擎的连接才能运行在智能手机上。

但是密歇根的学生们正利用福特嘉年华(Fiesta)2011特别改装版的板载处理器和存储器,开发能普遍运行于汽车上的应用程序(朱利称研发平台为“嘉年华装备(Fiestaware)”)。这些学生还可以连入云计算服务用来计算与存储,有的将此作为车载资源的补充。

学期末,学生的项目将由教师、福特工程师,以及微软领导者组成的团队进行评估。优胜的应用程序将嵌入福特嘉年华,而应用程序的开发者将从安阿伯市开往加州圣马特奥参加年度玩家大展(Maker Faire)。

朱利表示,采用应用程序开发模型的原因是它能为汽车产业的移动软件带来更短的开发周期。基于互联网或手机的应用程序几天到几周内就能写出来,但通常需要很多年才能将新技术嵌入汽车。朱利说:“每三年才发布一次新功能是没有价值的”。通过采用更通用的硬件开发软件,他说:“你可以更快地了解客户需求,保持车辆的售后价值。

然而,即使使用通用处理器和操作系统,在为汽车专门设计应用程序时仍有很多特殊难题。比如说,即使在福特这样的生产商中,也不是每一款汽车都使用相同的网络系统从各种传感器和车辆子系统收发数据。这样,每一款应用程序必须兼容每个基本汽车模型。朱利希望车载网络在将来可以标准化,至少在同一家汽车制造商内部标准化,以简化应用程序开发。

程序开发 篇12

ADINA是通用有限元软件, 用于进行固体、结构、流体以及结构相互作用的流体流动的复杂有限元分析。ADINA系统是最主要的、用于结构相互作用的流体流动的完全耦合分析程序。可以分析2D和3D固体应力以及静力学和动力学中的结构, 对象可以是线性的或者非线性的。但是, 对于复杂的三维模型, 在ADINA中是自下而上依次建立点、线、面、体, 其中面和体需手工完成, 费时费力, 又容易出错。而使用ABAQUS建模就省去了其中的许多麻烦。

使用Python语言编写ABAQUS TO ADINA的文件转换接口程序, 实现模型点、线、面、体的自动定义, 既解决了手工定义的费时费力, 又避免定义过程中易出错。

本工作进行ABAQUS和ADINA软件的接口程序开发研究, 主旨在于将ABAQUS的前处理技术与ADINA软件的分析功能结合起来, 以搭建ABAQUS和ADINA软件之间有限元模型的转换的桥梁。

1 接口程序编制

接口程序将ABAQUS生成的有限元模型数据转换成符合ADINA输入要求的标准数据。

1.1 工作流程

图1为总流程图, 其建模部分为前处理工作流程。首先启动ABAQUS CAE, 画出所要分析的几何模型, 画网格, 附材料属性等, 然后生成数据交换文件。

1.2 选择合适的数据生成文件

ADINA具有丰富的数据接口, ADINA采用Parasolid核心的软件直接交换几何模型, IGES通用数据接口可以将一些与ADINA没有直接接口的CAD系统几何模型读入ADINA, MSC.Nastran输入文件可以直接读入ADINA-AUI数据库, 与Pro/E、Unigraphics、SolidEdge、SolidWords、Microstation、AutoCAD、IDEAS、NASTRAN、PATRAN实现模型数据传递。比较分析后确认, 选用nas文件可方便的继承交换文件的数据。

1.3 编程中需要解决的主要问题

采用Python语言编制相关的接口程序, 将inp格式文件转换为nas格式文件。

程序包括:读写节点坐标、读写材料类型及属性、读写单元信息并进行分类判断、读取边界条件及载荷信息。图2显示了接口程序的流程。

1.3.1 节点编号重整

在nas中节点是按顺序全部写在一起的, 而在inp中节点是按不同的Part分别按顺序编写, 只需将inp中的多个Part重新编号写到一起。最重要的是, 记录下修改后的节点编号与修改前相对应的编号, 以便以后使用修改方便。

1.3.2 材料类型分辨

在nas中材料按照不同类型对应不同的编号, 并按顺序将inp中所含多个材料编写其代号。

1.3.3 单元类型及所属材料分辨

在nas中主要有两种单元类型, CHEXA表示8个或20个节点组成的单元, CHETRA表示4个或10个节点组成的单元, 并同时编写该单元所属材料的代号。

1.3.4 约束类型与约束编号

在nas中边界条件的约束类型主要有两种, SPC表示单个节点的约束, SPC1表示连续节点约束。约束编号是对应着inp中施加在某个节点集合上的边界条件类型的自由度编号组合。

1.3.5 海量网格模型转换是否失真

建海量网格模型, 使用接口程序转换, 编写导入前后节点对比程序进行对比, 相同节点编号下的节点坐标一致, 并且没有丢失节点, 证明海量网格模型转换导入ADINA后并无失真。

2 求解与后处理

将转换好的有限元模型导入ADINA中后, 须先为求解器生成输入数据文件, AUI显示一个Log窗口给出数据文件声称是的一些信息, 如最小带宽信息。如果模型定义中含有错误, AUI将不生成输入数据文件, 并将错误信息写到Log窗口。然后再读入结果文件, 对模型进行后处理。

通过求解与后处理可以检验出模型的转换是否有模型定义等错误, 进一步验证了转换程序的正确性。

3 三维多晶体有限元模型的转换

以三维多晶体有限元模型为例, 对其进行ABAQUS建模、Python接口程序转换、ADINA求解与后处理。

图3是ABAQUS环境下建立的三维多晶体模型, 对其划分网格, 定义集合、载荷、边界条件等。

输出数据交换文件, 利用Python接口程序, 为其赋予材料种数及属性, 将其转换为ADINA输入文件, 然后将新生成的nas文件导入ADINA。

图4为三维多晶体有限元模型导入ADINA后显示的图形。

模型导入后, 对其进行求解计算, 生成求解文件。再在Post-Processing程序模式下读入结果文件, 如图5所示。

查看其变型比例图像, 如图6所示。

4 结论

复杂三维模型在ADINA中一般采用自下而上依次建立点、线、面、体的方法。其中面和体的定义需手工完成, 若有几百个面和体, 人工定义既耗时又易出错。

用Python编写ABAQUS TO ADINA模型转换程序, 以三维多晶体有限元模型的转换为例, 表明了该方法的可行性。

参考文献

[1]石亦平, 周玉蓉.ABAQUS有限元分析实例详解[M].北京:机械工业出版社, 2006.

[2]孙广磊.征服Python—语言基础与典型应用[M].北京:人民邮电出版社, 2007.

[3]岳戈, 陈权, 等.ADINA应用基础与实例详解[M].北京:人民交通出版社, 2008.

[4]朱玉巧, 李晓峰, 刘铁夫.CADDS5与ADINA的接口程序开发[J].原子能科学技术, 1997, 31 (2) :98-105.

[5]张玉灯, 郑涛, 毛新生.基于AutoCAD的二维建模研究[J].水利与建筑工程学报, 2008, 6 (2) :11-18.

[6]张玉灯.基于AutoCAD的三维建模研究[J].矿业快报, 2008, 27 (2) :166-169.

[7]李旭东.复合材料微观组织结构的计算机可视化表征[J].材料科学与工程新进展, 2004:1103-1111.

上一篇:挡墙设计下一篇:项目施工阶段工程监理