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:
- In jeder Sprache geschrieben sein, die gRPC unterstützt.
- Überall ausgeführt werden – lokal auf dem PLCnext Control-Gerät oder auf einem entfernten Rechner*.
- In einem OCI-Container gehostet werden.
(* 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:
- AXC F 2152 mit Firmware-Version 2022.0.3 LTS oder höher.
- PLCnext Engineer Version 2022.0.1 LTS oder höher.
- Visual Studio 2019 (beliebige Edition).
- Die Konzepte aus diesem Maker's Blog Post: „How to create a simple PLCnext console application in C#“
- Protobuf-Definitionsdateien für den gRPC-Server, im protobuf-Verzeichnis des PLCnext/gRPC GitHub-Repositorys.
- Der Device Status RSC Service.
- Der Data Access RSC Service.
Vorgehensweise
- Über die webbasierte Verwaltungsseite sicherstellen, dass der Dienst „GRPC LOCAL SERVER“ aktiviert ist.
- 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.
- Das PLCnext Engineer-Projekt an das Zielgerät senden.
- In Visual Studio eine leere C#-Konsolenanwendung erstellen, indem Sie Schritte 1-3 des Verfahrens aus dem früheren Maker's Blog Post befolgen.
- Im Projekt-Eigenschaften-Fenster das Target Framework auf „.NET 5.0“ setzen.
- 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
- 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.
- 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:
- 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;
}
}
}
- Im Solution Explorer mit Rechtsklick auf die Solution ein Terminal öffnen.
- 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.
- Das Ausgabeverzeichnis und seinen gesamten Inhalt auf den PLC kopieren (z. B. mit scp oder WinSCP).
scp -r MyApp admin@192.168.1.10:~
- Eine Shell-Sitzung auf dem PLC öffnen (z. B. mit ssh oder PuTTY).
- Sicherstellen, dass die Executable Ausführungsrechte hat:
$ chmod a+x /opt/plcnext/MyApp/ConsoleApp1
- 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
- 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
- .NET Core ❤ gRPC
- Call gRPC services with the .NET client
- A curated list of useful resources for gRPC
Industrietechnik
- Elektroauto-Boom: Wie wachsende Nachfrage die globale Lieferkette prägt
- Optimierung der Kühlkettenlogistik für die COVID-19-Impfstoffverteilung
- Fine Art Logistics: Revolutionierung des globalen Kunstmarktes
- Proaktive Strategien zur Bewältigung kommender Supply-Chain-Störungen
- Kondensatorbank richtig dimensionieren: µF & kVAR für Leistungsfaktorkorrektur berechnen
- Das ideale Produktionskontrollwerkzeug definieren: Schlüsselfunktionen & Best Practices
- Intel Edison für IoT: Auswahl des richtigen Mini-Computers für Ihren Prototyp
- PLCnext Konsolenanwendung mit C# entwickeln: Einsteigerleitfaden
- Präzise Hydraulikarmaturen-Messung: Schritt-für-Schritt-Anleitung
- Hydraulikmotor-Drehzahl per PWM & Fernsteuerung regeln: Praxisleitfaden