Hoe maak je een client voor de PLCnext Control gRPC-server in C#
Firmwareversie 2022.0 LTS introduceert een gRPC-server op AXC F 1152- en AXC F 2152-apparaten. Deze gRPC-server biedt een manier voor clienttoepassingen om toegang te krijgen tot RSC-services op het PLCnext Control-apparaat. De clienttoepassingen kunnen zijn:
- Geschreven in elke taal die gRPC ondersteunt.
- Overal uitvoeren – lokaal op het PLCnext Control-apparaat of op een externe machine*.
- Gehost in een OCI-container.
(* toegang op afstand is beschikbaar vanaf firmwareversie 2022.3)
Algemene informatie over de gRPC-server in PLCnext Control-apparaten is beschikbaar in het PLCnext Info Center.
In dit artikel wordt beschreven hoe u een eenvoudige gRPC-clienttoepassing in C# maakt, draaiend op een PLCnext Control-apparaat.
Vereisten
De onderstaande procedure gebruikt:
- AXC F 2152 met firmwareversie 2022.0.3 LTS of hoger.
- PLCnext Engineer versie 2022.0.1 LTS of hoger.
- Visual Studio 2019 (elke editie).
- De concepten geïntroduceerd in deze Makers Blog-post:Hoe maak je een eenvoudige PLCnext console-applicatie in C#
- Protobuf-definitiebestanden voor de gRPC-server, in de protobuf-directory van de PLCnext/gRPC Github-repository.
- De RSC-service voor apparaatstatus.
- De RSC-service voor gegevenstoegang.
Procedure
1. Gebruik de webgebaseerde beheerpagina en zorg ervoor dat de service met de naam GRPC LOCAL SERVER is geactiveerd.
2. Maak een nieuw PLCnext Engineer-project voor uw doelapparaat. Dit project moet hebben:
- Een programma met een OUT-poortvariabele genaamd AI1, van het type INT.
- Een instantie van dat programma genaamd MainInstance1.
3. Stuur het PLCnext Engineer-project naar het doelapparaat.
4. Maak in Visual Studio een lege C#-consoletoepassing door stap 1-3 van de procedure te volgen die is beschreven in de eerdere Makers Blog-post.
5. Stel in het venster Project => Eigenschappen het project Doelframework in op “.NET 5.0”.
6. Klik in Solution Explorer met de rechtermuisknop op de oplossing, selecteer "NuGet-pakketten voor oplossing beheren..." en installeer de volgende NuGet-pakketten:
- Grpc.Tools
- Grpc.Net.Client
- Google.Protobuf
7. Kopieer de protobuf-map met de protobuf-definitiebestanden naar de projectbronmap. Protobuf is de Interface Definition Language (IDL) die wordt gebruikt om gRPC-services te beschrijven.
8. Voeg in het projectconfiguratiebestand een verwijzing toe naar de .proto-bestand(en) voor de services die in het project zullen worden gebruikt. De sectie ItemGroup van de projectconfiguratie ziet er nu ongeveer zo uit:
9. Vervang de inhoud van het project .cs-bestand door deze code (mogelijk moet u de naamruimtenaam wijzigen):
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. Klik in Solution Explorer met de rechtermuisknop op de oplossing en open een terminal.
11. Voer in de terminal de volgende opdrachten uit:
dotnet build ConsoleApp1.csproj dotnet publish -c RELEASE -r linux-arm .\ConsoleApp1.csproj -o MyApp
… waarbij ConsoleApp1 de naam is van de oplossing en MyApp de naam is van de uitvoermap waar de toepassing zal worden gepubliceerd. De applicatie kan indien nodig ook in DEBUG-modus worden gepubliceerd.
12. Kopieer de output directory en al zijn inhoud naar de PLC met (bijvoorbeeld) scp of WinSCP.
scp -r MyApp [email protected]:~
13. Open een shell-sessie op de PLC met (bijvoorbeeld) ssh of PuTTY.
14. Zorg ervoor dat het uitvoerbare bestand uitvoeringsrechten heeft:
$ chmod a+x /opt/plcnext/MyApp/ConsoleApp1
15. Start de applicatie:
$ /opt/plcnext/MyApp/ConsoleApp1
De uitvoer zou er ongeveer zo uit moeten zien:
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. Ga in PLCnext Engineer online en wijzig de waarde van de AI1-variabele. De waarde die door de applicatie wordt gerapporteerd, zou moeten veranderen.
Referenties en andere bronnen
1. .NET Core ❤ gRPC
2. Bel gRPC-services met de .NET-client
3. Een samengestelde lijst met nuttige bronnen voor gRPC
Industriële technologie
- Hoe de vliegtuigindustrie lasermetrologie gebruikt voor kwaliteitscontrole
- Hoe de vraag naar elektrische voertuigen de supply chain zal beïnvloeden
- De koudeketen voorbereiden op de eisen van COVID-19-vaccins
- Hoe Fine Art Logistics de kunstmarkt voorgoed verandert
- Hoe u zich kunt voorbereiden op de volgende verstoring van de toeleveringsketen
- Hoe de geschikte condensatorgrootte in µ-Farads &kVAR te berekenen voor PF-verbetering
- Hoe zou de ideale tool voor productiecontrole eruit moeten zien?
- Intel Edison IoT:hoe u de Intel Edison kiest voor uw IoT-prototype?
- Hoe maak je een eenvoudige PLCnext console applicatie in C#
- Hoe meet ik de hydraulische fitting die ik nodig heb?
- Hoe regel je de snelheid van een hydraulische motor?