西门子PLC通讯字节序实战:大端小端问题诊断与博途处理方案
1. 项目概述通讯报文字节序的“隐形战场”在工业自动化领域尤其是西门子PLC的通讯编程中有一个看似基础却极易引发“隐形”故障的细节——通讯报文中的大端格式Big-Endian和小端格式Little-Endian。这个问题我敢说是每一位从设备调试转向系统集成、从单一PLC编程转向多品牌设备通讯的工程师都必须跨过的一道坎。它不像逻辑错误那样会在仿真中立即报错也不像硬件接线错误那样肉眼可见。它更像一个潜伏者在你进行数据交换特别是涉及多字节数据类型如整数、浮点数时悄然出现导致你从HMI上读到的温度值是个天文数字或者控制变频器的频率指令完全失控。最近在项目上就因为一个第三方仪表采用了大端格式而我们的西门子S7-1200默认使用小端格式差点让整个生产线调试延期。今天我就结合这个踩坑经历把大端小端这件事掰开揉碎了讲清楚让你不仅知道它是什么更知道在西门子博途TIA Portal环境下如何精准地识别、处理和规避由此引发的所有问题。简单来说字节序定义了多字节数据在内存或通讯报文中的存储顺序。想象一下你要传输一个16位的整数0x1234十六进制。大端格式认为最重要的字节高位字节0x12应该放在前面低内存地址所以传输或存储的顺序是0x12,0x34。而小端格式则认为最不重要的字节低位字节0x34应该放在前面所以顺序是0x34,0x12。对于西门子PLC而言其内部存储和绝大多数通讯协议如S7协议、PROFINET IO都采用小端格式。但当你需要与采用大端格式的设备如某些Modbus RTU设备、特定品牌的仪表、或遵循某些行业标准的上位机系统通讯时如果不进行转换直接交换的多字节数据就会完全错位。2. 核心原理深度拆解为什么字节序如此关键要彻底理解字节序的影响不能停留在概念上必须深入到数据在存储介质中的实际布局和通讯帧的比特流层面。这对于后续的故障诊断和程序编写至关重要。2.1 从内存布局看字节序的本质计算机和PLC的内存是以字节为单位进行寻址的。对于一个超过8位1字节的数据类型比如一个16位的整数INT 占2字节或32位的浮点数Real 占4字节系统必须决定如何将这几个字节排列在连续的内存地址中。以一个32位十六进制数0x44332211为例它表示一个浮点数或一个双字DWord。我们可以将其拆分为4个字节Byte30x44,Byte20x33,Byte10x22,Byte00x11。这里约定Byte3是最高有效字节MSBByte0是最低有效字节LSB。大端格式 (Big-Endian) 内存地址增长方向与数据的重要性方向一致。从低地址到高地址依次存放最高位字节到最低位字节。地址N:0x44(Byte3)地址N1:0x33(Byte2)地址N2:0x22(Byte1)地址N3:0x11(Byte0)记忆口诀“大端存大位”即把“大端”数据的高位存在“前面”低地址。小端格式 (Little-Endian) 内存地址增长方向与数据的重要性方向相反。从低地址到高地址依次存放最低位字节到最高位字节。地址N:0x11(Byte0)地址N1:0x22(Byte1)地址N2:0x33(Byte2)地址N3:0x44(Byte3)记忆口诀“小端存小位”即把“小端”数据的低位存在“前面”低地址。西门子PLC的默认规则 在其数据块DB、存储器M、I、Q以及基于S7协议的通讯中均采用小端格式。这意味着当你用MOVE指令将一个DINT双整数值16#12345678传送到MD100时在监控表中以字节查看MB100到MB103你看到的顺序将是78 56 34 12。2.2 通讯报文中的字节序协议与设备的博弈当数据离开PLC的本地内存通过网线、DP电缆或485总线进行传输时它就变成了一个字节流报文。字节序问题在这里变得更加复杂因为它涉及三个层面发送端设备的内部表示 发送设备如PLC A按照自己的字节序规则将数据从内存打包成报文。通讯协议的规定 所使用的通讯协议如Modbus TCP、PROFIBUS DP、自由口通讯可能对报文内多字节数据的字节序有明确定义。例如Modbus协议规定对于“保持寄存器”中的16位数据采用大端格式。接收端设备的内部表示 接收设备如PLC B或仪表按照自己的字节序规则解析接收到的报文字节流。问题最常出现在协议规定与设备默认格式不一致或者通讯双方默认格式不同且协议未强制规定的场景。场景一西门子PLC与标准Modbus TCP设备通讯西门子PLC内部小端格式。Modbus TCP协议对于寄存器值16位规定为大端格式。因此西门子的Modbus TCP通讯功能块如MB_CLIENT/MB_SERVER在发送和接收时会自动完成16位数据的高低字节交换以符合Modbus协议。但请注意对于32位数据如浮点数Modbus协议本身没有明确规定其字节序这通常由设备厂商自定义此时就需要手动处理。场景二西门子PLC通过自由口USS/Modbus RTU与第三方仪表通讯这是字节序问题的“重灾区”。自由口通讯只是规定了物理层和帧结构数据区的字节序完全由通讯双方约定。如果仪表厂商的说明书写明“数据为大端格式”而你在PLC端用MOVE指令直接发送一个INT那么仪表收到的将是高低字节颠倒的值。例如PLC要发送十进制值500十六进制0x01F4。PLC内存中为F4 01小端。如果不做处理直接发送仪表按大端解析收到的F4 01会认为是0xF401 62465完全错误。注意 字节序交换只针对多字节的基本数据类型如INT、DINT、REAL、WORD、DWORD。对于字符串CHAR数组和字节数组BYTE数组其每个元素本身就是一个字节不存在字节内位的顺序问题因此无需交换。交换的是字节之间的顺序而不是比特位bit的顺序。3. 西门子博途中的实战处理方案理解了原理关键在于如何操作。在TIA Portal中我们主要有以下几种武器来应对字节序问题。3.1 使用系统库函数进行字节交换这是最直接和常用的方法。西门子提供了专门的转换函数位于“指令”“基本指令”“移动操作”下或者通过“指令”任务卡搜索。SWAP指令 用于交换16位数据WORD, INT的高低字节。应用场景 处理16位的整数或状态字。示例 你需要将一个来自大端仪表的16位温度值Temp_Raw假设已接收到DB1.DBW0转换为PLC可识别的值。// 假设接收缓冲区 DB1.DBB0, DB1.DBB1 中存储了仪表发来的大端数据 0x01 0xF4 (代表500) #Temp_Raw : DB1.DBW0; // 此时 #Temp_Raw 的字节序是 0x01, 0xF4 (大端视图) #Temp_Corrected : SWAP(#Temp_Raw); // SWAP 交换高低字节得到 0xF4, 0x01 (小端视图) // 现在 #Temp_Corrected 在PLC中代表的数值就是 500 了。Block转换与自定义函数对于32位数据DINT, REAL, DWORD没有现成的单条指令。通常有两种做法使用MOVE指令进行字节级别的重组 创建一个临时字节数组手动调整顺序。这种方法直接但代码稍显繁琐。VAR Real_From_Device : REAL; // 假设这是按大端字节序解析得到的错误值 Byte_Array : ARRAY[0..3] OF BYTE; // 4字节数组 Real_Correct : REAL; // 转换后的正确值 END_VAR // 将错误的REAL值按字节解释到数组中此时数组内是大端顺序 POKE_BLK(areaSrc:16#84, dbNumber:0, byteOffset:ADR(Real_From_Device), areaDest:16#84, byteOffsetDest:ADR(Byte_Array), count:4); // 手动交换字节顺序索引0和3交换1和2交换针对32位数据 #Temp_Byte : Byte_Array[0]; Byte_Array[0] : Byte_Array[3]; Byte_Array[3] : #Temp_Byte; #Temp_Byte : Byte_Array[1]; Byte_Array[1] : Byte_Array[2]; Byte_Array[2] : #Temp_Byte; // 将重组后的字节数组解释为REAL POKE_BLK(areaSrc:16#84, dbNumber:0, byteOffset:ADR(Byte_Array), areaDest:16#84, byteOffsetDest:ADR(Real_Correct), count:4);创建自定义函数块FB或函数FC 将上述逻辑封装成一个可重用的块例如FC_SwapDWord或FC_BigEndianToReal。这是工程化的做法强烈推荐在频繁需要转换的项目中使用。你可以在FC内部使用UNION数据结构如果PLC支持如S7-1500的SCL让一个DWORD和一个ARRAY[1..4] OF BYTE共享同一内存从而优雅地进行字节交换。3.2 在数据块中定义与设备匹配的结构对于复杂的、结构化的数据交换例如一次读取包含多个不同类型参数的报文另一种更清晰的方法是直接在数据块中定义与设备报文完全一致的结构。创建发送/接收数据块 例如DB_Comm_To_Device和DB_Comm_From_Device。按照设备报文的字节序定义变量 如果设备报文是大端的那么你在DB中定义多字节变量时就要预见到PLC会以小端方式解释它。实际上更常用的技巧是全部定义为字节BYTE或字节数组ARRAY OF BYTE。使用AT覆盖功能 这是西门子数据块的一个强大功能。你可以先定义一个字节数组Buffer : ARRAY[0..19] OF BYTE;用来存储原始报文。然后在同一数据块中使用AT关键字定义与报文结构对应的变量覆盖到Buffer的特定位置。DATA_BLOCK DB_DeviceData VAR // 原始报文缓冲区20字节 RawBuffer : ARRAY[0..19] OF BYTE; // 使用 AT 覆盖进行结构化解析 Header : WORD AT RawBuffer[0..1]; // 假设报头是16位大端 Temperature : INT AT RawBuffer[2..3]; // 温度值16位大端 Pressure : REAL AT RawBuffer[4..7]; // 压力值32位浮点大端 Status : BYTE AT RawBuffer[8]; // 状态单字节无字节序问题 // ... 其他字段 END_VAR关键点 当你从设备收到数据并填入RawBuffer后直接访问Temperature或Pressure得到的值仍然是错误的因为PLC用小端方式去解释了一段大端格式的字节。AT覆盖只是提供了便捷的访问方式并没有进行字节序转换。你仍然需要在访问这些字段后调用前面提到的SWAP或自定义转换函数来处理Temperature和Pressure。3.3 通讯功能块的参数配置对于集成的高级通讯功能字节序处理有时可以在功能块参数中配置。PROFINET IO 与智能设备 当组态第三方设备作为智能设备I-Device或使用标准GSD文件时在设备视图的“设备概览”或模块属性中有时会有“数据一致性”或“字节序”的选项。务必根据设备手册选择正确的设置。Modbus TCP 如前所述标准Modbus TCP功能块自动处理16位寄存器的字节序。但对于32位数据功能码03/04读取的连续两个寄存器你需要清楚设备厂商是如何将32位数拆分成两个16位寄存器的以及每个寄存器内部是否也遵循大端。常见的组合方式有ABCD(大端大端)、CDAB(小端大端即Modbus标准32位浮点格式)、BADC等。TIA Portal的Modbus功能块可能提供“交换字节”或“交换字”的选项来处理部分情况。S7通信PUT/GET 西门子PLC之间的S7通信由于两端都是小端格式通常无需担心此问题。4. 诊断与调试如何锁定字节序问题当通讯数据看起来“乱七八糟”时如何快速判断是不是字节序在作祟以下是我的实战排查流程。4.1 现象识别字节序错误通常表现为数据值异常巨大或异常小 例如一个温度值读回来是几万度或负的几万度。数据变化规律诡异 当实际物理量线性变化时读取值呈现非线性的、跳跃式的变化。例如压力从0.1MPa到0.2MPa读数可能从某个很大值跳到一个很小值。符号位错误 正数变成了负数或反之。浮点数显示为NaN非数 因为错误的字节序列可能构成一个无效的浮点数表示。4.2 使用博途中的在线监控工具切换到十六进制显示 在监控表中不要只看十进制值。将怀疑有问题的变量INT, DINT, REAL, WORD, DWORD的显示格式改为“十六进制”。对比发送值和接收值的十六进制表示。监控字节内存 对于接收到的数据不要只监控结构体中的整型或浮点型变量。直接监控你定义的原始字节缓冲区ARRAY OF BYTE。记录下设备实际发送的每一个字节。操作 在线后打开数据块找到你的接收缓冲区数组记录下每个字节的十六进制值。人工计算验证假设你从缓冲区读到4个字节B00x41,B10x48,B20x00,B30x00。设备手册说这是一个大端格式的浮点数REAL。步骤1按设备声明解释。将字节序视为B0 B1 B2 B3 组成十六进制数0x41480000。使用一个在线十六进制转浮点数工具或者你知道IEEE 754格式可以手动计算得出这个值大约为12.5。步骤2按PLC默认解释。PLC会将其当作小端格式即B3 B2 B1 B00x00004841 这个值作为浮点数是一个非常接近于0的小数或者是一个非规格化数。对比你在HMI上看到的值。如果HMI显示的值接近0而实际物理量应该是12.5左右那么几乎可以断定是小端/大端混淆。4.3 创建测试报文进行验证在怀疑字节序问题时最确凿的验证方法是进行一个可控的测试。让设备发送一个已知值 如果可能配置设备输出一个固定的、简单的值。例如让一个温度变送器输出25.0°C对应的浮点十六进制表示可能是0x41C80000大端。在PLC端捕获原始字节 记录下接收缓冲区中的4个字节。反向测试如果可能 让PLC发送一个已知值给设备查看设备侧显示是否正确。例如PLC发送浮点数100.0(0x42C80000小端格式在内存中为00 00 C8 42)。如果设备期望大端它收到的字节流将是00 00 C8 42 它会将其解释为0x0000C842这是一个完全不同的、很小的数。通过这一正一反的测试字节序问题将无处遁形。5. 不同通讯场景下的字节序处理策略不同的通讯协议和伙伴设备需要不同的处理策略。这里总结几个典型场景。5.1 与遵循国标/行业标准的设备通讯某些行业如电力、环保的通讯规约如Modbus、101/104规约、HJ 212等会明确规定数据项的字节序。你必须严格按照规约文档实施。策略 仔细阅读设备通讯协议文档的“数据格式”章节。文档中通常会明确写出“数据传送顺序为高字节在前低字节在后”即大端或给出类似“字/双字传输顺序”的说明。根据文档规定在PLC端实现对应的字节交换逻辑。不要想当然。5.2 西门子PLC与第三方PLC/控制器通讯当与三菱、欧姆龙、罗克韦尔等品牌的PLC通讯时情况多变。策略首选标准协议 如果双方都支持Modbus TCP则使用Modbus TCP并利用其16位寄存器自动交换的特性。对于32位数据需根据对方PLC的Modbus实现方式来确定交换规则。使用OPC UA OPC UA作为现代工业通讯标准其数据模型屏蔽了底层字节序差异是解决异构系统互连的理想选择但需要双方支持。Socket通信TCP/UDP 这是最灵活也最需要小心的地方。双方必须预先共同定义好应用层协议的每一个字段的字节序。通常的做法是约定全部使用网络字节序即大端格式因为许多网络协议如TCP/IP头部都使用大端。这样西门子PLC作为一端需要在发送前将数据转为大端接收后将数据从大端转回小端。5.3 通过网关或转换器的通讯很多项目会使用通讯网关如Profibus转Modbus、以太网串口服务器来连接不同网络的设备。策略明确网关的转换规则 网关可能本身具备字节序转换功能。你需要登录网关的配置页面仔细查看其数据映射配置项。是否有“字节交换”、“字交换”、“16位反转”、“32位反转”等选项。分阶段排查 如果数据不对首先确认PLC到网关的数据是否正确监控网关的输入数据寄存器再确认网关转换后的数据是否正确监控网关的输出或直接连接到目标设备测试最后确认目标设备接收到的数据。锁定问题发生在哪个环节。6. 避坑指南与最佳实践基于大量的项目教训我总结出以下几条黄金法则能帮你节省大量调试时间。文档先行协议为王 在动手编程前务必拿到并通读第三方设备的《通讯协议手册》或《数据地址表》。找到关于“数据格式”、“传输顺序”的描述并用笔圈出来。统一规划数据交换区 在PLC中为每一个需要处理字节序的外部设备创建独立的数据块DB用于收发数据。在数据块内清晰地区分“原始字节缓冲区”和“解析后并转换完成的数据区”。做好注释注明每个字段的来源设备和字节序要求。封装转换函数统一调用 不要在每个通讯处理程序里都写一遍字节交换的POKE/MOVE代码。为你的项目创建标准的转换函数库例如FC_BigEndian_TO_LittleEndian_INTFC_LittleEndian_TO_BigEndian_REALFC_SwapWords_In_DWord用于处理Modbus中两种16位寄存器组合成32位数据的情况 这样不仅代码整洁也减少了出错概率。在线调试时十六进制是你的朋友 当数据异常时第一时间将监控表切换到十六进制显示。对比发送和接收的原始十六进制序列比盯着错误的十进制值苦思冥想要高效得多。进行边界值测试 不要只测试正常范围的数据。测试一下0(0x0000)、-1(0xFFFF)、32767(0x7FFF)、-32768(0x8000) 等边界值。这些值的字节序转换特征明显更容易发现问题。对于浮点数可以测试0.0,1.0,-1.0。利用交叉对比工具 在电脑上准备一个简单的串口调试助手或网络调试助手以及一个十六进制与数值转换的计算器。当PLC侧调试困难时可以用电脑模拟PLC或设备发送固定的测试报文快速验证你的字节序判断和转换逻辑是否正确。处理字节序问题本质上是在处理不同系统之间的“方言”差异。它考验的不是高深的算法而是工程师的细心、严谨和对数据本质的理解。把这个基础打牢你在面对更复杂的异构系统集成时才会更有底气。

相关新闻

仿真(2):联合仿真,汇编与编译

仿真(2):联合仿真,汇编与编译

Q:我去看了一个modelsim的仿真教程,一共两个小时左右,他参考的材料是图片上这本,然后我发现其实models IM的仿真没有我想的难,他大多数都是把文件载入进去编译一下,然后点击开始可能要设定一下时间添加波形…

2026/7/31 3:01:28 阅读更多 →
C++空间配置器深度解析:从内存管理原理到高性能内存池实战

C++空间配置器深度解析:从内存管理原理到高性能内存池实战

1. 项目概述:从“航海王”到内存海洋的舵手看到这个标题,估计不少C老水手会心一笑。把C学习比作一场追寻“One Piece”的伟大航路,而空间配置器(Allocator)就是那艘船最核心的龙骨与动力舱。它不直接处理业务逻辑&…

2026/7/31 3:01:28 阅读更多 →
STM32 SPI双机通信实战:从机模式配置与稳定性优化

STM32 SPI双机通信实战:从机模式配置与稳定性优化

1. 项目概述:从“单口相声”到“双向对话”在嵌入式开发里,SPI(Serial Peripheral Interface)总线大家肯定不陌生,它速度快、全双工,是连接Flash、屏幕、传感器这些外设的“老熟人”。但大多数时候&#xf…

2026/7/31 3:01:28 阅读更多 →

最新新闻

25.5万起!行业首款“智能可变大空间SUV”小米澎程N70 Max、N90 Max正式开启预售

25.5万起!行业首款“智能可变大空间SUV”小米澎程N70 Max、N90 Max正式开启预售

7月30日,小米集团在京举办造车以来的第二场技术发布会,重磅发布小米汽车全新技术平台:小米昆仑技术架构。这是小米继摩德纳纯电平台后推出的第二套技术架构,包含小米昆仑平台、小米昆仑超级增程和小米昆仑全域安全三大核心技术。小…

2026/7/31 3:33:41 阅读更多 →
坦克与怪物镜像战斗动画制作全流程技术解析

坦克与怪物镜像战斗动画制作全流程技术解析

这次我们来看一个有趣的动画项目——"坦克动画:怪物的镜像!再所混战"。这个项目从标题就能感受到强烈的战斗氛围,涉及坦克、怪物、镜像等元素,应该是一个充满视觉冲击力的动画作品。从项目标题分析,这可能是…

2026/7/31 3:33:41 阅读更多 →
Spring Boot民宿系统开发实战与架构设计

Spring Boot民宿系统开发实战与架构设计

1. 项目背景与核心价值 民宿租赁系统作为共享经济时代的典型产物,正在经历从传统手工管理向数字化运营的转型。这个基于Spring Boot的毕业设计项目,实际上模拟了真实商业环境中中小型民宿企业的完整技术栈选型和开发流程。选择这个课题的学生&#xff0c…

2026/7/31 3:33:41 阅读更多 →
AI写作工具如何提升自考论文效率:千笔AI实战指南

AI写作工具如何提升自考论文效率:千笔AI实战指南

1. 项目背景与核心价值作为一名经历过自考论文煎熬的过来人,我深知从零开始撰写学术论文的痛苦。查资料、搭框架、凑字数、改格式...每个环节都能让人崩溃。直到去年接触到AI写作工具,才发现原来论文写作可以如此高效。今天要分享的"千笔AI写作&quo…

2026/7/31 3:33:41 阅读更多 →
伺服与步进电机选型核心参数计算与工程实践指南

伺服与步进电机选型核心参数计算与工程实践指南

电机选型参数干货指南在自动化设备开发过程中,电机选型是决定整个系统性能的关键环节。很多工程师在选型时容易陷入参数对比的困境,或者因为忽略某些关键指标导致设备运行不稳定。本文将从实际工程角度出发,系统梳理伺服电机和步进电机的选型…

2026/7/31 3:33:41 阅读更多 →
GD32开发环境搭建:基于Eclipse与GNU工具链的完整指南

GD32开发环境搭建:基于Eclipse与GNU工具链的完整指南

1. 项目概述:为什么选择GD32与Eclipse的组合?最近几年,国产MCU的势头越来越猛,其中兆易创新的GD32系列凭借其出色的性价比和与STM32的高度兼容性,成为了很多工程师和电子爱好者的新宠。无论是做产品原型、参加竞赛&…

2026/7/31 3:32:41 阅读更多 →

日新闻

物理复制比逻辑复制好在哪?数据库复制原理详解

物理复制比逻辑复制好在哪?数据库复制原理详解

数据库复制是把主库数据同步到备库的机制,分为逻辑复制和物理复制两种。逻辑复制传输的是 SQL 语句或行变更事件,物理复制传输的是存储引擎底层的物理日志。阿里云 PolarDB(云原生数据库)采用物理复制,在同步延迟、数据…

2026/7/31 0:00:34 阅读更多 →
BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bilib…

2026/7/31 0:00:34 阅读更多 →
有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

当前,游戏行业的“DataAI融合”已从概念验证进入价值落地阶段。根据IDC 2025年数据,中国AI游戏云市场规模已达18.6亿元;同时,游戏研发环节AI渗透率高达86%,生成式AI内容普及率超过50%。面对庞大的市场,游戏…

2026/7/31 0:00:34 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/31 1:03:03 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/29 15:00:03 阅读更多 →

月新闻