Создание C# клиента для gRPC сервера PLCnext Control: Пошаговое руководство
Прошивка версии 2022.0 LTS вводит gRPC сервер на устройствах AXC F 1152 и AXC F 2152. Этот gRPC сервер предоставляет способ для клиентских приложений обращаться к RSC-сервисам на устройстве PLCnext Control. Клиентские приложения могут:
- Быть написаны на любом языке, поддерживающем gRPC.
- Запускаться где угодно — локально на устройстве PLCnext Control или на удаленной машине*.
- Размещаться в OCI-контейнере.
(* удаленный доступ будет доступен с версии прошивки 2022.3)
Общая информация о gRPC сервере в устройствах PLCnext Control доступна в PLCnext Info Center.
В этой статье описывается, как создать простое клиентское gRPC приложение на C#, запускаемое на устройстве PLCnext Control.
Предварительные требования
Процедура ниже использует:
- AXC F 2152 с прошивкой версии 2022.0.3 LTS или более поздней.
- PLCnext Engineer версии 2022.0.1 LTS или более поздней.
- Visual Studio 2019 (любая редакция).
- Концепции, представленные в статье Makers Blog: «How to create a simple PLCnext console application in C#».
- Файлы определения Protobuf для gRPC сервера, в директории protobuf репозитория PLCnext/gRPC на Github.
- RSC-сервис Device Status.
- RSC-сервис Data Access.
Процедура
- Через веб-страницу управления (WBM) убедитесь, что сервис GRPC LOCAL SERVER активирован.
- Создайте новый проект PLCnext Engineer для вашего целевого устройства. Этот проект должен иметь:
- Программу с выходной порт-переменной
AI1типаINT. - Экземпляр этой программы под именем
MainInstance1.
- Программу с выходной порт-переменной
- Отправьте проект PLCnext Engineer на целевое устройство.
- В Visual Studio создайте пустое консольное приложение C#, выполнив шаги 1-3 процедуры, описанной в ранее упомянутой статье Makers Blog.
- В окне свойств проекта установите Target framework в «.NET 5.0».
- В Solution Explorer нажмите правой кнопкой на Solution, выберите «Manage NuGet Packages for Solution…» и установите следующие NuGet пакеты:
- Grpc.Tools
- Grpc.Net.Client
- Google.Protobuf
- Скопируйте папку protobuf с файлами определения protobuf в папку исходников проекта. Protobuf — это язык описания интерфейсов (IDL), используемый для описания gRPC сервисов.
- В файле конфигурации проекта добавьте ссылку на .proto файл(ы) для сервисов, которые будут использоваться в проекте. Секция ItemGroup файла конфигурации проекта теперь будет выглядеть примерно так:

- Замените содержимое файла .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;
}
}
}
}
- В Solution Explorer нажмите правой кнопкой на Solution и откройте Terminal.
- В терминале выполните следующие команды:
dotnet build ConsoleApp1.csproj
dotnet publish -c RELEASE -r linux-arm .\ConsoleApp1.csproj -o MyApp
… где ConsoleApp1 — имя решения, а MyApp — имя выходной директории, куда будет опубликовано приложение. Приложение также можно публиковать в режиме DEBUG при необходимости.
- Скопируйте выходную директорию со всем содержимым на ПЛК с помощью (например) scp или WinSCP.
scp -r MyApp admin@192.168.1.10:~
- Откройте сессию оболочки на ПЛК с помощью (например) ssh или PuTTY.
- Убедитесь, что у исполняемого файла есть права на выполнение:
$ chmod a+x /opt/plcnext/MyApp/ConsoleApp1
- Запустите приложение:
$ /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
- В PLCnext Engineer перейдите в онлайн-режим и измените значение переменной AI1. Значение, сообщаемое приложением, должно измениться.
Ссылки и другие ресурсы
- .NET Core ❤ gRPC
- Call gRPC services with the .NET client
- A curated list of useful resources for gRPC
Промышленные технологии
- Рост спроса на электромобили: как растущий спрос формирует глобальные цепочки поставок
- Оптимизация холодильной логистики для распределения вакцины COVID-19
- Логистика изобразительного искусства: революционизация глобального художественного рынка
- Проактивные стратегии навигации предстоящих сбоев цепи поставок
- Точный расчет банка конденсаторов (мкФ и кВАр) для коррекции коэффициента мощности
- Определение идеального инструмента контроля производства: Ключевые функции и лучшие практики
- Intel Edison для IoT: обзор, спецификации, breakout-платы, проекты и альтернативы
- Разработка консольного приложения PLCnext на C#: Руководство для начинающих
- Точный замер гидравлических фитингов: пошаговое руководство
- Управление скоростью гидравлического мотора через ШИМ и ДУ: практическое руководство