Criar Cliente C# para Servidor gRPC PLCnext Control: Guia Passo a Passo
A versão de firmware 2022.0 LTS introduz um servidor gRPC nos dispositivos AXC F 1152 e AXC F 2152. Este servidor gRPC permite que aplicações cliente acessem serviços RSC no dispositivo PLCnext Control. As aplicações cliente podem:
- Ser escritas em qualquer linguagem que suporte gRPC.
- Rodar em qualquer lugar – localmente no PLCnext Control ou em máquina remota*.
- Ser hospedadas em container OCI.
(* acesso remoto disponível a partir do firmware 2022.3)
Informações gerais sobre o servidor gRPC em dispositivos PLCnext Control estão disponíveis no PLCnext Info Center.
Este artigo descreve como criar uma aplicação cliente gRPC simples em C#, rodando em um dispositivo PLCnext Control.
Pré-requisitos
O procedimento abaixo usa:
- AXC F 2152 rodando firmware 2022.0.3 LTS ou posterior.
- PLCnext Engineer versão 2022.0.1 LTS ou posterior.
- Visual Studio 2019 (qualquer edição).
- Conceitos do post anterior: Como criar uma aplicação console PLCnext simples em C#.
- Arquivos de definição protobuf para o servidor gRPC, no diretório protobuf do repositório PLCnext/gRPC no GitHub.
- Serviço RSC Device Status.
- Serviço RSC Data Access.
Procedimento
- Na página de gerenciamento web (WBM), certifique-se que o serviço GRPC LOCAL SERVER está ativado.
- Crie um novo projeto PLCnext Engineer para seu dispositivo alvo, com:
- Um programa com variável de porta OUT chamada AI1, do tipo INT.
- Uma instância desse programa chamada MainInstance1.
- Envie o projeto PLCnext Engineer para o dispositivo alvo.
- No Visual Studio, crie uma aplicação console C# vazia seguindo os Passos 1-3 do post anterior.
- Na janela Propriedades do Projeto, defina o Target framework para ".NET 5.0".
- No Solution Explorer, clique com botão direito na Solution, selecione "Gerenciar Pacotes NuGet para Solution..." e instale:
- Grpc.Tools
- Grpc.Net.Client
- Google.Protobuf
- Copie a pasta protobuf com os arquivos de definição para a pasta source do projeto. Protobuf é a IDL (Interface Definition Language) usada para descrever serviços gRPC.
- No arquivo de configuração do projeto, adicione referência ao(s) arquivo(s) .proto dos serviços que serão usados. A seção ItemGroup ficará similar a isto:
9. Substitua o conteúdo do arquivo .cs do projeto por este código (pode precisar 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() {
// Código para conectar a Unix Domain Socket:
// 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
};
// Criar canal gRPC para o unix socket do PLCnext
using var channel = GrpcChannel.ForAddress("https://localhost",
new GrpcChannelOptions { HttpHandler = socketsHttpHandler });
// Cliente gRPC para Device Status Service
var grpc_status_client = new IDeviceStatusService.IDeviceStatusServiceClient(channel);
// Cliente gRPC para Data Access Service
var grpc_data_client = new IDataAccessService.IDataAccessServiceClient(channel);
// Item para obter do Device Status Service
// Identificadores listados no PLCnext Info Center
var item = new IDeviceStatusServiceGetItemRequest();
item.Identifier = "Status.Board.Temperature.Centigrade";
// Variável para obter do Data Access Service
var data = new IDataAccessServiceReadSingleRequest();
data.PortName = "Arp.Plc.Eclr/MainInstance1.AI1";
// Variáveis de resposta
IDeviceStatusServiceGetItemResponse grpc_status_response;
IDataAccessServiceReadSingleResponse grpc_data_response;
// Loop infinito
while (true) {
// Requisição ao Device Status Service
grpc_status_response = grpc_status_client.GetItem(item);
// Requisição ao Data Access Service
grpc_data_response = grpc_data_client.ReadSingle(data);
// Reportar resultados
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);
// Aguardar 1 segundo
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;
}
}
}
}
- No Solution Explorer, clique com botão direito na Solution e abra um Terminal.
- No terminal, execute:
dotnet build ConsoleApp1.csproj dotnet publish -c RELEASE -r linux-arm .\ConsoleApp1.csproj -o MyApp
Onde ConsoleApp1 é o nome da solution e MyApp o diretório de saída. Também pode publicar em modo DEBUG.
- Copie o diretório de saída e todo seu conteúdo para o PLC (ex: scp ou WinSCP):
scp -r MyApp admin@192.168.1.10:~
- Abra uma sessão shell no PLC (ex: ssh ou PuTTY).
- Certifique-se que o executável tem privilégios de execução:
$ chmod a+x /opt/plcnext/MyApp/ConsoleApp1
- Execute a aplicação:
$ /opt/plcnext/MyApp/ConsoleApp1
A saída deve ser similar a:
Board Temperature = 50°C MainInstance1.AI1 = 0 Board Temperature = 50°C MainInstance1.AI1 = 0 ...
- No PLCnext Engineer, entre online e altere o valor da variável AI1. O valor reportado pela aplicação deve mudar.
Referências e outros recursos
- .NET Core ❤ gRPC
- Call gRPC services with the .NET client
- A curated list of useful resources for gRPC
Tecnologia industrial
- Veículos Elétricos em Alta: Como a Demanda Crescente Molda a Cadeia de Suprimentos Global
- Otimizando a Logística de Cadeia Fria para Distribuição da Vacina contra COVID-19
- Logística de Belas Artes: Revolucionando o Mercado Global de Arte
- Estratégias Proativas para Navegar Disrupções Futuras na Cadeia de Suprimentos
- Como Calcular o Tamanho do Banco de Capacitores (µF e kVAR) para Correção do Fator de Potência
- Definindo a Ferramenta Ideal de Controlo de Produção: Características-Chave e Melhores Práticas
- Intel Edison IoT: Escolhendo o Mini-Computador Certo para o seu Protótipo
- Desenvolver Aplicação Console PLCnext em C#: Guia para Iniciantes
- Medição Precisa de Conexões Hidráulicas: Guia Passo a Passo
- Controle Velocidade de Motor Hidráulico com PWM e Controle Remoto