S7-300/400的CPx43-1 MODBUS TCP通讯案例

描述

1.“ ModbusTCP CP V5.0”块库使用说明

1) 该功能块库可以用于S7-300单站通过CP343-1或S7-400单站通过CP443-1进行ModbusTCP通讯。

2) 由于需要在SIMATIC站与其他通讯伙伴之间建立TCP连接用于Modbus通讯,因此需要调用SIMATIC S7标准功能块,对于S7-300/400的CP来说,需要调用FC5(AG_SEND),FC6(AG_RECV)功能块。

3) 对于主要功能块FB106、107和108来说,其版本号如下图1所示:

S7-300

图1 功能块版本号

当将软件选项包安装完集成到Step7时,可以在Step7安装文件的相应目录中找到块库、例程、英文手册,另外还可找到用CFC语言编程的功能快库,供读者选用,如下图2~4所示,在实际的项目调试过程中由于例子程序的各项功能比较完善,因此可以直接使用例子程序根据项目的实际情况修改相应的参数即可,可以节省大量的参数设置时间,以下主要描述了使用软件选项包” ModbusTCP CP V5.0 "配置S7-300/400站的详细配置和编程步骤。

S7-300

图2 块库、例程、英文手册和软件注册的文件夹位置

S7-300

图3 例程(注:当找不到例程时可以通过”Browse..”按钮来进行查找) 

S7-300

图4 功能块库(注:当找不到块库时可以通过”Browse..”按钮来进行查找)

2. 配置S7-300单站系统通过CP343-1 作为Server进行Modbus TCP通讯

以S7-300单站系统及Modscan32软件为例,详细介绍如何将S7-300单站系统通过CP343-1配置为Server,Modscan32为Client进行Modbus TCP通讯,在本例中将使用带FC10”AG_CNTRL”版本的功能块,下图5为服务器功能块库的程序结构及各功能块完成的功能:

S7-300

图5 服务器功能块库程序结构

S7-300注意:Modscan32软件可以从网上免费下载得到,本例中使用的版本为V4.A01版,由于各版本的功能不尽相同,因此需要注意版本问题。

2.1 例子中使用的硬件设备及软件

本例中所用的硬件设备如下表:

S7-300

表1 服务器硬件清单

所用软件如下表:

S7-300

表2 服务器软件清单

2.2 S7-300系统及Modscan32软件组态

打开Step7软件,新建一个工程项目文件,命名为“M_TCP_CP_V50(Server)”, 在项目下插入一个S7-300站,如下图6所示:

S7-300

图6 新建S7-300 Station

双击插入的SIMATIC 300 Station的“Hardware”,打开硬件组态,在硬件组态界面下分别插入机架,CPU315-2PN/DP、CP343-1,本例中将CP的IP地址设为192.168.0.137如下图7所示:

S7-300

图7 硬件组态并设置CP343-1的IP地址

硬件组态完成后,打开DEMO中的实例项目,见下图8所示:

S7-300

图8 DEMO中的实例项目

在实例项目中,找到300 Server程序中的块,复制所有的块(除System data外),粘贴至自建的项目,见下图9所示:

S7-300

图9 300 Server程序中的块

打开Netpro网络组态,选中CPU315-2PN/DP,插入一个新连接,连接伙伴为未指定(Unspecified),连接类型为TCP连接(TCP Connection),如下图10所示:

S7-300

图10 网络组态-新建TCP connection

打开连接属性对话框中的“General Information”,由于CP343-1做Server被动连接,因此不勾选“激活连接的建立“(Active connection estabishment),ID保持缺省即可,在“地址”(Address)栏中同样由于CP343-1做Server,因此填入连接的Port号设置为502,组态完成后,编译保存,将例程站点“SIMATIC 300(Server)”中的程序(System data不需要拷贝)拷贝到该项目中并下载(注意:OB100中调用的FB108,同时调用DB2,需填写DB2的id和laddr,如图13所示)。对于通讯伙伴Remote的IP地址可以不填,即允许任意IP地址的客户端发起连接,如下图11所示:

S7-300S7-300

图11 S7-300为服务器的TCP connection参数设置

对于服务器和客户端的端口号(下述中以Port代替)的选择需要注意以下几点:

1)一般情况下服务器端的Port号modbus TCP规范缺省为502,客户端的Port号设置为客户端允许的号即可,另外各厂商产品也有一些限制,对于SIMATIC产品一般从2000之后开始。

2)对于一个系统来说,当创建多个TCP连接时,要保证IP地址和Port号不重合,即同一个IP地址下创建多个TCP连接时Port号必须不同,而不同的系统因IP地址不同可以使用相同的Port号,例如本例中如果需要创建多个TCP连接作为Server时因只有一个IP,因此Port号必须不同。

2.3 通讯测试

由于“ ModbusTCP CP V5.0”选项包支持功能码FC1,2,3,4,5,6,15,16,不同的功能码测试过程中类似,因此下面以FC03(读写保持寄存器)为例来说明通讯测试的整个过程,对于其他功能码的测试将不再重复描述,对于Modbus的数据类型可参考下表3:

  S7-300

表3 Modbus数据类型 

由于服务器主功能块FB108“MODBUSCP”的参数需要初始化,因此分别在OB100及OB1中调用FB108,在OB100中调用FB108完成相关参数的初始化,FB108的管脚分分布如下图12所示:

S7-300

图12 FB108的管脚分分布

注意:从图12可以看出,数据集中在DB2中

打开DB2,设置相应参数,如下图13所示:

S7-300

图13 DB2中的变量设置

打开Modscan32软件,在“Connection--->connect”中打开连接属性对话框,连接接口选择“Remote TCP/IP Server”,IP Address分别填入CPU的IP地址

192.168.0.137,Service为远程服务器的端口502,在协议的选择对话框中可以定义传输模式、通讯超时响应时间,报文发送间隔及允许写多个保

持寄存器等,这里分别保持缺省设置即可,如下图14所示:

S7-300

图14 对应TCP通讯的Modscan32连接窗口

下载网络组态及程序到CPU中,使能参数ENQ_ENR=1,在 Modscan32的“Set up->Data Definition”中设置数据扫描周期、寄存器连接类型、起始地址、长度等,如下图15所示:

S7-300

图15 Modscan32中Modbus数据参数定义

之后在ModScan32中就可以建立和远程CP343-1 Server的连接了,在Netpro中可以看到连接已经建立起来,如下图16所示:

S7-300

图16 Modscan32激活与S7-300的连接

由于Modbus的内部地址编排时基于数据链路层和应用层有一定的映射关系,因此Modbus的地址与SIMATIC中的DB块的地址时按照一定的地址映射关系来相对应,这样造成了DB块中有一定的地址偏移量,在本例中假设数据区的定义如下图17所示,其DB偏移量、Modbus物理编址、应用层编址如下图18所示:

S7-300

图17 本例中的数据区定义

S7-300

图18 DB偏移量、Modbus物理编址、应用层编址对应关系 

在Step7的项目程序中新建一个变量监控表,插入需要监控的参数和数据区变量,可以看到ModScan32软件与CP343-1的数据通讯已经建立起来了,双方可以进行正常的保持寄存器数据读写操作,如下图19所示:

S7-300

图19 通讯连接建立

3. 配置S7-300单站系统作为Client进行Modbus TCP通讯

下面以S7-300单站系统及Modbus Slave软件为例,详细介绍如何将S7-300单站系统配置为Client,Modbus Slave为Server进行Modbus TCP通讯,在本例中同样使用FC10“AG_CNTRL”版本的功能块,由于客户端和服务器模式均使用相同的功能块,因此客户端功能块库的程序结构及各功能块完成的功能可以参考上图5。

3.1 例子中使用的硬件设备及软件

   本例中所用的硬件设备及软件同上文2.1节所示。

3.2 S7-300单站系统与Modbus Slave软件组态

打开Step7软件,新建一个工程项目文件,命名为“M_TCP_CP_V50(Client)”, 在项目下插入一个S7-300站,如下图20所示:

S7-300

图20 新建S7-300 Station

双击插入的SIMATIC 400 Station的“Hardware”,打开硬件组态,在硬件组态界面下分别插入机架,CPU315-2PN/DP、CP343-1,本例中将CP的IP地址设为192.168.0.137,如下图21所示: 

S7-300

图21 硬件组态并设置CP343-1的IP地址

打开Netpro网络组态,选中CPU315-2PN/DP,插入一个新连接,连接伙伴为Unspecified,连接类型为TCP Connection,如下图22所示:

S7-300

图22 网络组态-新建TCP connection

打开连接属性对话框中的“General Information”,由于CP343-1做Client主动发起连接,因此需要勾选“Active connection estabishment”选项,ID保持缺省即可,在“Address”栏中同样由于CP343-1做Client,对于本地的端口号设置为2000(一般从2000以外开始以避免与别的协议资源冲突),对于通讯伙伴Remote的IP地址设置为测试PC机的IP 地址,本例中 PC机的IP设置为192.168.0.130,而Port号设置为502,如下图23所示:

S7-300S7-300

图23 S7-300为客户端的TCP connection参数设置

组态完成后,编译保存,将例程站点“SIMATIC 300(Client)”中的程序(System data不需要拷贝)拷贝到该项目中并下载(注意:OB100中调用的FB108,DB2的id和laddr需根据组态设置,见下图24所示)。

S7-300

图24 DB2中的变量设置

关于服务器和端口号的设置请参考本文中2.2章节说明。

3.3 通讯测试

由于“ModbusTCP CP V5.0”选项包支持功能码FC1,2,3,4,5,6,15,16,不同的功能码测试过程中类似,因此下面同样以FC03(读写保持寄存器)为例来说明通讯测试的整个过程,对于其他功能码的测试将不再重复描述。

需要说明的是由于客户端功能块需要定义具体的功能码,而主功能块FB108 “MODBUSCP”并没有直接的管脚来定义功能码,而是由其中的两个参数“DATA_TYPE”和“single-write”共同决定(参见后面的管脚参数说明),详细情况如下图25所示:

S7-300

图25 S7-300单站系统做客户端时不同的功能码的参数定义

由于客户端和服务器均使用相同的功能块FB108“MODBUSCP ”的参数需要初始化,因此分别在OB100及OB1中调用FB108,在OB100中调用FB108完成相关参数的初始化,FB108的管脚分布参见2.3章节中的图12说明。

打开Modbus Slave软件,在“Connection--->connect”中打开连接属性对话框,连接接口选择TCP/IP,Port设置为本地服务器的端口502,如下图26所示:

S7-300

图26 Modbus Slave中设置端口号

下载硬件组态及程序到CPU中,给参数ENQ_ENR发送脉冲信号;在打开的ModSim32软件窗口设置寄存器连接类型、起始地址、长度等,如下图27所示:

S7-300

图27 Modbus Slave中Modbus数据参数定义

关于SIMATIC中DB偏移量、Modbus物理编址、应用层编址对应关系请参考本文中2.3章节图18的说明

之后在CP343-1 Client就可以建立和远程Modbus Slave Server的连接了,在Netpro中可以看到连接已经建立起来,如下图28所示:

S7-300

图28 Modbus Slave激活与S7-300的连接

在Step7的项目程序中新建一个变量监控表,插入需要监控的参数和数据区变量,可以看到Modbus Slave软件与S7-300的数据通讯已经建立起来了,双方可以进行正常的保持寄存器数据读写操作,如下图29所示:

S7-300

图29 S7-300单站系统作为客户端与Modbus Slave软件通讯

4. “ ModbusTCP CP V5.0” 选项包通讯使用总结及相关注意事项

由于是通过PC测试软件模拟第三方设备与SIMATIC CPU的集成PN口进行Modbus TCP通讯,因此在实际的第三方设备与CPU的集成PN口进行通讯时需要注意以下几点:

1) 由于订货号2XV9450-1MB00程序中会占用CPU 较大的装载和工作存储区,因此对于性能比较低特别是S7-300的低端CPU进行通讯时必须考虑一定的富余量。

2) 对于SIMATIC S7,参数DB_x的数据区建议使用不同的DB 块,使用同一个DB的不同地址区会造成地址编排混乱,另外参数Start_xEND_x 参数不能出现地址叠加情况。

3) 第三方设备的数据区与SIMATIC S7的数据DB块的地址对应关系可以先按照第三方的数据区域Modbus地址的偏移关系之后计算相应的偏移量。

4)建议使用项目中的样例程序,只须修改连接ID、addr,定义通讯双方的IP地址、端口号及相应的数据存储区等,能减少编程量,只须把样例程序放到一个单独的FC块中即可,样例程序中定义了足够的数据区,连接成功及错误次数指示等。

5) Modbus TCP每一包的数据最多只能发送125个寄存器或2000个比特位,超过该范围必须进行分包处理。

6) S7-300/400作为Client能与多少个Server建立通讯或者作为Server时能与多少个Client通讯取决于产品所支持的TCP连接数,Modbus/TCP协议并没有对此进行约束和限制。 

5 .“ModbusTCP CP V5.0” 软件包授权

未经授权的Modbus TCP软件可用于测试和学习,不允许用于商业行为;未经授权的软件测试时CPU 的INTF指示灯红色闪烁,并在CPU故障缓冲区生成错误信息;同时,Modbus TCP功能块报错,如图30、31所示:

S7-300

图30 CPU诊断缓冲区报错

S7-300

图31 Modbus TCP功能块报错A090

每个CPU都需要对功能块MODBUSCP进行授权。授权有两个步骤:读取IDENT_CODE和申请注册码REG_KEY。且在CPU中必须调用OB121。 

5.1读取IDENT_CODE

1、下载程序并将CPU切换到RUN模式;

2、打开MODBUSCP(FB108)的背景块DB108,确认IDENT_CODE的偏移地址为42;如图32所示:

S7-300

图32 确认IDENT_CODE的偏移地址

3、打开变量监视表,输入DB108.DBB42开始的20个字节,偏移地址44开始的18个字符即为IDENT_CODE,监控如图33所示:

S7-300

图33 确认IDENT_CODE

4、按上图方式,获取IDENT_CODE和软件包装上的License-No,并按照章节5.2和5.3所描述步骤申请注册码。

5.2 通过拨打西门子授权服务中心申请注册码REG_KEY

授权中心联系方式:010-64757575

通过西门子授权服务中心申请注册码时,需要您提供所购买的软件订货号、IDENT_CODE和软件包装上的License-No ,如图33所示。

5.3 通过网站申请注册码REG_KEY

1、通过西门子技术支持网站申请,打开如下网址,点击“技术问题提交”:

https://support.automation.siemens.com/CN/llisapi.dll?func=cslib.csinfo2&aktprim=99&lang=zh

S7-300

图34 技术支持网站

2、请按如下示例的步骤进行操作(注意:由于步骤3搜索出来的参考信息无法解决授权问题,请直接点击“继续”进入步骤4),如图35~39所示。

S7-300

图35 步骤1

S7-300

图36 步骤2

S7-300

图37 步骤4

S7-300

图38 步骤5

S7-300

图39 步骤6

5.4 使用注册码REG_KEY

1、西门子授权中心收到技术支持申请后,将会尽快给您回复邮件;

2、当获取到注册码后,在项目中打开LICENSE_DB(DB3);

3、通过菜单“View--->Data View”将DB块切换到数据视图模式,将获取的17位注册码填写到“Actual value”中,如图40所示。

S7-300

图40 输入注册码

4、将LICENSE_DB(DB3)下载到CPU中,CPU的INTF指示灯熄灭;并可通过查看MODBUSPN(FB102)的输出引脚LICENSED为true且不再报A090错误代码,确认注册码激活成功,如图41所示。

S7-300

图41 注册码激活成功

6. CP进行Modbus TCP通讯FB输出常见故障代码及处理

STATUS(Hex) 故障原因 处理措施
FB MODBUS故障
A002 Modbus起始地址Start_x错误 由通讯伙伴确认起始地址
A003 Modbus地址映射的DB块的数据区长度太短,最低长度:
-寄存器:
(START_ADDRESS – start_x + LENGTH) * 2
-位
(START_ADDRESS – start_x + LENGTH) / 8
其他可能的原因:
·参数初始化错误(CP为Client时)
·客户端请求报文时错误的地址区域(CP为Server)
扩展DB区域
当CP为Client时,修改参数START-ADDRESS或者LENGTH
当CP为Server时,修改客户端的请求
A004 仅在CP为Client时才有此故障:
参数DATA_TYPE及WRITE_READ设置不匹配,不可能对输入寄存器或离散输入进行写操作
修改此两个参数
A005 CP为Client时:
参数LENGTH设置无效
CP为Server时:
Client请求的寄存器号无效,合法的数据类型范围如下:
读线圈/离散输入: 1 to 2000
写线圈: 1 to 1968
读寄存器: 1 to 125
写保持寄存器: 1 to 123
CP为Client时:
修改参数LENGTH
CP为Server时:
修改Client请求的数据类型范围
A006 CP为客户端时:
数据区1-8中对应的Modbus地址范围(DATA_TYPE,
START_ADDRESS和 LENGTH
)不存在
CP为服务器时:
客户端请求的报文不正确
CP为Client时:
修改参数DATA_TYPE,START_ADDRESS和 LENGTH
CP为Server时:
修改Client 请求或修改数据类型data_type_x.
A007 CP为Client时:
参数MONITOR监控时间设置无效,值必须>20ms
修改参数MONITOR
A008 接收监控超时,可能的原因:
对于MODBUSCP V2.x:
所有通过502端口的连接激将中断并重新建立
对于MODBUSCP V1.x:
同步错误,报文丢失
检查通讯伙伴的参数设置,如单元标识符等
A009 当CP为Client时,接收标识符TI与发送不一致, 连接将终止和重新建立
对于MODBUSCP V2.x:
所有通过502端口的连接激将中断并重新建立
通过抓包工具来分析和修正通讯伙伴的报文
A00A CP为Client时,接收参数UNIT 与发送的不一致,连接将终止和重新建立
对于MODBUSCP V2.x:
所有通过502端口的连接激将中断并重新建立
A00B CP为Client时:
接收与发送功能码不一致
CP为Server时:
无效的功能码被接收
对于MODBUSCP V2.x:
所有通过502端口的连接激将中断并重新建立
对于MODBUSCP V1.x:
同步错误,报文丢失
CP为Client时:
通过抓包工具来分析和修正通讯伙伴的数据报文格式
CP为Server时:
注意FB MODBUS仅支持功能码FC1、2、3、4、5、6、15、16
A00C 接收到的字节长度与寄存器/位不匹配
CP为服务器时,CP将发一个响应异常给客户端
对于MODBUSCP V2.x:
所有通过502端口的连接激将中断并重新建立
通过抓包工具来分析和修正通讯伙伴的报文
A00D 仅在CP 为Client 时发生:
响应的MODBUS寄存器/位地址或长度与客户端请求的不一致
A00E MODBUS报文报头的长度与寄存器/位 不匹配,FB将忽略
对于MODBUSCP V2.x:
所有通过502端口的连接激将中断并重新建立
对于MODBUSCP V1.x:
同步错误,报文丢失
A00F 非0的协议标识符报文被接收
对于MODBUSCP V2.x:
所有通过502端口的连接激将中断并重新建立
对于MODBUSCP V1.x:
同步错误,报文丢失
A010 数据区1-8 DB块号重复使用 确保每个Db块号只使用一次
A011 DATA_TYPE参数设置(范围为1-4) 修改DATA_TYPE参数
A012 数据区参数data_type_1和data_type_2设置重叠 数据区不能有重叠的modbus地址区域
A013 数据区参数data_type_1和data_type_3设置重叠 修改此参数
A014 数据区参数data_type_1和data_type_4设置重叠
A015 数据区参数data_type_1和data_type_5设置重叠
A016 数据区参数data_type_1和data_type_6设置重叠
A017 数据区参数data_type_1和data_type_7设置重叠
A018 数据区参数data_type_1和data_type_8设置重叠
A019 当参数data_type_x设置不为0时,db_x被赋值0 db_x不能为0
A01A 报头中长度错误:
范围3-253字节
对于MODBUSCP V2.x:
所有通过502端口的连接激将中断并重新建立
通过抓包工具来分析和修正通讯伙伴的报文
A01B CP为Server及使用功能码FC05时:
接收的线圈值无效
CP将发送异常报文
A01E CP接收到无法识别的数据,
对于MODBUSCP V2.x:
所有通过502端口的连接激将中断并重新建立
对于MODBUSCP V1.x:
同步错误,报文丢失
分析错误信息,通过抓包工具来分析和修正通讯伙伴的报文
A01F 功能块FB MBBUSCP返回一个无效的状态 联系产品供货商
A020 参数Check_conn_cycle设置<1s时,对于功能块AG_CNTRL过短 当为Client模式时,参数Check_conn_cycle=TRUE下Check_conn_cycle设置需要>1s;
当为Server模式时,Check_conn_cycle设置需要>1s;
A023 数据区参数data_type_2和data_type_3设置重叠 数据区不能有重叠的modbus地址区域
A024 数据区参数data_type_2和data_type_4设置重叠
A025 数据区参数data_type_2和data_type_5设置重叠
A026 数据区参数data_type_2和data_type_6设置重叠
A027 数据区参数data_type_2和data_type_7设置重叠
A028 数据区参数data_type_2和data_type_8设置重叠
A034 数据区参数data_type_3和data_type_4设置重叠
A035 数据区参数data_type_3和data_type_5设置重叠
A036 数据区参数data_type_3和data_type_6设置重叠
A037 数据区参数data_type_3和data_type_7设置重叠
A038 数据区参数data_type_3和data_type_8设置重叠
A045 数据区参数data_type_4和data_type_5设置重叠
A046 数据区参数data_type_4和data_type_6设置重叠
A047 数据区参数data_type_4和data_type_7设置重叠
A048 数据区参数data_type_4和data_type_8设置重叠
A056 数据区参数data_type_5和data_type_6设置重叠
A057 数据区参数data_type_5和data_type_7设置重叠
A058 数据区参数data_type_5和data_type_8设置重叠
A067 数据区参数data_type_6和data_type_7设置重叠
A068 数据区参数data_type_6和data_type_8设置重叠
A068 数据区参数data_type_7和data_type_8设置重叠
A07A 参数id设置无效:范围1-64 修改参数id
A07C 参数data_type_1设置无效:范围0-4 修改参数data_type_x
A07D 参数data_type_1未定义,data_type_1为缺省的使用数据区,需要定义 修改参数data_type_1
A07E 参数db_x值与背景DB中的值不一致 修改参数db_x
A080 在OB1和OB100调用FB MODBUS功能块时使用了不同的背景DB 需要使用相同的背景DB
A081 CP为Client且使用FC05功能码时:
接收的线圈状态与发送不一致
通过抓包工具来分析和修正通讯伙伴的报文
A082 CP为Client且使用FC06功能码时:
接收的寄存器值与发送不一致
通过抓包工具来分析和修正通讯伙伴的报文
A083 仅在CP为Client时:在上一个请求还没有处理完成时又发送新的请求 等待DONE =TRUE 或 ERROR = TRUE后再发送新请求
A085 在授权期间由于无效的写权限导致发生错误 对于授权DB,确认参数REG_KEY的结构是否正确
A090 功能块未授权,此为一状态信息,参数ERROR并不会置1,功能块在未授权情况仍然可以运行而不影响通讯 针对CPU读出预授权解码,之后按照授权操作向IT4industry.部门索取授权码
A091 收到异常响应码1(仅在Client模式),连接将终止和重新建立 通讯伙伴不支持请求的报文
A092 收到异常响应码2(仅在Client模式),无效的或不存在的地址请求 确认参数LENGTH 或START_ADDRESS
是否正确
A093 收到异常响应码3(仅在Client模式) 通讯伙伴无法执行报文接收(例如请求长度不支持等)
A094 收到异常响应码4(仅在Client模式) 通讯伙伴无法执行报文接收
A095 收到未知的异常响应码(仅在Client模式) 通过抓包工具来分析和修正通讯伙伴的报文
FC/SFC故障
7xxx 请参考SIMATIC的在线帮助 通过在线帮助SIMATIC manager -> mark block -> key F1 –> Ethernet -> see also -> code evaluation可以查到相关帮助信息
8xxx 请参考SIMATIC的在线帮助 通过在线帮助SIMATIC manager -> mark block -> key F1 –> Ethernet -> see also -> code evaluation可以查到相关帮助信息
SFC24故障
80A1 DB=0或超出了CPU允许的范围 选择有效的DB
80B2 DB块在CPU中不存在 DB_x参数中的DB块必须创建并下载到CPU中
80B3 DB块被创建为“Unlinked”类型 DB块不能创建为“Unlinked”类型

 

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分