Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Tecnología Industrial

Crear un cliente C# para servidor gRPC de PLCnext Control: Guía paso a paso

La versión de firmware 2022.0 LTS introduce un servidor gRPC en dispositivos AXC F 1152 y AXC F 2152. Este servidor gRPC proporciona una forma para que las aplicaciones cliente accedan a los servicios RSC en el dispositivo PLCnext Control. Las aplicaciones cliente pueden ser:

(* el acceso remoto estará disponible desde la versión de firmware 2022.3)

La información general sobre el servidor gRPC en dispositivos PLCnext Control está disponible en el PLCnext Info Center.

Este artículo describe cómo crear una aplicación cliente gRPC simple en C#, ejecutándose en un dispositivo PLCnext Control.

Requisitos previos

El procedimiento a continuación usa:

Procedimiento

  1. Usando la página de gestión web, asegúrese de que el servicio llamado GRPC LOCAL SERVER esté activado.
  2. Cree un nuevo proyecto PLCnext Engineer para su dispositivo objetivo. Este proyecto debe tener:
    • Un programa con una variable de puerto OUT llamada AI1, de tipo INT.
    • Una instancia de ese programa llamada MainInstance1.
  3. Envíe el proyecto PLCnext Engineer al dispositivo objetivo.
  4. En Visual Studio, cree una aplicación de consola C# vacía siguiendo los pasos 1-3 del procedimiento descrito en el post anterior del Makers Blog.
  5. En la ventana Proyecto => Propiedades, establezca el marco de trabajo objetivo del proyecto en ".NET 5.0".
  6. En el Explorador de soluciones, haga clic derecho en la Solución, seleccione "Administrar paquetes NuGet para la solución...", e instale los siguientes paquetes NuGet:
    • Grpc.Tools
    • Grpc.Net.Client
    • Google.Protobuf
  7. Copie la carpeta protobuf que contiene los archivos de definición protobuf a la carpeta fuente del proyecto. Protobuf es el Lenguaje de Definición de Interfaz (IDL) usado para describir servicios gRPC.
  8. En el archivo de configuración del proyecto, añada una referencia a los archivos .proto para los servicios que se usarán en el proyecto. La sección ItemGroup de la configuración del proyecto se verá algo así:
Crear un cliente C# para servidor gRPC de PLCnext Control: Guía paso a paso
Referencia a archivos .proto en el proyecto
  1. Reemplace el contenido del archivo .cs del proyecto con este código (puede necesitar cambiar el nombre del namespace):
using System;
using System.Net;
using System.Net.Http;
using System.Net.Sockets;
using System.Threading;
using System.Threading.Tasks;
using System.IO;
using Grpc.Net.Client;
using Arp.Device.Interface.Services.Grpc;
using Arp.Plc.Gds.Services.Grpc;

namespace ConsoleApp1 {
  class Program {
    static void Main() {
      // El código para conectar a un Unix Domain Socket es de:
      // https://docs.microsoft.com/en-us/aspnet/core/grpc/interprocess?view=aspnetcore-6.0
      var udsEndPoint = new UnixDomainSocketEndPoint("/run/plcnext/grpc.sock");
      var connectionFactory = new UnixDomainSocketConnectionFactory(udsEndPoint);
      var socketsHttpHandler = new SocketsHttpHandler { ConnectCallback = connectionFactory.ConnectAsync };
      
      // Crear un canal gRPC al socket unix de PLCnext
      using var channel = GrpcChannel.ForAddress("https://localhost", new GrpcChannelOptions { HttpHandler = socketsHttpHandler });
      
      // Crear un cliente gRPC para el Servicio de Estado del Dispositivo en ese canal
      var grpc_status_client = new IDeviceStatusService.IDeviceStatusServiceClient(channel);
      
      // Crear un cliente gRPC para el Servicio de Acceso a Datos en ese canal
      var grpc_data_client = new IDataAccessService.IDataAccessServiceClient(channel);
      
      // Crear un elemento para obtener del Servicio de Estado del Dispositivo
      // Los identificadores de elementos están listados en el PLCnext Info Center:
      // https://www.plcnext.help/te/Service_Components/Remote_Service_Calls_RSC/RSC_device_interface_services.htm#IDeviceStatusService
      var item = new IDeviceStatusServiceGetItemRequest();
      item.Identifier = "Status.Board.Temperature.Centigrade";
      
      // Crear una variable para obtener del Servicio de Acceso a Datos
      var data = new IDataAccessServiceReadSingleRequest();
      data.PortName = "Arp.Plc.Eclr/MainInstance1.AI1";
      
      // Variables de respuesta
      IDeviceStatusServiceGetItemResponse grpc_status_response;
      IDataAccessServiceReadSingleResponse grpc_data_response;
      
      // Bucle infinito
      while (true) {
        // Solicitar el elemento del Servicio de Estado del Dispositivo
        grpc_status_response = grpc_status_client.GetItem(item);
        
        // Solicitar datos del Servicio de Acceso a Datos
        grpc_data_response = grpc_data_client.ReadSingle(data);
        
        // Informar los resultados
        var temperature = grpc_status_response.ReturnValue.Int8Value;
        var ai1 = grpc_data_response.ReturnValue.Value.Int16Value;
        
        Console.WriteLine("Temperatura de la placa = " + temperature + "°C");
        Console.WriteLine("MainInstance1.AI1 = " + ai1);
        
        // Esperar 1 segundo
        Thread.Sleep(1000);
      }
    }
  }
  
  public class UnixDomainSocketConnectionFactory {
    private readonly EndPoint _endPoint;
    
    public UnixDomainSocketConnectionFactory(EndPoint endPoint) {
      _endPoint = endPoint;
    }
    
    public async ValueTask<Stream> ConnectAsync(SocketsHttpConnectionContext _, CancellationToken cancellationToken = default) {
      var socket = new Socket(AddressFamily.Unix, SocketType.Stream, ProtocolType.Unspecified);
      try {
        await socket.ConnectAsync(_endPoint, cancellationToken).ConfigureAwait(false);
        return new NetworkStream(socket, true);
      }
      catch {
        socket.Dispose();
        throw;
      }
    }
  }
}
  1. En el Explorador de soluciones, haga clic derecho en la Solución y abra un Terminal.
  2. En el terminal, ejecute los siguientes comandos:
dotnet build ConsoleApp1.csproj
dotnet publish -c RELEASE -r linux-arm .\ConsoleApp1.csproj -o MyApp

... donde ConsoleApp1 es el nombre de la solución, y MyApp es el nombre del directorio de salida donde se publicará la aplicación. La aplicación también puede publicarse en modo DEBUG si se requiere.

  1. Copie el directorio de salida y todo su contenido al PLC usando (por ejemplo) scp o WinSCP.
scp -r MyApp admin@192.168.1.10:~
  1. Abra una sesión de shell en el PLC usando (por ejemplo) ssh o PuTTY.
  2. Asegúrese de que el ejecutable tenga privilegios de ejecución:
$ chmod a+x /opt/plcnext/MyApp/ConsoleApp1
  1. Ejecute la aplicación:
$ /opt/plcnext/MyApp/ConsoleApp1

La salida debería ser similar a:

Temperatura de la placa = 50°C
MainInstance1.AI1 = 0
Temperatura de la placa = 50°C
MainInstance1.AI1 = 0
Temperatura de la placa = 50°C
MainInstance1.AI1 = 0
Temperatura de la placa = 50°C
MainInstance1.AI1 = 0
  1. En PLCnext Engineer, póngase en línea y cambie el valor de la variable AI1. El valor informado por la aplicación debería cambiar.

Referencias y otros recursos

  1. .NET Core ❤ gRPC
  2. Llamar a servicios gRPC con el cliente .NET
  3. Una lista curada de recursos útiles para gRPC

Tecnología Industrial

  1. El auge de los vehículos eléctricos: cómo la creciente demanda transforma la cadena de suministro global
  2. Optimizando la Cadena de Frío para la Distribución Global de Vacunas COVID-19
  3. Logística de Bellas Artes: Revolucionando el Mercado Global del Arte
  4. Estrategias Proactivas para Navegar Próximas Disrupciones en la Cadena de Suministro
  5. Guía precisa para calcular el tamaño del banco de condensadores (µF y kVAR) para corrección del factor de potencia
  6. Definiendo la herramienta ideal de control de producción: Características clave y mejores prácticas
  7. Intel Edison IoT: Cómo Elegir el Miniordenador Ideal para tu Prototipo
  8. Desarrollar una aplicación de consola PLCnext usando C#: Guía para principiantes
  9. Metrología láser en aviación: control de calidad de precisión para fabricación de aeronaves
  10. Medición Precisa de Racores Hidráulicos: Guía Paso a Paso para Evitar Fugas
  11. Control de Velocidad de Motor Hidráulico con PWM y Control Remoto: Guía Práctica