如何读取Openness XML文件
熟练掌握Openness的XML结构并不是一个快速而简单的过程;它需要时间和大量经验。然而,通过我在本文中将介绍的基础知识,您将获得迈出第一步所需的工具和背景。
AI模型价格对比 | AI工具导航 | ONNX模型库 | Vibe Coding教程 | PLC在线仿真器 | Tripo 3D | Meshy AI | ElevenLabs | KlingAI | ArtSpace | Phot.AI | InVideo
在我之前的文章中,我解释了什么是TIA Openness以及使用它如何简化您的开发过程。由于Openness使用XML文件作为其导入和导出功能的基础,因此了解如何理解这些XML文件对于使用Openness创建和修改代码至关重要。
熟练掌握Openness的XML结构并不是一个快速而简单的过程;它需要时间和大量经验。然而,通过我在本文中将介绍的基础知识,您将获得迈出第一步所需的工具和背景。
1、阅读XML文件
XML代表可扩展标记语言(eXtensible Markup Language),是一种用于存储数据的语言。与HTML类似,它是一种标记语言,旨在具有自描述性。XML非常适合存储复杂数据结构,因为它将它们编码在分层标签结构中。让我们看一个简单的XML示例。
<email>
<to>Alice</to>
<from>Bob</from>
<subject>XML</subject>
<message>Isn't XML the best?</message>
</email>
此代码表示一封电子邮件。您可以看到,在Email对象中,它包含To、From、Subject和Message的信息。这些元素是Email父元素的子元素。与HTML不同,XML没有预定义标签。没有预定义标签允许XML的创建者使这些标签尽可能具有描述性。XML还依赖其他程序来读取和写入它;它本身不做任何事情。对于上面的示例代码,必须有人创建了一个程序来存储电子邮件。为了对这些存储的电子邮件进行操作,需要一个将XML转换为更人类友好格式的程序。
这正是Openness所做的;它获取包含创建函数块所需的所有信息的XML文件,读取它们,并处理这些信息以创建新的函数块。当Openness导出函数块(或其他代码段)时,它会将所有数据转换为XML格式。这意味着当您打开Openness XML文档时,它将包含许多由Siemens定义的标签。这些标签具有描述性,但乍一看可能难以理解。以下是函数块的XML片段。
<Document>
<SW.Blocks.FB ID="0">
<AttributeList>
<AutoNumber>true</AutoNumber>
<HeaderAuthor />
<HeaderFamily />
<HeaderName />
<HeaderVersion>0.1</HeaderVersion>
<Interface>
<Sections xmlns="http://www.siemens.com/automation/Openness/SW/Interface/v2">
<Section Name="Input">
<Member Name="bInCondition" Datatype="Bool" Remanence="NonRetain" Accessibility="Public">
<AttributeList>
<BooleanAttribute Name="ExternalAccessible" SystemDefined="true">false</BooleanAttribute>
<BooleanAttribute Name="ExternalVisible" SystemDefined="true">false</BooleanAttribute>
<BooleanAttribute Name="ExternalWritable" SystemDefined="true">false</BooleanAttribute>
</AttributeList>
<Comment>
<MultiLanguageText Lang="en-US">Input condition</MultiLanguageText>
</Comment>
</Member>
</Section>
<Section Name="Output">
<Member Name="bOutDoSomething" Datatype="Bool" Remanence="NonRetain" Accessibility="Public">
<AttributeList>
<BooleanAttribute Name="ExternalAccessible" SystemDefined="true">false</BooleanAttribute>
<BooleanAttribute Name="ExternalVisible" SystemDefined="true">false</BooleanAttribute>
<BooleanAttribute Name="ExternalWritable" SystemDefined="true">false</BooleanAttribute>
</AttributeList>
<Comment>
<MultiLanguageText Lang="en-US">Output action</MultiLanguageText>
</Comment>
</Member>
</Section>
这是函数块块接口的一部分。让我们从顶部开始,逐步向下。
Document标签
第一个元素是'Document'标签。此标签仅用于描绘XML文件的开始和结束。您为Openness创建的每个XML文件应只包含一个"Document"标签。接下来,我们有'SW.Blocks.FB ID="0"'。
SW.Blocks.FB
'SW.Blocks.FB'告诉Openness我们正在定义一个函数块。类似地,我们可以使用'SW.Blocks.DB'来定义数据块。'ID="0"'部分是Openness使用的内部ID。此ID仅用于标识XML文件中的不同数据。如果您在一个'Document'标签内定义了多个块,则每个块都需要具有唯一ID,否则导入过程将失败。发生错误时,Openness将使用这些ID号来指定错误发生的位置。
每个函数块都有某些属性,这些属性封装在'AttributeList'标签中。其中许多属性看起来与您在Portal中转到函数块属性时看到的属性相似。例如,我们有一个'AutoNumber'值,它告诉我们函数块编号是自动设置还是手动设置。'HeaderAuthor'、'HeaderFamily'、'HeaderName'和'HeaderVersion'属性也可以在块的属性中找到。'Interface'标签用于定义函数块的块接口。
Sections
接口包含一组'Sections'。'Section'是函数块可以包含的不同数据类型之一。在此示例中,我们有一个名为'Input'的部分和一个名为'Output'的部分。它们分别对应于块的输入和输出参数。要定义输入参数,我们在'Input'部分中创建一个'Member'。在上面的图像中,我们有一个名为'bInCondition'的输入参数。成员有自己的一组属性。
Members
在'Member'定义中,有'Name'、'Datatype'、'Remanence'和'Accessibility'属性。这些分别对应于变量的名称、数据类型、是否是保持型以及谁可以访问变量。其他属性在封闭的'AttributeList'中定义。这三个属性'ExternalAccessible'、'ExternalVisible'和'ExternalWritable'对应于您在Portal中看到的复选框:'Accessible from HMI'、'Writable from HMI'和'Visible in HMI engineering'。
Comment属性
最后,'Member'包含一个'Comment'属性。注释包含一个'MultiLanguageText'属性,该属性包含实际的注释值。如果您以多种语言编程,将定义其他'MultiLanguageText'属性,并允许注释以多种语言显示。通过设置这些属性的值,您可以完全定义变量。因此,上面的XML代码转换为以下块定义。
2、从XML创建代码
让我们先看几个例子。这是我们现有函数块中的一个网络。
以下是相关的XML。
<SW.Blocks.CompileUnit ID="3" CompositionName="CompileUnits">
<AttributeList>
<NetworkSource>
<FlgNet xmlns="http://www.siemens.com/automation/Openness/SW/NetworkSource/FlgNet/v1">
<Parts>
<Access Scope="LocalVariable" UId="21">
<Symbol>
<Component Name="bInCondition" />
</Symbol>
</Access>
<Access Scope="LocalVariable" UId="22">
<Symbol>
<Component Name="bOutDoSomething" />
</Symbol>
</Access>
<Part Name="Contact" UId="23" />
<Part Name="Coil" UId="24" />
</Parts>
<Wires>
<Wire UId="25">
<Powerrail />
<NameCon UId="23" Name="in" />
</Wire>
<Wire UId="26">
<IdentCon UId="21" />
<NameCon UId="23" Name="operand" />
</Wire>
<Wire UId="27">
<NameCon UId="23" Name="out" />
<NameCon UId="24" Name="in" />
</Wire>
<Wire UId="28">
<IdentCon UId="22" />
<NameCon UId="24" Name="operand" />
</Wire>
</Wires>
</FlgNet>
</NetworkSource>
<ProgrammingLanguage>LAD</ProgrammingLanguage>
</AttributeList>
<ObjectList>
<MultilingualText ID="4" CompositionName="Comment">
<ObjectList>
<MultilingualTextItem ID="5" CompositionName="Items">
<AttributeList>
<Culture>en-US</Culture>
<Text>This network uses an input condition to activate an output action</Text>
</AttributeList>
</MultilingualTextItem>
</ObjectList>
</MultilingualText>
<MultilingualText ID="6" CompositionName="Title">
<ObjectList>
<MultilingualTextItem ID="7" CompositionName="Items">
<AttributeList>
<Culture>en-US</Culture>
<Text>Simple contact/coil network</Text>
</AttributeList>
</MultilingualTextItem>
</ObjectList>
</MultilingualText>
</ObjectList>
</SW.Blocks.CompileUnit>
XML虽然比梯形逻辑视图更复杂,但仍然相对可读。有网络的属性、用于声明所有使用变量的部分、定义使用的梯形图元素的部分,以及创建变量和单独梯形图元素之间连接的部分。然而,虽然部分保持不变,但添加更复杂的元素会很快使此XML难以解析。
以下是创建Open Library fb_ValveSolenoid函数块实例的示例。
虽然仍然是一个相对简单的网络,但封装此网络的XML有187行长(为节省空间,我不会在此发布)。XML的每个部分都必须准确定义,否则最终会导致导入错误。此外,学习Openness用于定义函数块的各种部分需要大量练习。
由于这些原因,从头开始创建函数块的XML版本通常没有意义。您可以向Openness应用程序添加函数,将现有块导出为XML。然后,您可以在Portal中创建块,并让Openness自动生成关联的XML。编辑这些XML文档时,我建议使用支持正确XML格式化的文本编辑器,例如Notepad++或Visual Studio Code。
虽然至少熟悉Openness的XML格式对于调试非常有用,但我们已经看到,当尝试编写代码时,它可能会让人不知所措。使用Openness生成XML代码很容易,但无论如何都需要在Portal中创建所需的对象。
那么,您可能会问,在XML中创建对象的意义是什么?在下一篇文章中,我将介绍如何使用Openness通过XML模板自动创建代码。
原文链接: How to Read an Openness XML File
汇智网翻译整理,转载请标明出处