C# Client Maken voor PLCnext Control gRPC Server: Stapsgewijze Handleiding
Firmware versie 2022.0 LTS introduceert een gRPC server op AXC F 1152 en AXC F 2152 apparaten. Deze gRPC server biedt een manier voor clientapplicaties om toegang te krijgen tot RSC services op het PLCnext Control apparaat. De clientapplicaties kunnen:
- Geschreven zijn in elke taal die gRPC ondersteunt.
- Overal draaien – lokaal op het PLCnext Control apparaat, of op een externe machine*.
- Gehost worden in een OCI container.
(* externe toegang beschikbaar vanaf firmware versie 2022.3)
Algemene informatie over de gRPC server in PLCnext Control apparaten is beschikbaar in het PLCnext Info Center.
Dit artikel beschrijft hoe u een eenvoudige gRPC clientapplicatie in C# maakt, die op een PLCnext Control apparaat draait.
Vereisten
De procedure hieronder gebruikt:
- AXC F 2152 met firmware versie 2022.0.3 LTS of later.
- PLCnext Engineer versie 2022.0.1 LTS of later.
- Visual Studio 2019 (elke editie).
- De concepten geïntroduceerd in deze Makers Blog post: Hoe een eenvoudige PLCnext console applicatie in C# te maken.
- Protobuf definitiebestanden voor de gRPC server, in de protobuf directory van de PLCnext/gRPC Github repository.
- De Device Status RSC service.
- De Data Access RSC service.
Procedure
1. Gebruik de web-gebaseerde Management-pagina, zorg ervoor dat de service genaamd GRPC LOCAL SERVER geactiveerd is.
2. Maak een nieuw PLCnext Engineer project voor uw doelapparaat. Dit project moet hebben:
- Een programma met een OUT poortvariabele genaamd AI1, van type INT.
- Een instantie van dat programma genaamd MainInstance1.
3. Stuur het PLCnext Engineer project naar het doelapparaat.
4. In Visual Studio, maak een lege C# console applicatie door stappen 1-3 van de procedure te volgen die beschreven is in de eerdere Makers Blog post.
5. In het Project => Eigenschappen venster, stel het project Target framework in op ".NET 5.0".
6. In Solution Explorer, rechtsklik op de Solution, selecteer "Manage NuGet Packages for Solution...", en installeer de volgende NuGet pakketten:
- Grpc.Tools
- Grpc.Net.Client
- Google.Protobuf
7. Kopieer de protobuf map met de protobuf definitiebestanden naar de project bronmap. Protobuf is de Interface Definition Language (IDL) die gebruikt wordt om gRPC services te beschrijven.
8. In het projectconfiguratiebestand, voeg een referentie toe aan het .proto bestand(en) voor de services die in het project gebruikt zullen worden. De ItemGroup sectie van de projectconfiguratie zal er nu ongeveer zo uitzien:
9. Vervang de inhoud van het project .cs bestand door deze code (u moet misschien de naamruimte naam 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() { // De code om verbinding te maken met een Unix Domain Socket is afkomstig van: // 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 }; // Maak een gRPC kanaal naar de PLCnext unix socket using var channel = GrpcChannel.ForAddress("https://localhost", new GrpcChannelOptions { HttpHandler = socketsHttpHandler }); // Maak een gRPC client voor de Device Status Service op dat kanaal var grpc_status_client = new IDeviceStatusService.IDeviceStatusServiceClient(channel); // Maak een gRPC client voor de Data Access Service op dat kanaal var grpc_data_client = new IDataAccessService.IDataAccessServiceClient(channel); // Maak een item om op te halen van de Device Status Service // Item identificaties staan in het 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"; // Maak een variabele om op te halen van de Data Access Service var data = new IDataAccessServiceReadSingleRequest(); data.PortName = "Arp.Plc.Eclr/MainInstance1.AI1"; // Respons variabelen IDeviceStatusServiceGetItemResponse grpc_status_response; IDataAccessServiceReadSingleResponse grpc_data_response; // Oneindige lus while (true) { // Vraag het item op van de Device Status Service grpc_status_response = grpc_status_client.GetItem(item); // Vraag data op van de Data Access Service grpc_data_response = grpc_data_client.ReadSingle(data); // Rapporteer de resultaten var temperature = grpc_status_response.ReturnValue.Int8Value; var ai1 = grpc_data_response.ReturnValue.Value.Int16Value; Console.WriteLine("Bord Temperatuur = " + temperature + "°C"); Console.WriteLine("MainInstance1.AI1 = " + ai1); // Wacht 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; } } } }
10. In Solution Explorer, rechtsklik op de Solution en open een Terminal.
11. In de terminal, voer de volgende commando's uit:
dotnet build ConsoleApp1.csproj dotnet publish -c RELEASE -r linux-arm .\ConsoleApp1.csproj -o MyApp
... waar ConsoleApp1 de naam is van de solution, en MyApp de naam is van de uitvoermap waar de applicatie zal worden gepubliceerd. De applicatie kan ook in DEBUG modus worden gepubliceerd indien gewenst.
12. Kopieer de uitvoermap en al zijn inhoud naar de PLC met behulp van (bijvoorbeeld) scp of WinSCP.
scp -r MyApp admin@192.168.1.10:~
13. Open een shell-sessie op de PLC met behulp van (bijvoorbeeld) ssh of PuTTY.
14. Zorg ervoor dat het uitvoerbare bestand uitvoerrechten heeft:
$ chmod a+x /opt/plcnext/MyApp/ConsoleApp1
15. Voer de applicatie uit:
$ /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. In PLCnext Engineer, ga 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. gRPC services aanroepen met de .NET client
3. Een gecureerde lijst met nuttige bronnen voor gRPC
Industriële technologie
- Elektrische Voertuigen in Opkomst: Hoe Groeiende Vraag de Mondiale Keten Beïnvloedt
- Optimalisatie van koudeketenlogistiek voor COVID-19 vaccin distributie
- Kunstlogistiek: De wereldwijde kunstmarkt revolutioneren
- Proactieve strategieën om toekomstige supply chain storingen te navigeren
- Accurate handleiding voor het berekenen van condensatorbank-grootte (µF & kVAR) voor vermogensfactorkorrektie
- De Ideale Productiecontroletool Definiëren: Sleutelkenmerken & Best Practices
- Intel Edison IoT: De Juiste Mini-Computer Kiezen voor Jouw Prototype
- PLCnext Console-applicatie Ontwikkelen met C#: Handleiding voor Beginners
- Lasermetrologie in de Luchtvaart: Precisie Kwaliteitscontrole voor Vliegtuigproductie
- Accurate Hydraulische Koppeling Meting: Stap-voor-Stap Handleiding
- Hydraulische Motorsnelheid Sturen met PWM en Afstandsbediening