一、GSD文件的重要组成:

  • 设备身份索引: 提供了设备的基本识别信息,包含主系列(MainFamily)、产品系列(ProductFamily)、供应商名称(VendorName)。

  • 设备的接口参数:一个设备可能有多个接口类型(DeviceAccessPoint),每个接口类型的参数可能不一样,则需要提取出一个设备的所有接口供用户选择,接口对应不同的接口参数族。接口参数包含:接口ID(DAP_ID)、接口名称(DAP_Name)、DNS兼容名称(DNS_CompatibleName)、接口可用模块(UseableModule)。

  • 接口可用模块(UseableModule):定义了接口可用的输入和输出模块,可用模块参数包含:模块识别ID(ModuleItemRef)、模块可用槽区间(AllowedInSlots)、模块预安装槽号(UsedInSlots)、模块安装槽号(FixedInSlots)。这里模块可用槽区间(AllowedInSlots)、模块预安装槽号(UsedInSlots)这两个参数与模块安装槽号(FixedInSlots)为互斥参数。

  • 模块参数: 一个设备通过不同的模块实现不同的功能,模块即功能块。模块的参数包含:模块ID(Module_ID)、模块名称(Module_Name)、模块信号数据(IOData)。

  • 模块信号数据(IOData):模块信号数据定义了一个模块的信号组成、信号定义、信号类型和信号分配,是GSD文件中最为重要的信息,其中包含:数据类型(IODataType)、输入输出类型(InOrOut)、数据名称(DataName)、信号长度(Length)、按位使用(UseAsBits)、位信号数据(BitDataItem)。

  • 位信号数据(BitDataItem): 位信号数据定义了一个信号单体中按位使用时每一个位的位置与定义,参数包含:位偏移量(BitOffset)、位描述(Description)。

  • 拓展文本(ExternalTextList): 设备的拓展信息,如模块名称、信号描述等等,在上述的参数中,通过文本ID(TextID)在拓展文本中进行识别提取。


注意:这里列出的只是笔者认为GSD文件中对于PROFINET网络组态重要的信息,不代表整个GSD文件的内容。


二、设备身份索引


注意:这里以小原焊机GSD文件为例子展开分析(GSDML-V2.31-OBARA-SIV31-40-20190707.xml)


1、主系列(MainFamily)

此参数在xml上的xpath为: /a:ISO15745Profile/a:ProfileBody/a:DeviceFunction/a:Family/@MainFamily

主要表示该设备的主要分类。

在这里插入图片描述
图1 主系列显示的位置

2、供应商名称(VendorName)

此参数在xml的xpath为:/a:ISO15745Profile/a:ProfileBody/a:DeviceIdentity/a:VendorName/@Value

主要表示该设备的供应商名称。

在这里插入图片描述
图2 供应商名称显示的位置

3、产品系列(ProductFamily)

此参数在xml的xpath为: /a:ISO15745Profile/a:ProfileBody/a:DeviceFunction/a:Family/@ProductFamily

主要表示该设备的产品系列。

在这里插入图片描述
图3 产品系列显示的位置

三、设备的接口参数

1、接口ID(DAP_ID)

此参数在xml中的xpath为: /a:ISO15745Profile/a:ProfileBody/a:ApplicationProcess/a:DeviceAccessPointList/a:DeviceAccessPointItem[1]/@ID
此参数主要表示接口的识别ID,在设计PNConfigLib文件中会使用到

2、接口名称(DAP_Name)

此参数在xml中的xpath为: /a:ISO15745Profile/a:ProfileBody/a:ApplicationProcess/a:DeviceAccessPointList/a:DeviceAccessPointItem[1]/a:ModuleInfo/a:Name/@TextId

但是通过此路径获取的只是接口名称在拓展文本中的识别ID,因此还需通过识别ID在拓展文本中获取对应的名称文本。

接口名称代表一个设备的不同接口,需要用户对应接口名称进行接口选择


图4 接口名称显示的名字

3、DNS兼容名称(DNS_CompatibleName)

此参数在xml中的xpath为: /a:ISO15745Profile/a:ProfileBody/a:ApplicationProcess/a:DeviceAccessPointList/a:DeviceAccessPointItem[1]/@DNS_CompatibleName

DNS兼容名称主要作为网络中设备的预设名称使用。

在这里插入图片描述
图5 GSD文件中接口的DNS兼容名称

在这里插入图片描述
图6 Protal 17 中的设备名称设置

四、接口可用模块(UseableModule)

1、识别ID(ModuleItemRef)

此参数在xml的xpath为: /a:ISO15745Profile/a:ProfileBody/a:ApplicationProcess/a:DeviceAccessPointList/a:DeviceAccessPointItem[1]/a:UseableModules/a:ModuleItemRef[1]/@ModuleItemTarget

可用模块的识别ID主要是为了定位到下面模块列表中的模块,与模块参数中的模块ID(Module_ID)一一对应。

2、模块可用槽区间(AllowedInSlots)

此参数在xml中的xpath为: /a:ISO15745Profile/a:ProfileBody/a:ApplicationProcess/a:DeviceAccessPointList/a:DeviceAccessPointItem[1]/a:UseableModules/a:ModuleItemRef[1]/@AllowedInSlots

此参数主要表示这个可用模块在设备中的可用槽区间,通常格式为单个数字“x”或区间"x…y",这个参数给模块限定了在设备中的位置,在进行PNConfigLib输入文件设计时会使用到。

在进行GSD数据解析时,会对模块可用槽区间进行拆分,拆分成两个参数:AllowedInSlotsStart和AllowedInSlotsEnd,分别代表模块可用槽区间的起始与结束。

需要注意的是模块可用槽区间与模块安装槽号(FixedInSlots)为互斥参数,同时只能存在一个。

在这里插入图片描述
图7 GSD文件中的模块可用槽区间参数

3、模块预安装槽号(UsedInSlots)

此参数在xml中的xpath为: /a:ISO15745Profile/a:ProfileBody/a:ApplicationProcess/a:DeviceAccessPointList/a:DeviceAccessPointItem[1]/a:UseableModules/a:ModuleItemRef[1]/@UsedInSlots

此参数主要表示这个可用模块被预设安装在了哪个槽位中,模块预安装槽号为可用槽区间伴生的可选参数。有预安装槽位的模块在其设备添加到网络中时就会被安装到对应的预安装槽位,但是如果用户需要的话,也可以被安装到别的模块可用槽号上。

需要注意的是模块预安装槽号和模块可用槽区间一样与模块安装槽号为互斥参数。

在这里插入图片描述
图8 GSD文件中的模块预安装槽号

在这里插入图片描述
图9 Protal 17 中添加设备时模块被安装到了预安装槽号上

4、模块安装槽号(FixedInSlots)

此参数在xml中的xpath为: /a:ISO15745Profile/a:ProfileBody/a:ApplicationProcess/a:DeviceAccessPointList/a:DeviceAccessPointItem/a:UseableModules/a:ModuleItemRef[1]/@FixedInSlots

此参数主要表示该可用模块只能被安装在设备的对应槽号上。

模块安装槽号与模块可用槽区间是互斥参数。

在这里插入图片描述
图10 GSD文件中的模块安装槽号

五、模块参数

1、模块ID(Module_ID)

此参数在xml中的xpath为: /a:ISO15745Profile/a:ProfileBody/a:ApplicationProcess/a:ModuleList/a:ModuleItem[1]/@ID

此参数是对应模块的标志位,为了方便后续解析索引到模块。与上述的接口可用模块中的识别ID(ModuleItemRef)对应。

在这里插入图片描述
图11 GSD文件中的模块ID参数

2、模块名称(Module_Name)

此参数在xml中的xpath为: /a:ISO15745Profile/a:ProfileBody/a:ApplicationProcess/a:ModuleList/a:ModuleItem[1]/a:ModuleInfo/a:Name/@TextId

通过此路径获取的只是模块名称在拓展文本中的识别ID,因此还需通过识别ID在拓展文本中获取对应的名称文本。

此参数是对应模块的模块名称。

在这里插入图片描述
图12 GSD文件中的模块名称文本ID信息

在这里插入图片描述
图13 TIA Protal 中的模块名称

六、模块信号数据(IOData)

1、数据类型(IODataType)

此参数在xml中的xpath为: /a:ISO15745Profile/a:ProfileBody/a:ApplicationProcess/a:ModuleList/a:ModuleItem[1]/a:VirtualSubmoduleList/a:VirtualSubmoduleItem/a:IOData/a:Input/a:DataItem[1]/@DataType

数据类型表示单个数据结构体(IODataItem)的数据类型,常见的数据类型有Unsigned8、Unsigned16、Unsigned32、Integer8和字符串类型。

当GSD中不提供数据的信号长度(Length)属性时,就需要通过数据类型来判断该数据的信号长度。

在这里插入图片描述
图14 GSD文件中的数据类型属性

2、数据名称(DataName)

此参数在xml中的xpath为: /a:ISO15745Profile/a:ProfileBody/a:ApplicationProcess/a:ModuleList/a:ModuleItem[1]/a:VirtualSubmoduleList/a:VirtualSubmoduleItem/a:IOData/a:Input/a:DataItem[1]/@TextId

通过此路径获取的只是数据名称在拓展文本中的识别ID,因此还需通过识别ID在拓展文本中获取对应的名称文本。

数据名称主要作一个功能模块解释的作用,可以让用户理解这一数据结构是包含了什么功能。

在这里插入图片描述
图15 GSD文件中的数据名称文本ID

3、信号长度(Length)

此参数在xml中的xpath为: /a:ISO15745Profile/a:ProfileBody/a:ApplicationProcess/a:ModuleList/a:ModuleItem[1]/a:VirtualSubmoduleList/a:VirtualSubmoduleItem/a:IOData/a:Input/a:DataItem[1]/@Length

信号长度表示这个数据结构的信号长度,单位为BYTE。

信号长度属性在数据类型为确定长度的类型时可以不存在,如数据类型为Unsigned8时,则长度默认为1,信号长度属性则可以不存在。

需要通过每个模块的各数据结构信号长度来得出整个模块的信号长度,且区分输入输出属性。

在这里插入图片描述
图16 GSD文件中的数据信号长度属性

4、输入输出类型(InOrOut)

此参数在xml中的xpath为: /a:ISO15745Profile/a:ProfileBody/a:ApplicationProcess/a:ModuleList/a:ModuleItem[1]/a:VirtualSubmoduleList/a:VirtualSubmoduleItem/a:IOData/a:Input

IODataItem在IOData中是根据输入输出属性来进行类型区分的,在Input元素下的IODataItem即为输入属性,在Output元素下的IODataItem即为输出属性。

5、按位使用(UseAsBits)

此参数在xml中的xpath中为: /a:ISO15745Profile/a:ProfileBody/a:ApplicationProcess/a:ModuleList/a:ModuleItem[1]/a:VirtualSubmoduleList/a:VirtualSubmoduleItem/a:IOData/a:Input/a:DataItem[1]/@UseAsBits

按位使用代表这个数据结构的每一位都是有单独意义的,整个数据结构不作为一个单一的功能使用。当按位使用属性不存在或者等于false时,即表明这个数据结构作为一个单一的功能使用。

当数据结构按位使用为true时,通常也会存在BitDataItem元素。

在这里插入图片描述
图17 GSD文件中的按位使用属性

七、位信号数据(BitDataItem)

1、位偏移量(BitOffset)

此参数在xml中的xpath为: /a:ISO15745Profile/a:ProfileBody/a:ApplicationProcess/a:ModuleList/a:ModuleItem[1]/a:VirtualSubmoduleList/a:VirtualSubmoduleItem/a:IOData/a:Input/a:DataItem[1]/a:BitDataItem[1]/@BitOffset

位偏移量表示该位在上层数据结构(IODataItem)中的位置,比如说BitOffset = 1时表示这是第二个位。

在这里插入图片描述
图18 GSD文件中的位偏移量属性

2、位描述(Description)

此参数在xml中的xpath为: /a:ISO15745Profile/a:ProfileBody/a:ApplicationProcess/a:ModuleList/a:ModuleItem[1]/a:VirtualSubmoduleList/a:VirtualSubmoduleItem/a:IOData/a:Input/a:DataItem[1]/a:BitDataItem[1]/@TextId

位描述是对位的功能进行了描述,通过此路径获取的只是位描述在拓展文本中的识别ID,因此还需通过识别ID在拓展文本中获取对应的名称文本。

在这里插入图片描述
图19 GSD文件中的位描述拓展文本ID

八、拓展文本(ExternalTextList)

拓展文本主要包含:设备的拓展信息,如模块名称、信号描述等等,在上述的参数中,通过文本ID(TextID)在拓展文本中进行识别提取。

在这里插入图片描述
图20 GSD文件中的拓展文本

九、解析GSD文件使用的库和方法

这里因为要兼容旧版本的C++11,选用了更加轻量化的TinyXML2 。

在进行GSD解析时,主要用到索引元素和提取元素属性的功能。

1、索引元素:

XMLElement* ExternalTextList = applicationProcess->FirstChildElement("ExternalTextList");
                            if (!ExternalTextList) {
                                std::cout << filename << "ExternalTextList element not found." << std::endl;
                                return moduleiodata;
                            }

例:
1. applicationProcess->FirstChildElement("ExternalTextList")

  • applicationProcess:这是一个指向 XMLElement 的指针,表示当前正在处理的 XML 元素。

  • FirstChildElement("ExternalTextList"):这是 TinyXML-2 提供的一个方法,用于查找当前元素的第一个子元素,其标签名为 "ExternalTextList"

    • 如果找到匹配的子元素,返回一个指向该子元素的指针。

    • 如果没有找到匹配的子元素,返回 nullptr

2. if (!ExternalTextList)

  • 这行代码检查 ExternalTextList 是否为 nullptr

  • 如果 ExternalTextListnullptr,说明没有找到名为 "ExternalTextList" 的子元素。

3. std::cout << filename << "ExternalTextList element not found." << std::endl;

  • 如果没有找到 "ExternalTextList" 元素,这行代码会输出一条错误信息到标准输出(控制台)。

  • filename:这是一个变量,表示当前处理的 XML 文件的名称。

  • 错误信息的格式是:<filename>ExternalTextList element not found.

4. return moduleiodata;

  • 如果没有找到 "ExternalTextList" 元素,函数会提前返回 moduleiodata

  • moduleiodata:这是一个变量,可能是函数的返回值类型。提前返回这个值可能表示函数在没有找到 "ExternalTextList" 元素时无法继续执行,或者返回一个默认值。

2、提取元素属性:

const char* textid = Text->Attribute("TextId");
       if (textid) {
        存在的实现逻辑
            } else {
                std::cout << filename << "modulenameids TextId attribute not found in Text." << std::endl;
                }

例:
1. Text->Attribute("TextId")

  • Text:这是一个指向 XMLElement 的指针,表示当前正在处理的 XML 元素。

  • Attribute("TextId"):这是 TinyXML-2 提供的一个方法,用于获取当前元素的属性值。

    • 参数 "TextId" 是属性的名称。

    • 如果属性存在,返回一个指向属性值的 const char* 指针。

    • 如果属性不存在,返回 nullptr

2. if (textid)

  • 这行代码检查 textid 是否为 nullptr

  • 如果 textid 不为 nullptr,说明找到了名为 "TextId" 的属性。

  • 如果 textidnullptr,说明没有找到名为 "TextId" 的属性。

3. std::cout << filename << "modulenameids TextId attribute not found in Text." << std::endl;

  • 如果没有找到 "TextId" 属性,这行代码会输出一条错误信息到标准输出(控制台)。

  • filename:这是一个变量,表示当前处理的 XML 文件的名称。

  • 错误信息的格式是:<filename>modulenameids TextId attribute not found in Text.

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐