问题描述
我正在 .net 框架 (C#) 中为本地网络创建一个 Web API。在该用户可以从 excel 导入/导出 IO 标签或将它们设置为静态字符串数组。我添加了 (Siemens.Engineering.Hmi.dll) 但仍然显示未找到的编译时错误。
我们还连接到 TIAPortal,它运行良好,唯一的障碍是 I/O 标签导入/导出或设置静态值和 HMI 软件。
-
项目:Web API(.Net Framework 4.6.1)
-
Tia 门户:v16.0
-
许可类型:试用
如果有人有想法或任何建议,请回复我。这将是高度appriciated。
解决方法
您遇到的问题是(很可能)您没有将引用的 Siemens.Engineering.Hmi.dll 的 copy local
属性设置为 false。因此,无法找到引用的 Siemens.Engineering.Hmi.dll 的依赖项。 备注:添加 Siemens.Engineering.dll 作为参考 此外 Siemens.Engineering.Hmi.dll
拥有非本地程序集则需要 AssemblyResolving
。最简单的方法是使用 App.config 文件。
请参阅西门子有关此主题的页面: support.industry.siemens.com
我看到的第二个问题是标签的访问。您肯定知道,有 HMI 标签和 PLC 标签。可以通过相应的 DeviceItems
访问它们。这些 DeviceItems
公开不同的 Services
。您可以通过 Services
方法访问 <YourEngineeringObject>.GetService<T>()
。在这种情况下,您将需要 SoftwareContainer
服务。
要熟悉 TIA Openness 的数据模型,请查看 TIA Openness Explorer
此外,为了加深您对与 TIA Openness 合作的理解,请参阅SIMATIC TIA Portal Openness: API for automation of engineering workflows
,我导入 IO 标签的解决方案是使用 .xml 文件
它的优点是可以访问和设置IO标签的属性,如IO标签表的名称、数据类型名称、externalaccessible、externalvisible、externalwritable、logicaladdress、tagName、comment。
例如.xml
<?xml version="1.0" encoding="utf-8"?>
<Document>
<Engineering version="V16" />
<SW.Tags.PlcTagTable ID="0">
<AttributeList>
<Name>IO Table</Name>
</AttributeList>
<ObjectList>
<SW.Tags.PlcTag ID="1" CompositionName="Tags">
<AttributeList>
<DataTypeName>Bool</DataTypeName>
<ExternalAccessible>true</ExternalAccessible>
<ExternalVisible>true</ExternalVisible>
<ExternalWritable>true</ExternalWritable>
<LogicalAddress>%I0.0</LogicalAddress>
<Name>Tag</Name>
</AttributeList>
<ObjectList>
<MultilingualText ID="2" CompositionName="Comment">
<ObjectList>
<MultilingualTextItem ID="3" CompositionName="Items">
<AttributeList>
<Culture>en-US</Culture>
<Text>Tag</Text>
</AttributeList>
</MultilingualTextItem>
</ObjectList>
</MultilingualText>
</ObjectList>
</SW.Tags.PlcTag>
</ObjectList>
</SW.Tags.PlcTagTable>
</Document>
你只需要修改.xml中的tags属性,包括ID值。比如第一个标签ID=1,第二个标签ID=2。ID的值不可重复!
例如.cs
var fileInfo = new FileInfo(@"IO MAP.xml");
SoftwareContainer softwareContainer = Project.Devices[0].DeviceItems[1].GetService<SoftwareContainer>();
Software softwareBase = softwareContainer.Software;
PlcSoftware plcSoftware = softwareBase as PlcSoftware;
PlcTagTableGroup PlcTagTableGroup = plcSoftware.TagTableGroup;
PlcTagTableGroup.TagTables.Import(fileInfo,ImportOptions.Override);
您只需要修改 SoftwareContainer 的目标,这取决于您使用的 PLC 型号,以 s7-1516 为例。
如果您有任何问题,请联系我。