ch12反 射

反 射

反射是一个普通术语,描述了在运行过程中检查和处理程序元素的功能。例如,反射允许完成以下任务:

● 枚举类型的成员

● 实例化新对象

● 执行对象的成员

● 查找类型的信息

● 查找程序集的信息

● 检查应用于类型的定制特性

● 创建和编译新程序集

这个列表列出了许多功能,包括.NET Framework 类库提供的一些最强大、最复杂的功能。但本章不可能介绍反射的所有功能,仅讨论最常用的功能。

首先讨论定制特性,定制特性允许把定制的元数据与程序元素关联起来。这些元数据是在编译过程中创建的,并嵌入到程序集中。接着就可以在运行期间使用反射的一些功能检查这些元数据了。

在介绍了定制特性后,本章将探讨支持反射的一些基类,包括System.Type 和System. Reflection.Assembly 类,它们可以访问反射提供的许多功能。

为了演示定制特性和反射,我们将开发一个示例,说明公司如何定期升级软件,自动解释升级的信息。在这个示例中,要定义几个定制特性,表示程序元素最后修改或创建的日期,以及发生了什么变化。然后使用反射开发一个应用程序,在程序集中查找这些特性,自动显示软件自某个给定日期以来升级的所有信息。

本章要讨论的另一个示例是一个应用程序,该程序读写数据库,并使用定制特性,把类和特性标记为对应的数据库表和列。然后在运行期间从程序集中读取这些特性,使程序可以自动从数据库的相应位置检索或写入数据,无需为每个表或列编写特定的逻辑。

第 章 12

第Ⅰ部分C# 语言

12.1 定制特性

前面介绍了如何在程序的各个数据项上定义特性。这些特性都是Microsoft定义好的,作为.NET Framework类库的一部分,许多特性都得到了C#编译器的支持。对于这些特性,编译器可以以特殊的方式定制编译过程,例如,可以根据StructLayout特性中的信息在内存中布置结构。

.NET Framework也允许用户定义自己的特性。显然,这些特性不会影响编译过程,因为编译器不能识别它们,但这些特性在应用于程序元素时,可以在编译好的程序集中用作元数据。

这些元数据在文档说明中非常有用。但是,使定制特性非常强大的因素是使用反射,代码可以读取这些元数据,使用它们在运行期间作出决策,也就是说,定制特性可以直接影响代码运行的方式。例如,定制特性可以用于支持对定制许可类进行声明代码访问安全检查,把信息与程序元素关联起来,由测试工具使用,或者在开发可扩展的架构时,允许加载插件或模块。

12.1.1 编写定制特性

为了理解编写定制特性的方式,应了解一下在编译器遇到代码中某个应用了定制特性的元素时,该如何处理。以数据库为例,假定有一个C#属性声明,如下所示。

[FieldName("SocialSecurityNumber")]

public string SocialSecurityNumber

{

get {

// etc.

当C#编译器发现这个属性有一个特性FieldName时,首先会把字符串Attribute添加到这个名称的后面,形成一个组合名称FieldNameAttribute,然后在其搜索路径的所有命名空间(即在using语句中提及的命名空间)中搜索有指定名称的类。但要注意,如果用一个特性标记数据项,而该特性的名称以字符串Attribute结尾,编译器就不会把该字符串加到组合名称中,而是不修改该特性名。因此,上面的代码实际上等价于:

[FieldNameAttribute("SocialSecurityNumber")]

public string SocialSecurityNumber

{

get {

// etc.

编译器会找到含有该名称的类,且这个类直接或间接派生自System.Attribute。编译器还认为这个类包含控制特性用法的信息。特别是属性类需要指定:

●特性可以应用到哪些程序元素上(类、结构、属性和方法等)

●它是否可以多次应用到同一个程序元素上

●特性在应用到类或接口上时,是否由派生类和接口继承

322

第12章反射

●这个特性有哪些必选和可选参数

如果编译器找不到对应的特性类,或者找到一个这样的特性类,但使用特性的方式与

特性类中的信息不匹配,编译器就会产生一个编译错误。例如,如果特性类指定该特性只

能应用于字段,但我们把它应用到结构定义上,就会产生一个编译错误。

继续上面的示例,假定定义了一个FieldName特性:

[AttributeUsage(AttributeTargets.Property,

AllowMultiple=false,

Inherited=false)]

public class FieldNameAttribute : Attribute

{

private string name;

public FieldNameAttribute(string name)

{

https://www.360docs.net/doc/9117736501.html, = name;

}

}

下面几节讨论这个定义中的每个元素。

1. AttributeUsage特性

要注意的第一个问题是特性(attribute)类本身用一个特性System.AttributeUsage来标记。这是Microsoft定义的一个特性,C#编译器为它提供了特殊的支持(AttributeUsage根本

不是一个特性,它更像一个元特性,因为它只能应用到其他特性上,不能应用到类上)。AttributeUsage主要用于表示定制特性可以应用到哪些类型的程序元素上。这些信息由它的

第一个参数给出,该参数是必选的,其类型是枚举类型AttributeTargets。在上面的示例中,

指定FieldName特性只能应用到属性(property)上——这是因为我们在前面的代码段中把它

应用到属性上。AttributeTargets枚举的成员如下:

●All

●Assembly

●Class

●Constructor

●Delegate

●Enum

●Event

●Field

●GenericParameter(仅.NET 2.0提供)

●Interface

●Method

●Module

●Parameter

●Property

323

第Ⅰ部分C# 语言

324 ●ReturnValue

●Struct

这个列表列出了可以应用该特性的所有程序元素。注意在把特性应用到程序元素上

时,应把特性放在元素前面的方括号中。但是,在上面的列表中,有两个值不对应于任何程序元素:Assembly和Module。特性可以作为一个整体应用到程序集或模块中,而不是应用到代码中的一个元素上,在这种情况下,这个特性可以放在源代码的任何地方,但需要用关键字assembly或module来做前缀:

[assembly: SomeAssemblyAttribute(Parameters)]

[module: SomeAssemblyAttribute(Parameters)]

在指定定制特性的有效目标元素时,可以使用按位OR运算符把这些值组合起来。例如,如果指定FieldName特性可以应用到属性和字段上,可以编写下面的代码:

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple=false,

Inherited=false)]

public class FieldNameAttribute : Attribute

也可以使用AttributeTargets.All指定特性可以应用到所有类型的程序元素上。Attributes Usage特性还包含另外两个参数AllowMultiple 和Inherited。它们用不同的语法来指定:=,而不是只给出这些参数的值。这些参数是可选的,如果需要,可以忽略它们。

AllowMultiple参数表示一个特性是否可以多次应用到同一项上,这里把它设置为false,表示如果编译器遇到下述代码,就会产生一个错误:

[FieldName("SocialSecurityNumber")]

[FieldName("NationalInsuranceNumber")]

public string SocialSecurityNumber

{

// etc.

如果Inherited参数设置为true,就表示应用到类或接口上的特性也可以自动应用到所有派生的类或接口上。如果特性应用到方法或属性上,也可以自动应用到该方法或属性的重载上。

2. 指定特性参数

下面介绍如何指定定制特性的参数。在编译器遇到下述语句时:

[FieldName("SocialSecurityNumber")]

public string SocialSecurityNumber

{

// etc.

会检查传送给特性的参数(在本例中,是一个字符串),并查找该特性中带这些参数的

第12章反射

构造函数。如果找到一个这样的构造函数,编译器就会把指定的元数据传送给程序集。如

果找不到,就生成一个编译错误。如后面所述,反射会从程序集中读取元数据,并实例化

它们表示的特性类。因此,编译器需要确保存在这样的构造函数,才能在运行期间实例化

指定的特性。

在本例中,仅为FieldNameAttribute提供了一个构造函数,而这个构造函数有一个字

符串参数。因此,在把FieldNameAttribute特性应用到一个属性上时,必须为它提供一个

字符串参数,如上面的代码所示。

如果可以选择特性的参数类型,当然可以提供构造函数的不同重载方法,但一般是仅

提供一个构造函数,使用属性来定义其他可选参数,下面将介绍可选参数。

3. 指定特性的可选参数

在AttributeUsage特性中,可以使用另一个语法,把可选参数添加到特性中。这个语

法指定可选参数的名称和值,处理特性类中的公共属性或字段。例如,假定修改SocialSecurityNumber属性的定义,如下所示:

[FieldName("SocialSecurityNumber", Comment="This is the primary key field")] public string SocialSecurityNumber

{

// etc.

在本例中,编译器识别第二个参数的语法=,所以

不会把这个参数传递给FieldNameAttribute构造函数,而是查找一个有该名称的公用属性

或字段(最好不要使用公用字段,所以一般情况下要使用属性),编译器可以用这个属性设

置第二个参数的值。如果希望上面的代码工作,必须给FieldNameAttribute添加一些代码:

[AttributeUsage(AttributeTargets.Property,

AllowMultiple=false,

Inherited=false)]

public class FieldNameAttribute : Attribute

{

private string comment;

public string Comment

{

get

{

return comment;

}

set

{

comment = value;

}

}

// etc.

325

第Ⅰ部分C# 语言

12.1.2 定制特性示例:WhatsNewAttributes

本节开始编写前面描述过的示例WhatsNewAttributes,该示例提供了一个特性,表示最后一次修改程序元素的时间。这个示例比前面所有的示例都复杂,因为它包含3个不同的程序集:

●WhatsNewAttributes程序集,它包含特性的定义。

●VectorClass程序集,包含所应用的特性的代码。

●LookUpWhatsNew程序集,包含显示已改变的数据项信息的项目。

当然,只有LookUpWhatsNew是前面使用的一个控制台应用程序,其余两个程序集都是库文件,它们都包含类的定义,但都没有程序的入口。对于VectorClass程序集,我们使用了VectorAsCollection示例,但删除了入口和测试代码类,只剩下Vector类。

在命令行上编译,以此管理3个相关的程序集要求较高的技巧,所以我们分别给出编译这3个源文件的命令。也可以编辑代码示例,(可以从Wrox Press网站上下载),组合为一个Visual Studio 2005解决方案,详见第14章。下载的文件包含所需的Visual Studio 2005解决方案文件。

1. WhatsNewAttributes 库程序集

首先从核心的WhatsNewAttributes程序集开始。其源代码包含在文件WhatsNewAttri butes.cs中,该文件位于本章示例代码的WhatsNewAttributes解决方案的WhatsNewAttributes 项目中。编译为库的语法非常简单:在命令行上,给编译器提供标记target:library即可。

要编译WhatsNewAttributes,键入:

csc /target:library WhatsNewAttributes.cs

WhatsNewAttributes.cs文件定义了两个特性类LastModifiedAttribute和SupportsWhats New-Attribute。LastModifiedAttribute特性可以用于标记最后一次修改数据项的时间,它有两个必选参数(该参数传递给构造函数);修改的日期和包含描述修改的字符串。它还有一个可选参数Issues (表示存在一个公共属性),它可以描述该数据项的任何重要问题。

在现实生活中,或许想把特性应用到任何对象上。为了使代码比较简单,这里仅允许将它应用于类和方法,并允许它多次应用到同一项上(AllowMultiple=true),因为可以多次修改一个项,每次修改都需要用一个不同的特性实例来标记。

SupportsWhatsNew是一个较小的类,表示不带任何参数的特性。这个特性是一个程序集的特性,用于把程序集标记为通过LastModifiedAttribute维护的文档说明书。这样,以后查看这个程序集的程序会知道,它读取的程序集是我们使用自动文档说明过程生成的那个程序集。这部分示例的完整源代码如下所示:

using System;

namespace Wrox.ProCSharp.WhatsNewAttributes

{

[AttributeUsage(

AttributeTargets.Class | AttributeTargets.Method,

AllowMultiple=true, Inherited=false)]

326

第12章反射

public class LastModifiedAttribute : Attribute

{

private DateTime dateModified;

private string changes;

private string issues;

public LastModifiedAttribute(string dateModified, string changes)

{

this.dateModified = DateTime.Parse(dateModified);

this.changes = changes;

}

public DateTime DateModified

{

get

{

return dateModified;

}

}

public string Changes

{

get

{

return changes;

}

}

public string Issues

{

get

{

return issues;

}

set

{

issues = value;

}

}

}

[AttributeUsage(AttributeTargets.Assembly)]

public class SupportsWhatsNewAttribute : Attribute

{

}

}

从上面的描述可以看出,上面的代码非常简单。但要注意,不必将set访问器提供给Changes和DateModified属性,不需要这些访问器是因为在构造函数中,这些参数都是必

选参数。需要get访问器,是因为以后可以读取这些特性的值。

327

第Ⅰ部分C# 语言

328 2. VectorClass程序集

本节就使用这些特性,我们用前面的VectorAsCollection 示例的修订版本来说明。注

意这里需要引用刚才创建的WhatsNewAttributes库,还需要使用using语句指定相应的命名空间,这样编译器才能识别出这些特性:

using System;

using System.Collections;

using System.Text;

using Wrox.ProCSharp.WhatsNewAttributes;

[assembly: SupportsWhatsNew]

在这段代码中,添加了一行用SupportsWhatsNew特性标记程序集本身的代码。

下面考虑Vector类的代码。我们并不是真的要修改这个类中的任何内容,只是添加两个LastModified特性,以标记出本章对Vector类进行的操作。把Vector定义为一个类,而不是结构,以简化后面显示特性所编写的代码(在V ectorAsCollection示例中,Vector是一个结构,但其枚举器是一个类。于是,这个示例的下一个版本在查看程序集时,必须同时考虑类和结构。这会使例子比较复杂)。

namespace Wrox.ProCSharp.VectorClass

{

[LastModified("14 Feb 2007", "IEnumerable interface implemented " + "So Vector can now be treated as a collection")]

[LastModified("10 Feb 2007", "IFormattable interface implemented " + "So Vector now responds to format specifiers N and VE")]

class Vector : IFormattable, IEnumerable

{

public double x, y, z;

public Vector(double x, double y, double z)

{

this.x = x;

this.y = y;

this.z = z;

}

[LastModified("10 Feb 2002",

"Method added in order to provide formatting support")] public string ToString(string format, IFormatProvider formatProvider) {

if (format == null)

{

return ToString();

}

再把包含的VectorEnumerator类标记为new:

[LastModified("14 Feb 2007",

"Class created as part of collection support for Vector")]

第12章反射

private class VectorEnumerator : IEnumerator

{

为了在命令行上编译这段代码,应键入下面的命令:

csc /target:library /reference:WhatsNewAttributes.dll VectorClass.cs

上面是这个示例的代码。目前还不能运行它,因为我们只有两个库。在描述了反射的

工作原理后,就介绍这个示例的最后一部分,查找和显示这些特性。

12.2 反射

本节先介绍System.Type 类,通过这个类可以访问任何给定数据类型的信息。然后简

要介绍System.Reflection.Assembly类,它可以用于访问给定程序集的信息,或者把这个程

序集加载到程序中。最后把本节的代码和上一节的代码结合起来,完成WhatsNewAttributes

示例。

12.2.1 System.Type类

在本书中的许多场合中都使用了Type类,但它只存储类型的引用:

Type t = typeof(double)

我们以前把Type看作一个类,但它实际上是一个抽象的基类。只要实例化了一个Type

对象,就实例化了Type的一个派生类。Type有与每种数据类型对应的派生类,但一般情

况下派生的类只提供各种Type方法和属性的不同重载,返回对应数据类型的正确数据。一

般不增加新的方法或属性。获取指向给定类型的Type引用有3种常用方式:

●使用C#的typeof运算符,如上所示。这个运算符的参数是类型的名称(不放在引

号中)。

●使用GetType()方法,所有的类都会从System.Object继承这个类。

double d = 10;

Type t = d.GetType();

在一个变量上调用GetType(),而不是把类型的名称作为其参数。但要注意,返回的Type对象仍只与该数据类型相关:它不包含与类型实例相关的任何信息。如果有一个对象

引用,但不能确保该对象实际上是哪个类的实例,这个方法也是很有用的。

●还可以调用Type类的静态方法GetType():

Type t = Type.GetType("System.Double");

Type是许多反射技术的入口。它执行许多方法和属性,这里不可能列出所有的方法和

属性,而主要介绍如何使用这个类。注意,可用的属性都是只读的:可以使用Type确定

329

第Ⅰ部分C# 语言

数据的类型,但不能使用它修改该类型!

1. Type的属性

由Type执行的属性可以分为下述3类:

●有许多属性都可以获取包含与类相关的各种名称的字符串,如表12-1所示。

●属性还可以进一步获取Type对象的引用,这些引用表示相关的类,如表12-2所示。

●许多Boolean 属性表示这个类型是一个类、还是一个枚举等。这些属性包括IsAbstract、

IsArray、IsClass、IsEnum、IsInterface、IsPointer、IsPrimitive(一种预定义的基本数

据类型)、IsPublic、IsSealed和IsValueType

例如,使用一个基本数据类型:

Type intType = typeof(int);

Console.WriteLine(intType.IsAbstract); // writes false

Console.WriteLine(intType.IsClass); // writes false

Console.WriteLine(intType.IsEnum); // writes false

Console.WriteLine(intType.IsPrimitive); // writes true

Console.WriteLine(intType.IsValueType); // writes true

或者使用Vector类:

Type intType = typeof(Vector);

Console.WriteLine(intType.IsAbstract); // writes false

Console.WriteLine(intType.IsClass); // writes true

Console.WriteLine(intType.IsEnum); // writes false

Console.WriteLine(intType.IsPrimitive); // writes false

Console.WriteLine(intType.IsValueType); // writes false

也可以获取定义类型的程序集的引用,该引用作为System.Reflection.Assembly类实例的一个引用来返回:

330

第12章反射

Type t = typeof (Vector);

Assembly containingAssembly = new Assembly(t);

2. 方法

System.Type的大多数方法都用于获取对应数据类型的成员信息:构造函数、属性、方

法和事件等。它有许多方法,但它们都有相同的模式。例如,有两个方法可以获取数据类

型的方法信息:GetMethod()和GetMethods()。GetMethod()方法返回System.Reflection.MethodInfo对象的一个引用,其中包含一个方法的信息。GetMethods()

返回这种引用的一个数组。其区别是GetMethods()返回所有方法的信息,而GetMethod()

返回一个方法的信息,其中该方法包含特定的参数列表。这两个方法都有重载方法,该重

载方法有一个附加的参数,即BindingFlags枚举值,表示应返回哪些成员,例如,返回公

有成员、实例成员和静态成员等。

例如,GetMethods()最简单的一个重载方法不带参数,返回数据类型所有公共方法的

信息:

Type t = typeof(double);

MethodInfo [] methods = t.GetMethods();

foreach (MethodInfo nextMethod in methods)

{

// etc.

}

Type的成员方法如表12-3所示遵循同一个模式。

GetMember()和GetMembers()方法返回数据类型的一个或所有成员的信息,这些成员

可以是构造函数、属性和方法等。最后要注意,可以调用这些成员,其方式是调用Type

的InvokeMember()方法,或者调用MethodInfo, PropertyInfo和其他类的Invoke()方法。

12.2.2 TypeView示例

下面用一个短小的示例TypeView来说明Type类的一些功能,这个示例可以列出数据类

331

第Ⅰ部分 C# 语 言

332 型的所有成员。本例中主要介绍double 型的TypeView 用法,也可以修改该样列中的一行代码,使用其他的数据类型。TypeView 提供的信息要比在控制台窗口中显示的信息多得多,所以我们将打破常规,在一个消息框中显示这些信息。运行double 型的TypeView 示例,结果如图12-1所示。

图 12-1

该消息框显示了数据类型的名称、全名和命名空间,以及底层类型和基类的名称。然后迭代该数据类型的所有公有实例成员,显示所声明类型的每个成员、成员的类型(方法、字段等)以及成员的名称。声明类型是实际声明类型成员的类名(换言之,如果在System.Double 中定义或重载,该声明类型就是System.Double ,如果成员继承了某个基类,该声明类就是相关基类的名称)。

TypeView 不会显示方法的签名,因为我们是通过MemberInfo 对象获取所有公有实例成员的信息,参数信息不能通过MemberInfo 对象来获得。为了获取该信息,需要引用MemberInfo 和其他更特殊的对象,即需要分别获取每一个成员类型的信息。

TypeView 会显示所有公有实例成员的信息,但对于double 来说,仅定义了字段和方法。把TypeView 编译为一个控制台应用程序,可以在控制台应用程序中显示消息框。但是,使用消息框就意味着需要引用基类程序集System.Windows.Forms. dll ,它包含System.Windows.Forms 命名空间中的类,在这个命名空间中,定义了我们需要的MessageBox 类。下面列出TypeView 的代码。开始时需要添加两条using 语句: using System;

using System.Text;

using System.Windows.Forms;

using System.Reflection;

第12章反射

需要System.Text的原因是我们要使用StringBuilder对象建立在消息框中显示的文本,

以及消息框本身的System.Windows.Forms。全部代码都放在类MainClass中,这个类包含

两个静态方法和一个静态字段,StringBuilder的一个实例叫作OutputText,用于创建在消息

框中显示的文本。Main方法和类的声明如下所示:

class MainClass

{

Static StringBuilder OutputText = new StringBuilder();

static void Main()

{

// modify this line to retrieve details of any

// other data type

Type t = typeof(double);

AnalyzeType(t);

MessageBox.Show(OutputText.ToString(), "Analysis of type "

+ https://www.360docs.net/doc/9117736501.html,);

Console.ReadLine();

}

Main()方法首先声明一个Type对象,表示我们选择的数据类型,再调用方法AnalyzeType(),从Type对象中提取信息,并使用该信息建立输出文本。最后在消息框中显

示输出。使用MessageBox类是非常直观的:只需调用其静态方法Show(),给它传递两个

字符串,分别为消息框中的文本和标题。这些都由AnalyzeType()来完成:

static void AnalyzeType(Type t)

{

AddToOutput("Type Name: " + https://www.360docs.net/doc/9117736501.html,);

AddToOutput("Full Name: " + t.FullName);

AddToOutput("Namespace: " + https://www.360docs.net/doc/9117736501.html,space);

Type tBase = t.BaseType;

if (tBase != null)

{

AddToOutput("Base Type:" + https://www.360docs.net/doc/9117736501.html,);

}

Type tUnderlyingSystem = t.UnderlyingSystemType;

if (tUnderlyingSystem != null)

{

AddToOutput("UnderlyingSystem Type:" + https://www.360docs.net/doc/9117736501.html,);

}

AddToOutput("\nPUBLIC MEMBERS:");

MemberInfo [] Members = t.GetMembers();

foreach (MemberInfo NextMember in Members)

333

第Ⅰ部分C# 语言

334 {

AddToOutput(NextMember.DeclaringType + " " +

NextMember.MemberType + " " + https://www.360docs.net/doc/9117736501.html,);

}

}

执行这个方法,仅需调用Type对象的各种属性,就可以获得我们需要的类型名称的信

息,再调用GetMembers()方法,获得一个MemberInfo对象数组,该数组用于显示每个成员的信息。注意这里使用了一个辅助方法AddToOutput(),该方法创建要在消息框中显示的文本:

static void AddToOutput(string Text)

{

OutputText.Append("\n" + Text);

}

使用下面的命令编译TypeView程序集:

csc /reference:System.Windows.Forms.dll TypeView.cs

12.2.3 Assembly类

Assembly类是在System.Reflection命名空间中定义的,它允许访问给定程序集的元数据,它也包含可以加载和执行程序集(假定该程序集是可执行的)的方法。与Type类一样,Assembly类包含非常多的方法和属性,这里不可能逐一论述。下面仅介绍完成示例WhatsNewAttributes所需要的方法和属性。

在使用Assembly实例做一些工作前,需要把相应的程序集加载到运行进程中。为此,可以使用静态成员Assembly.Load()或Assembly.LoadFrom()。这两个方法的区别是Load()的参数是程序集的名称,运行库会在各个位置上搜索该程序集,这些位置包括本地目录和全局程序集高速缓存。而LoadFrom()的参数是程序集的完整路径名,不会在其他位置搜索该程序集:

Assembly assembly1 = Assembly.Load("SomeAssembly");

Assembly assembly2 = Assembly.LoadFrom

(@"C:\My Projects\Software\SomeOtherAssembly");

这两个方法都有许多其他重载,它们提供了其他安全信息。加载了一个程序集后,就可以使用它的各种属性,例如查找它的全名:

string name = assembly1.FullName;

1. 查找在程序集中定义的类型

Assembly类的一个特性是可以获得在相应程序集中定义的所有类型的信息,只要调用Assembly.GetTypes()方法,就可以返回一个包含所有类型信息的System.Type引用数组,然后就可以按照上一节的方式处理这些Type引用了:

第12章反射

Type[] types = theAssembly.GetTypes();

foreach(Type definedType in types)

{

DoSomethingWith(definedType);

}

2. 查找定制特性

用于查找在程序集或类型中定义了什么定制特性的方法取决于与该特性相关的对象类型。如果要确定程序集中有什么定制特性,就需要调用Attribute类的一个静态方法GetCustomAttributes(),给它传递程序集的引用:

Attribute [] definedAttributes =

Attribute.GetCustomAttributes(assembly1);

// assembly1 is an Assembly object

注意:

这是相当重要的。以前您可能想知道,在定义定制特性时,必须为它们编写类,为什

么Microsoft没有更简单的语法。答案就在于此。定制特性与对象一样,加载了程序集后,

就可以读取这些特性对象,查看它们的属性,并且调用它们的方法。

GetCustomAttributes()在用于获取程序集的特性时,有两个重载方法:如果在调用它时,

除了程序集的引用外,没有指定其他参数,该方法就会返回为这个程序集定义的所有定制

特性。当然,也可以通过指定第二个参数来调用它,第二个参数表示特性类的一个Type

对象,在这种情况下,GetCustomAttributes()就返回一个数组,该数组包含该特性类的所有

特性。

注意,所有的特性都作为一般的Attribute引用来获取。如果要调用为定制特性定义的任

何方法或属性,就需要把这些引用显式转换为相关的定制特性类。调用Assembly.GetCustomAttributes()的另一个重载方法,可以获得与给定数据类型相关的定制特

性信息,这次传递的是一个Type引用,它描述了要获取的任何相关特性的类型。另一方面,

如果要获得与方法、构造函数和字段等相关的特性,就需要调用GetCustomAttributes()方法,

该方法是类MethodInfo、ConstructorInfo和FieldInfo等的一个成员。

如果只需要给定类型的一个特性,就可以调用GetCustomAttribute()方法,它返回一个Attribute对象。在WhatsNewAttributes示例中使用GetCustomAttribute()方法,是为了确定

程序集中是否有特性SupportsWhatsNew。为此,调用GetCustomAttributes(),传递对WhatsNew Attributes程序集的一个引用和SupportWhatsNewAttribute特性的类型。

如果有这个特性,就返回一个Attribute实例。如果在程序集中没有定义任何实例,就返回null。如果找到两个或多个实例,GetCustomAttribute()方法就抛出一个异常System.Reflection. AmbiguousMatchException:

Attribute supportsAttribute =

Attribute.GetCustomAttributes(assembly1,

typeof(SupportsWhats NewAttribute));

335

第Ⅰ部分C# 语言

12.2.4 完成WhatsNewAttributes示例

现在已经有足够的知识来完成WhatsNewAttributes示例了。为该示例中的最后一个程序集LookUpWhatsNew编写源代码,这部分应用程序是一个控制台应用程序,它需要引用其他两个程序集WhatsNewAttributes和VectorClass。这是一个命令行应用程序,但仍可以象前面的TypeView示例那样在消息框中显示结果,因为结果是许多文本,所以不能显示在一个控制台窗口屏幕上。

这个文件的名称为LookUpWhatsNew.cs,编译它的命令是:

csc /reference:WhatsNewAttributes.dll /reference:VectorClass.dll LookUpWhatsNew.cs

在这个文件的源代码中,首先指定要使用的命名空间System.Text,因为需要使用一个StringBuilder对象:

using System;

using System.Reflection;

using System.Windows.Forms;

using System.Text;

using Wrox.ProCSharp.VectorClass;

using Wrox.ProCSharp.WhatsNewAttributes;

namespace Wrox.ProCSharp.LookUpWhatsNew

{

类WhatsNewChecker包含主程序入口和其他方法。我们定义的所有方法都在这个类中,它还有两个静态字段:outputText和backDateTo。outputText包含在准备阶段创建的文本,这个文本要写到消息框中,backDateTo存储了选择的日期——自从该日期以来的所有修改都要显示出来。一般情况下,需要显示一个对话框,让用户选择这个日期,但我们不想编写这段代码,以免转移读者的注意力。因此,把backDateTo硬编码为日期2007年2月1日。在下载这段代码时,很容易修改这个日期:

class WhatsNewChecker

{

static StringBuilder outputText = new StringBuilder(1000);

static DateTime backDateTo = new DateTime(2007, 2, 1);

static void Main()

{

Assembly theAssembly = Assembly.Load("VectorClass");

Attribute supportsAttribute =

Attribute.GetCustomAttribute(

theAssembly, typeof(SupportsWhatsNewAttribute));

string Name = theAssembly.FullName;

AddToMessage("Assembly: " + Name);

if (supportsAttribute == null)

{

336

第12章反射

AddToMessage( "This assembly does not support WhatsNew attributes");

return;

}

else

AddToMessage("Defined Types:");

Type[] types = theAssembly.GetTypes();

foreach(Type definedType in types)

DisplayTypeInfo(theAssembly, definedType);

MessageBox.Show(outputText.ToString(),

"What\'s New since " + backDateTo.ToLongDateString());

Console.ReadLine();

}

Main()方法首先加载VectorClass程序集,验证它是否真的用SupportsWhatsNew特性

来标记。我们知道,VectorClass应用了SupportsWhatsNew特性,虽然才编译了该程序集,

但进行这种检查还是必要的,因为用户可能希望检查这个程序集。

验证了这个程序集后,使用Assembly.GetTypes()方法获得一个数组,其中包括在该程

序集中定义的所有类型,然后在这个数组中迭代。对每种类型调用一个方法DisplayTypeInfo(),给outputText字段添加相关的文本,包括LastModifiedAttribute实例的

信息。最后,显示带有完整文本的消息框。DisplayTypeInfo()方法如下所示:

static void DisplayTypeInfo(Assembly theAssembly, Type type)

{

// make sure we only pick out classes

if (!(type.IsClass))

{

return;

}

AddToMessage("\nclass " + https://www.360docs.net/doc/9117736501.html,);

Attribute [] attribs = Attribute.GetCustomAttributes(type);

if (attribs.Length == 0)

{

AddToMessage("No changes to this class\n");

}

else

{

foreach (Attribute attrib in attribs)

{

WriteAttributeInfo(attrib);

}

337

第Ⅰ部分C# 语言

338

}

MethodInfo [] methods = type.GetMethods();

AddToMessage("CHANGES TO METHODS OF THIS CLASS:");

foreach (MethodInfo nextMethod in methods)

{

object [] attribs2 =

nextMethod.GetCustomAttributes(

typeof(LastModifiedAttribute), false);

if (attribs != null)

{

AddToMessage(

nextMethod.ReturnType + " " + https://www.360docs.net/doc/9117736501.html, + "()");

foreach (Attribute nextAttrib in attribs2)

{

WriteAttributeInfo(nextAttrib);

}

}

}

}

注意,在这个方法中,首先应检查参数Type引用是否表示一个类。为了简化代码,指

定LastModified特性只能应用于类或成员方法,如果该引用不是类(它可能是一个结构、委托或枚举),进行任何处理都是浪费时间。

接着使用Attribute.GetCustomAttributes()方法确定这个类是否有相关的LastModified Attribute实例。如果有,就使用帮助方法WriteAttributeInfo()把它们的信息添加到输出文本中。

最后使用Type.GetMethods()方法迭代这个数据类型的所有成员方法,然后对类的每个方法进行相同的处理:检查每个方法是否有相关的LastModifiedAttribute实例,如果有,用WriteAttributeInfo()显示方法它们。

下面的代码显示了WriteAttributeInfo()方法,它负责确定为给定的LastModifiedAttribute 实例显示什么文本,注意这个方法的参数是一个Attribute引用,所以需要先把该引用转换为LastModifiedAttribute引用。之后,就可以使用最初为这个特性定义的属性获取其参数。在把该特性添加到要显示的文本中之前,应检查特性的日期是否是最近的:

static void WriteAttributeInfo(Attribute attrib)

{

LastModifiedAttribute lastModifiedAttrib =

attrib as LastModifiedAttribute;

if (lastModifiedAttrib == null)

{

return;

第12章 反 射

339 }

// check that date is in range

DateTime modifiedDate = lastModifiedAttrib.DateModified;

if (modifiedDate < backDateTo)

{

return;

}

AddToMessage(" MODIFIED: " +

modifiedDate.ToLongDateString() + ":");

AddToMessage(" " + lastModifiedAttrib.Changes);

if (lastModifiedAttrib.Issues != null)

{

AddToMessage(" Outstanding issues:" +

lastModifiedAttrib.Issues);

}

}

最后,是辅助方法AddToMessage():

static void AddToMessage(string message)

{

outputText.Append("\n" + message);

}

}

}

运行这段代码,得到如图12-2所示的结果。

图 12-2

第Ⅰ部分C# 语言

340 注意,在列出VectorClass程序集中定义的类型时,实际上选择了两个类:V ector和内

嵌的V ectorEnumerator类。还要注意,这段代码把backDateTo日期硬编码为2月1日,实际上选择的是日期为2月14日的特性(添加集合支持的时间),而不是1月14日(添加IFormattable接口的时间)。

12.3 小结

本章没有介绍反射的全部内容,反射需要一整本书来讨论。我们只介绍了Type和Assembly类,它们是访问反射所提供的扩展功能的主要入口。

另外,本章还探讨了反射的一个常用方面:定制特性。介绍了如何定义和应用自己的定制特性,以及如何在运行期间检索定制属性的信息。

第13章介绍异常和结构化的异常处理。

第十一章界面现象

第十一章界面现象 一、基本要求 (1)理解表面张力和表面吉布斯自由能函数的概念。 (2)理解弯曲界面的附加压力概念和拉普拉斯公式及其应用。 (3)理解弯曲液面的饱和蒸汽压与平面液体的饱和蒸汽压的不同;掌握开尔文方程及其应用。 (4)了解铺展和铺展系数。了解润式、接触角和杨氏方程;了解毛细管现象。 (5)理解压稳状态及新相生成。 (6)了解溶液界面上的吸附现象,正吸附和负吸附,吉布斯模型及其表面过剩物质的量的概念。 (7)了解物理吸附和化学吸附的含义和区别。 (8)了解表面活性剂的特征及其应用。 (9)理解吉布斯吸附等温式。 (10)掌握兰缪尔单分子层吸附模型和吸附等温式。 (11)了解B.E.T.多分子层吸附定温式及其内容。 二、主要概念、定理与公式 1.界面 存在于两相之间的厚度约为几个分子大小(纳米级)的一薄层,称为界面层,简称界面。 通常有液-气、固-气、固-液、液-液、固-固等界面,对固-气界面及液-气界面亦称为表面。

2.分散度 把物质分散成细小微粒的程度,称为分散度。通常采用体积表面或质量表面来表示分散度的大小。 )表示多相分散体系的分散程度。其定义为:单位 通常用比表面( 体积或单位质量的物质所具有的表面积,分别用符号 或 式中 ,V,m分别为物质的总表面积、体积和质量。 3.界面现象 凡物质处于凝聚状态,界面上发生的一切物理化学现象均称为界面现象。如毛细管现象、润湿作用、液体过热、蒸汽过饱和、吸附作用等,同称为界面现象。 4.表面自由能和表面张力 (1)表面功:由于分子在界面上与在体相中所处的环境不同,所以表面组成、结构、能量和受力情况与体相都不相同。如果把一个分子从内部移到界面(或者说增大表面积)时,就必须克服分子体系内部分子之间的吸引力而 所需要 对体系做功。在温度、压力和组成恒定时,可逆的使表面积增加 对体系做的功叫表面功。 (2)表面自由能:高分散体系具有巨大的表面积,所以具有巨大的表面能。表面自由能的广义定义为:

傅献彩物理化学选择题———第十二章 界面现象 物化试卷(一)

目录(试卷均已上传至“百度文库”,请自己搜索)第一章热力学第一定律及其应用物化试卷(一)第一章热力学第一定律及其应用物化试卷(二)第二章热力学第二定律物化试卷(一) 第二章热力学第二定律物化试卷(二) 第三章统计热力学基础 第四章溶液物化试卷(一) 第四章溶液物化试卷(二) 第五章相平衡物化试卷(一) 第五章相平衡物化试卷(二) 第六章化学平衡物化试卷(一) 第六章化学平衡物化试卷(二) 第七章电解质溶液物化试卷(一) 第七章电解质溶液物化试卷(二) 第八章可逆电池的电动势及其应用物化试卷(一)第八章可逆电池的电动势及其应用物化试卷(二)第九章电解与极化作用 第十章化学动力学基础(一)物化试卷(一) 第十章化学动力学基础(一)物化试卷(二) 第十一章化学动力学基础(二) 物化试卷(一) 第十一章化学动力学基础(二) 物化试卷(二) 第十二章界面现象物化试卷(一) 第十二章界面现象物化试卷(二) 第十三章胶体与大分子溶液物化试卷(一) 第十三章胶体与大分子溶液物化试卷(二) 参考答案

1. 液体的表面自由能γ 可以表示为: ( ) (A) (α H/αA)T,p,n(B) (αF/αA)T,p,n (C) (αU/αA)S,V,n(D) (αG/αA)T,V,n 2. 对大多数纯液体其表面张力随温度的变化率是: ( ) (A) (αγ/αT)p> 0 (B) (αγ/αT)p< 0 (C) (αγ/αT)p= 0 (D) 无一定变化规律 3. 已知400 K 时,汞的饱和蒸气压为 p0,密度为ρ ,如果求在相同温度下,一个直径为10-7m 的汞滴的蒸气压,应该用公式:( ) (A) p = p0+ 2γ/R' (B) ln(p/p0) =ΔVapHm(1/T0-1/T)/R (C) RTln(p/p0) = 2γM/ρR' (D) p = nRT/V 4. 弯曲表面上附加压力的计算公式:Δp = p'-p0= 2γ/R' 中,R' 的符号:( ) (A) 液面为凸面时为正,凹面为负(C) 总为正 (B) 液面为凸面时为负,凹面为正(D) 总为负 5. 液体在毛细管中上升的高度与下列那一个因素无关: (A)温度(B)液体密度(C)重力加速度(D)大气压力 6. 把玻璃毛细管插入水中,凹面下液体所受的压力p 与平面液体所受的压力p 相比:( ) (A) p = p0(B)p < p0(C) p > p0(D) 不确定

第十二章界面现象 复习题解答

第十二章 界面现象复习题解答 1、 为什么气泡、液滴、肥皂泡等等都呈圆形?玻璃管口加热后会变的光滑并缩小(俗称圆口),这些现象的本质就是什么? 答:这些现象的本质就是:表面层分子总就是受到本体内部分子的拉力,有进入本体内部的趋势,即总就 是使表面积缩小到最小的趋势,因为相同体积的球形表面积最小,所以都成球形,而玻璃管口加热后变为 圆口也就是减小曲率半径((缩小表面积)。 2、 用学到的关于界面现象的知识解释以下几种做法或现象的基本原理:(1)人工降雨,(2)有机蒸馏中加沸石,(3)毛细凝聚,(4)过饱与溶液、过饱与蒸汽、过冷液体等过饱与现象,(5)重量分析中的“陈化”过程,(6)喷洒农药时为何常常要在药液中加少量表面活性剂。 答:都用开尔文公式RTlnP/P 0=2 r m/ρR’或RTlnP 1/P 2=(2 r m/ρ)*(1/R 1′-1/ R 2′)或RTlnS/S 0=2 r m/ρR’或 RTlnS 1/S 2=(2 r m/ρ)*(1/R 1′-1/ R 2′)来解释。 3、如图所示,在三通活塞的两端涂上肥皂液,关断右端通路,在左端吹一个大泡;然后关闭左端,在右端吹一个小泡,最后让左右两端相通,试问接通后两泡的大小有何变化?到何时达到平衡?讲出 变化的原因及平衡时两泡的曲率半径的比值。 答:接通后小泡变小,大泡变大,即小气泡的附加压力Ps 大于大气泡的附加压力,当达平衡时两气泡的曲 率半径相等。 4、因吉布斯自由能越低,体系越稳定,所以物体总有降低本身表面吉布斯自由能的趋势。请说说纯液体、溶液、固体就是如何降低自己的表面吉布斯自由能的。 答:纯液体通过缩小表面积来降低表面吉布斯自由能。溶液通过减小表面积与表面吸附两种途径来降低 表面吉布斯自由能,对表面活性剂产生正吸附(Pi= -a i /RT(dr/da i ),对非表面活性剂产生负吸附。固体通过 吸附气体分子或液体分子来降低体系吉布斯自由能。 5、为什么小晶粒的熔点比大块的固体的熔点略低而溶解度却比大晶粒大? 答:根据开尔文公式RTlnS 1/S 2=2 r m/ρR’说明小晶粒的溶解度大于大块固体的溶解度(因为相同质量的 小晶粒的表面吉布斯自由能大于大晶体的表面吉布斯自由能。因为熔点就是三相平衡点 , ∵RTlnP 小/P 大=(2 r m/ρ)*(1/R 小-1/ R 大),小晶体的蒸汽压大于大晶体的蒸汽压,所以小晶体的熔点比大晶

完全竞争市场与完全垄断市场的特点与区别

完全竞争市场与完全垄断 市场的特点与区别 柳剑 西方经济学家认为,依据市场竞争的不同条件和程度,可将市场分为四种类型:完全竞争市场、完全垄断市场、垄断竞争市场和寡头垄断市场。而完全竞争与完全垄断市场是其中的两种极端形势,其在生产过程、产品销售、经营策略等方面,都有其与众不同的特点,研究其价值,无疑为我们了解更深层次的市场理论,有着重要的意义。 完全竞争又称纯粹竞争,是指一种竞争不受任何阻碍和干扰的市场结构,是一种纯粹理论上的典型意义的市场,他不受任何外部力量控制和干扰,是完全自由化的市场,更是一种理论上的理想市场。 完全竞争市场具有以下特点: 第一,它是一个没有任何外在力量干预和控制的市场,既没有国家政府的干预,也没有厂商勾结的集体行动对市场机制作用的阻挠。 第二,它是一个数目众多的经济主体,而不存在足以左右市场的庞大企业或公司即:在市场中,每个经济主体的规模都很小,以致对市场不能发生什么影响。就买方而言,任何一个消费者,也不过是为数即多的消费者之一,从而不会引起卖者对他们的特殊考虑。就卖方而言,任何一个厂商的规模都很小,从而不能用变动某产出量的办法影响市场价格。 第三,市场上出售的商品是同质的、无差别的,甚至包装,样式都一样。因此,卖者不可能根据自己出售商品的某些特色而抬高价格。买者对任何一家厂商出售的商品都看成是一样的,而无任何偏好,也不愿为同质的商品付出较高的代价。 第四,市场上任何资源可以充分自由流动。任何一种生产资源,都可对市场的信息做出灵活的反映:流入或流出这个市场。具体说,资源的自由流动意味着:1、劳动力在地理位置上和工作种类上可以自由流动;2、没有一个投入所有者或生产者垄断投入;3、新的厂商或新的资本可以毫无困难的进入某一行业。 第五,充分的知识。消费者、生产者和资源的所有者充分掌握市场信息。如果消费者对市场缺乏了解,它就会对本来可以付较低价格的商品而付出较高价格。这样,市场就会出现商品统一而价格不一的现象;如果劳动者对市场的工资率一无所知,他就不会得到他本来可以得到的工资;如果生产者对成本价格不熟悉,他就不会把生产安排在最有力的水平上。 以上是理想化的完全竞争市场的条件和特点。在现实生活中,当然很难具备,甚至连一个条件也达不到。因此这种市场在现实生活中也根本不存在。然而,他作为一种基本的模式,仍然对我们了解西方经济市场有很大帮助。 完全垄断市场,是指整个行业的市场完全处于一家厂商所控制的状态,由一家厂商完全控制一个部门的市场结构。在这个市场中只有唯一的出售者。这个出

金属功能材料

粉末冶金: 将金属或非金属粉末混合后压制成形,并在低于金属熔点的温度下进行烧结,利用粉末间原子扩散来使其结合的过程被称做粉末冶金工艺。 一、粉料制备与压制成型粉末混料均匀并加入适当的助剂,再进行压制成型,粉粒间的原子通过固相扩散和机械咬合作用,使制件结合为具有一定强度的整体。 二、烧结将压制成型的制件放置在采用还原性气氛的闭式炉中进行烧结,烧结温度约为基体金属熔点的2/3~3/4倍。由于高温下不同种类原子的扩散,粉末表面氧化物的被还原以及变形粉末的再结晶,使粉末颗粒相互结合。 金属基复合材料的界面结合形式 (1)机械结合:第一类界面。主要依靠增强剂的粗糙表面的机械“锚固”力结合。 (2)浸润与溶解结合:第二类界面。如相互溶解严重,也可能发生溶解后析出现象,严重损伤增强剂,降低复合材料的性能。如采用熔浸法制备钨丝增强镍基高温合金复合材料以及碳纤维/镍基复合材料在600C下碳在镍中先溶解后析出的现象等。 (3)化学反应结合:第三类界面。大多数金属基复合材料的基体与增强相之间的界面处存在着化学势梯度。只要存在着有利的动力学条件,就可能发生相互扩散和化学反应。 2 金属基复合材料制备方法 固态法、液态法、喷射成型法、原位生长法 3、界面优化以及界面设计一般有以下几种途径: 1 增强剂的表面改性处理(选择增强体的考虑因素) (1)改善增强剂的力学性能(保护层); (2)改善增强剂与基体的润湿性和粘着性(润湿层); (3)防止增强剂与基体之间的扩散、渗透和反应(阻挡层); (4)减缓增强剂与基体之间因弹性模量、热膨胀系数等的不同以及热应力集中等因素所造成的物理相容性差的现象(过渡层、匹配层)。 2 金属基体改性(添加微量合金元素):控制界面反应、增加基体合金的流动性,降低复合材料的制备温度和时间、改善增强剂与基体的润湿性。 环境材料的内涵特点 (1)材料的先进性 (2)环境协调性(区别于传统材料) 生产环节中资源和能源的消耗少 工艺流程的环境负荷小 废弃后易于再生循环。(优先争取的目标) (3)舒适性 金属材料环境化 一、合金元素无害化、资源丰富和易于再生循环

界面现象 复习题解答

第十二章界面现象复习题解答 1、为什么气泡、液滴、肥皂泡等等都呈圆形玻璃管口加热后会变的光滑并缩小(俗称圆口),这些现象 的本质是什么 答:这些现象的本质是:表面层分子总是受到本体内部分子的拉力,有进入本体内部的趋势,即总是使表面积缩小到最小的趋势,因为相同体积的球形表面积最小,所以都成球形,而玻璃管口加热后变为圆口也是减小曲率半径((缩小表面积)。 2、用学到的关于界面现象的知识解释以下几种做法或现象的基本原理:(1)人工降雨,(2)有机蒸馏中加沸石,(3)毛细凝聚,(4)过饱和溶液、过饱和蒸汽、过冷液体等过饱和现象,(5)重量分析中的“陈化”过程,(6)喷洒农药时为何常常要在药液中加少量表面活性剂。 答:都用开尔文公式RTlnP/P0=2 r m/ρR’或RTlnP1/P2=(2 r m/ρ)*(1/R1′-1/ R2′)或RTlnS/S0=2 r m/ρR’或RTlnS1/S2=(2 r m/ρ)*(1/R1′-1/ R2′)来解释。 3、如图所示,在三通活塞的两端涂上肥皂液,关断右端通路,在左端吹一个大泡;然后关闭左端,在右端吹一个小泡,最后让左右两端相通,试问接通后两泡的大小有何变化到何时达到平 衡讲出变化的原因及平衡时两泡的曲率半径的比值。 答:接通后小泡变小,大泡变大,即小气泡的附加压力Ps大于大气泡的附加压力,当达平衡时两气泡的曲率半径相等。 4、因吉布斯自由能越低,体系越稳定,所以物体总有降低本身表面吉布斯自由能的趋势。请说说纯液体、溶液、固体是如何降低自己的表面吉布斯自由能的。 答:纯液体通过缩小表面积来降低表面吉布斯自由能。溶液通过减小表面积和表面吸附两种途径来降低表面吉布斯自由能,对表面活性剂产生正吸附(Pi= -a i/RT(dr/da i),对非表面活性剂产生负吸附。 固体通过吸附气体分子或液体分子来降低体系吉布斯自由能。 5、为什么小晶粒的熔点比大块的固体的熔点略低而溶解度却比大晶粒大 答:根据开尔文公式RTlnS1/S2=2 r m/ρR’说明小晶粒的溶解度大于大块固体的溶解度(因为相同质量的小晶粒的表面吉布斯自由能大于大晶体的表面吉布斯自由能。因为熔点是三相平衡点, ∵RTlnP小/P大=(2 r m/ρ)*(1/R小-1/ R大),小晶体的蒸汽压大于大晶体的蒸汽压,所以小晶体的熔点

三菱FX系列PLC特殊功能寄存器M指令代码详细功能介绍

M8000:上电接通 M8001:上电断开 M8002:初始化脉冲(首次扫描接通) M8003:初始化脉冲(首次扫描断开) M8004:错误发生(FX3UC时M8060,M8061,M8064,M8065,M8066,M8067其中哪一个ON时动作;FX3UC以外M8060,M8061,M8063,M8064,M8065,M8066,M8067其中哪一个ON时动作) M8005:电池电压降低(电池电压异常降低时动作) M8006:电池电压降低锁存(电池电压异常降低时动作保持) M8007:瞬间停止检测(当M8007为ON的时间小于D8008,PLC将继续运行) M8008:停电检测(当M8008电源关闭时,M8000也关闭) M8009:DC24V故障 M8011:10ms时钟脉冲 M8012:100ms时钟脉冲 M8013:1s时钟脉冲 M8014:1min时钟脉冲 M8015:内存实时脉冲(计时停止以及预先装置) M8016:内存实时脉冲(显示停止,时刻读出显示的停止) M8017:内存实时脉冲(补正,±30s补正) M8018:内存实时脉冲(安装,安装检测) M8019:内存实时脉冲错误

M8020:零位标志,加减演算结果为0 M8021:借位标志,演算结果成为最大的负数值以下时 M8022:进位标志,进位发生在ADD(FNC20)指令期间或当数据移位操作的结果发生溢出时。 M8023:小数点演算标志,ON:进行浮点运算。 M8024:BMOV方向指定,转送方向替换,数据从终点到源的方向转送。M8029:指令结束,DSW(FNC72)等等的动作结束时动作 M8030:电池LED消灯指令,当驱动M8030时,及时电池电压降低,PLC面板的LED也不会点亮。 M8031:非锁存内存全部清除 M8032:锁存内存全部清除 M8033:内存保持停止,ON时内存保持,当PLC从RUN→STOP,图像存储或者数据存储的内容保持原来状态。 M8034:所有输出禁止 M8035:强制RUN模式 M8036:强制RUN指令 M8037:强制STOP指令 M8038: ON时,通讯参数被设定;在FX2、FX2C里,作为RAM文件寄电器全部删除动作。M8074=1,M8038=1,D6000-D7999文件寄电器被删除。 M8039:=0常规扫描模式;=1恒定扫描模式,PLC等到在D8039里被指定的时间为止,进行循环操作。

(竞争策略)完全垄断市场与垄断竞争市场

(竞争策略)完全垄断市场与垄断竞争市场

第7章完全垄断市场与垄断竞争市场 7.1 考点难点归纳 7.1.1 提纲挈领 条件 需求曲线:右下方倾斜 收益曲线 完全垄断市场短期均衡:MR=SMC 供给曲线:不存在具有规律性的供给曲线 长期均衡:MR=SMC=LMC 差别定价:一级、二级、三级 边际成本定价法:P=MC 平均成本定价法:P=AC 自然垄断和政府管制双重定价法:类似价格歧视 资本回报率管制 条件右下方倾斜 需求曲线 垄断竞争市场d需求曲线与D需求曲线 短期均衡:MR=SMC 长期均衡:MR=LMC=SMC,AR=LAC=SAC 7.1.2 内容提要 一、完全垄断市场 垄断市场是指整个行业中只有惟一的一个厂商的市场组织。具体地说,垄断市场的条件

主要有这样三点:第一,市场上只有惟一的一个厂商生产和销售商品;第二,该厂商生产和销售的商品没有任何相近的替代品;第三,其他任何厂商进入该行业都极为困难或不可能。 二、垄断厂商的需求曲线和收益曲线 1.需求曲线 垄断厂商所面临的需求曲线就是市场的需求曲线,它是一条向右下方倾斜的曲线,即垄断厂商的销售量和市场价格成反方向变动。这条向右下方倾斜的需求曲线表示垄断厂商可以通过改变销售量来控制市场价格:以减少销售量来抬高价格,以增加销售量来降低价格。 2.收益曲线 垄断厂商的收益曲线具有以下特征: 第一,厂商的平均收益AR曲线与需求曲线d重叠,它们是同一条向右下方倾斜的曲线,这表示在每一个销售量上厂商的平均收益都等于商品的价格。第二,厂商的边际收益MR曲线也是向右下方倾斜的,且位于平均收益AR曲线的下方,这表示在每一个销售量上厂商的边际收益都小于平均收益。之所以MR<AR,是因为只要平均量下降,边际量就总是小于平均量。第三,厂商的总收益TR曲线是先上升,达到最高点以后再下降。因为在每一个销售量上的MR值都是相应的TR曲线的斜率,所以当MR值为正时,TR曲线的斜率为正,即TR曲线上升;当MR为负时,TR曲线的斜率为负,即TR曲线是下降的;当MR=0时,TR 曲线的斜率为零,即TR曲线达到极大值。如图7.1所示。 图7.1 完全垄断厂商的收益曲线 如果当垄断厂商所面临的向右下方倾斜的需求曲线d为直线型时,MR曲线也为向右下方倾斜的直线;d曲线和MR曲线在纵轴上的截距是相等的;MR曲线在横轴上的截距是d 曲线在横轴上的截距的一半。这一特征见图7.1。 3.边际收益、价格和需求的价格弹性的关系

(完整版)高性能金属新材料

高性能金属新材料(特种金属功能材料、高端金属结构材料) 一、金属类新材料 金属新材料按功能和应用领域可划分为高性能金属结构材料和金属功能材料。高性能金属结构材料指与传统结构材料相比具备更高的耐高温性、抗腐蚀性、高延展性等特性的新型金属材料,主要包括钛、镁、锆及其合金、钽铌、硬质材料等,以及高端特殊钢、铝新型材等。金属功能材料指具有辅助实现光、电、磁或其他特殊功能的材料,包括磁性材料、金属能源材料、催化净化材料、信息材料、超导材料、功能陶瓷材料等。 与其他材料相比,稀土具有优异的光、电、磁、催化等物理特性,近年来在新兴领域的应用急速增长,其中永磁材料是稀土应用领域最重要的组成部分,2009年永磁材料占稀土新材料消费总量的57%。在国家新兴产业政策的推动下,新能源汽车、风力发电、节能家电等领域将拉动稀土永磁材料钕铁硼磁体的需求出现爆发式增长。建议重点关注钕铁硼行业龙头中科三环、宁波韵升,以及稀土资源类企业包钢稀土、厦门钨业等。 钢铁材料、稀有金属新材料、高温合金、高性能合金是属于金属类工程结构材料。 ①、钢铁材料和稀有金属新材料 钢铁材料提高钢材的质量、性能,延长使用周期,在钢铁材料生产中,应用信息技术改造传统的生产工艺,提高生产过程的自动化和智能化程度,实现组织细化和精确控制,提高钢材洁净度和高均匀度,出现低温轧制、临界点温度轧制、铁素体轧制等新工艺。 稀有金属新材料指高强、高韧、高损伤容限钛合金,以及热强钛合金、锆合金、难熔金属合金、钽钨合金、高精度铍材等。 ②、高温合金和高性能合金 高温结构材料主要种类包括:高温合金、粉末合金、高温结构金属间化合物,以及高熔点金属间化合物等。 二、高性能结构材料 从世界上新材料的发展趋势看,钢铁材料和有色金属材料的生产一直在向短流程、高效率、节能降耗、洁净化、高性能化、多功能化的方向发展。结构材料其主要功能是承担负载(如火车、汽车、飞机)。汽车用钢近年来已从一般钢铁发展为使用高强合金钢、铝合金或特殊的高强Mg基合金,高强Ti合金在高强钢中有重要位置,不锈钢则有取代碳钢的趋势。用于军用飞机的Al合金及一般钢材则被先进的Ti合金及高分子基复合材料所取代。进一步还需要发展碳纤维增强复合材料或Al基复合材料。 结构材料的主体有: (1)钢铁 钢铁材料,特别是具有多相结构和复杂成分的优质钢具有重要的应用前景和潜在优势,需要开展相应的基础研究。联系微米和纳米技术的纳米层间结构、织构以及晶界和界面都可视为改善钢铁材料的重要途径。 (2)Al合金 Al基材料及相应的沉淀硬化效应导致高强铝合金的出现,相关技术工艺已发展为“沉淀科学”,它涉及“相”间晶体结构的匹配性以及合金的稳定性,特别是时效合金的稳定性直接影响航空或空间应用,因此可视为Al合金基础研究中的重要问题。 (3)Mg合金 镁及镁合金广泛应用于冶金、汽车、摩托车、航空航天、光学仪器、计算机、电子与通讯、电动、风动工具和医疗器械等领域。镁合金是最轻的工程结构材料,以其优良的导热性、减振性、可回收性、抗电磁干扰及优良的屏蔽性能等特点,被誉为新型“绿

第10章 界面现象

第10章界面现象 10.1 请回答下列问题: (1)常见的亚稳定状态有哪些?为什么会产生亚稳定状态?如何防止亚稳定状态的产生? 解:常见的亚稳定状态有:过饱和蒸汽、过热或过冷液体和过饱和溶液等。 产生亚稳定状态的原因是新相种子难生成。如在蒸气冷凝、液体凝固和沸腾以及溶液结晶等过程中,由于要从无到有生产新相,故而最初生成的新相,故而最初生成的新相的颗粒是极其微小的,其表面积和吉布斯函数都很大,因此在系统中产生新相极其困难,进而会产生过饱和蒸气、过热或过冷液体和过饱和溶液等这些亚稳定状态。 为防止亚稳定态的产生,可预先在系统中加入少量将要产生的新相种子。 (2)在一个封闭的钟罩内,有大小不等的两个球形液滴,问长时间恒温放置后,会出现什么现象? 解:若钟罩内还有该液体的蒸气存在,则长时间恒温放置后,出现大液滴越来越大,小液滴越来越小,并不在变化为止。 其原因在于一定温度下,液滴的半径不同,其对应的饱和蒸汽压不同,液滴越小,其对应的饱和蒸汽压越大。当钟罩内液体的蒸汽压达到大液滴的饱和蒸汽压时。该蒸汽压对小液滴尚未达到饱和,小液滴会继续蒸发,则蒸气就会在大液滴上凝结,因此出现了上述现象。 (3)物理吸附和化学吸附最本质的区别是什么? 解:物理吸附与化学吸附最本质的区别是固体与气体之间的吸附作用力不同。 物理吸附是固体表面上的分子与气体分子之间的作用力为范德华力,化学吸附是固体表面上的分子与气体分子之间的作用力为化学键力。 (4)在一定温度、压力下,为什么物理吸附都是放热过程? 解:在一定温度、压力下,物理吸附过程是一个自发过程,由热力学原理可知,此过程系统的ΔG<0。同时气体分子吸附在固体表面,有三维运动表为二维运动,系统的混乱度减小,故此过程的ΔS<0。根据ΔG=ΔH-TΔS可得,物理吸附过程的ΔH<0。在一定的压力下,吸附焓就是吸附热,故物理吸附过程都是放热过程。 10.2 在293.15K及101.325kPa下,把半径为1×10-3m的汞滴分散成半径为1×10-9m小汞滴,试求此过程系统的表面吉布斯函数变为多少?已知汞的表面张力为0.4865N·m-1。

界面现象

第十二章界面现象 一、选择题 1.下列叙述不正确的是( ) A比表面自由能的物理意义是,在定温定压下,可逆地增加单位表面 积引起系统吉布斯自由能的增量 B表面张力的物理意义是,在相表面的功面上,垂直作用于表面上任 意单位长度功线的表面紧缩力 C比表面自由能与表面张力量纲相同,单位不同 D比表面自由能单位为J·m2,表面张力单位为N·m-1时,两者数值不 同 2.在液面上,某一小面积S周围表面对S有表面张力,下列叙述不正确的是( ) A表面张力与液面垂直 B表面张力与S的周边垂直垂直 C表面张力沿周边与表面相切 D表面张力的合力在凸液面指向液体内部(曲面球心),在凹液面指向液体外部3.同一体系,比表面自由能和表面张力都用γ表示,它们( ) A物理意义相同,数值相同 B量纲和单位完全相同 C物理意义相同D前者是标量,后者是矢量相同,单位不同 4.一个玻璃毛细管分别插入25oC和75oC的水中,则毛细管中的水在两不同温度水中上升的高度( ) A相同B无法确定C25oC水中高于75oC水中D75oC水中高于25oC水中 5.纯水的表面张力是指恒温恒压组成时水与哪类相接触的界面张力( ) A饱和水蒸汽B饱和了水蒸气的空气C空气D含有水蒸气的空气 6.已知20oC时水~空气的界面张力为 7.27×10-2N·m-1,当在20oC下可逆地增加水的表面积4cm2,则系统的ΔG为( ) A2.91×10-5J B2.91×10-1J C-2.91×10-5J D-2.91×10-1J 7.对处于平衡状态的液体,下列叙述不正确的是( ) A凸液面内部分子所受压力大于外部压力 B凹液面内部分子所受压力小于外部压力 C水平液面内部分子所受压力大于外部压力 D水平液面内部分子所受压力等于外部压力 8.弯曲液面下的附加压力与表面张力的联系与区别在于( ) A产生的原因与方向相同,而大小不同 B作用点相同,而方向和大小不同 C产生的原因相同,而方向不同 D作用点相同,而产生的原因不同 9.在一个密闭容器中,有大小不同的两个水珠,长期放置后会发生( ) A大水珠变大,小水珠变小 B大水珠变大,小水珠变大 C大水珠变小,小水珠变大 D大水珠、小水珠均变小

三菱FX系列PLC的程序流程控制功能指令

1、条件跳转指令CJ CJ、CJP指令用于跳过顺序程序某一部分的场合,以减少扫描时间。 2、子程序调用指令CALL与返回指令SRET 子程序应写在主程序之后,即子程序的标号应写在指令FEND之后,且子程序必须以SRET指令结束 3、中断返回指令IRET、允许中断指令EI与禁止中断指令DI PLC一般处在禁止中断状态。指令EI~DI之间的程序段为允许中断区间,而DI~EI之间为禁止中断区间。当程序执行到允许中断区间并且出现中断请求信号时,PLC停止执行主程序,去执行相应的中断子程序,遇到中断返回指令IRET 时返回断点处继续执行主程序。 4、主程序结束指令FEND FEND指令表示主程序的结束,子程序的开始。程序执行到FEND指令时,进行输出处理、输入处理、监视定时器刷新,完成后返回第0步。 FEND 指令通常与CJ-P-FEND、CALL-P-SRET和I-IRET结构一起使用(P 表示程序指针、I表示中断指针)。CALL指令的指针及子程序、中断指针及中断子程序都应放在FEND指令之后。CALL指令调用的子程序必须以子程序返回指令SRET结束。中断子程序必须以中断返回指令IRET结束。 5、监视定时器刷新指令WDT 如果扫描时间(从第0步到END或FEND)超过100ms,三菱PLC将停止运行。在这种情况之下,应将WDT指令插到合适的程序步(扫描时间不超过100ms)中刷新监视定时器。 6、循环开始指令FOR与循环结束指令NEXT FOR~NEXT之间的程序重复执行n次(由操作数指定)后再执行NEXT指令后的程序。循环次数n的范围为1~32767。若n的取值范围为-32767~0,循环次数作1处理。 FOR与NEXT总是成对出现,且应FOR在前,NEXT在后。FOR~NEXT 循环指令最多可以嵌套5层。 利用CJ指令可以跳出FOR~NEXT循环体。 艾驰商城是国内最专业的MRO工业品网购平台,正品现货、优势价格、迅

物理化学第十章界面现象

第十章界面现象 10.1 界面张力 界面:两相的接触面。 五种界面:气—液、气—固、液—液、液—固、固—固界面。(一般常把与气体接触的界面称为表面,气—液界面=液体表面,气—固界面=固体表面。) 界面不是接触两相间的几何平面!界面有一定的厚度, 有时又称界面为界面相(层)。 特征:几个分子厚,结构与性质与两侧体相均不同 比表面积:αs=A s/m(单位:㎡·㎏-1) 对于一定量的物质而言,分散度越高,其表面积就越大,表面效应也就越明显,物质的分散度可用比表面积αs来表示。 与一般体系相比,小颗粒的分散体系有很大的表面积,它对系统性质的影响不可忽略。 1. 表面张力,比表面功及比表面吉布斯函数 物质表面层的分子与体相中分子所处的力场是不同的——所有表面现象的根本原因! 表面的分子总是趋向移往内部,力图缩小表面积。液体表面如同一层绷紧了的富有弹性的橡皮膜。 称为表面张力:作用于单位界面长度上的紧缩力。单位:N/m, 方向:表面(平面、曲面)的切线方向 γ可理解为:增加单位表面时环境所需作的可逆功,称比表面功。单位:

J · m-2。 恒温恒压: 所以: γ等于恒温、恒压下系统可逆增加单位面积时,吉布斯函数的增加,所以,γ也称为比表面吉布斯函数或比表面能。单位J · m-2 表面张力、比表面功、比表面吉布斯函数三者的数值、量纲和符号等同,但物理意义不同,是从不同角度说明同一问题。(1J=1N·m故1J·m-2=1N·m-1,三者单位皆可化成N·m-1) 推论:所有界面——液体表面、固体表面、液-液界面、液-固界面等,由于界面层分子受力不对称,都存在界面张力。 2. 不同体系的热力学公式 对一般多组分体系,未考虑相界面面积时:

物理化学十一、十二章问答题(界面现象和胶体)

第十一章界面现象 .表面能、表面自由能、比表面自由能、表面张力是否是一个概念?相同否? 答:总地说来四者都是描述表面地过剩能量,但概念上有区别,表面能为物质表面较其 内部多余地能量;若在,恒定时,这部分能量称为表面自由能(表面吉布斯自由能);若在,恒定时,单位表面地自由能,便称为比表面自由能,其单位为·-,因=·,故·-也可化为·-,这样表面自由能又转变为另一概念,成为垂直作用于单位长度相表面上沿着相表面地切面方向地力,称为表面张力.虽然比表面自由能和表面张力地数值相同,也可混用,但概念有差别,前者是标量,后者是矢量. .若在容器内只是油与水在一起,虽然用力振荡,但静止后仍自动分层,这是为什么? 答:油与水是互不相溶地,当二者剧烈振荡时,可以相互分散成小液滴,这样一来,表面能增大,这时又没有能降低表面能地第三种物质存在,因此这时为不稳定体系,体系有自动降低能量地倾向,分层后,体系能量降低,因此会自动分层. .铅酸蓄电池地两个电极,一个是活性铅电极,另一个是活性氧化铅电极,你是怎样理 解这理解这“活性”两字? 答:这里活性是指铅或氧化铅处于多孔性,即具有大地比表面积,具有较高比表面自由能,处于化学活性状态.这是在制备电极时经过特殊活化工序而形成地高分散状态,根据热力学理论及表面性质,若铅蓄电池长期使用或者长期放置而未能及时充电,电极地高分散状态会逐渐减低,这种活性也就消失. .在化工生产中,固体原料地焙烧,目前很多采用沸腾焙烧,依表面现象来分析有哪些优点? 答:沸腾焙烧是将固体原料碎成小颗粒,通入预热地空气或其它气体,使炉内固体颗粒在 气体中悬浮,状如沸腾,这样就增大了固气间地接触界面,增强了传质与传热,使体系处于较高地化学活性状态. . 在滴管内地液体为什么必须给橡胶乳头加压时液体才能滴出,并呈球形? 答:因在滴管下端地液面呈凹形,即液面地附加力是向上地,液体不易从滴管滴出,因此 若要使液滴从管端滴下,必须在橡胶乳头加以压力,使这压力大于附加压力,此压力通过液柱而传至管下端液面而超过凹形表面地附加压力,使凹形表面变成凸形表面,最终使液滴滴下,刚滴下地一瞬间,液滴不成球形,上端呈尖形,这时液面各部位地曲率半径都不一样,不同部位地曲面上所产生附加压力也不同,这种不平衡地压力便迫使液滴自动调整成球形,降低能量使液滴具有最小地表面积.

完全垄断市场的价格和产量的决定

第10章完全垄断市场的价格和产量的决定 10.1 复习笔记 1.不完全竞争市场结构 (1)不完全竞争市场结构简介 当关于完全竞争的假设中的任何一条不再存在时,就意味着出现了某种形式的“不完全竞争”。在实际生活中,不完全竞争有许多种形式。其中之一处于完全竞争的另一极端,即一个行业提供的某种产品只有一家生产厂商,因而是不存在丝毫竞争因素的完全垄断,简称垄断。另一种形式是,它与完全竞争的唯一区别,仅仅在于行业中的各厂商正在各自生产一种商标牌号稍有不同的产品,即只是在产品的同质性这一点不同于完全竞争行业,因而被称为“垄断竞争”。在这两者之间的第三种不完全竞争形式是,该行业是由少数几个出售同样的或稍为不同的产品的厂商组成的,被称为“寡头垄断”. (2)完全垄断市场的特点 ①只有唯一的一家厂商提供整个行业的产销量; ②唯一的垄断厂商决定价格; ③产品不可替代; ④其他厂商不能进入该行业。 (3)完全垄断形成的原因 ①某些产品需要大量固定设备投资,规模经济十分显著,大规模生产可使成本大大降低; ②法律赋予某产品生产的专利权,以保障其免于其他商品的竞争; ③一家厂商控制了其产品的基本原料的来源。 2.完全垄断厂商均衡价格和产量的决定 (1)边际收益和需求弹性 垄断厂商面临的需求曲线是自左向右下方倾斜的市场需求曲线。对于完全垄断厂商而言, 其边际收益、价格和需求弹性的关系为: 1 (1) d E MR P =- ①如图10-1所示,若E d>1,则降低价格将导致总收益增加,这意味着MR是正数(MR 曲线位于横轴上面) ②如图10-1所示,若Ed=1,这表示需求量变动的百分率等于价格变动的百分率,价格降低不会引起总收益发生变化,MR等于零(MR与横轴交于A点) ③如图10-1所示,若Ed<1,则降低价格将导致总收益减少。这意味着MR是负数(MR 曲线位于横轴下面)。

金属功能材料

(2012届)金属功能材料课程论文 摘要 现代切削加工朝着高速、高效、高精、智能和环保的方向不断发展及难加工材料的不断涌现,对刀具材料性能要求越来越高。涂层硬质合会刀具以其高硬度、高耐磨性、良好的化学稳定性和高的通用性等特点,广泛地应用于金属切削加工领域,是当前世界各国重点研究开发的刀具之一。本文简要的叙述了涂层硬质合金刀具的特点、制备工艺、未来发展趋势等。 关键词:涂层硬质合金刀具;切削; 高硬度; 高耐磨性 Abstract With modern machining developing toward high speed.High efficiency,high precision,intelligent and environmentally friendly along with the continuous emerging of the difficult—to—machine material,the demand for material performance of cutting tool becomes higher and higher.Because of its high hardness,good wear resistance,excellent thermal stability and applicability,the coated cemented carbide tool is now widely used in metal cutting area and becoming one of the most ideal cutting tools to research and develop around the world.This thesis briefly narrates the coated cemented carbide tool characteristics, preparation technology, the future development trends. Key word: The coated cemented carbide tool, Cutting, Hardness, Good wear resistance

金属功能材料总复习提纲

1.金属基复合材料制备工艺的选择原则 (1)基体与增强剂的选择,基体与增强剂的结合 (2)界面的形成机制,界面产物的控制及界面设计 (3)增强剂在基体中的均匀分布 (4)制备工艺方法及参数的选择和优化 (5)制备成本的控制和降低,工业化应用的前景 2. 金属基复合材料制备工艺的分类 1)固态法:真空热压扩散结合、超塑性成型/ 扩散结合、模压、热等静压、粉末冶金法 2)液态法:液态浸渗、真空压铸、反压铸造、半固态铸造 3)喷射成型法:等离子喷涂成型、喷射成型 4)原位生长法 3. 金属基复合材料的界面结合形式 (1)机械结合:第一类界面。主要依靠增强剂的粗糙表面的机械“锚固”力结合。 (2)浸润与溶解结合:第二类界面。如相互溶解严重,也可能发生溶解后析出现象,严重损伤增强剂,降低复合材料的性能。如采用熔浸法制备钨丝增强镍基高温合金复合材料以及碳纤维/镍基复合材料在600℃下碳在镍中先溶解后析出的现象等。 (3)化学反应结合:第三类界面。大多数金属基复合材料的基体与增强相之间的界面处存在着化学势梯度。只要存在着有利的动力学条件,就可能发生相互扩散和化学反应 4.金属基复合材料的界面优化以及界面设计 改善增强剂与基体的润湿性以及控制界面反应的速度和反应产物的数量,防止严重危害复合材料性能的界面或界面层的产生,进一步进行复合材料的界面设计,是金属基复合材料界面研究的重要内容。 从界面优化的观点来看,增强剂与基体的在润湿后又能发生适当的界面反应,达到化学结合,有利于增强界面结合,提高复合材料的性能 5. 界面优化以及界面设计一般有以下几种途径 <1> 增强剂的表面改性处理 (1)改善增强剂的力学性能(保护层); (2)改善增强剂与基体的润湿性和粘着性(润湿层); (3)防止增强剂与基体之间的扩散、渗透和反应(阻挡层); (4)减缓增强剂与基体之间因弹性模量、热膨胀系数等的不同以及热应力集中等因素所造成的物理相容性差的现象(过渡层、匹配层)。 常用的增强材料的表面(涂层)处理方法有:PVD、CVD、电化学、溶胶-凝胶法等 <2>金属基体改性(添加微量合金元素) (1)控制界面反应 (2)增加基体合金的流动性,降低复合材料的制备温度和时间 (3)改善增强剂与基体的润湿性

三菱高级指令说明

三菱PLC功能指令:FROM KO K32 K2M132 K1是什么意思 FROM从KO模块中32#寄存器中读取数据,传送到K2M132中改变M132~M139的状态,传送寄存器和存储数量是×1个(就是只传32#和只存K2M132)。 从32#寄存器中读出的数字可能是10进制或16进制如15,PLC自动将其转换成二进制如1111,再将其写入位元件的状态寄存器中。1表示开,0表示关。 K2M132表示从低位M132开始到4×2=8个位即M132到M139. 将11110000从低到高写入,这样表示M132~M135状态是1,接通;M136~M139状态是0,断开。 补充回答: PLC基本模块和模拟量输入输出模块之间的数据通讯是靠FROM和TO指令执行的,FROM 和TO指令实际上都是针对模拟量输入输出模块中的缓冲寄存器BFM进行的,FROM是将数据读入PLC,而TO则是将基本模块中的数据写到特殊功能模块内的缓冲寄存器。 TOP H0 K150 D2 K6 TO指令用于向特殊模块写入数据,H0代表第1块扩展模块。K150就是指在扩展模块上的参数地址,后面的D2就是指要写入的首地址,K6代表写入数量。 TOP H0 K150 D2 K6 就是指,将D2开始的6个字的参数写入第一块扩展模块的第150个参数地址去。 三菱FX2N系列PLC的TO指令、FROM指令及实例FX2N-4AD 应用程序 TO指令是从PLC对增设的特殊单元(如FX2N-4DA)缓冲存储器(BFM)写入数据的指令 TO,TOP:十六位连续执行和脉冲执行型指令 DTO,DTOP:三十二位连续执行和脉冲执行型指令 TO指令的编程格式:TO K1 K12 D0 K2 *K1:特殊模块的地址编号,只能用数值,范围:0---7 *K12:特殊模块的缓冲存储器起始地址编号,只能用数值,范围:0---32767 *D0:源寄存器起始地址编号,可以用T,C,D数值和位元件组合如K4X0 *K2:传送的点数,只能用数值。范围:1---32767 TO K1 K12 D0 K2指令的作用是:将PLC的16位寄存器D0,D1的数值分别写入特殊单元(或模块) N0.1的缓冲寄存器(BFM)#12,#13中。 1、在特殊辅助继电器M8164闭合时,D8164内的数据做为传送点数。 2、特殊辅助继电器M8028断开状态,在TO指令执行时,自动进入中断禁止状态,输入中断和定时器中 断不能执行。在这期间发生的中断只能等FROM指令执行完后开始执行。TO指令可以在中断程序中使用 3、特殊辅助继电器M8028闭合状态,在TO指令执行时,如发生中断则执行中断程序,TO指令不能在中断 程序中使用。 FROM指令是将PLC增设的特殊单元(如FX2N-4AD)缓冲存储器(BFM)的内容读到可编程控制器的指令FROM、FROMP:十六位连续执行和脉冲执行型指令 DFROM、DFROMP:三十二位连续执行和脉冲执行型指令 读出指令FROM的编程格式:FROM K1 K29 D0 K2 *K1:特殊模块的地址编号,只能用数值,范围:0---7 *K29:特殊模块的缓冲存储器起始地址编号,只能用数值,范围:0---32767

第十章 界面现象

第十章界面现象 1.液体在毛细管中上升的高度与基本无关。 A.温度 B.液体密度 C.大气压力 D.重力加速度 2.微小晶体与同一种的大块晶体相比较,下列说法中不正确的是。 A.微小晶体的饱和蒸气压大 B.微小晶体的表面张力未变 C. 微小晶体的溶解度小 D.微小晶体的熔点较低 3.水在某毛细管内上升高度为h,若将此管垂直地向水深处插下,露在水面以上的高度为h/2,则。 A.水会不断冒出 B. 水不流出,管内液面凸起 C. 水不流出,管内凹液面的曲率半径增大为原先的2倍 D.水不流出,管内凹液面的曲率半径减小为原先的一半 4. 在用最大气泡法测定液体表面张力的实验中,是错误的。 A.毛细管壁必须清洁干净 B.毛细管口必须平整 C.毛细管必须垂直放置 D.毛细管须插入液体内部一定深度 5. 在干净的粗细均匀的U形玻璃毛细管中注入纯水,两侧液柱的高度相同,然后用微量注射器从右侧注入少许正丁酸水溶液,两侧液柱的高度将是。 A.相同 B.左侧高于右侧 C.右侧高于左侧 D.不能确定 6. 在三通活塞两端涂上肥皂液,关闭右端,在左端吹一大泡,关闭左端,在右端吹一小泡,然后使左右两端相通,将会出现什么现象。 A.大泡变小,小泡变大 B.小泡变小,大泡变大 C.两泡大小保持不变 D.不能确定 7. 在一支干净的、水平放置的、内径均匀的玻璃毛细管中部注入一滴纯水,形成一自 由移动的液柱。然后用微量注射器向液柱右侧注入少量NaCl水溶液,假设接触角不变,则液柱将。 A. 不移动 B.向右移动 C.向左移动 D无法判断 8. 在潮湿的空气中,放有3只粗细不等的毛细管,其半径大小顺序为:r1>r2>r3,则毛细管内水蒸气易于凝结的顺序是。

相关文档
最新文档