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 admin@192.168.1.10:~
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?