Openness API:读取PLC IP地址

IP地址并非作为直接设备属性公开——您必须通过设备的层次结构通过NetworkInterface功能访问它。

Openness API:读取PLC IP地址
AI模型价格对比 | AI工具导航 | ONNX模型库 | Vibe Coding教程 | PLC在线仿真器 | Tripo 3D | Meshy AI | ElevenLabs | KlingAI | ArtSpace | Phot.AI | InVideo

西门子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集合。要访问网络参数:

  1. 遍历Device.DeviceItems以查找网络接口组件
  2. 查询IEngineeringServiceProvider.GetService<NetworkInterface>()
  3. 访问NetworkInterface.Nodes[0]以获取第一个接口
  4. 使用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]——动态迭代
  • 可用属性包括:AddressSubnetMaskDefaultGateway
  • 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)来浏览完整的对象模型:

  1. 在TIA Portal中打开您的项目
  2. 启动TIA Openness Explorer
  3. 浏览到您的设备 → 网络接口 → 节点
  4. 通过GetAttributeInfos()查看所有可用属性

并非所有属性都可在所有设备上读取。某些PROFINET接口可能会根据硬件配置返回某些属性的null值。

6、替代方案:通过拓扑视图手动导出

对于不需要编程的一次性导出:

  1. 在TIA Portal中打开拓扑视图
  2. 展开拓扑数据面板(垂直菜单,右侧)
  3. 右键单击列标题 → 显示/隐藏
  4. 勾选IP地址
  5. 所有设备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

汇智网翻译整理,转载请标明出处