Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Промышленные технологии

Создание C# клиента для gRPC сервера PLCnext Control: Пошаговое руководство

Прошивка версии 2022.0 LTS вводит gRPC сервер на устройствах AXC F 1152 и AXC F 2152. Этот gRPC сервер предоставляет способ для клиентских приложений обращаться к RSC-сервисам на устройстве PLCnext Control. Клиентские приложения могут:

(* удаленный доступ будет доступен с версии прошивки 2022.3)

Общая информация о gRPC сервере в устройствах PLCnext Control доступна в PLCnext Info Center.

В этой статье описывается, как создать простое клиентское gRPC приложение на C#, запускаемое на устройстве PLCnext Control.

Предварительные требования

Процедура ниже использует:

Процедура

  1. Через веб-страницу управления (WBM) убедитесь, что сервис GRPC LOCAL SERVER активирован.
  2. Создайте новый проект PLCnext Engineer для вашего целевого устройства. Этот проект должен иметь:
    • Программу с выходной порт-переменной AI1 типа INT.
    • Экземпляр этой программы под именем MainInstance1.
  3. Отправьте проект PLCnext Engineer на целевое устройство.
  4. В Visual Studio создайте пустое консольное приложение C#, выполнив шаги 1-3 процедуры, описанной в ранее упомянутой статье Makers Blog.
  5. В окне свойств проекта установите Target framework в «.NET 5.0».
  6. В Solution Explorer нажмите правой кнопкой на Solution, выберите «Manage NuGet Packages for Solution…» и установите следующие NuGet пакеты:
    • Grpc.Tools
    • Grpc.Net.Client
    • Google.Protobuf
  7. Скопируйте папку protobuf с файлами определения protobuf в папку исходников проекта. Protobuf — это язык описания интерфейсов (IDL), используемый для описания gRPC сервисов.
  8. В файле конфигурации проекта добавьте ссылку на .proto файл(ы) для сервисов, которые будут использоваться в проекте. Секция ItemGroup файла конфигурации проекта теперь будет выглядеть примерно так:

Создание C# клиента для gRPC сервера PLCnext Control: Пошаговое руководство

  1. Замените содержимое файла .cs проекта на следующий код (возможно, понадобится изменить имя пространства имен):
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() {
      // Код для подключения к 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
      };
      // Создаем gRPC канал к unix-сокету PLCnext
      using var channel = GrpcChannel.ForAddress("https://localhost", new GrpcChannelOptions {
        HttpHandler = socketsHttpHandler
      });
      // Создаем gRPC клиент для Device Status Service на этом канале
      var grpc_status_client = new IDeviceStatusService.IDeviceStatusServiceClient(channel);
      // Создаем gRPC клиент для Data Access Service на этом канале
      var grpc_data_client = new IDataAccessService.IDataAccessServiceClient(channel);

      // Создаем элемент для получения из Device Status Service
      // Идентификаторы элементов перечислены в 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";

      // Создаем переменную для получения из Data Access Service
      var data = new IDataAccessServiceReadSingleRequest();
      data.PortName = "Arp.Plc.Eclr/MainInstance1.AI1";

      // Переменные ответов
      IDeviceStatusServiceGetItemResponse grpc_status_response;
      IDataAccessServiceReadSingleResponse grpc_data_response;

      // Бесконечный цикл
      while (true) {
        // Запрос элемента из Device Status Service
        grpc_status_response = grpc_status_client.GetItem(item);
        // Запрос данных из Data Access Service
        grpc_data_response = grpc_data_client.ReadSingle(data);

        // Вывод результатов
        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);

        // Ждем 1 секунду
        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;
      }
    }
  }
}
  1. В Solution Explorer нажмите правой кнопкой на Solution и откройте Terminal.
  2. В терминале выполните следующие команды:
dotnet build ConsoleApp1.csproj
dotnet publish -c RELEASE -r linux-arm .\ConsoleApp1.csproj -o MyApp

… где ConsoleApp1 — имя решения, а MyApp — имя выходной директории, куда будет опубликовано приложение. Приложение также можно публиковать в режиме DEBUG при необходимости.

  1. Скопируйте выходную директорию со всем содержимым на ПЛК с помощью (например) scp или WinSCP.
scp -r MyApp admin@192.168.1.10:~
  1. Откройте сессию оболочки на ПЛК с помощью (например) ssh или PuTTY.
  2. Убедитесь, что у исполняемого файла есть права на выполнение:
$ chmod a+x /opt/plcnext/MyApp/ConsoleApp1
  1. Запустите приложение:
$ /opt/plcnext/MyApp/ConsoleApp1

Вывод должен быть похож на:

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
  1. В PLCnext Engineer перейдите в онлайн-режим и измените значение переменной AI1. Значение, сообщаемое приложением, должно измениться.

Ссылки и другие ресурсы

  1. .NET Core ❤ gRPC
  2. Call gRPC services with the .NET client
  3. A curated list of useful resources for gRPC

Промышленные технологии

  1. Рост спроса на электромобили: как растущий спрос формирует глобальные цепочки поставок
  2. Оптимизация холодильной логистики для распределения вакцины COVID-19
  3. Логистика изобразительного искусства: революционизация глобального художественного рынка
  4. Проактивные стратегии навигации предстоящих сбоев цепи поставок
  5. Точный расчет банка конденсаторов (мкФ и кВАр) для коррекции коэффициента мощности
  6. Определение идеального инструмента контроля производства: Ключевые функции и лучшие практики
  7. Intel Edison для IoT: обзор, спецификации, breakout-платы, проекты и альтернативы
  8. Разработка консольного приложения PLCnext на C#: Руководство для начинающих
  9. Точный замер гидравлических фитингов: пошаговое руководство
  10. Управление скоростью гидравлического мотора через ШИМ и ДУ: практическое руководство