GSDML 属性数值格式最终规范(十六进制 vs 十进制)
落档: 2026-08-13 · 审计范围:
Darra_Profinet_Slave全仓只读审计 用途: 钉死 GSDML(ISO 15745 / GSDML V2.3x-2.4 设备描述)各属性必须 0x 十六进制 / 必须十进制 / 两者皆可的最终裁决,供 GSDML 生成器(GsdmlWriter)、校验器(ValidationService)、核心解析器(pnet_gsdml.c)与测试样例对齐口径。 本规范只落档与指出违规点,不修改任何代码(修复由其他 agent 按第 8 节清单执行)。
0. 结论速览
| 类别 | 属性 | 格式裁决 |
|---|---|---|
| 必须 0x 十六进制 | VendorID、DeviceID | 0x + 1~4 位 hex |
ModuleIdentNumber | 0x + 固定 8 位 hex | |
SubmoduleIdentNumber | 0x + 1~8 位 hex | |
| 十进制或 0x 均可(XSD 双 pattern,两种都被 TIA 接受) | SubslotNumber、FixedInSlots、FixedInSubslots、AllowedInSlots、UsedAsPlugInSlots、记录数据 Value、诊断 DefaultValue | 项目统一口径 = 十进制(对齐西门子 TIA 官方导出);0x 形式同为规范合法,不得判为错误 |
| 必须十进制 | SlotNumber(旧版 GSDML 属性 / 运行配置轨)、PhysicalSlots、ObjectUUID_LocalIndex、MinDeviceInterval、SendClock、ReductionRatio、NumberOfAR、MaxInputLength / MaxOutputLength / MaxDataLength、DataItem Length、MAUTypes / MAUTypeItem Value、MaxSupportedRecordSize、ResetToFactoryModes、Writeable_IM_Records | 纯十进制数字(部分支持 n..m 区间写法,如 PhysicalSlots="0..1") |
| 自由文本(非数字) | OrderNumber(OrderID)、HardwareRelease、SoftwareRelease、InfoText 等 | 任意字符串,不套用任何进制规则 |
1. 规范依据与取证(仓库内材料)
仓库内没有 GSDML 官方 .xsd(全仓 *.xsd 仅 docs/node_modules 的 sitemap schema,与 GSDML 无关)。最终裁决依据为两重:
- GSDML 规范 v2.3x 权威知识(PI 官方
GSDML-DeviceProfile-V2.32/V2.33/V2.34.xsd的 simpleType pattern + GSDML Specification 文本)。 - 仓库内真实样例互证(以下文件均为只读取证):
| 材料 | 路径 | 性质 |
|---|---|---|
| 西门子 TIA 官方导出样例(GSDML V2.34) | 其他参考\GSDML-V2.34-#Siemens-PLC200smart_CPU SR20-20260811-045916.xml | 最权威实测证据:真实 TIA 导出、真实通过 XSD 校验 |
| 产品实际输出(audit 后快照) | _Stage\_trash\gsdml-output-after-audit-20260811.xml | Darra 产品当前真实 GSDML 输出 |
| GSDML 生成器 | Darra_Pnet_GUI\Services\GsdmlWriter.cs | 输出格式的唯一权威实现 |
| GSDML 校验器 | Darra_Pnet_GUI\Services\ValidationService.cs | 导出/预览前语义校验 |
| 核心 GSDML 解析器 | Darra_Pnet_Core\main\core\pnet_gsdml.c(+ .h) | 只解析 0x 语义的标识号 |
| 核心测试样例 | Darra_Pnet_Core\tests\test_pnet_gsdml.c | 与生成器输出对齐的样例 |
| TEST_Config 期望输出 | 测试项目\TEST_Config\样例\gsdml_sample.xml + _三端闭环.cs | 期望 ModuleIdentNumber/SubmoduleIdentNumber 以 0x 开头 |
| 运行配置轨样例 | 样例\basic-slave\SlaveConfig.cs | PNETConfig 轨(非 GSDML 轨)的 hex/十进制口径 |
| 站点文档 | docs\docs\guide\quickstart.md、docs\docs\guide\concepts.md | 对外口径 |
西门子官方样例的关键取证(逐行)
其他参考\GSDML-V2.34-#Siemens-PLC200smart_CPU SR20-20260811-045916.xml:
- 第 16 行:
VendorID="0x002A" DeviceID="0x0119"→ hex - 第 25 行:
ModuleIdentNumber="0x80000201"(8 位)、PhysicalSlots="1"(十进制)、FixedInSlots="1"(十进制)、ObjectUUID_LocalIndex="100"(十进制)、MinDeviceInterval="128"(十进制)、MaxSupportedRecordSize="4068"(十进制)、ResetToFactoryModes="2"(十进制) - 第 34-35 行:
SubslotNumber="32768"/"32769"→ 十进制(接口 0x8000 / 端口 0x8001 的十进制写法) - 第 37 行:
MaxInputLength="10" MaxOutputLength="15" MaxDataLength="25"→ 十进制 - 第 39/46/57 行:
SubmoduleIdentNumber="0x00000001" / "0x1000000A" / "0x20000005"→ hex;FixedInSubslots="1" / "1000" / "1001"→ 十进制 - 第 70/75 行: 接口
SubmoduleIdentNumber="0xf00"(3 位 hex 合法)、端口"0xf01";SubslotNumber="32768" / "32769"十进制;MAUTypes="16"十进制 - 第 77 行:
MAUTypeItem Value="16"十进制(16 = 100BASE-TX 全双工) - 第 96 行: 诊断
DefaultValue="1"十进制 - 第 29 行:
OrderNumber Value="6ES7 288-1SR20-0AA0"→ 自由文本(含字母数字空格,非任何进制数)
2. 权威清单表 A — 必须 0x 十六进制(十进制 = schema 非法,TIA 拒导)
XSD 类型 pattern 只接受 0x 前缀;十进制写法 schema-invalid。仓库核心解析器同样硬拒(无 0x 前缀直接解析失败)。
| 属性 | 位数 | 所在元素 | 依据 |
|---|---|---|---|
VendorID | 0x + 1~4 位 hex(惯例 4 位,如 0x002A) | DeviceIdentity | 西门子样例 L16;XSD VendorID pattern 0x[0-9A-Fa-f]{1,4};pnet_gsdml.c:436 gsdml_parse_hex16 无 0x 即 false |
DeviceID | 0x + 1~4 位 hex(惯例 4 位) | DeviceIdentity | 西门子样例 L16;XSD DeviceID pattern 同上;核心 gsdml_parse_hex16 |
ModuleIdentNumber | 0x + 固定 8 位 hex | DeviceAccessPointItem(DAP)、ModuleItem | 西门子样例 L25 0x80000201;XSD pattern 0x[0-9A-Fa-f]{8};核心 gsdml_parse_hex32 |
SubmoduleIdentNumber | 0x + 1~8 位 hex | VirtualSubmoduleItem、InterfaceSubmoduleItem、PortSubmoduleItem | 西门子样例 L39 0x00000001 / L70 0xf00(3 位合法);XSD pattern 0x[0-9A-Fa-f]{1,8};核心 gsdml_parse_hex32 |
生成器现状(GsdmlWriter.cs): Hex16(0x{value:X4})/ Hex32(0x{value:X8})——全部符合本表,无违规。
3. 权威清单表 B — 十进制或 0x 十六进制均合法(项目统一口径 = 十进制)
GSDML XSD 对这组属性定义的是双 pattern((0x[0-9A-Fa-f]{1,4})|([0-9]{1,5}) 一类),GSDML 规范文本明示"该值可用十进制或十六进制(0x 前缀)书写"。两种写法都能通过 XSD、都能被 TIA 导入:
- 西门子 TIA 官方导出 → 用十进制(
SubslotNumber="32768"、FixedInSubslots="1")。 - 大量第三方厂商 GSDML → 用 0x(
SubslotNumber="0x8000"、FixedInSubslots="0x1")。
项目最终口径:统一十进制(与西门子官方导出、核心测试样例、audit 后输出一致)。生成器、测试、校验器不得把 0x 形式判为错误,也不得把十进制判为错误。
| 属性 | 所在元素 | 项目口径 | 依据 |
|---|---|---|---|
SubslotNumber | SubslotItem、InterfaceSubmoduleItem、PortSubmoduleItem | 十进制(接口 32768 / 端口 32769) | 西门子样例 L34/70/75;GsdmlWriter L423/461/478;test_pnet_gsdml.c L83/85 |
FixedInSlots | DeviceAccessPointItem | 十进制 | 西门子样例 L25 "1";GsdmlWriter L403 "0" |
FixedInSubslots | VirtualSubmoduleItem | 十进制 | 西门子样例 L39 "1" / L46 "1000";GsdmlWriter L517 |
AllowedInSlots | ModuleItemRef(UseableModules) | 十进制 | GsdmlWriter L390;test_pnet_gsdml.c L74 "1" |
UsedAsPlugInSlots | ModuleItemRef | 十进制(当前生成器未输出该属性) | 与 AllowedInSlots 同类型 |
记录数据 Value(ParameterRecordDataItem / Const / Ref) | 记录定义 | 十进制或 0x 均可(规范明示);当前生成器未输出记录 | GSDML spec 记录章节"decimal or hexadecimal" |
诊断报警 Value / DefaultValue(UnitDiagTypeItem、ChannelDiagItem 等) | 诊断定义 | 十进制或 0x 均可;西门子官方用十进制 | 西门子样例 L96 DefaultValue="1";当前生成器未输出 UnitDiag 列表 |
注:用户裁定中的"诊断报警 Value 必须 0x"在本规范裁决下不成立——XSD 双 pattern,西门子官方导出用十进制。诊断 Value 的两种写法均合法;若未来生成器补 UnitDiagTypeList,建议沿用十进制口径。
4. 权威清单表 C — 必须十进制(0x 形式 = 非法)
XSD 中为 unsigned 类型或 decimal-only pattern / 规范明示十进制;0x 前缀在这些属性上会导致 schema-invalid。
| 属性 | 所在元素 | 依据 |
|---|---|---|
PhysicalSlots | DeviceAccessPointItem | 西门子样例 L25 "1";支持区间写法 "0..N"(GsdmlWriter L398、audit 输出 L25 "0..1") |
SlotNumber | GSDML V2.3x 设备描述中不存在此属性(模块槽位 = ModuleList 顺序 + UseableModules 的 AllowedInSlots/FixedInSlots 表达)。旧版 GSDML(V1.0/V2.0)与 TIA 内部表示、以及本仓运行配置轨(<Module Slot="N"> / <Slot>N</Slot>)中槽位一律十进制 | 测试项目\TEST_Config\样例\gsdml_sample.xml L23/27 <Slot>1</Slot>;样例\basic-slave\SlaveConfig.cs L209 Slot 属性十进制;核心 pf_types.h L2749 SlotNumber 为 16 位无符号字段 |
ObjectUUID_LocalIndex | DeviceAccessPointItem | 西门子样例 L25 "100" |
MinDeviceInterval / SendClock | DeviceAccessPointItem / TimingProperties | 西门子样例 L25 "128" / L72 "32";31.25µs 时基十进制,1 ms = 32,上限 16384(512 ms) |
ReductionRatio | TimingProperties | 西门子样例 L72 "1 2 4 8 16 32 64 128 256 512" 十进制列表 |
NumberOfAR | ApplicationRelations | 西门子样例 L71 "1" |
MaxInputLength / MaxOutputLength / MaxDataLength | IOConfigData | 西门子样例 L37 "10" / "15" / "25" |
DataItem Length | IOData/DataItem | 西门子样例 L49 Length="10" |
MAUTypes / MAUTypeItem Value | PortSubmoduleItem / MAUTypeItem | 西门子样例 L75/77 "16"(100BASE-TX 全双工),十进制 |
MaxSupportedRecordSize | DeviceAccessPointItem | 西门子样例 L25 "4068" |
ResetToFactoryModes | DeviceAccessPointItem | 西门子样例 L25 "2" |
Writeable_IM_Records | VirtualSubmoduleItem | 西门子样例 L39 "1 2 3" 十进制列表 |
5. 自由文本属性(非数字,不套用进制规则)
| 属性 | 说明 | 依据 |
|---|---|---|
OrderNumber(OrderID)Value | 订货号自由文本,可含字母/数字/空格 | 西门子样例 L29 "6ES7 288-1SR20-0AA0" |
HardwareRelease / SoftwareRelease Value | 版本文本 | 西门子样例 L30 "V02.05.01" |
所有 TextId / Value(ExternalTextList) | 多语言文本 | 全样例 |
ProfileRevision / ISO15745Part / ISO15745Edition | 头部固定文本("1.00" / "4" / "1") | 西门子样例 L5/10/11 |
用户初稿把
OrderID归入"必须十进制"——裁决修正:它是自由文本字符串,不是数字。
6. XSD 类型依据(最终裁决基准)
仓库无 GSDML .xsd 落盘,引用 PI 官方 GSDML-DeviceProfile-V2.32~V2.34.xsd 类型定义(与 GSDML Specification v2.3x 文本一致),并以西门子官方导出样例实测互证:
| XSD simpleType | pattern / 类型 | 对应属性 |
|---|---|---|
VendorID / DeviceID | 0x[0-9A-Fa-f]{1,4} | VendorID / DeviceID(仅 hex) |
ModuleIdentNumber | 0x[0-9A-Fa-f]{8} | ModuleIdentNumber(仅 hex,固定 8 位) |
SubmoduleIdentNumber | 0x[0-9A-Fa-f]{1,8} | SubmoduleIdentNumber(仅 hex,1~8 位) |
SubslotNumber / FixedInSlots / FixedInSubslots / AllowedInSlots / UsedAsPlugInSlots | (0x[0-9A-Fa-f]{1,4})|([0-9]{1,5})(双 pattern) | 表 B 六属性(两种格式都收) |
PhysicalSlots | 十进制数或 n..m 区间 | PhysicalSlots(仅十进制) |
| unsigned / 十进制数值类型 | xs:unsignedByte / 十进制 pattern | 表 C 全部(仅十进制) |
判据一句话: 0x 前缀的合法域 = 4 个标识号属性(VendorID / DeviceID / ModuleIdentNumber / SubmoduleIdentNumber)之外,任何其他属性写 0x 都必须先查表 B(双 pattern)再落笔;槽号类属性(SubslotNumber / FixedIn* / AllowedInSlots / UsedAsPlugInSlots)写十进制永远安全。
7. 已发现违规点清单(供其他 agent 修复,本规范不修代码)
V1(阻断级)校验器把生成器自家输出判为 Error → GUI 导出被阻断
- 位置:
Darra_Pnet_GUI\Services\ValidationService.cs- L713
CheckHexAttribute(element, "FixedInSubslots", 4, issues)(case ModuleItem / VirtualSubmoduleItem) - L733
CheckHexAttribute(element, "SubslotNumber", 4, issues)(case InterfaceSubmoduleItem / PortSubmoduleItem) - L671 文档注释: "SubslotNumber / FixedInSubslots 必须为 0x 前缀 hex (GSDML 语义, 十进制会被 TIA 拒绝)"
- L713
- 事实:
GsdmlWriter.cs输出SubslotNumber="32768"、FixedInSubslots="1"(十进制,与西门子官方样例一致)。校验器把这些判为 Error"不是 0x 前缀十六进制"。 - 后果:
MainForm.cs:1054-1058(导出路径)与XmlPreviewView.cs:231(预览)调用ValidateGsdmlOutput→HasErrors= true →ShowValidationBlocked阻断导出。自家输出永远过不了自家校验。 - 裁决: 十进制与 0x 均为 XSD 合法(表 B),校验器错。修复方向: 删除这两处
CheckHexAttribute,改为"十进制或 0x 双格式 + 值域(≤65535)"校验,或仅检查整数合法性。
V2(注释错误)GsdmlWriter.cs 四处 audit 注释断言错误
- 位置:
Darra_Pnet_GUI\Services\GsdmlWriter.csL402(FixedInSlots)、L460 / L477(SubslotNumber)、L516(FixedInSubslots),注释均写"十六进制会被 GSDML XSD 拒绝"。 - 事实: XSD 双 pattern,0x 形式合法(大量厂商 GSDML 即 0x 形式)。选择十进制本身正确(对齐西门子),但注释理由不成立,须按表 B 改写。
V3(口径缺口)表 B 部分属性校验器零覆盖
AllowedInSlots(GsdmlWriter L390 输出十进制)、FixedInSlots(L403 输出 "0")、UsedAsPlugInSlots、Writeable_IM_Records、诊断DefaultValue/记录Value在ValidationService.cs中无任何格式校验。按表 B/C 补双格式值域校验。
V4(样例不一致)核心测试样例与校验器时基口径矛盾
- 位置:
Darra_Pnet_Core\tests\test_pnet_gsdml.cL66MinDeviceInterval="1"。 - 事实: 31.25µs 时基下 1 < 32(1 ms 下限),
ValidationService.CheckTimeBaseAttribute(L878)会判 Error。建议改"32"对齐时基下限(西门子样例为 128)。 - 同文件 L55
VendorID="0x0000":核心解析器口径可接受,但 GUIValidateVendorId(用户 2026-08-09 裁定)拒绝 0x0000;属测试域口径差异,标注即可,建议与 GUI 口径对齐为0x0001。
V5(文档口径)concepts.md 示意图易误读
- 位置:
docs\docs\guide\concepts.mdL35-37 用Submodule 0x01/Submodule 0x8001示意子模块。 - 事实: GSDML 中槽/子槽号是十进制,仅标识号(SubmoduleIdentNumber)是 0x。建议示意改为
子槽 0x8001仅指标识号语义,或加注"槽号十进制、标识号 0x"。
V6(非违规,登记)SubmoduleIdentNumber 校验器位数不严格
CheckHexAttribute对SubmoduleIdentNumber只做 ≤32 位上限,不强制 1~8 位与 XSD 完全一致;生成器恒输出 8 位,无实际风险,登记备查。
8. 三端口径统一建议(供修复 agent 参考)
| 端 | 现状 | 目标 |
|---|---|---|
生成器 GsdmlWriter.cs | 正确(表 A hex + 表 B 十进制) | 仅改注释(V2) |
校验器 ValidationService.cs | 表 B 误判 hex-only(V1)+ 覆盖缺口(V3) | 删 V1 两处检查、补 V3 覆盖、改注释 |
核心解析器 pnet_gsdml.c | 只解析 4 个标识号(严格 0x,与表 A 一致),槽号不参与数值解析 | 不变 |
测试 test_pnet_gsdml.c | 样例十进制口径正确 | 改 MinDeviceInterval=32、VendorID 对齐(V4) |
样例/期望输出(_Stage\_trash\gsdml-output-after-audit-20260811.xml、TEST_Config\样例\gsdml_sample.xml、样例\basic-slave) | 与表 A/B/C 一致 | 不变 |
修复验收判据: ① ValidateGsdmlOutput(GsdmlWriter.Generate(p)) 对任意合法工程返回 0 Error;② 全仓 grep FixedInSubslots/SubslotNumber 相关注释不再出现"十六进制会被 XSD 拒绝"/"十进制会被 TIA 拒绝"两类错误断言;③ 表 A 四属性在生成器输出中恒为 0x 前缀(grep 验证 VendorID="0x 等);④ TEST_Config _三端闭环.cs 现有断言(ModuleIdentNumber/SubmoduleIdentNumber StartsWith("0x"))继续全绿。