fondo
Anteriormente, configuramos un PLC
entorno de simulación local, KEPServerEX6
leímos PLC
los datos y finalmente lo usamos UAExpert
como OPC
cliente para completar KEPServerEX6
las 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 UA
las funciones del cliente en el trabajo real, Duck no necesita crear un PLC
entorno de simulación local, sino que utiliza algunas OPC UA
herramientas de simulación del lado del servidor. En este artículo, utilizaremos Prosys OPC UA Simulation Server
como OPC UA
servidor y OPC UA
nos conectaremos al OPC UA
servidor simulado a través del cliente que implementamos anteriormente, a saber:
El cliente conectado al servidor simulado a través de
Milo
la implementación .OPC UA
Prosys OPC UA Simulation Server
OPC 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.
Si necesita modificar la dirección de conexión predeterminada, puede Endpoints
configurarla a través del menú (aquí uso la dirección predeterminada).
En Objects
el menú, puede ver que Prosys OPC UA Simulation Server
viene 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 UA
leer y probar a través del cliente.
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 Server
OPC UA
Antes de la prueba de codificación real, puede usar UAExpert
como OPC
cliente para completar las funciones de lectura y suscripción de datos desde el servidor simulado y, de paso, aclarar NodeId
la información a continuación nuevamente.
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:
Posibles problemas
Prosys OPC UA Simulation Server
¿ No hay Endpoints
menú en la interfaz?
Solución: si no hay un menú Prosys OPC UA Simulation Server
en la interfaz , puede cambiarlo a través del menú en la esquina superior izquierda.Endpoints
Options
Switch to Expert Mode
¿Cómo un cliente OPC UA implementado basado en Milo lee y se suscribe a Prosys OPC UA Simulation Server
los datos del nodo en ?
StatusCode{name=Bad_NodeIdUnknown, valor=0x80340000, calidad=mala}
Análisis de la razón: De acuerdo con el indicador de estado, combinado con nuestra implementación de lectura de datos del nodo: readNodeValue
los parámetros clave del método son: int namespaceIndex
, String identifier
. Cuando se conecta KEPServer
a y Milo Server
antes , identifier
el tipo es ambos String
, y se puede leer normalmente, pero Prosys OPC UA Simulation Server
después de conectarse a, no se puede leer. int
Después de intentar cambiar directamente al tipo, la lectura es exitosa.
Solución:
Método 1: cambie el parámetro readNodeValue
del 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 identifier
int identifier
public void readNodeValue(OpcUaClient client, int namespaceIndex, int identifier)
Método 2: modifique readNodeValue
el método para recibir directamente NodeId
el tipo, que se puede definir de varias maneras en este momento NodeId
, y NodeId
se 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-4
el 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
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!