CANopen协议介绍(讲义)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CANopen协议介绍(讲义)
2010-10-12 15:58:28| 分类:技术文档| 标签:|举报|字号大中小订阅
很长一段时间以来,很多人问我CANopen 总线优势到底在什么地方,我也大体的给了口头的讲述,但是比较笼统,没办法做到详细解释,加上纯技术的话语比较晦涩,遇上内行还能多聊几句,如果是刚接触的,那就是云里雾里了。
这次正好要进行公司业务员培训,要讲讲CANopen,在整理过程中把我的讲义贴出来,希望能帮到大家,以下内容是我讲课的口述内容,比较白话,不能作为资料,大家见谅,鉴于我整理也比较辛苦,也算个小小的知识产权,所以PPT我就不
贴出来了。
^-^
讲义内容:
通常CANopen协议相关的一些资料相对来说比较晦涩,非专业人士看起来比较困难。
我尽量以浅显易懂的方式将CANopen 协议的框架和它在实际应用中存在的优缺
点展示给大家。
我按照最先接触的内容由浅入深的讲解,直接讲CANopen协议会有点跳跃的感觉,所以,我以产品作为切入点,分析一下如何使用,在这个过程中,让大家理解什么是CANopen协议。
首先,我们拿到一个产品,比方说是编码器,它的用途是作为位置传感器,那我们就需要将编码器送出的数据进行采集。
一般自然界中存在的信号有多种形式,大多以模拟量形式存在,类似于人感觉到温度的高低、水流的快慢、风力的大小等等。
但这是很模糊的概念,今天热了还是冷了,风大风小,没有比较是很难界定的,为了规范这些量,方便描述时的统一性,温度计量标准有华氏和摄氏、水流有每秒多少立方、风力有级数。
这些,就是数字量。
数字量在人与人之间传递时,可以通过嘴和耳,语言和听力,在设备之间如何来传递呢?学过数电的人知道,灯泡有两种状态,亮和暗,在最基础的电路回路里,“通”和“断”是两个最基本的状态,我们可以把他理解为“1”和“0”,这样,就有了表述的方法。
但是单独使用这两种状态是无法传递信息的,如何把编码器
的数据传递出去,就需要使用到协议,下面
我就讲讲协议。
我们知道,人与人交流需要用到语言,我们要表达出一个完整的意思就要使用一句话,一句话内会包含很多的字,每个字又由笔画构成。
这样,我们协议的基本框架就出来了,在整个CANopen协议传递过程中,最大的单位称为“帧”,类似于一句话,“帧”由“字节”组成,就代表了字,每个“字节”由“位”组成,我们称为笔画。
那地球上还有英语、法语、德语、还有听不懂的鸟语呢!那就是各个通讯协议,比如Profibus-DP、DeviceNet、CC-Link、Hart、Modbus等。
让DP和CANopen通讯,那就是相当于一个讲德语的与讲中文的对话,鸡同鸭讲,能沟通吗?需要翻译,对吧。
回过头来我们讲讲CANopen的帧格式,CANopen一帧数据由一个COB-ID(报文头)和最大8字节数据组成,其中COB-ID可以是11位(CAN2.0),也可以是29位(CAN2.0B),当然,CAN2.0B需要向下兼容11位CAN 报文。
对于每字节数据由哪些位组成,这里
就不再赘述,因为这部分内容不在OSI模型的第七层应用层内描述,开发人员也不必过多考虑这块内容。
由于CANopen协议内对COB-ID的各个地址段报文有详细规范,这里就花点时间讲一下,当然也没时间全部讨论,只选一些重要内容来说。
以前我们培训一直在说CANopen协议好,速度快,广播报文,这些关键字听的多了,但是大家可能不是很理解这些内容。
现在就来解释一下。
在编码器应用中,CAN报文我们常用的有SDO(Service Data Object 服务数据对象)和PDO(Process Data Object过程数据对象),从字面描述意义看,通常数据的发送读取是采用PDO来实现的,CAN参数的修改是通过SDO来实现的(当然这不是绝对的,具体的如果有兴趣可以会后询问)。
先来说说PDO,我们在很多资料上会看到这样一张表
注意:PDO/SDO 发送/接收是由(slave)
CAN节点方观察的
表一:CANopen主/从连接集对象假设我们读取到一组编码器数据是这样的《0x181 0x30 0x1F 0x00 0x00》,我们应该如何理解呢?首先,“0x”只是一个符号,它代表了紧跟着的数据是十六进制的(等同于在数据后面直接标“H”,上述表达式也可以表述为《181H 30H 1FH 00H 00H》),“181”我们查看上表后发现,它包含在PDO1(发送)里面,它代表了是由编码器发出的过程数据对象,表上显示是“181H~1FFH”,这是因为COB-ID包含了节点号信息,地址1对应着181H,地址2对应了182H,以此类推,最大127个节点。
“0x30 0x1F 0x00 0x00”就代表了数据内容,在CAN协议内,帧数据是低位在前,高位在后的。
所以上述数据直接读取后得出编码器送出1F30H,这
就代表了编码器的当前位置值。
那在总线上面,多个节点同时发送数据不会产生冲突么?以前我们说过,CAN协议具有仲裁,这里简单介绍一下仲裁是如何实现的。
上面说了,COB-ID包含了节点号信息,也就是说,只要总线上的设备节点号不同,所送出的广播报文的COB-ID肯定是不同的,如果一个是182H,一个是183H,仲裁时怎么做?本文最开始的时候介绍了每个字由笔画组成,现在就要用到位(bit)的概念了,182H换算成二进制是0001 1000 0010(B),“B”代表了二进制,183H换算成二进制是0001 1000 0011(B),关于显性位、隐形位这里不再赘述,这个有兴趣可以找我要资料看,这里我就简单描述为“0”比“1”的优先级高,可以理解为拖后腿,“0”为低电平,“1”为高电平,在线上低电平会把高电平拉低,一旦183H发现数据传输过程中与自身数据不符合,就终止上传,保证了182H的数据
先上总线。
我们在实践中会发现,编码器的数据在不断的更新输出,那输出周期如何定义呢?这
个我们就来讨论一下引申的PDO传送方式。
我们以前在培训时一直介绍CANopen 协议与DP协议相比的好处在于DP是轮询的,问答方式浪费了大量的时间,而CAN 协议是广播的,可以将1MHz的速率发挥至极致。
这种说法形象,一般可以解释给初步接触CANopen的人听。
其实CANopen的报文形式很多样化,在不同的应用场合可以采取不同的方式,上面说的称为异步方式,异步方式也分两种,一种是上面的内部时钟触发,也就是按照固定时间间隔发送,另一种是事件触发,假设编码器发生转动,数据相应送出。
还有一种同步方式,我们也可以口述为踏拍方式,当主站要求报数是,所有从节点按照仲裁的优先顺序进行数据发送。
这三种报文方式分别在哪些场合适用呢?我们以车辆来举例。
车辆开在路上,在整个车辆控制内,最重要的,具有高优先级的,应该是牵涉到安全的制动(刹车),安全气囊等等。
其次是转向、车灯。
再次是音响、影视系统(当然,我对车不是很熟悉,这是我的主观认识,作为一个例程)。
我们可以
把小的节点号分配给制动系统,以保证数据能及时送达控制器,并采用定时报数,实时监测车辆制动系统的情况。
对于音箱什么的,我们可以采用事件触发方式,在有输入控制时(比方说打开收音机)进行响应。
同步数据一般用在实时数据监测方面,比方是在同一时间点查阅角度、位置、重量、压力、流量等等信息,保证所监测的各个数据在很小的时间变化范围内。
当然CANopen不可能摒弃问答方式的数据采集,这可以通过
SDO访问OD来实现。
讲到SDO——服务数据对象,我们可以这么理解,PDO报文在发送出去后不需要反馈信号,总线上能消化这个数据的都可以消化,所以白话叫广播报文。
而SDO报文是需要响应的,每一帧SDO发出后需要等待反馈。
那这会不会引起无反馈时总线死机呢?不会,CAN数据链路内规定了超时,在一定时间内得不到回答,总线将进行后面的作业,多次询问无果,总线会对错误节点进行屏蔽处理。
SDO的帧格式和PDO的帧格式是一致的,但对有些字节的定义不同,下
面就简单介绍一些编码器修改参数时用到
的帧格式。
SDO中实现了5个请求/应答协议,这里我只讲讲启动域下载与上传,其他的有兴趣
可以问我要资料看。
我来解释一下上表,COB-ID引用第一张表的SDO地址段。
假设主站需要读取1号编码器对象字典(OD)6200H内的参数,我们应该如何做呢?我们需要发送
0x601 0x40 0x00 0x62 0x00 0x00 0x00
0x00 0x00
我们得到编码器的反馈数据是
0x581 0x4B 0x00 0x62 0x00 0x0A 0x00
0x00 0x00
上述命令的解释是,控制器通过SDO指令读取1号编码器OD为6200H的编码器发送数据周期的参数,得到编码器的回答是每隔10ms发送一次。
40H和4BH是启动
域上传的命令字。
如果需要将6200H的参数修改为20ms 一次数据,我们应该怎么做?
发送:0x601 0x22 0x00 0x62 0x00 0x14
0x00 0x00 0x00
反馈:0x581 0x60 0x00 0x62 0x00 0x00
0x00 0x00 0x00
未完待续。
作为十大总线来说,CANOpen的开放性等等就不赘述了。
该协议最早在汽车总线中得到了大量的推广。
目前很多厂家都支持CANOpen总线。
比如施耐德、菲尼克斯等。
尤其是施耐德,目前在所有的传动产品、中高端的PLC上都支持CANOpen总线。
可能是由于所有产品在总线支持上不然
Rockwell和西门子的缘故吧。
目前CANOpen在连接现场从站设备时,很多厂家的PLC 已经可以像step7软件组态profibus DP从站设备一样,只
需导入eds文件后,在软件中直接选择或拖拉即可。
相关参数的地址定义等等都自动完成。
相对来说比较简单。
当然如果软件即便不支持上述方式,有个公司专门开发了一个sycon的软件,利用sycon软件也可以直接定义CANOpen 从站设备。
相对来说也比较简单。
只不过需要做sycon到PLC软件的地址的映射的操作。
CANOpen总线与Profibus DP总线相比:
1. CANOpen的通讯速率较低,最高1Mbps。
而Profibus DP
最高支持12Mbps;
2. 两种总线随着距离的增加都会衰减,但是CANOpen衰减
的更快一些;
3. 理论上CANOpen支持127个子站(当然和CANOpen 主站设备有关,在实际PLC产品中一般最大只能支持64,有的只能支持32或16个),而Profibus DP在子站支持能
力上较强;
4. CANOPen的中继器支持树形结构连接,这一点与
Profibus的总线型连接方式有区别;
5. 从组态来说,集成CANOpen总线的设备组态方式与Profibus DP的组态方式类似。
只需导入eds文件即可;
6. 抗干扰能力经过我使用了,感觉和Profibus DP差不多。
当然CANOpen电缆有4种,DP应该分普通和复杂环境两种。
从电缆来说,CANOpen电缆的适用性更强一些。
以上内容,只是一己之见,不含任何广告内容,也请各位批
评指正
于CANopen协议的分布式控制系统设计
孙树文杨建武
(北京工业大学机械工程与应用电子学院,北京100022)摘要:针对印刷机外围设备多分散、数据传输信息量大、实时性和可靠性要求高等问题,设计了一种基于CAN现场总线的分布式控制系统。
监控主机运行软PLC程序,通过PC-CAN卡与现场I/O从站进行通信,形成分布式网络,简化了系统结构,提高了可靠性。
本文介绍了分布式监控系统的整体结构、工作原理及特点;分析了CANopen协议、详细说明了采用P87C591单片机开发I/O从站的硬件电路、软件设计流程以及从站节点的调试方法。
经系统测试和模拟运行表明,I/O从站与监控主机通讯可靠、准确,实时性满足了印刷机控制系统的要求,具有一定
的参考价值和广阔的应用前景。
关键词:CANopen;CAN总线;软PLC;分布式控制系统;
P87C591
中国分类号:TP247文献标识码:A
TheDesignofDistributedControlSystemI/OSlaveBasedonCANo
penProtocol
SunShuwen,YangJianwu,ZhangHuihui,ZhaoJianguang
(CollegeofMechanicalEngineering&AppliedElectronicsTechnol ogy,BeijingUniversityofTechnology,Beijing100022,China)
Abstract:Counteringtheproblemsexistingintheprintingmachine, suchastheexcessiveanddistributedperipheralequipment,manyi nformationexchange,thereliability,veracityandrealtimefeatureof datacommunication,adistributedcontrolsystembasedonCAN(C ontrolAreaNetworks)Busisdesigned.TheSoftPLCisstudiedandr ealizedontheplatformofmonitorhostcomputer.ViaPC-CANcard,t hemastercomputerandI/Oslavenodescancommunicatewitheac hotherdirectly,likeadistributednetwork.Thesystemstructureismo reconcise.Thefunctionofdistributedsettingandconcentratedcont rolisrealizedinthissystem.Thewholestructureandprincipleofsyst em,thehardwarecircuit,thesoftwareprogrammingandthetesting experimentwerediscussedindetail.Practicalusingshowsthatthis distributedcontrolsystemhasthebettercontroleffect,indicatesit’s brilliantandvaliditybeyondtraditionalcontrolmethodsandissuitabl eforsimilarpracticalengineering.
Keywords:CANopen,CANbus,SoftPLC,DistributedControlSyst
em,P87C591
0引言
印刷机有大量的外围设备,存在大量的I/O信号,如何保证外围设备与控制主机之间的实时通讯,使得印刷机可靠运行,目前采用的方式主要有2种:1)采用传统的PLC构成集散型控制系统(DCS);2)采用基于现场总线的分布式I/O系统。
采用前一种方式存在系统不开放、硬件投资大、布线复杂、维修不便的缺点,具有明显的局限性[1]。
而采用第二种方式基本局限于国外产品,如西门子公司的基于Profibus分布式I/O系统,WAGO 公司基于CANbus、DeviceNET、Profibus分布式I/O系统,但价格较高。
因此我们设计了基于CAN现场总线技术与软PLC的
印刷机分布式控制系统。
CAN(ControllerAreaNetwork)总线,又称控制器局域网,是由德国Bosch公司在80年代初为分布式系统在强电磁干扰环境下可靠工作而开发的一种串行数据通信网络,并有效支持分布式控制和实时控制。
目前CAN总线规范已被ISO国际标准组织指定为国际标准,并得到了Motorola,Intel,Philips,Siemens,NEC等公司的支持[1]。
CANopen是CAN总线的一种有影响力的应用层协议,近年来得到了广泛的应用,它保证了各种厂商设备的互用性、互换性,同时提高了信息传输的可靠性,实时性。
其应用范围已经扩展到了汽车行业、机械工业、纺织机械、农用机械、机器人、数控机床、医疗器械、家用电器及传感器等领域。
软PLC是一种基于PC机的新兴自动控制技术,不仅能够实现硬PLC的所有功能,而且遵循IEC61131-3编程标准,为用户
提供了更多的开放性和适用性。
1 控制系统的整体构成[2]
整个控制系统由监控计算机、PC-CAN适配卡、I/O从站节点(n<110)、CAN总线网络组成,其系统结构如图1所示。
分布在现场的I/O从站节点连接印刷机的外围设备,并通过CAN 通信接口与总线相连;监控计算机运行软PLC软件并通过PC-CAN适配卡和连接在CAN总线网络上的各个从站节点之间进行实时通信,从而实现整个印刷机组的分散控制和集中监管。
控制系统中的I/O从站节点由CAN控制器、CAN收发器和外围电路(如:光电隔离、I2C、LED显示等)组成。
监控计算机可以选用普通PC或工控机IPC。
PC-CAN适配卡用来完成CAN总线和监控计算机之间的协议转换,可以选用PCI总线适配卡、ISA总线适配卡。
各个控制节点之间通过屏蔽双绞线互联构成CAN总线网络,总线两端连接120Ω的阻抗匹配电阻,用来提高系统的稳定性、增强系统的抗干扰能力。
2 I/O从站的硬件设计
目前,有两种CAN总线器件可以选择:一种是带片上CAN 的微控制器,如P8XC591/2、87C196CA/CB、MC68376等;
另一种是独立的CAN控制器,如控制Philips公司的SJA1000、82C200,Intel公司的82526、以及Microchip公司的MCP2510等,但是独立的CAN控制芯片需要外接一个微处理器,接收外部CPU的控制才能运行。
本系统选用的是Philips公司的带有在片CAN控制器的P87C591微型控制器,这样大大简化了节点的硬件设计,提高系统的可靠性[2]。
I/O从站节点的硬件设计上采用了模块化结构,由微控制器、CAN通信模块、输入/输出接口模块、扩展接口模块、参数设置模块组成,其整体结构如图2所示。
P87C591是一款8位高性能微控制器,具有片内CAN控制器,从80C51微控制器家族派生而来,采用了强大的80C51指令集并成功的包括了Philips半导体SJA1000CAN控制器的PeliCAN功能。
CAN收发器采用的是PhilipsPCA82C250芯片,它具有高速稳定的差动发送和接收能力;为了提高抗干扰能力,系统中采用双路电源模块供电,在控制器和传输介质之间加接光电隔离器件ADuM1201高速数字隔离器替代传统的光电耦合器(如6N137),简化了电路,极大的降低了功耗。
从站节点I/O 接口模块采用了光电隔离电路,提高了抗干扰能力;为了使本系统具有更好的适用性和扩展性,预留了基于I2C总线扩展接口模块。
此外,从站节点还外扩了RS232接口;以及电源信号、通讯状态、I/O端口、故障信号等状态的LED显示。
3 I/O从站的软件设计
在I/O从站的软件设计中,使用C51Windows编程语言实现各种功能,与从站节点的硬件设计相一致,软件设计也遵循模块化的设计原则,使控制软件具有易读、易扩展和易维护的优点。
各功能模块之间通过入口和出口参数相互联系,组合灵活且方便
[3]。
从站节点的软件设计流程如图3所示。
3.1 CANopen通讯协议[4][5]
CANopen协议是CiA协会基于CAN总线定义的应用层协议之一,在各种控制系统中得到了广泛应用。
CANopen设备模型如图4所示,不同设备通过CAN总线进行连接组网,CANopen通信协议接口用于提供在总线上收发通信对象的服务;不同CANopen设备间的通信都是通过交换通信对象来完成
的。
CANopen协议中定义了4种通信对象(通讯模式),用于处理不同作用的信息,包括:1)NMT对象,用来传递主节点对整个网络系统的管理信息;2)SDO对象,用来传递网络系统中的配置信息;3)PDO对象,用来实时传送过程数据信息;4)特殊功能对象,包括同步对象(Sync)紧急对象(Emergency)时间戳对象(TimeStamp)等,详细内容可参考CANopen协议相关文档[4]。
设备对象字典是CANopen协议的核心概念,描述了该设备使用的所有数据类型、通信对象和应用对象,CANopen 协议的网络系统中每一个设备都要实现一个唯一的对象字典,区别在于设备类型不同其内容则不同。
对象字典中每个对象拥有一
个唯一的16位主索引和8位子索引,由此实现对其中各种对象的访问。
对象字典在系统软件设计中得以实现,然后使用标准化的EDS文件对其进行描述。
EDS文件的编写,基本可以借鉴同类设备的EDS文件,只需针对具体不同应用做出相应修改即可。
3.2 I/O从站的CANopen通讯协议实现
I/O从站的软件设计遵循CANopen协议预定义主/从连接集,在程序中采用预定义的强制性的缺省标识符(CAN-ID)分配表。
从站节点支持4个接收PDO对象,4个发送PDO对象,1个SDO对象,1个紧急对象和1个节点错误控制对象。
协议的相关细节可查看文档[6]。
在系统的软件设计中,结合通讯协议的特点,大多采用了结构体的方式来定义诸如CAN报文、发送和接收PDO配置对象、CANopen协议配置对象等,通过定义结构体型指针变量完成对相关数据的读写,给程序的编制带来了方便。
此外,利用定义数组的方法实现了对象字典和过程数据影像的操作。
在SDO报文处理子函数中,通过被访问对象的主索引和子索引,以数组查询的方式实现了对对象字典的读写访问。
CANopenI/O从站的状态机转换通过判断接收NMT报文命令字,对心跳报文标志字节代码进行读写,通过程序散转方式得以实现。
对PDO、SDO通讯对象的处理则根据心跳报文标志字节代码指明的当前状态分别进行处理。
3.3 I/O从站的调试
从站节点的开发与调试采用了德国PEAK公司的CANopen
开发系统,硬件包括PCI和USB接口的CAN卡,软件是
PCANopenMagicPro3.0[7]专业开发版,很好的实现了对CANopen网络节点的配置、分析和实时监控。
调试所采用的通讯结构如图1所示,通过USB-CAN适配器监控主机与CAN总线网络连接,构成主-从式的网络结构,这种方式在后续系统组网调试时可以方便地实现对CAN总线网络的监控。
通过PCANopenMagicPro3.0软件可以对网络上传输的CANopen通讯对象报文进行实时跟踪;通过加载从站设备的EDS文件实现对从站节点进行配置;可以方便地实现对某个设备对象字典的访问。
在调试过程中,要注意保持CAN总线网络中主从设备的CAN波特率要一致,否则将不能建立正常的通信。
4 控制系统的测试平台
控制系统的整体测试采用如图1所示的网络结构。
监控计算机运行德国3S公司的CoDeSys软PLC软件及RTE实时程序组件,作为CAN总线网络的主站(相当于一台高性能可编程控制器),通过PCAN-PCI卡与自行设计开发的I/O从站节点进行数据通信,构成了基于软PLC和CAN现场总线的分布式I/O控
制系统。
在控制系统的硬件连接完成后,还需要在监控计算机上通过CoDeSys软件对整个网络进行组态,包括:安装系统支持的PCAN-PCI卡的驱动程序(由3S提供),并加载到RTE中;加载从站设备的EDS文件;设置CAN相关通讯参数(如波特率,
本系统设置为250k/s);设置CANopen协议的相关参数(如从站ID号、启动方式、心跳报文时间等)。
软PLC组态及监控界面如图5所示,可以看出挂接在网络系统上的主从设备都会在组态界面上显示出来,CANopenI/O从站节点的各个端口状态一目了然,可以实时监控输入/输出点的状态,并可以强制置位和复
位输出点。
5 控制系统测试结果
为了系统通讯测试,我们在上位机CoDeSys软PLC中编写了一个8位DO指示灯延时交替闪烁的I/O控制程序。
在这之前,要在系统库管理中加入标准的CANopen协议库文件(3S提供),这样上位机才能支持CANopen通讯协议;其次,要注意将程序中定义的变量和设备端口地址进行关联,否则系统进行程序编译时会报错。
编好程序后,在系统运行前,不要忘记先开启CoDeSysSPRTE实时程序,否则系统会报出通讯错误。
系统正常运行时,如图5所示,在上位机中CoDeSys提供了良好的监控界面,实时显示了8路DO指示灯延时交替闪烁的对应状态。
在实际应用中,CoDeSys也很好的支持用户自行设计的人机交
互界面。
图6PCANopenMagicPro3.0软件监控界面如图6所示,系统建立正常通讯需要经过通讯初始化阶段。
在这一阶段,从站启动后自动进入预操作状态,发送心跳报文表明当前状态,等待主站的询问;主站首先发送Bootup启动报文,
然后通过SDO服务至少要向从站询问设备类型信息,更多的还可能有厂商ID、产品代码、版本号等;得到应答确认之后,主站发送NMT报文,命令从站进入操作状态,系统随即建立了正常通讯状态,开始了实时PDO数据的通讯。
在本系统中利用挂接监控节点对CoDeSys与CANopenI/O从站通讯进行实时跟踪,网络中所有交互通讯报文可以按时间顺序清晰记录,这种方法对于CANopen协议的类似开发具有很好的借鉴意义。
6 结论
本文设计的基于CANopen协议的I/O从站,通过CAN现场总线与软PLC构成分布式控制系统,实现了监控主站与从站节点的正常通信。
通过与德国WAGO公司的CANopen远程I/O 从站组成分布式控制网络,编写了软PLC的测试程序,检验了整体设计方案的可行性;验证了系统信息传递的可靠性、准确性和实时性,以及I/O从站与其它产品的兼容性,实验表明,所设计的基于CANopen协议的I/O从站可以很好的满足了印刷设备控制系统的要求。
开发过程中所提出的技术方案和实现方法可以在类似的分布式控制系统中推广应用。