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:
- Escrito em qualquer idioma compatível com gRPC.
- Execute em qualquer lugar – localmente no dispositivo PLCnext Control ou em uma máquina remota*.
- Hospedado em um contêiner OCI.
(* 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:
- AXC F 2152 executando a versão de firmware 2022.0.3 LTS ou posterior.
- PLCnext Engineer versão 2022.0.1 LTS ou posterior.
- Visual Studio 2019 (qualquer edição).
- Os conceitos apresentados nesta postagem do Blog Makers:Como criar um aplicativo de console PLCnext simples em C#
- Arquivos de definição de protobuf para o servidor gRPC, no diretório protobuf do repositório PLCnext/gRPC Github.
- O serviço RSC de status do dispositivo.
- O serviço RSC de acesso a dados.
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:
- Um programa com uma variável de porta OUT chamada AI1, do tipo INT.
- Uma instância desse programa chamada MainInstance1.
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:
- Grpc.Tools
- Grpc.Net.Client
- Google.Protobuf
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
- Como a demanda por veículos elétricos afetará a cadeia de suprimentos
- Como preparar a cadeia de frio para demandas de vacina COVID-19
- Como a Fine Art Logistics está mudando o mercado de arte para sempre
- Como se preparar para a próxima interrupção da cadeia de suprimentos
- Como calcular o tamanho adequado do capacitor em µ-Farads e kVAR para melhoria de P.F
- Como deve ser a ferramenta ideal para controle de produção?
- Intel Edison IoT:como escolher o Intel Edison para seu protótipo de IoT
- Como criar um aplicativo de console PLCnext simples em C#
- Como faço para medir a conexão hidráulica necessária?
- Como você controla a velocidade de um motor hidráulico?