Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Industrietechnik

C#-Client für PLCnext Control gRPC-Server erstellen: Schritt-für-Schritt-Anleitung

Firmware-Version 2022.0 LTS führt einen gRPC-Server auf AXC F 1152 und AXC F 2152 Geräten ein. Dieser gRPC-Server ermöglicht Client-Anwendungen den Zugriff auf RSC-Dienste auf dem PLCnext Control-Gerät. Die Client-Anwendungen können:

(* Remote-Zugriff ab Firmware-Version 2022.3 verfügbar)

Allgemeine Informationen zum gRPC-Server in PLCnext Control-Geräten finden Sie im PLCnext Info Center.

In diesem Artikel wird beschrieben, wie eine einfache gRPC-Client-Anwendung in C# erstellt wird, die auf einem PLCnext Control-Gerät läuft.

Voraussetzungen

Das folgende Verfahren verwendet:

Vorgehensweise

  1. Über die webbasierte Verwaltungsseite sicherstellen, dass der Dienst „GRPC LOCAL SERVER“ aktiviert ist.
  2. Ein neues PLCnext Engineer-Projekt für das Zielgerät erstellen. Dieses Projekt sollte Folgendes enthalten:
    • Ein Programm mit einer OUT-Portvariablen namens AI1 vom Typ INT.
    • Eine Instanz dieses Programms namens MainInstance1.
  3. Das PLCnext Engineer-Projekt an das Zielgerät senden.
  4. In Visual Studio eine leere C#-Konsolenanwendung erstellen, indem Sie Schritte 1-3 des Verfahrens aus dem früheren Maker's Blog Post befolgen.
  5. Im Projekt-Eigenschaften-Fenster das Target Framework auf „.NET 5.0“ setzen.
  6. Im Solution Explorer mit Rechtsklick auf die Solution „NuGet-Pakete für Solution verwalten…“ auswählen und folgende NuGet-Pakete installieren:
    • Grpc.Tools
    • Grpc.Net.Client
    • Google.Protobuf
  7. Den protobuf-Ordner mit den Protobuf-Definitionsdateien in den Projektquellordner kopieren. Protobuf ist die Interface Definition Language (IDL), die zur Beschreibung von gRPC-Diensten verwendet wird.
  8. In der Projektkonfigurationsdatei einen Verweis auf die .proto-Datei(en) für die im Projekt verwendeten Dienste hinzufügen. Der ItemGroup-Abschnitt der Projektkonfiguration sieht nun etwa so aus:
C#-Client für PLCnext Control gRPC-Server erstellen: Schritt-für-Schritt-Anleitung
  1. Den Inhalt der Projekt-.cs-Datei durch folgenden Code ersetzen (Namespace ggf. anpassen):
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 für Verbindung zu Unix Domain Socket von:
  // 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 };
  // gRPC-Kanal zum PLCnext Unix Socket erstellen
  using var channel = GrpcChannel.ForAddress("https://localhost", new GrpcChannelOptions { HttpHandler = socketsHttpHandler });
  // gRPC-Client für Device Status Service auf diesem Kanal erstellen
  var grpc_status_client = new IDeviceStatusService.IDeviceStatusServiceClient(channel);
  // gRPC-Client für Data Access Service auf diesem Kanal erstellen
  var grpc_data_client = new IDataAccessService.IDataAccessServiceClient(channel);
  // Item für Device Status Service erstellen
  // Item-Identifikatoren sind im PLCnext Info Center aufgelistet:
  // 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 für Data Access Service erstellen
  var data = new IDataAccessServiceReadSingleRequest();
  data.PortName = "Arp.Plc.Eclr/MainInstance1.AI1";
  // Antwortvariablen
  IDeviceStatusServiceGetItemResponse grpc_status_response;
  IDataAccessServiceReadSingleResponse grpc_data_response;
  // Endlosschleife
  while (true) {
    // Item vom Device Status Service anfordern
    grpc_status_response = grpc_status_client.GetItem(item);
    // Daten vom Data Access Service anfordern
    grpc_data_response = grpc_data_client.ReadSingle(data);
    // Ergebnisse ausgeben
    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);
    // 1 Sekunde warten
    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. Im Solution Explorer mit Rechtsklick auf die Solution ein Terminal öffnen.
  2. Im Terminal folgende Befehle ausführen:
dotnet build ConsoleApp1.csproj
dotnet publish -c RELEASE -r linux-arm .\ConsoleApp1.csproj -o MyApp

… wobei ConsoleApp1 der Name der Solution ist und MyApp der Name des Ausgabeverzeichnisses, in dem die Anwendung veröffentlicht wird. Die Anwendung kann auch im DEBUG-Modus veröffentlicht werden, falls erforderlich.

  1. Das Ausgabeverzeichnis und seinen gesamten Inhalt auf den PLC kopieren (z. B. mit scp oder WinSCP).
scp -r MyApp admin@192.168.1.10:~
  1. Eine Shell-Sitzung auf dem PLC öffnen (z. B. mit ssh oder PuTTY).
  2. Sicherstellen, dass die Executable Ausführungsrechte hat:
$ chmod a+x /opt/plcnext/MyApp/ConsoleApp1
  1. Die Anwendung ausführen:
$ /opt/plcnext/MyApp/ConsoleApp1

Die Ausgabe sollte ähnlich sein wie:

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
  1. In PLCnext Engineer online gehen und den Wert der AI1-Variable ändern. Der von der Anwendung gemeldete Wert sollte sich ändern.

Referenzen und weitere Ressourcen

  1. .NET Core ❤ gRPC
  2. Call gRPC services with the .NET client
  3. A curated list of useful resources for gRPC

Industrietechnik

  1. Elektroauto-Boom: Wie wachsende Nachfrage die globale Lieferkette prägt
  2. Optimierung der Kühlkettenlogistik für die COVID-19-Impfstoffverteilung
  3. Fine Art Logistics: Revolutionierung des globalen Kunstmarktes
  4. Proaktive Strategien zur Bewältigung kommender Supply-Chain-Störungen
  5. Kondensatorbank richtig dimensionieren: µF & kVAR für Leistungsfaktorkorrektur berechnen
  6. Das ideale Produktionskontrollwerkzeug definieren: Schlüsselfunktionen & Best Practices
  7. Intel Edison für IoT: Auswahl des richtigen Mini-Computers für Ihren Prototyp
  8. PLCnext Konsolenanwendung mit C# entwickeln: Einsteigerleitfaden
  9. Präzise Hydraulikarmaturen-Messung: Schritt-für-Schritt-Anleitung
  10. Hydraulikmotor-Drehzahl per PWM & Fernsteuerung regeln: Praxisleitfaden