Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Tecnologia industrial

Como criar um cliente para o servidor gRPC PLCnext Control em C#


A versão de firmware 2022.0 LTS apresenta um servidor gRPC em dispositivos AXC F 1152 e AXC F 2152. Este servidor gRPC fornece uma maneira para aplicativos cliente acessarem serviços RSC no dispositivo PLCnext Control. Os aplicativos cliente podem ser:

(* o acesso remoto estará disponível a partir da versão de firmware 2022.3)

Informações gerais sobre o servidor gRPC nos dispositivos PLCnext Control estão disponíveis no PLCnext Info Center.

Este artigo descreve como criar um aplicativo cliente gRPC simples em C#, executado em um dispositivo PLCnext Control.

Pré-requisitos


O procedimento abaixo utiliza:

Procedimento


1. Usando a página de Gerenciamento baseado na Web, certifique-se de que o serviço denominado GRPC LOCAL SERVER esteja ativado.

2. Crie um novo projeto PLCnext Engineer para seu dispositivo alvo. Este projeto deve ter:

3. Envie o projeto PLCnext Engineer para o dispositivo alvo.

4. No Visual Studio, crie um aplicativo de console C# vazio seguindo as etapas de 1 a 3 do procedimento descrito na postagem anterior do Makers Blog.

5. Na janela Project => Property, defina o framework Target do projeto como “.NET 5.0”.

6. No Solution Explorer, clique com o botão direito do mouse na solução, selecione “Manage NuGet Packages for Solution…” e instale os seguintes pacotes NuGet:

7. Copie a pasta protobuf que contém os arquivos de definição do protobuf para a pasta de origem do projeto. Protobuf é a Interface Definition Language (IDL) usada para descrever serviços gRPC.

8. No arquivo de configuração do projeto, inclua uma referência ao(s) arquivo(s) .proto para os serviços que serão usados ​​no projeto. A seção ItemGroup da configuração do projeto agora será algo assim:

9. Substitua o conteúdo do arquivo .cs do projeto por este código (talvez seja necessário alterar o nome do namespace):
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. No Solution Explorer, clique com o botão direito do mouse na solução e abra um Terminal.

11. No terminal, execute os seguintes comandos:
dotnet build ConsoleApp1.csproj
dotnet publish -c RELEASE -r linux-arm .\ConsoleApp1.csproj -o MyApp

… onde ConsoleApp1 é o nome da solução e MyApp é o nome do diretório de saída onde o aplicativo será publicado. O aplicativo também pode ser publicado no modo DEBUG, se necessário.

12. Copie o diretório de saída e todo o seu conteúdo para o CP usando (por exemplo) scp ou WinSCP.
scp -r MyApp [email protected]:~

13. Abra uma sessão de shell no PLC usando (por exemplo) ssh ou PuTTY.

14. Certifique-se de que o executável tenha privilégios de execução:
$ chmod a+x /opt/plcnext/MyApp/ConsoleApp1

15. Execute o aplicativo:
$ /opt/plcnext/MyApp/ConsoleApp1

A saída deve ser semelhante a:
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. No PLCnext Engineer, entre online e altere o valor da variável AI1. O valor informado pelo aplicativo deve mudar.

Referências e outros recursos


1. .NET Core ❤ gRPC

2. Chame os serviços gRPC com o cliente .NET

3. Uma lista com curadoria de recursos úteis para gRPC

Tecnologia industrial

  1. Como a demanda por veículos elétricos afetará a cadeia de suprimentos
  2. Como preparar a cadeia de frio para demandas de vacina COVID-19
  3. Como a Fine Art Logistics está mudando o mercado de arte para sempre
  4. Como se preparar para a próxima interrupção da cadeia de suprimentos
  5. Como calcular o tamanho adequado do capacitor em µ-Farads e kVAR para melhoria de P.F
  6. Como deve ser a ferramenta ideal para controle de produção?
  7. Intel Edison IoT:como escolher o Intel Edison para seu protótipo de IoT
  8. Como criar um aplicativo de console PLCnext simples em C#
  9. Como faço para medir a conexão hidráulica necessária?
  10. Como você controla a velocidade de um motor hidráulico?