So erstellen Sie einen Client für den PLCnext Control gRPC-Server in C#
Firmware-Version 2022.0 LTS führt einen gRPC-Server auf AXC F 1152- und AXC F 2152-Geräten ein. Dieser gRPC-Server bietet eine Möglichkeit für Clientanwendungen, auf RSC-Dienste auf dem PLCnext Control-Gerät zuzugreifen. Die Client-Anwendungen können sein:
- Geschrieben in einer beliebigen Sprache, die gRPC unterstützt.
- Überall ausführen – lokal auf dem PLCnext Control-Gerät oder auf einem Remote-Rechner*.
- In einem OCI-Container gehostet.
(* Fernzugriff wird ab Firmware-Version 2022.3 verfügbar sein)
Allgemeine Informationen zum gRPC-Server in PLCnext Control-Geräten finden Sie im PLCnext Info Center.
Dieser Artikel beschreibt, wie Sie eine einfache gRPC-Clientanwendung in C# erstellen, die auf einem PLCnext Control-Gerät ausgeführt wird.
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 (jede Edition).
- Die in diesem Makers-Blogbeitrag vorgestellten Konzepte:Wie man eine einfache PLCnext-Konsolenanwendung in C# erstellt
- Protobuf-Definitionsdateien für den gRPC-Server im Verzeichnis protobuf des PLCnext/gRPC-Github-Repositorys.
- Der Gerätestatus-RSC-Dienst.
- Der Data Access RSC-Dienst.
Verfahren
1. Stellen Sie auf der Seite Web-based Management sicher, dass der Dienst mit dem Namen GRPC LOCAL SERVER aktiviert ist.
2. Erstellen Sie ein neues PLCnext Engineer-Projekt für Ihr Zielgerät. Dieses Projekt sollte haben:
- Ein Programm mit einer OUT-Port-Variable namens AI1 vom Typ INT.
- Eine Instanz dieses Programms namens MainInstance1.
3. Senden Sie das PLCnext Engineer-Projekt an das Zielgerät.
4. Erstellen Sie in Visual Studio eine leere C#-Konsolenanwendung, indem Sie die Schritte 1–3 des Verfahrens befolgen, das im früheren Makers-Blog-Beitrag beschrieben wurde.
5. Stellen Sie im Fenster Projekt => Eigenschaft das Zielframework des Projekts auf „.NET 5.0“ ein.
6. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf die Projektmappe, wählen Sie „Manage NuGet Packages for Solution…“ und installieren Sie die folgenden NuGet-Pakete:
- Grpc.Tools
- Grpc.Net.Client
- Google.Protobuf
7. Kopieren Sie den Protobuf-Ordner mit den Protobuf-Definitionsdateien in den Projektquellordner. Protobuf ist die Interface Definition Language (IDL), die zur Beschreibung von gRPC-Diensten verwendet wird.
8. Fügen Sie in der Projektkonfigurationsdatei einen Verweis auf die .proto-Datei(en) für die Dienste hinzu, die im Projekt verwendet werden. Der ItemGroup-Abschnitt der Projektkonfiguration sieht nun ungefähr so aus:
9. Ersetzen Sie den Inhalt der .cs-Datei des Projekts durch diesen Code (möglicherweise müssen Sie den Namespace-Namen ändern):
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. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf die Projektmappe und öffnen Sie ein Terminal.
11. Führen Sie im Terminal die folgenden Befehle aus:
dotnet build ConsoleApp1.csproj dotnet publish -c RELEASE -r linux-arm .\ConsoleApp1.csproj -o MyApp
… wobei ConsoleApp1 der Name der Lösung und MyApp der Name des Ausgabeverzeichnisses ist, in dem die Anwendung veröffentlicht wird. Die Anwendung kann bei Bedarf auch im DEBUG-Modus veröffentlicht werden.
12. Kopieren Sie das Ausgabeverzeichnis und seinen gesamten Inhalt mit (zum Beispiel) scp oder WinSCP.
auf die SPSscp -r MyApp [email protected]:~
13. Öffnen Sie eine Shell-Sitzung auf der SPS mit (zum Beispiel) ssh oder PuTTY.
14. Stellen Sie sicher, dass die ausführbare Datei über Ausführungsberechtigungen verfügt:
$ chmod a+x /opt/plcnext/MyApp/ConsoleApp1
15. Führen Sie die Anwendung aus:
$ /opt/plcnext/MyApp/ConsoleApp1
Die Ausgabe sollte ähnlich aussehen 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
16. Gehen Sie in PLCnext Engineer online und ändern Sie den Wert der Variable AI1. Der von der Anwendung gemeldete Wert sollte sich ändern.
Referenzen und andere Ressourcen
1. .NET Core ❤ gRPC
2. gRPC-Dienste mit dem .NET-Client aufrufen
3. Eine kuratierte Liste nützlicher Ressourcen für gRPC
Industrietechnik
- Wie sich die Nachfrage nach Elektrofahrzeugen auf die Lieferkette auswirkt
- Wie man die Kühlkette auf den COVID-19-Impfstoffbedarf vorbereitet
- Wie Kunstlogistik den Kunstmarkt zum Guten verändert
- Wie man sich auf die nächste Unterbrechung der Lieferkette vorbereitet
- So berechnen Sie die geeignete Kondensatorgröße in µ-Farad und kVAR zur P.F-Verbesserung
- Wie sollte das ideale Werkzeug zur Produktionssteuerung aussehen?
- Intel Edison IoT:So wählen Sie Intel Edison für Ihren IoT-Prototyp aus
- So erstellen Sie eine einfache PLCnext-Konsolenanwendung in C#
- Wie messe ich für die benötigte Hydraulikarmatur?
- Wie steuert man die Drehzahl eines Hydraulikmotors?