Créer un client C# pour serveur gRPC PLCnext Control : guide étape par étape
Le firmware 2022.0 LTS introduit un serveur gRPC sur AXC F 1152 et AXC F 2152. Ce serveur permet aux applications clientes d'accéder aux services RSC sur le contrôleur PLCnext. Les applications clientes peuvent :
- Être écrites dans tout langage supportant gRPC.
- S'exécuter n'importe où – localement sur le PLCnext Control ou sur une machine distante*.
- Être hébergées dans un conteneur OCI.
(* l'accès distant sera disponible depuis le firmware 2022.3)
Informations générales sur le serveur gRPC dans le PLCnext Info Center.
Cet article décrit la création d'une application cliente gRPC simple en C#, s'exécutant sur un contrôleur PLCnext Control.
Prérequis
- AXC F 2152 avec firmware 2022.0.3 LTS ou ultérieur.
- PLCnext Engineer 2022.0.1 LTS ou ultérieur.
- Visual Studio 2019 (toute édition).
- Concepts du blog « How to create a simple PLCnext console application in C# ».
- Fichiers de définition Protobuf du serveur gRPC, dans le répertoire
protobufdu dépôt GitHub PLCnext/gRPC. - Service RSC Device Status.
- Service RSC Data Access.
Procédure
- Via l'interface Web-Based Management, activer le service GRPC LOCAL SERVER.
- Créer un projet PLCnext Engineer pour le périphérique cible avec :
- Un programme avec une variable de port OUT nommée
AI1, de type INT. - Une instance de ce programme nommée
MainInstance1.
- Un programme avec une variable de port OUT nommée
- Envoyer le projet au périphérique cible.
- Dans Visual Studio, créer une application console C# vide (étapes 1-3 du blog précédent).
- Dans les propriétés du projet, définir Target framework sur « .NET 5.0 ».
- Dans l'Explorateur de solutions, clic droit sur la solution > Gérer les packages NuGet pour la solution…, installer :
Grpc.ToolsGrpc.Net.ClientGoogle.Protobuf
- Copier le dossier
protobuf(fichiers de définition) dans le dossier source du projet. - Dans le fichier de configuration du projet (
.csproj), ajouter une référence aux fichiers.protodes services utilisés. La sectionItemGroupressemble à :
- Remplacer le contenu du fichier
.cspar le code ci-dessous (adapter le namespace si besoin) :
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() {
// Code pour se connecter à un Unix Domain Socket :
// 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 };
// Créer un canal gRPC vers le socket Unix PLCnext
using var channel = GrpcChannel.ForAddress("https://localhost", new GrpcChannelOptions { HttpHandler = socketsHttpHandler });
// Client gRPC pour le service Device Status
var grpc_status_client = new IDeviceStatusService.IDeviceStatusServiceClient(channel);
// Client gRPC pour le service Data Access
var grpc_data_client = new IDataAccessService.IDataAccessServiceClient(channel);
// Élément à lire depuis Device Status Service
// Identifiants listés dans 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";
// Variable à lire depuis Data Access Service
var data = new IDataAccessServiceReadSingleRequest();
data.PortName = "Arp.Plc.Eclr/MainInstance1.AI1";
// Variables de réponse
IDeviceStatusServiceGetItemResponse grpc_status_response;
IDataAccessServiceReadSingleResponse grpc_data_response;
// Boucle infinie
while (true) {
// Requête Device Status Service
grpc_status_response = grpc_status_client.GetItem(item);
// Requête Data Access Service
grpc_data_response = grpc_data_client.ReadSingle(data);
// Affichage résultats
var temperature = grpc_status_response.ReturnValue.Int8Value;
var ai1 = grpc_data_response.ReturnValue.Value.Int16Value;
Console.WriteLine("Board Temperature = " + temperature + "°C");
Console.WriteLine("MainInstance1.AI1 = " + ai1);
// Attente 1 seconde
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; }
}
}
- Dans l'Explorateur de solutions, clic droit sur la solution > ouvrir un Terminal.
- Dans le terminal, exécuter :
dotnet build ConsoleApp1.csproj dotnet publish -c RELEASE -r linux-arm .\ConsoleApp1.csproj -o MyApp
Où ConsoleApp1 est le nom de la solution, MyApp le répertoire de sortie. Publication possible en mode DEBUG.
- Copier le répertoire de sortie et son contenu sur le PLC (ex:
scpou WinSCP) :
scp -r MyApp admin@192.168.1.10:~
- Ouvrir une session shell sur le PLC (ssh ou PuTTY).
- Vérifier les droits d'exécution :
$ chmod a+x /opt/plcnext/MyApp/ConsoleApp1
- Exécuter l'application :
$ /opt/plcnext/MyApp/ConsoleApp1
Sortie attendue :
Board Temperature = 50°C MainInstance1.AI1 = 0 Board Temperature = 50°C MainInstance1.AI1 = 0 ...
- Dans PLCnext Engineer, passer en ligne et modifier la valeur de
AI1. La valeur rapportée par l'application doit changer.
Références et ressources
- .NET Core ❤ gRPC
- Call gRPC services with the .NET client
- Liste de ressources utiles pour gRPC
Technologie industrielle
- L'essor des véhicules électriques : comment la demande croissante redéfinit la chaîne d'approvisionnement mondiale
- Optimiser la logistique de la chaîne du froid pour la distribution du vaccin COVID-19
- Logistique des beaux-arts : révolutionner le marché mondial de l'art
- Stratégies proactives pour naviguer les perturbations à venir de la chaîne d'approvisionnement
- Guide précis pour calculer la taille d'un banc de condensateurs (µF et kVAR) pour l'amélioration du facteur de puissance
- Définir l'outil idéal de contrôle de production : Fonctionnalités clés et meilleures pratiques
- Intel Edison IoT : Choisir le Bon Mini-Ordinateur pour Votre Prototype
- Développer une application console PLCnext en C# : guide pour débutants
- Mesure précise raccords hydrauliques : Guide étape par étape