Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Technologie industrielle

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 :

(* 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 :

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 :

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 :

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

  1. Impact de la demande de véhicules électriques sur la chaîne d'approvisionnement
  2. Comment préparer la chaîne du froid pour les demandes de vaccins COVID-19
  3. Comment la logistique des beaux-arts change le marché de l'art pour de bon
  4. Comment se préparer à la prochaine interruption de la chaîne d'approvisionnement
  5. Comment calculer la taille de condensateur appropriée en µ-Farads et kVAR pour l'amélioration du P.F
  6. A quoi doit ressembler l'outil idéal de contrôle de production ?
  7. Intel Edison IoT :comment choisir Intel Edison pour votre prototype IoT
  8. Comment créer une application console PLCnext simple en C#
  9. Comment mesurer le raccord hydraulique dont j'ai besoin ?