Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Industriële technologie

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

  1. Hoe de vliegtuigindustrie lasermetrologie gebruikt voor kwaliteitscontrole
  2. Hoe de vraag naar elektrische voertuigen de supply chain zal beïnvloeden
  3. De koudeketen voorbereiden op de eisen van COVID-19-vaccins
  4. Hoe Fine Art Logistics de kunstmarkt voorgoed verandert
  5. Hoe u zich kunt voorbereiden op de volgende verstoring van de toeleveringsketen
  6. Hoe de geschikte condensatorgrootte in µ-Farads &kVAR te berekenen voor PF-verbetering
  7. Hoe zou de ideale tool voor productiecontrole eruit moeten zien?
  8. Intel Edison IoT:hoe u de Intel Edison kiest voor uw IoT-prototype?
  9. Hoe maak je een eenvoudige PLCnext console applicatie in C#
  10. Hoe meet ik de hydraulische fitting die ik nodig heb?
  11. Hoe regel je de snelheid van een hydraulische motor?