Openness API:读取PLC IP地址
西门子TIA Portal Openness API支持对项目设备进行编程访问,但检索IP地址需要正确导航对象模型。IP地址并非作为直接设备属性公开——您必须通过设备的层次结构通过NetworkInterface功能访问它。
1、前提条件
- TIA Portal V14或更高版本(支持Openness API)
- TIA Portal Openness许可证(包含在Professional许可证中)
- 用于C#开发的Visual Studio或VS Code
- 带有
python-opcua或自定义西门子工程API包装器的Python 3.x
2、理解对象模型
TIA Portal中的设备包含分层的DeviceItems集合。要访问网络参数:
- 遍历
Device.DeviceItems以查找网络接口组件 - 查询
IEngineeringServiceProvider.GetService<NetworkInterface>() - 访问
NetworkInterface.Nodes[0]以获取第一个接口 - 使用
GetAttribute("Address")读取IP
属性名称区分大小写。使用TIA Openness Explorer(见下文)发现硬件的确切属性名称。
3、C#实现
以下是西门子示例代码的修改版本,用于读取IP地址而不是写入:
using Siemens.Engineering;
using Siemens.Engineering.HW;
using Siemens.Engineering.HW.Features;
using Siemens.Engineering.SW;
public string GetNodeAddress(Device device)
{
if (device == null) return null;
NetworkInterface itf = null;
int idx1 = 0, idx2 = 0;
bool foundIt = false;
for (idx1 = 0; idx1 < device.DeviceItems.Count; idx1++)
{
DeviceItem di1 = device.DeviceItems.ElementAt(idx1);
for (idx2 = 0; idx2 < di1.DeviceItems.Count; idx2++)
{
DeviceItem di2 = di1.DeviceItems.ElementAt(idx2);
itf = ((IEngineeringServiceProvider)di2).GetService<NetworkInterface>();
if (itf != null)
{
foundIt = true;
break;
}
}
if (foundIt) break;
}
if (foundIt && itf.Nodes.Count > 0)
{
Node node = itf.Nodes.ElementAt(0);
IEngineeringObject nodeObject = (IEngineeringObject)node;
return nodeObject.GetAttribute("Address").ToString();
}
return null;
}
关键点:
- 不要使用硬编码索引如
DeviceItems[6]——动态迭代 - 可用属性包括:
Address、SubnetMask、DefaultGateway - API返回
object——适当转换
4、Python实现
from Siemens.Engineering.HW.Features import NetworkInterface
import Siemens.Engineering
def get_device_ip(device):
"""从TIA Portal设备读取IP地址"""
hwf = Siemens.Engineering.HW.Features
for idx1, di1 in enumerate(device.DeviceItems):
for idx2, di2 in enumerate(di1.DeviceItems):
try:
provider = di2
itf = provider.GetService(NetworkInterface)
if itf:
node = itf.Nodes[0]
ip_address = node.GetAttribute("Address")
return ip_address
except:
continue
return None
# 使用项目设备
for device in project.Devices:
ip = get_device_ip(device)
print(f"{device.Name}: {ip}")
5、发现可用属性
西门子提供TIA Openness Explorer(下载:支持条目109760816)来浏览完整的对象模型:
- 在TIA Portal中打开您的项目
- 启动TIA Openness Explorer
- 浏览到您的设备 → 网络接口 → 节点
- 通过
GetAttributeInfos()查看所有可用属性
并非所有属性都可在所有设备上读取。某些PROFINET接口可能会根据硬件配置返回某些属性的null值。
6、替代方案:通过拓扑视图手动导出
对于不需要编程的一次性导出:
- 在TIA Portal中打开拓扑视图
- 展开拓扑数据面板(垂直菜单,右侧)
- 右键单击列标题 → 显示/隐藏
- 勾选IP地址
- 所有设备IP显示在可排序列表中
此方法不支持导出——使用Openness API进行自动报告。
7、常见问题
| 错误 | 原因 | 解决方案 |
|---|---|---|
| GetService返回null | 选择了错误的DeviceItem级别 | 在层次结构中深入迭代——尝试向下2-3级 |
| 未找到属性 | 设备没有网络接口 | 验证设备具有PROFINET/以太网端口 |
| 泛型类型的编译器错误 | C#泛型语法 | 使用GetService()而不是括号 |
| Python:ImportError | 缺少西门子工程DLL | 安装TIA Portal并引用工程程序集 |
8、支持的设备
NetworkInterface服务适用于:
- S7-1200 / S7-1500 CPU(TIA V14+支持所有固件版本)
- S7-300 / S7-400(通过PN接口)
- 带有以太网的SIMATIC HMI面板
- PC站(软件控制器)
- 第三方PROFINET设备(只读)
9、相关配置
以编程方式设置IP地址时,请确保:
- 设备处于离线模式
- IP地址格式为有效的IPv4(例如"192.168.1.100")
- 子网掩码匹配(例如"255.255.255.0")
- 修改后调用
project.Save()
原文链接: Reading PLC IP Addresses via TIA Portal Openness API
汇智网翻译整理,转载请标明出处