« 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进行测试时,我们可以使用 NoneAnonymous,但这些不是真正的OPC UA通信的推荐设置。

    定义安全设置

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

    查找具有CurrentWrite的变量节点

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

    将值写入所选变量

    将值写入所选变量
  7. Write Value 对话框中,可以为变量设置一个新值。由于 RedLight 是一个布尔变量,我们只能写 TrueFalse,这取决于它的当前值。勾选值框以写入 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中找到的NamespaceIndexIdentifier的地方。

      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工厂的主要组成部分。"

查看所有博客文章 »

-->