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:
- Escritas en cualquier lenguaje que soporte gRPC.
- Ejecutadas en cualquier lugar - localmente en el dispositivo PLCnext Control, o en una máquina remota*.
- Alojadas en un contenedor OCI.
(* 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:
- AXC F 2152 ejecutando firmware versión 2022.0.3 LTS o posterior.
- PLCnext Engineer versión 2022.0.1 LTS o posterior.
- Visual Studio 2019 (cualquier edición).
- Los conceptos introducidos en este post del Makers Blog: Cómo crear una aplicación de consola PLCnext simple en C#
- Archivos de definición Protobuf para el servidor gRPC, en el directorio protobuf del repositorio PLCnext/gRPC en Github.
- El servicio RSC Device Status.
- El servicio RSC Data Access.
Procedimiento
- Usando la página de gestión web, asegúrese de que el servicio llamado GRPC LOCAL SERVER esté activado.
- 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.
- Envíe el proyecto PLCnext Engineer al dispositivo objetivo.
- 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.
- En la ventana Proyecto => Propiedades, establezca el marco de trabajo objetivo del proyecto en ".NET 5.0".
- 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
- 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.
- 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í:
- 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;
}
}
}
}
- En el Explorador de soluciones, haga clic derecho en la Solución y abra un Terminal.
- 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.
- 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:~
- Abra una sesión de shell en el PLC usando (por ejemplo) ssh o PuTTY.
- Asegúrese de que el ejecutable tenga privilegios de ejecución:
$ chmod a+x /opt/plcnext/MyApp/ConsoleApp1
- 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
- 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
- .NET Core ❤ gRPC
- Llamar a servicios gRPC con el cliente .NET
- Una lista curada de recursos útiles para gRPC
Tecnología Industrial
- El auge de los vehículos eléctricos: cómo la creciente demanda transforma la cadena de suministro global
- Optimizando la Cadena de Frío para la Distribución Global de Vacunas COVID-19
- Logística de Bellas Artes: Revolucionando el Mercado Global del Arte
- Estrategias Proactivas para Navegar Próximas Disrupciones en la Cadena de Suministro
- Guía precisa para calcular el tamaño del banco de condensadores (µF y kVAR) para corrección del factor de potencia
- Definiendo la herramienta ideal de control de producción: Características clave y mejores prácticas
- Intel Edison IoT: Cómo Elegir el Miniordenador Ideal para tu Prototipo
- Desarrollar una aplicación de consola PLCnext usando C#: Guía para principiantes
- Metrología láser en aviación: control de calidad de precisión para fabricación de aeronaves
- Medición Precisa de Racores Hidráulicos: Guía Paso a Paso para Evitar Fugas
- Control de Velocidad de Motor Hidráulico con PWM y Control Remoto: Guía Práctica