Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Industrietechnik

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:

(* 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:

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:

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:

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 SPS
scp -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

  1. Wie sich die Nachfrage nach Elektrofahrzeugen auf die Lieferkette auswirkt
  2. Wie man die Kühlkette auf den COVID-19-Impfstoffbedarf vorbereitet
  3. Wie Kunstlogistik den Kunstmarkt zum Guten verändert
  4. Wie man sich auf die nächste Unterbrechung der Lieferkette vorbereitet
  5. So berechnen Sie die geeignete Kondensatorgröße in µ-Farad und kVAR zur P.F-Verbesserung
  6. Wie sollte das ideale Werkzeug zur Produktionssteuerung aussehen?
  7. Intel Edison IoT:So wählen Sie Intel Edison für Ihren IoT-Prototyp aus
  8. So erstellen Sie eine einfache PLCnext-Konsolenanwendung in C#
  9. Wie messe ich für die benötigte Hydraulikarmatur?
  10. Wie steuert man die Drehzahl eines Hydraulikmotors?