« All blog posts

SimServer How To #3: 使用OPC UA客户端模拟服务器上的数据更改

21.03.2023


««q»» 在上一篇文章:SimServer How To #2中,我们向您展示了如何通过将NodeSet导入Prosys OPC UA Simulation server并模拟实例来复制真实的OPC UA服务器。

在某些情况下,除了模拟服务器上的实例外,用户还可以根据特定模式或记录的数据来更改服务器上的值。通过这种方式,您可以模拟为服务器提供数据的物理系统;比如机器人或其他工厂车间设备。

目前,我们的模拟服务器没有用于此任务的内置功能。为此,我们在这里为您介绍两种可行的解决方案:

  1. 使用Prosys OPC UA Browser手动更改值。.
  2. 使用Prosys OPC UA SDK for Java创建您自己的OPC UA客户端,以自动更改服务器上的值。.

这两个教程都可以作为独立的示例使用,因为您可以使用Prosys OPC UA Simulation Server的免费新安装版本。如果您想从上一教程继续,您将需要专业版。

使用Prosys OPC UA Browser手动更改值

对于这一部分,您将需要以下产品:

  • Prosys OPC UA Simulation Server
    • 免费版本对于一个简单的例子来说已经足够了
    • 您需要专业版才能继续使用上一教程中的示例。如果您还没有专业版许可证,您可以联系我们的销售团队来获得评估许可证。
  • Prosys OPC UA Browser

注意:_ 要继续使用免费版的Simulation Server,请跳过步骤5-8。

  1. 请确保您的服务器正在运行。

  2. 复制连接地址。(这是可选的;您也可以手动键入服务器的地址。)

    复制服务器的连接地址

    复制服务器的连接地址
  3. 启动Prosys OPC UA Browser并将连接地址粘贴到顶部的地址栏中。按Enter键或单击在地址栏的右侧的箭头 (→) 建立连接。

  4. 定义您的首选安全设置。当使用Simulation Server进行测试时,我们可以使用 None 和 Anonymous,但这些不是真正的OPC UA通信的推荐设置。

    定义安全设置

    定义安全设置
  5. 浏览地址空间以查找要更改其值的变量。我们在上一个教程中更改了灯光输出变量,所以让我们再次使用这些变量。我们选择Objects > PLC_1 > Outputs > RedLight。找到一个 AccessLevel 属性为CurrentWrite的变量至关重要的,因为这意味着您可以为该变量写入值。

    查找具有CurrentWrite的变量节点

    查找具有CurrentWrite的变量节点
  6. 右键单击所选变量,然后选择Write Value。

    将值写入所选变量

    将值写入所选变量
  7. 在 Write Value 对话框中,可以为变量设置一个新值。由于 RedLight 是一个布尔变量,我们只能写 True 或 False,这取决于它的当前值。勾选值框以写入 True,然后单击写入。如果写入成功,对话框将关闭,并且该变量的新值应该可见。

    设置要写入的新值

    设置要写入的新值
  8. 如果右键单击变量并选择 Monitor Data,则可以观察该值的变化。通过勾选 Data view 右侧的Graph选项,可以查看在图形中绘制的值。这就是RedLight在写了几次之后的图形。

    更改后的Redlight

    更改后的Redlight
  9. 让我们尝试一个更令人兴奋的例子。选择 Objects > MyObjects > MyDevice > MyLevel。右键单击并选择Write Value。

    查找 MyLevel

    查找 MyLevel
  10. 从DataType中,我们可以看到这个变量有两个值,所以我们可以为这个变量写值。我们将写100,然后单击Write。

    为MyLevel设置新值

    为MyLevel设置新值
  11. MyLevel是一个具有模拟值的变量,因此它会由服务器更新。我们仍然可以向它写入新的值,下图显示了这是如何更改模拟值的。

    更改后MyLevel的图形

    更改后MyLevel的图形

使用Prosys OPC UA SDK for Java创建您自己的OPC UA客户端,以自动更改服务器上的值

对于这一部分,您将需要以下产品:

  • Prosys OPC UA Simulation Server
    • 免费版本对于一个简单的例子来说已经足够了。
    • 您需要专业版才能继续使用上一教程中的示例。如果您还没有评估许可证,可以联系我们的销售团队获得评估许可证。
  • Prosys OPC UA SDK for Java
    • 您可以通过我们的下载申请表获得本教程所用的SDK的免费评估许可证。
    • 要遵循本教程,您必须首先设置您的SDK开发环境。按照您可以在产品下载页面上找到的Prosys OPC UA SDK for Java Starting Guide进行操作。
  • Prosys OPC UA Browser
    • 这不是必需的,但您可以轻松地监视更新的值。
  • Eclipse或其他Java开发环境

注意:如果使用的是免费版本的Simulation Server,请跳过步骤11-13。

  1. 确保您的SDK for Java已准备好进行开发。按照您可以在产品下载页面上找到的Prosys OPC UA SDK for Java Starting Guide进行正确设置。

  2. 启动服务器并在Address Space视图中浏览地址空间,然后找到有关要写入的变量的以下详细信息:

    • NamespaceIndex (a)
    • NodeId的标识符的字符串值(b)

    NamespaceIndex和变量的标识符

    NamespaceIndex和变量的标识符
  3. 在本教程中,我们选择了两个变量并了解了它们的详细信息:

    • Objects > MyObjects > MyDevice > MyLevel
      • NamespaceIndex: 6
      • NodeId’s Identifier: MyLevel

    MyLevel的NodeId

    MyLevel的NodeId
    • Objects > PLC_1 > Outputs > RedLight
      • NamespaceIndex: 8
      • NodeId’s Identifier: “RedLight” (请注意,双引号也必须出现在代码中!)

    Redlight节点Id

    Redlight节点Id
  4. 转到Eclipse和您已经设置好的项目。

    Eclipse中的SDK项目

    Eclipse中的SDK项目
  5. 右键单击com.prosysopc.ua.samples.client 包,然后选择“新建”>“类”添加一个新类。

    创建一个新类

    创建一个新类
  6. 为新类指定一个名称,然后单击“完成”。我们将类命名为SimpleClient。

    命名新类

    命名新类
  7. 将以下代码块粘贴到您的类中。

    首先,为您的Class导入:

      import java.io.IOException;
      import java.net.UnknownHostException;
      import java.util.Locale;
      import com.prosysopc.ua.ApplicationIdentity;
      import com.prosysopc.ua.SecureIdentityException;
      import com.prosysopc.ua.client.UaClient;
      import com.prosysopc.ua.stack.builtintypes.DataValue;
      import com.prosysopc.ua.stack.builtintypes.LocalizedText;
      import com.prosysopc.ua.stack.builtintypes.NodeId;
      import com.prosysopc.ua.stack.builtintypes.UnsignedInteger;
      import com.prosysopc.ua.stack.core.ApplicationDescription;
      import com.prosysopc.ua.stack.core.ApplicationType;
      import com.prosysopc.ua.stack.transport.security.SecurityMode;
    

    类内部的其余代码:

      public static void main(String[] args) throws Exception {
         UaClient client = new UaClient("opc.tcp://localhost:53530/OPCUA/SimulationServer");
    
         // 这些是用户需要更改的变量,默认变量可以用来测试代码的工作方式。
         NodeId writeTestNodeId = new NodeId(6, "MyLevel");
         int sleeptime = 1000;
         Double[] writeValues = {-1.0, -3.0, -5.0, -7.0, -9.0};
    
         client.setSecurityMode(SecurityMode.NONE);
         initialize(client);
         client.connect();
         DataValue value;
    
         // 简单循环,遍历要写入变量的预定值列表
         for (int i = 0; i < writeValues.length; i++) {
            // valueOf(13)是硬编码的,因为它是value属性的attributeId。
            client.writeAttribute(writeTestNodeId, UnsignedInteger.valueOf(13), writeValues[i], true);
            value = client.readValue(writeTestNodeId);
            System.out.println(value.getValue()); // Prints the values that were written
            Thread.sleep(sleeptime);
         }
         client.disconnect();
      }
    
      protected static void initialize(UaClient client) throws SecureIdentityException, IOException, UnknownHostException {
         ApplicationDescription appDescription = new ApplicationDescription();
         appDescription.setApplicationName(new LocalizedText("SimpleClient", Locale.ENGLISH));
         appDescription.setApplicationUri("urn:localhost:UA:SimpleClient");
         appDescription.setProductUri("urn:prosysopc.com:UA:SimpleClient");
         appDescription.setApplicationType(ApplicationType.Client);
         final ApplicationIdentity identity = new ApplicationIdentity();
         identity.setApplicationDescription(appDescription);
         client.setApplicationIdentity(identity);
      }
    
  8. 上面的代码有几个关键部分,所以让我们仔细研究一下。

    函数initialize()用于初始化客户端。如果您没有将类命名为“SimpleClient”,则必须修改以下行以匹配您的类名:

      appDescription.setApplicationName(new LocalizedText("SimpleClient", Locale.ENGLISH));
      appDescription.setApplicationUri("urn:localhost:UA:SimpleClient");
      appDescription.setProductUri("urn:prosysopc.com:UA:SimpleClient");
    

    此行创建一个用于连接到服务器的客户端。URL应该是服务器的连接地址。

      UaClient client = new UaClient("opc.tcp://localhost:53530/OPCUA/SimulationServer");
    

    下面的行中我们要设置更新值的变量。这就是我们需要在步骤2和3中找到的NamespaceIndex和Identifier的地方。

      NodeId writeTestNodeId = new NodeId(6, "MyLevel");
    

    由于MyLevel的数据类型是double,因此我们可以创建一个将逐个写入变量的值列表。您还可以从文件中为此检索值列表。

      Double[] writeValues = {-1.0, -3.0, -5.0, -7.0, -9.0};
    

    最后,这一行用于将值写入服务器:

      client.writeAttribute(writeTestNodeId, UnsignedInteger.valueOf(13), writeValues[i], true);
    
  9. 右键单击您的类,然后选择Run As > Java Application。

    运行Java应用程序

    运行Java应用程序
  10. 代码应该在控制台上运行并打印写入的值。

    控制台输出

    控制台输出
  11. 现在我们可以向RedLight写入值。修改NodeId和值列表,使其适合具有布尔值的变量。

    新的代码行如下所示:

      NodeId writeTestNodeId = new NodeId(8, "\"RedLight\"");
    
      Boolean[] writeValues = {false, true, false, true, false, true};
    
  12. 再次运行客户端应用程序(步骤9)并观察控制台。

  13. 如果运行Browser并监视变量,则可以看到更改的值。

    所有更改后的Redlight图

    所有更改后的Redlight图

下一步

在本文中,我们向您展示了在OPC UA服务器上对变量写入值的两种方法。SDK for Java使您能够做更多的事情,因此,如果您有兴趣了解更多关于编写自己的OPC UA客户端的信息,我们建议您查看SDK下载附带的教程和示例文件。

如果您想开始开发自己的客户端或服务器,但感到困惑并需要更多详细信息,请随时通过电子邮件sales@prosysopc.com联系我们寻求帮助或通过我们的网站联系表格。我们提供研讨会和其他材料帮助您开始。

Kaisa Voutilainen

Kaisa Hirvola

Creative Engineer

Email:kaisa.hirvola@prosysopc.com

Tags: OPC UA, Simulation Server, Guides

comments powered by Disqus

Prosys OPC Ltd

Prosys OPC是OPC和OPC UA软件领域中拥有20年技术经验的行业佼佼者。 OPC和OPC UA(Unified Architecture)是工业和高科技公司使用的通信标准。

了解更多关于我们的信息 »

最新博客文章

SimServer How To #3: 使用OPC UA客户端模拟服务器上的数据更改

关于如何使用OPC UA客户端在OPC UA服务器上写入新数据的分步教程(分为两部分)。

如何在生产分析项目中取得成功

工业4.0分析项目将在未来几年内成为显著增长的业务。阅读如何绕过最常见的陷阱以及成功交付项目。

Prosys OPC UA Forge为什么是工业4.0工厂的重要组成部分

如今,边缘计算应用程序提供了比OPC UA聚合服务器更广泛的功能。事实上,它是工业4.0工厂的主要组成部分。"

查看所有博客文章 »

-->