Comment créer un client pour le serveur PLCnext Control gRPC en C#
La version 2022.0 LTS du micrologiciel introduit un serveur gRPC sur les appareils AXC F 1152 et AXC F 2152. Ce serveur gRPC permet aux applications clientes d'accéder aux services RSC sur l'équipement PLCnext Control. Les applications clientes peuvent être :
- Écrit dans n'importe quel langage prenant en charge gRPC.
- Exécuter n'importe où :localement sur l'appareil PLCnext Control ou sur une machine distante*.
- Hébergé dans un conteneur OCI.
(* l'accès à distance sera disponible à partir de la version 2022.3 du firmware)
Des informations générales sur le serveur gRPC dans les équipements PLCnext Control sont disponibles dans le PLCnext Info Center.
Cet article décrit comment créer une application client gRPC simple en C#, s'exécutant sur un appareil PLCnext Control.
Prérequis
La procédure ci-dessous utilise :
- AXC F 2152 exécutant la version de micrologiciel 2022.0.3 LTS ou ultérieure.
- PLCnext Engineer version 2022.0.1 LTS ou ultérieure.
- Visual Studio 2019 (toute édition).
- Les concepts présentés dans cet article du Makers Blog :comment créer une application console PLCnext simple en C#
- Fichiers de définition Protobuf pour le serveur gRPC, dans le répertoire protobuf du référentiel PLCnext/gRPC Github.
- Le service RSC d'état de l'appareil.
- Le service RSC d'accès aux données.
Procédure
1. À l'aide de la page Web de gestion, assurez-vous que le service nommé GRPC LOCAL SERVER est activé.
2. Créez un nouveau projet PLCnext Engineer pour votre équipement cible. Ce projet doit avoir :
- Un programme avec une variable de port OUT appelée AI1, de type INT.
- Une instance de ce programme appelée MainInstance1.
3. Envoyez le projet PLCnext Engineer à l'équipement cible.
4. Dans Visual Studio, créez une application de console C# vide en suivant les étapes 1 à 3 de la procédure décrite dans le précédent article du blog Makers.
5. Dans la fenêtre Projet => Propriétés, définissez le framework cible du projet sur ".NET 5.0".
6. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur la solution, sélectionnez « Gérer les packages NuGet pour la solution… » et installez les packages NuGet suivants :
- Grpc.Tools
- Grpc.Net.Client
- Google.Protobuf
7. Copiez le dossier protobuf contenant les fichiers de définition protobuf dans le dossier source du projet. Protobuf est le langage de définition d'interface (IDL) utilisé pour décrire les services gRPC.
8. Dans le fichier de configuration du projet, ajoutez une référence au(x) fichier(s) .proto pour les services qui seront utilisés dans le projet. La section ItemGroup de la configuration du projet ressemblera désormais à ceci :
9. Remplacez le contenu du fichier .cs du projet par ce code (vous devrez peut-être modifier le nom de l'espace de noms) :
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() { // The code to connect to a Unix Domain Socket is from: // 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 }; // Create a gRPC channel to the PLCnext unix socket using var channel = GrpcChannel.ForAddress("http://localhost", new GrpcChannelOptions { HttpHandler = socketsHttpHandler }); // Create a gRPC client for the Device Status Service on that channel var grpc_status_client = new IDeviceStatusService.IDeviceStatusServiceClient(channel); // Create a gRPC client for the Data Access Service on that channel var grpc_data_client = new IDataAccessService.IDataAccessServiceClient(channel); // Create an item to get from the Device Status Service // Item identifiers are listed in the 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"; // Create a variable to get from the Data Access Service var data = new IDataAccessServiceReadSingleRequest(); data.PortName = "Arp.Plc.Eclr/MainInstance1.AI1"; // Response variables IDeviceStatusServiceGetItemResponse grpc_status_response; IDataAccessServiceReadSingleResponse grpc_data_response; // Endless loop while (true) { // Request the item from the Device Status Service grpc_status_response = grpc_status_client.GetItem(item); // Request data from the Data Access Service grpc_data_response = grpc_data_client.ReadSingle(data); // Report the results 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); // Wait for 1 second 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; } } } }
10. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur la solution et ouvrez un terminal.
11. Dans le terminal, exécutez les commandes suivantes :
dotnet build ConsoleApp1.csproj dotnet publish -c RELEASE -r linux-arm .\ConsoleApp1.csproj -o MyApp
… où ConsoleApp1 est le nom de la solution, et MyApp est le nom du répertoire de sortie où l'application sera publiée. L'application peut également être publiée en mode DEBUG si nécessaire.
12. Copiez le répertoire de sortie et tout son contenu dans l'automate en utilisant (par exemple) scp ou WinSCP.
scp -r MyApp [email protected]:~
13. Ouvrez une session shell sur l'automate en utilisant (par exemple) ssh ou PuTTY.
14. Assurez-vous que l'exécutable dispose des privilèges d'exécution :
$ chmod a+x /opt/plcnext/MyApp/ConsoleApp1
15. Exécutez l'application :
$ /opt/plcnext/MyApp/ConsoleApp1
Le résultat devrait ressembler à :
Board Temperature = 50°C MainInstance1.AI1 = 0 Board Temperature = 50°C MainInstance1.AI1 = 0 Board Temperature = 50°C MainInstance1.AI1 = 0 Board Temperature = 50°C MainInstance1.AI1 = 0
16. Dans PLCnext Engineer, passez en ligne et modifiez la valeur de la variable AI1. La valeur rapportée par l'application devrait changer.
Références et autres ressources
1. .NET Core ❤ gRPC
2. Appelez les services gRPC avec le client .NET
3. Une liste organisée de ressources utiles pour gRPC
Technologie industrielle
- Impact de la demande de véhicules électriques sur la chaîne d'approvisionnement
- Comment préparer la chaîne du froid pour les demandes de vaccins COVID-19
- Comment la logistique des beaux-arts change le marché de l'art pour de bon
- Comment se préparer à la prochaine interruption de la chaîne d'approvisionnement
- Comment calculer la taille de condensateur appropriée en µ-Farads et kVAR pour l'amélioration du P.F
- A quoi doit ressembler l'outil idéal de contrôle de production ?
- Intel Edison IoT :comment choisir Intel Edison pour votre prototype IoT
- Comment créer une application console PLCnext simple en C#
- Comment mesurer le raccord hydraulique dont j'ai besoin ?