跳到主要内容

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 十六进制VendorIDDeviceID0x + 1~4 位 hex
ModuleIdentNumber0x + 固定 8 位 hex
SubmoduleIdentNumber0x + 1~8 位 hex
十进制或 0x 均可(XSD 双 pattern,两种都被 TIA 接受)SubslotNumberFixedInSlotsFixedInSubslotsAllowedInSlotsUsedAsPlugInSlots、记录数据 Value、诊断 DefaultValue项目统一口径 = 十进制(对齐西门子 TIA 官方导出);0x 形式同为规范合法,不得判为错误
必须十进制SlotNumber(旧版 GSDML 属性 / 运行配置轨)、PhysicalSlotsObjectUUID_LocalIndexMinDeviceIntervalSendClockReductionRatioNumberOfARMaxInputLength / MaxOutputLength / MaxDataLength、DataItem LengthMAUTypes / MAUTypeItem ValueMaxSupportedRecordSizeResetToFactoryModesWriteable_IM_Records纯十进制数字(部分支持 n..m 区间写法,如 PhysicalSlots="0..1"
自由文本(非数字)OrderNumber(OrderID)、HardwareReleaseSoftwareReleaseInfoText任意字符串,不套用任何进制规则

1. 规范依据与取证(仓库内材料)

仓库内没有 GSDML 官方 .xsd(全仓 *.xsd 仅 docs/node_modules 的 sitemap schema,与 GSDML 无关)。最终裁决依据为两重:

  1. GSDML 规范 v2.3x 权威知识(PI 官方 GSDML-DeviceProfile-V2.32/V2.33/V2.34.xsd 的 simpleType pattern + GSDML Specification 文本)。
  2. 仓库内真实样例互证(以下文件均为只读取证):
材料路径性质
西门子 TIA 官方导出样例(GSDML V2.34)其他参考\GSDML-V2.34-#Siemens-PLC200smart_CPU SR20-20260811-045916.xml最权威实测证据:真实 TIA 导出、真实通过 XSD 校验
产品实际输出(audit 后快照)_Stage\_trash\gsdml-output-after-audit-20260811.xmlDarra 产品当前真实 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/SubmoduleIdentNumber0x 开头
运行配置轨样例样例\basic-slave\SlaveConfig.csPNETConfig 轨(非 GSDML 轨)的 hex/十进制口径
站点文档docs\docs\guide\quickstart.mddocs\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 前缀直接解析失败)。

属性位数所在元素依据
VendorID0x + 1~4 位 hex(惯例 4 位,如 0x002ADeviceIdentity西门子样例 L16;XSD VendorID pattern 0x[0-9A-Fa-f]{1,4}pnet_gsdml.c:436 gsdml_parse_hex16 无 0x 即 false
DeviceID0x + 1~4 位 hex(惯例 4 位)DeviceIdentity西门子样例 L16;XSD DeviceID pattern 同上;核心 gsdml_parse_hex16
ModuleIdentNumber0x + 固定 8 位 hexDeviceAccessPointItem(DAP)、ModuleItem西门子样例 L25 0x80000201;XSD pattern 0x[0-9A-Fa-f]{8};核心 gsdml_parse_hex32
SubmoduleIdentNumber0x + 1~8 位 hexVirtualSubmoduleItemInterfaceSubmoduleItemPortSubmoduleItem西门子样例 L39 0x00000001 / L70 0xf00(3 位合法);XSD pattern 0x[0-9A-Fa-f]{1,8};核心 gsdml_parse_hex32

生成器现状(GsdmlWriter.cs): Hex160x{value:X4})/ Hex320x{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 → 用 0xSubslotNumber="0x8000"FixedInSubslots="0x1")。

项目最终口径:统一十进制(与西门子官方导出、核心测试样例、audit 后输出一致)。生成器、测试、校验器不得把 0x 形式判为错误,也不得把十进制判为错误。

属性所在元素项目口径依据
SubslotNumberSubslotItemInterfaceSubmoduleItemPortSubmoduleItem十进制(接口 32768 / 端口 32769)西门子样例 L34/70/75;GsdmlWriter L423/461/478;test_pnet_gsdml.c L83/85
FixedInSlotsDeviceAccessPointItem十进制西门子样例 L25 "1";GsdmlWriter L403 "0"
FixedInSubslotsVirtualSubmoduleItem十进制西门子样例 L39 "1" / L46 "1000";GsdmlWriter L517
AllowedInSlotsModuleItemRef(UseableModules)十进制GsdmlWriter L390;test_pnet_gsdml.c L74 "1"
UsedAsPlugInSlotsModuleItemRef十进制(当前生成器未输出该属性)与 AllowedInSlots 同类型
记录数据 ValueParameterRecordDataItem / Const / Ref记录定义十进制或 0x 均可(规范明示);当前生成器未输出记录GSDML spec 记录章节"decimal or hexadecimal"
诊断报警 Value / DefaultValueUnitDiagTypeItemChannelDiagItem 等)诊断定义十进制或 0x 均可;西门子官方用十进制西门子样例 L96 DefaultValue="1";当前生成器未输出 UnitDiag 列表

注:用户裁定中的"诊断报警 Value 必须 0x"在本规范裁决下不成立——XSD 双 pattern,西门子官方导出用十进制。诊断 Value 的两种写法均合法;若未来生成器补 UnitDiagTypeList,建议沿用十进制口径。


4. 权威清单表 C — 必须十进制(0x 形式 = 非法)

XSD 中为 unsigned 类型或 decimal-only pattern / 规范明示十进制;0x 前缀在这些属性上会导致 schema-invalid。

属性所在元素依据
PhysicalSlotsDeviceAccessPointItem西门子样例 L25 "1";支持区间写法 "0..N"(GsdmlWriter L398、audit 输出 L25 "0..1"
SlotNumberGSDML 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_LocalIndexDeviceAccessPointItem西门子样例 L25 "100"
MinDeviceInterval / SendClockDeviceAccessPointItem / TimingProperties西门子样例 L25 "128" / L72 "32";31.25µs 时基十进制,1 ms = 32,上限 16384(512 ms)
ReductionRatioTimingProperties西门子样例 L72 "1 2 4 8 16 32 64 128 256 512" 十进制列表
NumberOfARApplicationRelations西门子样例 L71 "1"
MaxInputLength / MaxOutputLength / MaxDataLengthIOConfigData西门子样例 L37 "10" / "15" / "25"
DataItem LengthIOData/DataItem西门子样例 L49 Length="10"
MAUTypes / MAUTypeItem ValuePortSubmoduleItem / MAUTypeItem西门子样例 L75/77 "16"(100BASE-TX 全双工),十进制
MaxSupportedRecordSizeDeviceAccessPointItem西门子样例 L25 "4068"
ResetToFactoryModesDeviceAccessPointItem西门子样例 L25 "2"
Writeable_IM_RecordsVirtualSubmoduleItem西门子样例 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 simpleTypepattern / 类型对应属性
VendorID / DeviceID0x[0-9A-Fa-f]{1,4}VendorID / DeviceID(仅 hex
ModuleIdentNumber0x[0-9A-Fa-f]{8}ModuleIdentNumber(仅 hex,固定 8 位
SubmoduleIdentNumber0x[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 拒绝)"
  • 事实: GsdmlWriter.cs 输出 SubslotNumber="32768"FixedInSubslots="1"(十进制,与西门子官方样例一致)。校验器把这些判为 Error"不是 0x 前缀十六进制"。
  • 后果: MainForm.cs:1054-1058(导出路径)与 XmlPreviewView.cs:231(预览)调用 ValidateGsdmlOutputHasErrors = true → ShowValidationBlocked 阻断导出。自家输出永远过不了自家校验。
  • 裁决: 十进制与 0x 均为 XSD 合法(表 B),校验器错。修复方向: 删除这两处 CheckHexAttribute,改为"十进制或 0x 双格式 + 值域(≤65535)"校验,或仅检查整数合法性。

V2(注释错误)GsdmlWriter.cs 四处 audit 注释断言错误

  • 位置: Darra_Pnet_GUI\Services\GsdmlWriter.cs L402(FixedInSlots)、L460 / L477(SubslotNumber)、L516(FixedInSubslots),注释均写"十六进制会被 GSDML XSD 拒绝"。
  • 事实: XSD 双 pattern,0x 形式合法(大量厂商 GSDML 即 0x 形式)。选择十进制本身正确(对齐西门子),但注释理由不成立,须按表 B 改写。

V3(口径缺口)表 B 部分属性校验器零覆盖

  • AllowedInSlots(GsdmlWriter L390 输出十进制)、FixedInSlots(L403 输出 "0")、UsedAsPlugInSlotsWriteable_IM_Records、诊断 DefaultValue/记录 ValueValidationService.cs 中无任何格式校验。按表 B/C 补双格式值域校验。

V4(样例不一致)核心测试样例与校验器时基口径矛盾

  • 位置: Darra_Pnet_Core\tests\test_pnet_gsdml.c L66 MinDeviceInterval="1"
  • 事实: 31.25µs 时基下 1 < 32(1 ms 下限),ValidationService.CheckTimeBaseAttribute(L878)会判 Error。建议改 "32" 对齐时基下限(西门子样例为 128)。
  • 同文件 L55 VendorID="0x0000":核心解析器口径可接受,但 GUI ValidateVendorId(用户 2026-08-09 裁定)拒绝 0x0000;属测试域口径差异,标注即可,建议与 GUI 口径对齐为 0x0001

V5(文档口径)concepts.md 示意图易误读

  • 位置: docs\docs\guide\concepts.md L35-37 用 Submodule 0x01 / Submodule 0x8001 示意子模块。
  • 事实: GSDML 中槽/子槽号是十进制,仅标识号(SubmoduleIdentNumber)是 0x。建议示意改为 子槽 0x8001 仅指标识号语义,或加注"槽号十进制、标识号 0x"。

V6(非违规,登记)SubmoduleIdentNumber 校验器位数不严格

  • CheckHexAttributeSubmoduleIdentNumber 只做 ≤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.xmlTEST_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"))继续全绿。