7
西门子6ES7352-1AH02-0AE0性能参数
PLC程序的调试可以分为模拟调试和现场调试两个调试过程,在此之前首先对PLC外部接线作仔细检查,这一个环节很重要。外部接线一定要准确无误。也可以用事先编写好的试验程序对外部接线做扫描通电检查来查找接线故障。不过,为了安全考虑,较好将主电路断开。当确认接线无误后再连接主电路,将模拟调试好的程序送入用户存储器进行调试,直到各部分的功能都正常,并能协调一致地完成整体的控制功能为止。据中国变频器维修网介绍,程序的具体调试要按照以下的方法进行。
1.程序的模拟调试
将设计好的程序写入PLC后,首先逐条仔细检查,并改正写入时出现的错误。用户程序一般先在实验室模拟调试,实际的输入信号可以用钮子开关和按钮来模拟,各输出量的通/断状态用PLC上有关的发光二极管来显示,一般不用接PLC实际的负载(如接触器、电磁阀等)。可以根据功能表图,在适当的时候用开关或按钮来模拟实际的反馈信号,如限位开关触点的接通和断开。对于顺序控制程序,调试程序的主要任务是检查程序的运行是否符合功能表图的规定,即在某一转换条件实现时,是否发生步的活动状态的正确变化,即该转换所有的前级步是否变为不活动步,所有的后续步是否变为活动步,以及各步被驱动的负载是否发生相应的变化。在调试时应充分考虑各种可能的情况,对系统各种不同的工作方式、有选择序列的功能表图中的每一条支路、各种可能的进展路线,都应逐一检查,不能遗漏。发现问题后应及时修改梯形图和PLC中的程序,直到在各种可能的情况下输入量与输出量之间的关系完全符合要求。如果程序中某些定时器或计数器的设定值过大,为了缩短调试时间,可以在调试时将它们减小,模拟调试结束后再写入它们的实际设定值。在设计和模拟调试程序的同时,可以设计、制作控制台或控制柜,PLC之外的其他硬件的安装、接线工作也可以同时进行。
2.程序的现场调试完成上述的工作后,将PLC安装在控制现场进行联机总调试,在调试过程中将暴露出系统中可能存在的传感器、执行器和硬接线等方面的问题,以及PLC的外部接线图和梯形图程序设计中的问题,应对出现的问题及时加以解决。如果调试达不到指标要求,则对相应硬件和软件部分作适当调整,通常只需要修改程序就可能达到调整的目的。全部调试通过后,经过一段时间的考验,系统就可以投入实际的运行了
0MRON PLC提供了通过MODEM与PC连接的功能。其方法主要是利用MODEM分别与PC及PLC连接后,在PC上运行SSS或CPT软件,从而实现远程监控与程序调试的功能。而MODEM的连接方式又分为拨号连接与专线连接两种方式。以下分别描述各方式下实现该功能的方法。
拨号连接
1 系统框图
2硬件要求:
1)IBMPC/XT兼容机:一台。可运行CPT;若使用SSS,则要求能运行Microsoft bbbbbbs的“**级终端”软件,或其他通讯程序,如Procomm plus等。
2)MODEM:两台。其中连接PLC的一台为外置式,为保证通讯质量,波特率采用9600bPs,故MODEM的速率不用太高,14400bPs即可。推荐使用贺氏公司的MODEM。若使用其他厂商的产品,必须保证与贺氏(Hayes)的AT指令集完全兼容,尤其是对S Register 的定义。
与PC机相连的MODEM无特殊要求,内置式及NOTEB00K上使用的PCMCIA卡型的均可。但在使用SSS软件连接时,因要监测MODEM的连接状态,较好也采用外置式。
3)PLC:凡是CPT或sss软件支持的PLC均可使用,但若用编程器口必须通过适配器。
3操作步骤:
1.配线:
1)IBMPC/XT兼容机COM口与MODEM之间的串口通信线,可使用随MODEM购买时附带的电缆。若自己制作,连接如下:
IBM PC/XT MODEM
兼容机COM口9孔DTE 串行通讯口25针DCE
2)因0MRON PLC RS232C口或CPMlA—CIF01上均为9孔插座,不能与MODEM直接相联,故需要用户自行制作一条9针——9针的转接电缆,接线如下:
PLC侧,9针DTE、 MODEM侧,9针DTE
2.MODEM设置:
1)首先将一台MODEM连接到计算机的串行通讯口(如COMl口)上,打开WIN95/98的**级终端,在对话框的“连接时使用”栏选择“直接连接到串口1”,然后设置波特率为9600、偶校验、7位数据位、2位停止位、无流量控制。
2)设置完成后,在**级终端窗口中使用“AT&V”指令,此时显示的是MODEM当前的配置,需要使用 AT指令重新配置MODEM如下:
B1 E1 L1 M1 N1 QO TVl W0 X4 Y0&C1&D0&GO&JO&K0&Q5&R1&S0&T5&XO&Y0
S00:001 S11:095 S12:050 S18:000 S25:005 S26:001 S36:007 S37:000 S38:020 S44:020 S46: 138 S48:007 S95:000
因上述参数有些是MODEM的默认值,所以M0DEM的当前配置可能有一些不需要改,如B1、E1等。用户只需把与上表设置不同的参数做相应的改动即可。
方法为:如MODEM当前配置的&D参数为“&D2”,要改为&D0”,在**级终端窗口输入“AT&D0”,回 车;如MODEM当前S00寄存器为“000”,要改为 “001”,在**级终端窗口输入输入“ATS00=1”并回 车。
注:&D必须设为0,S00必须设为1。
3) MODEM参数配置完成后,使用“AT&W”命令 将上述配置写入MODEM。
4)将MODEM与计算机脱开,连接到PLC的 RS232口或CIF01等RS232适配器,并插入一条电话线。
5)将另一台MODEM连接到计算机的串行通讯口 (如COMl口)上,打开WIN95/98的**级终端,按照上述步骤1)———3)也配置好,插入另一条电话拨号线,即可按下面的方法运行CPT或SSS与PLC进行通讯。
6)AT命令简介:
大部分通信软件使用菜单来配置、测试MoDEM, 然而有些通信软件要求直接发命令给MODEM,在这种情况下要求使用AT命令。
贺氏(Hayes)标准AT命令集是调制解调器通信接口的工业标准。AT命令可以用来配置MODEM与软件共同工作、与远端系统通信、发起或应答一个呼叫。
所有AT命令都以前缀AT开始。AT应以大写 (AT)或小写(at),MODEM无法识别大、小写的组合 (At或aT)。前缀AT用以引起调制解调器的注意,检测计算机串行通信口的速率,识别字符格式,包括字 符长度和奇偶设定等。
每一条AT命令都对应MODEM的某种动作。AT 命令可以是单一字母也可以是字母的组合。例如:D命令用于指示MODEM发起呼叫,同时D命令可包含多种拨号修正符,用于指示MODEM怎样、何时、如何拨号。T表示音频拨号,P表示脉冲拨号。
AT命令后面所跟的数字(0、1、2等)指标MODEM 执行*的选项。例如上面提到的&D命令,&D表示 MODEM采取DTR 0N方式;&D1表示当DTR发生从 0N到0FF的转换时,MODEM进入命令方式;&D2表示当DTR发生从0N到0FF的转换时,MODEM关进入命令方式;&D3表示当MODEM检测到DTR发生从0N到0FF的转换时复位。
3.PLC的设置: 在PLC的DM区将PLC设置成上位机链接方式,若与RS232C端口相连,则设置DM6645为0000,即与上位机相连采用标准设置;若想用户自定义设置,则设置DM6645为0001,然后在DM6646中进行具体设置。总之,PLC、MODEM、上位计算机以及SSS的有关 RS232C的参数设置必须保持一致。
4.使用SSS连接:
1)在配置好MODEM并将两台MODEM分别接到 计算机与PLC后,PLC、MODEM上电,打开计算机 WIN95/98的**级终端,在对话框的“连接时使用”栏 选择“直接连接到串口1”,然后设置波特率为9600、 偶校验、7位数据位、2位停止位、无流量控制。在**级 终端窗口中用AT命令拨号,如ATDTxxxxxxxx,回车 (xxx即为与PLC相连那个MODEM的电话线所使用的电话号码)。
2)拨号后,与计算机相连的MODEM OH灯亮,开始拨号,对方MODEM 0H灯、RI灯亮,同时MODEM会发出连接的声音。连通后,两个MODEM的CD灯(载波检测)亮,并且**级终端窗口会返回结果码 “CONNECT 9600”,表示MODEM间已经连接成功。若结果码返回为“NO CARRIER”,说明没有连上,需要硬件连线与电话线路。
注:1)在拨号后与MODEM连接成功之间,敲击键盘任意键均会中断本次呼叫。
2)拨号必须使用AT命令,否则下面的操作无法进行。
3)MODEM连接成功后,在点击**级终端窗口的挂断图标,断开连接,并较小化终端窗口。此时断开的只是**级终端到计算机机串口的连接,为的是让出 COM口来运行SSS的连线功能,实际上MODEM的连接并没有断,此时观察两个MODEM,会发现CD灯仍 亮,这也就是必须用AT命令拨号的原因。否则断开的将是整条线路,MODEM间也会断开,CD灯灭,就不能进行对P比远程通讯的功能了。
4)在上位计算机运行SSS,进行PLC的设置,设定 P比型号、COM中、通讯方式选择HOSTlNK、波特率、数据位、停止位等有关RS232C的设置应与M0DEM的设置保持一致。设置完成后,在标准画面下按 Ctro+O,出现链接菜单,选F1进行连接,当屏幕出现 单元号等信息后说明连接成功,即可按正常的 HOSTbbbb链接方式对PLC进行程序的传送以及远程监控PLC的状态。
5)对PLC的操作完成后,若想断开连接,首先退出SSS,重新进入到**级终端窗口,用ATH命令断开 MODEM间的连接。若发现在**级终端窗口无法输入AT命令,可输入“+ + +”并回车,待屏幕出现“0K”提示后再输入“ATH”命令,屏幕再次提示“0K”表示已断开本次连接。
5.使用CPT连接:
1) 在配置好MODEM并将两台MODEM分别接到计算机与PLC后,PLC、MODEM上电。
2)在上位计算机运行CPT,进行PLC的设置,设定PLC型号。然后点击屏幕底部的“Net:x Node:x”按 钮,进行COMMUNICATl0N的设置。在弹出窗口的“Network”栏选择“MODEM”然后点击“SetuP…”,在弹出窗口再次选择“SetuP…”,选择与MODEM相连的COM口、设定波特率、数据位、停止位、奇偶检验等,这些设置应与MODEM及PLC的设置保持一致。在该屏幕较下面的“bbbephone No.”栏输入与PLC相连那个MODEM的电话线所使用的电话号码,并点击“0K”退出。
3)在CPT的标准窗口中选择“on—Line”,等待片刻MODEM即开始拨号。拨号后,与计算机相连的MODEM 0H灯亮,开始拨号,对方MODEM 0H灯、RI灯亮,同时MODEM会发出连接时的声音。连通后CPT的状态会如正常的HOSTbbbb链接一样,表示上位计算机与PLC间已经连接成功,即可按正常的 HOSTHNK链接方式对PLC进行程序的传送以及远程监控PLC的状态。若要断开连接,在CPT中选择“0ff—Line”即可。
专线连接
所谓专线连接,即两台MODEM之间不通过PSTN公共电话交换网进行通讯,而是用一根2芯或4芯的普通电话线将两台MODEM直接相连,以达到通讯的目的。这种方式在上位监控计算机与PLC之间距离较远,而现场又不具备与PSTN电话网相连的情况下较为有用。一般情况下,普通电话到电话局交换机的距离为1KM以内,故用专线连接在1KM内应没有问题。具体适用距离用户需在应用中实践测试。
专线连接的硬件要求以及接线与拨号连接基本相应,包括MODEM、计算机、PLC的参数设置也与上述方式一样,下面只说明专线连接与拨号连接不同的地方。
1.MODEM的设置:
MODEM除与拨号连接的要求外,较重要的一点 就是必须支持专线方式。现在市场上销售的部分商用 MODEM不具备专线功能,故在MODEM的选择上应与生产厂商联系,以确认其产品支持专线方式。
MODEM的参数按的要求分别设好,另外需要将MODEM设为专线模式,并将其中一台设为主叫 (0riginal),另一台设为被叫(Answer)。有的支持专线 MODEM在板上可以通过按键或其他硬件方式设置,如无法硬件设置,则需要按照“拨号连接”中描述 的方法通过“**级终端”用AT命令设置并存储。相应的AT命令为:
&L1:设为2线专线(1eased line)方式
MODEM设置完成后,分别与上位计算机及PLC 相连,并将一根两端带有RG—11插头的电话线插入 MODEM的“LINE”口中,然后将各设备上电。
2.CPT与SSS的使用:
在MODEM上电后,主叫一方(一般是与计算机相连)会自动发起呼叫,并与被叫一方建立连接,可通过观察MODEM面板上的指示(CD灯)以确认MODEM 连接成功。
在连接成功后,在计算机上运行SSS或CPT软件,按照HOSTbbbb方式与PLC通讯即可。也就是说专线连接只不过把HOSTbbbb方式下计算机与PLC 之间的串行通讯电缆,换成了两台可以自动进行连接 的MODEM而已



基于VB的远程通讯程序
1 引言
计算机与通信的紧密结合较大地推动了工业自动化的进程。人们坐在计算机前就可以实现对远端设备的集中监控,从而提高了整个系统的稳定性和可靠性。本文作者曾经参与了电源远程监控系统软件的开发工作。在运用VB开发软件的过程中,为实现远程通讯功能,我们利用了VB提供的通讯控件MSComm。该控件屏蔽了通信过程中的底层操作,程序员只需设置和监视MSComm控件的属性和事件,就可以轻而易举地实现串行异步通讯。
远程监控中心可以对分布的各个独立的电源系统进行遥测、遥控。电源控制器可以现场监测和控制电源系统的各项工作参数;可以接受远端监控中心的查询、控制;并可以向中心上报工作状态。为实现上述功能 ,首要任务是建立两者之间的通讯。因此可分别将监控中心计算机和电源控制器通过RS-232C接口与Modem相连,再通过Modem接入公用电话网(PSTN),由PSTN实现本地Modem与电源端Modem的联接,就可以实现监控中心计算机与电源控制器间的通讯。
2 通讯控件简介
MSComm 控件提供了一系列标准通讯属性和方法。使用它可以建立起应用程序与串行端口的联接。为实现远程通讯,还需要把调制解调器与串行端口通过RS-232C接口连接,这样,在应用程序中发出AT命令,就可以达到控制调制解调器的目的,进行远程通讯。有关调制解调器的AT命令,本文不做讨论,读者可以参考相关的调制解调器手册。
2.1 在项目中加入MSComm控件
启动Visual Basic,建立一个新项目。
选Project菜单,从中选择Components子菜单。
在弹出的Components对话框里的Controls标签下选择Microsoft Comm Control 5.0项。
2.2 与程序设计有关的 MSComm控件属性
CommPort 设置或返回通讯端口号。格式为:mPort[ = PortNumber ]。 在设计时,PortNumber 可以设置成从 1 到 16 的任何数(缺省值为 1)。但是如果用 PortOpen 属性打开一个并不存在的端口时,就会产生错误 。还需注意的是必须在打开端口之前设置 CommPort 属性。例如:mPort=2,即设置当前通信串口为COM2口。
Settings 以字符串形式设置或返回波特率、奇偶校验、数据位和停止位。格式为:
MSComm.Settings[=Parabbbbbb]。Parabbbbbb是一个包含四部分的字符串。**部分为波特率,其可选值为110,300,600,1200,2400,4800,9600,14400,19200,28800。*二部分为奇偶校验,N 表示不校验,E 表示偶校验,O表示奇校验,S表示空格检验,M表示符号校验。*三部分为数据位位数,其可选值为4,5,6,7,8。*四部分为停止位位数,其可选值为1,1.5,2 。Settings属性的缺省值为“9600,N,8,1” 。
PortOpen 设置并返回通讯端口的状态(打开或关闭)。在设计时无效。格式为:
MSComm.PortOpen[=TRUE/FALSE] 。
bbbbb 返回并删除接收缓冲区中的数据流。该属性在设计时无效,在运行时为只读。
格式为:MSComm.bbbbb。
bbbbbLen 设置并返回 bbbbb 属性从接收缓冲区中每次读取的字符数。格式为:MSComm.bbbbbLen[=CharNumber]。bbbbbLen 属性的缺省值是 0。设置 bbbbbLen 为 0 时,使用 bbbbb 将使 MSComm 控件读取接收缓冲区中全部的内容。若接收缓冲区中的字符数小于bbbbbLen 属性设置的字符数,bbbbb 属性返回一个零长度字符串 ("")。所以在使用bbbbb 前,用户可以通过检查 InBufferCount 属性来确定缓冲区中是否已有需要数目的字符。
InBufferCount 返回接收缓冲区中已接收的字符数。格式为: MSComm.InBufferCount[=0]。该属性在设计时无效,但设置InBufferCount 属性为0 可以接收缓冲区。
bbbbbMode 设置或返回 bbbbb 属性取回的数据的类型。格式为MSComm.bbbbbMode[=Modbbbbue]。若数据只用 ANSI 字符集,设置bbbbbMode属性值为0(缺省),数据通过 bbbbb 属性以文本形式取回。如数据中有嵌入控制字符、Nulls 等等,可设置bbbbbMode属性值为1,数据通过 bbbbb 属性以二进制形式取回。
Output 向发送缓冲区写数据。该属性在设计时无效,在运行时为只读。格式为:MSComm.Output=OutData。OutData为要发送的数据,可以是文本数据或二进制数据。
Rthreshold 设置或返回输入缓冲区中存放接收字符的较小数。当其属性值为1时,则缓冲区中每接收到一个字符就引发一次OnComm事件,以便及时从缓冲区中取走数据;当设为0时,则不引发OnComm事件;当设为其它值时,如Rthreshold属性值为5时,则缓冲区中每接收到5个字符引发一次OnComm事件。
CommEvent 返回较近的通讯事件或错误的数字代码。格式为:mEvent。 当CommEvent属性值为常数ComEvReceive=2时,收到 Rthreshold 个字符,就会触发OnComm事件,直到用 bbbbb 属性从接收缓冲区中取出数据。
DTREnable 确定在通讯时是否使 Data Terminal Ready (DTR) 线有效。Data Terminal Ready 是计算机发送到调制解调器的信号,指示计算机准备就绪,可以开始传输数据。格式为:MSComm.DTREnable[=TRUE/FALSE]。 DTREnable 设置为 True,当端口被打开时 Data Terminal Ready 线设置为高电平(开),当端口被关闭时 Data Terminal Ready 线设置为低电平(关)。 DTREnable 设置为 False,Data Terminal Ready 线始终保持为低电平。在很多情况下,当Data Terminal Ready 线发生从开到关的转换时,调制解调器进入命令状态,执行“ATH0”命令来挂断电话。
2.3 MSComm控件的OnComm 事件
通讯控件产生的一事件是OnComm事件。每当有通讯错误或某事件发生时,通讯控件就会产生此事件。事件或错误的数字代码放在CommEvent属性中。
3 程序设计
MSComm 控件提供下列两种处理通讯的方式:查询方式和事件驱动方式。
3.1 查询通讯
通过检查InBufferCount 属性值来判定输入缓冲区中是否接收到相应数目的字符或字节。若已接收到相应数目的字符或字节,就可以用bbbbb属性来接收这些字符或字节;否则继续查询InBufferCount属性值,直到满足条件。
下面是用查询方式实现的通讯程序。在下面给出的例子中,我们接收的数据都是48字节的定长二进制数据。为实现该程序,需在窗体上加入一个通讯控件MSComm1,四个命令按钮cmdDial,cmdHangUp,cmdOrder,cmdExit。
窗体文件清单(只给出主要的程序代码)
Dim ret '定义窗体级变量
Dim databuffer() As Byte 'databuffer是存放接收数据的数组
Private Sub bbbb—Load()
'设置当前通信串口为COM2口
mPort = 2
'设置串口传输速率为2400bps,数据位8位,无校验,一位停止位
MSComm1.Settings = "2400,n,8,1"
MSComm1.bbbbbMode = 1 '以二进制形式从输入缓冲区中读数据
MSComm1.RThreshold = 0 '接收到数据不引发OnComm事件
MSComm1.bbbbbLen = 0 '一次读出输入缓冲区中的所有数据
MSComm1.PortOpen = True '打开串口
End Sub
Private Sub cmdDial—Click() '拨号联机
Static Num As bbbbbb
Num = bbbbbBox$("Enter Phone Number:", "Dial Number", Num) '输入电话号码
If Num = "" Then Exit Sub
If Not MSComm1.PortOpen Then
MSComm1.PortOpen = True
If Err Then Exit Sub
End If
MSComm1.Output = "ATDT" & Num & vbCrLf
'ATDT通知调制解调器以音频方式拨号
cmdHangUp.Enabled = True
cmdDial.Enabled = False
MSComm1.InBufferCount = 0
'查询InBufferCount 属性值来确定输入缓冲区中是否接收到调制解调器回送的字符串“10 ”,以证实拨号成功,正确建立联接
Do
DoEvents
Loop Until MSComm1.InBufferCount =3
End Sub
Sub ReceiveData() '接收数据子程序
Dim temp
MSComm1.InBufferCount = 0 '清空输入缓冲区
'查询InBufferCount 属性值来确定输入缓冲区中是否有接收到48字节的数据
Do
DoEvents
Loop Until MSComm1.BufferCount = 48
temp = MSComm1.bbbbb
databuffer = temp '将接收到的数据的类型转换为字节数组类型
End Sub
Private Sub cmdHangUp—Click() '数据通讯结束后,执行操作
Dim ret
ret = MSComm1.DTREnable
'当DTR信号发生从高电平到低电平的转换时,调制解调器从传输状态进入命令状态
MSComm1.DTREnable = True
MSComm1.DTREnable = False
MSComm1.DTREnable = ret
MSComm1.Output = "ATH0" 'ATH0是命令
cmdHangUp.Enabled = False
cmdDial.Enabled = True
If Err Then MsgBox Error$, 48
End Sub
Private Sub cmdExit—Click() '单击退出按钮触发的事件过程
Mscomm1.Portopen=False '关闭串口
End
End Sub
Private Sub cmdOrder—Click() '单击查询按钮触发的事件过程
Dim temp
Dim order() As Byte
order = StrConv(Chr(0) + "aa" + Chr(13), vbFromUnicode) '查询命令串
'strconv()函数的功能是将Unicode字符串转换为ASCII码字符串
temp = order
MSComm1.Output = temp
'通过与串口联接的调制解调器向远端电源控制器发送查询命令
ReceiveData '查询接收48字节的数据
End Sub
3.2 事件驱动通讯
事件驱动通讯是处理串行端互作用的一种非常有效的方法。在许多情况下,当输入缓冲区中收到字符或是输出缓冲区空时,需要通知程序以便处理,在这些情况下,可以利用 MSComm 控件的 OnComm 事件捕获并处理这些通讯事件。
下文给出的用事件驱动方法设计的通讯程序与上面的查询通讯程序具有相同的窗口界面和功能。在实现过程中,要把查询通讯程序的查询接收子程序去掉,这是因为在事件驱动的通讯中,接收数据都是在OnComm事件过程里完成的。并且,在bbbb—load事件过程中将Rthreshold属性值设为1。在程序设计时,还要引入一个窗体级变量comstate,指示串口当前的状态。下面只给出OnComm 事件过程。
Private Sub MSComm1—OnComm()
Dim temp As Variant
Dim tempbyte() As Byte
Select Case mEvent
'根据不同的CommEvent属性的值来确定引起OnComm事件的具体原因,然后进行不同的处理
Case 2 'MSCOMM—EV—RECEIVE=2
temp = MSComm1.bbbbb '从缓冲区中读出接收到的数据
tempbyte= temp '将接收到的数据的类型转换为字节数组类型
Dim k As Integer
Static i As Integer
For k = LBound(tempbyte) To UBound(tempbyte)
If comstate=0 Then 'comstate=0, 串口处在拨号状态
If tempbyte(k)=13 Then
'判断是否收到调制解调器回送的结果码结束符回车符
comstate=1 '拨号成功
End If
Else 'comstate=1,串口处在接收数据状态
databuffer(i)=tempbyte(k)
i=i+1
If i=47 Then
i=0
End If
Next k
End Select
End Sub
以上,我们讨论了用VB实现远程数据通讯的两种方法。需要注意的是,用查询方式进行通讯程序设计时,要对输入缓冲区中的数据及时处理,保证数据的正确接收。例如,在输出调制解调器拨号命令后,程序就立即查询调制解调器的回送结果码;而向电源控制器发出查询命令后,程序就立即查询接收上报的数据。如果在数据量大,功能比较复杂的通讯程序中,就应该采用事件驱动的通讯方法,保通讯的可靠性。