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

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 :

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

Procédure

  1. Via l'interface Web-Based Management, activer le service GRPC LOCAL SERVER.
  2. 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.
  3. Envoyer le projet au périphérique cible.
  4. Dans Visual Studio, créer une application console C# vide (étapes 1-3 du blog précédent).
  5. Dans les propriétés du projet, définir Target framework sur « .NET 5.0 ».
  6. Dans l'Explorateur de solutions, clic droit sur la solution > Gérer les packages NuGet pour la solution…, installer :
    • Grpc.Tools
    • Grpc.Net.Client
    • Google.Protobuf
  7. Copier le dossier protobuf (fichiers de définition) dans le dossier source du projet.
  8. Dans le fichier de configuration du projet (.csproj), ajouter une référence aux fichiers .proto des services utilisés. La section ItemGroup ressemble à :
Créer un client C# pour serveur gRPC PLCnext Control : guide étape par étape
  1. Remplacer le contenu du fichier .cs par 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; }
}
}
  1. Dans l'Explorateur de solutions, clic droit sur la solution > ouvrir un Terminal.
  2. 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.

  1. Copier le répertoire de sortie et son contenu sur le PLC (ex: scp ou WinSCP) :
scp -r MyApp admin@192.168.1.10:~
  1. Ouvrir une session shell sur le PLC (ssh ou PuTTY).
  2. Vérifier les droits d'exécution :
$ chmod a+x /opt/plcnext/MyApp/ConsoleApp1
  1. Exécuter l'application :
$ /opt/plcnext/MyApp/ConsoleApp1

Sortie attendue :

Board Temperature = 50°C
MainInstance1.AI1 = 0
Board Temperature = 50°C
MainInstance1.AI1 = 0
...
  1. 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

  1. .NET Core ❤ gRPC
  2. Call gRPC services with the .NET client
  3. Liste de ressources utiles pour gRPC

Technologie industrielle

  1. L'essor des véhicules électriques : comment la demande croissante redéfinit la chaîne d'approvisionnement mondiale
  2. Optimiser la logistique de la chaîne du froid pour la distribution du vaccin COVID-19
  3. Logistique des beaux-arts : révolutionner le marché mondial de l'art
  4. Stratégies proactives pour naviguer les perturbations à venir de la chaîne d'approvisionnement
  5. Guide précis pour calculer la taille d'un banc de condensateurs (µF et kVAR) pour l'amélioration du facteur de puissance
  6. Définir l'outil idéal de contrôle de production : Fonctionnalités clés et meilleures pratiques
  7. Intel Edison IoT : Choisir le Bon Mini-Ordinateur pour Votre Prototype
  8. Développer une application console PLCnext en C# : guide pour débutants
  9. Mesure précise raccords hydrauliques : Guide étape par étape