El cliente OPC UA implementado por Milo se conecta y se suscribe al servidor de simulación Prosys OPC UA Simulation Server

fondo

Anteriormente, configuramos un PLCentorno de simulación local, KEPServerEX6leímos PLClos datos y finalmente lo usamos UAExpertcomo OPCcliente para completar KEPServerEX6las funciones de suscripción y lectura de datos desde este servidor OPC: SpringBoot integra la biblioteca Milo para realizar el cliente OPC UA: conectar, atravesar nodos, leer, escribir, suscribirse y suscribirse por lotes .

Tenga en cuenta que si solo necesita probar OPC UAlas funciones del cliente en el trabajo real, Duck no necesita crear un PLCentorno de simulación local, sino que utiliza algunas OPC UAherramientas de simulación del lado del servidor. En este artículo, utilizaremos Prosys OPC UA Simulation Servercomo OPC UAservidor y OPC UAnos conectaremos al OPC UAservidor simulado a través del cliente que implementamos anteriormente, a saber:

El cliente conectado al servidor simulado a través de Milola implementación .OPC UAProsys OPC UA Simulation ServerOPC UA

Descargar e instalar: Servidor de simulación Prosys OPC UA

https://downloads.prosysopc.com/opc-ua-simulation-server-downloads.php

Simular servidor OPC UA

Después de hacer doble clic para iniciar Prosys OPC UA Simulation Server, la página de inicio muestra la información de la dirección del servidor.

2023-04-16-Inicio.jpg

Si necesita modificar la dirección de conexión predeterminada, puede Endpointsconfigurarla a través del menú (aquí uso la dirección predeterminada).

2023-04-16-Puntos finales.jpg

En Objectsel menú, puede ver que Prosys OPC UA Simulation Serverviene con contador, número aleatorio, diagrama de escalera, onda de diente de sierra, onda sinusoidal, onda triangular y otros nodos de forma predeterminada, que se pueden OPC UAleer y probar a través del cliente.

2023-04-16-Objetos.jpg

Prueba de cliente OPC UA basada en Milo

Como ejemplo, lo siguiente completa la operación con el servidor simulado conectándose al servidor (conexión anónima) , leyendo el valor del nodo especificado y suscribiéndose al nodo especificado .Prosys OPC UA Simulation ServerOPC UA

Antes de la prueba de codificación real, puede usar UAExpertcomo OPCcliente para completar las funciones de lectura y suscripción de datos desde el servidor simulado y, de paso, aclarar NodeIdla información a continuación nuevamente.

2023-04-16-UAExperto.jpg

public class OpcUaStart {
    
    
    public void start() throws Exception {
    
    
        OpcUaClientService opcUaClientService = new OpcUaClientService();

        // 与OPC UA服务端建立连接,并返回客户端实例
        OpcUaClient client = opcUaClientService.connectOpcUaServer("你的机器名称", "53530", "/OPCUA/SimulationServer");

        // 两种方式定义节点
        NodeId nodeId = new NodeId(3, 1002); // 注意第2个参数类型为数字
//        NodeId nodeId = NodeId.parse("ns=3;i=1002"); // 通过parse静态方法定义

        // 读取指定节点的值
        opcUaClientService.readNodeValue(client, nodeId);

        // 订阅指定节点
        opcUaClientService.subscribe(client, nodeId);
    }
}

Los resultados de la prueba son los siguientes:
2023-04-16-Resultado.jpg

Posibles problemas

Prosys OPC UA Simulation Server¿ No hay Endpointsmenú en la interfaz?

Solución: si no hay un menú Prosys OPC UA Simulation Serveren la interfaz , puede cambiarlo a través del menú en la esquina superior izquierda.EndpointsOptionsSwitch to Expert Mode

2023-04-16-Opciones.jpg

¿Cómo un cliente OPC UA implementado basado en Milo lee y se suscribe a Prosys OPC UA Simulation Serverlos datos del nodo en ?

StatusCode{name=Bad_NodeIdUnknown, valor=0x80340000, calidad=mala}

2023-04-16-Cursor.jpg

Análisis de la razón: De acuerdo con el indicador de estado, combinado con nuestra implementación de lectura de datos del nodo: readNodeValuelos parámetros clave del método son: int namespaceIndex, String identifier. Cuando se conecta KEPServera y Milo Serverantes , identifierel tipo es ambos String, y se puede leer normalmente, pero Prosys OPC UA Simulation Serverdespués de conectarse a, no se puede leer. intDespués de intentar cambiar directamente al tipo, la lectura es exitosa.

Solución:

Método 1: cambie el parámetro readNodeValuedel método a , es decir, use el tipo de número entero al pasar el parámetro, lo que se puede realizar agregando un método sobrecargado.String identifierint identifier

public void readNodeValue(OpcUaClient client, int namespaceIndex, int identifier)

Método 2: modifique readNodeValueel método para recibir directamente NodeIdel tipo, que se puede definir de varias maneras en este momento NodeId, y NodeIdse proporcionan varios métodos de sobrecarga y análisis.

public void readNodeValue(OpcUaClient client, NodeId nodeId)

// 方式1:构造方法定义NodeId,注意第2个参数类型为数字
NodeId nodeId = new NodeId(3, 1002); 

// 方式2:静态解析定义NodeId
NodeId nodeId = NodeId.parse("ns=3;i=1002");

Nota: Método 2: Analizar y definir estáticamente NodeId . Este método es lo que aprendí de la pregunta y respuesta basada en GPT-4el modelo grande : la primera experiencia de programación de cursores, equipado con el modelo grande GPT-4, su asistente de IA, la programación en lenguaje natural está aquí .Cursor

2023-04-15-MiloResultado.jpg

Referencia

Prosys_OPC_UA_Simulation_Server_UserManual Manual de usuario

Código fuente

https://github.com/heartsuit/demo-spring-boot/tree/master/springboot-opcua


Si tiene alguna pregunta o se encuentra algún error, no dude en ponerse en contacto conmigo.

¡Tus comentarios y sugerencias son bienvenidos!

Supongo que te gusta

Origin blog.csdn.net/u013810234/article/details/130189271
Recomendado
Clasificación