Как создать клиент для gRPC-сервера PLCnext Control на C#
Версия микропрограммы 2022.0 LTS представляет сервер gRPC на устройствах AXC F 1152 и AXC F 2152. Этот сервер gRPC предоставляет клиентским приложениям способ доступа к службам RSC на устройстве PLCnext Control. Клиентские приложения могут быть:
- Написано на любом языке, поддерживающем gRPC.
- Запускайте где угодно — локально на устройстве PLCnext Control или на удаленной машине*.
- Размещено в контейнере OCI.
(* удаленный доступ будет доступен с версии прошивки 2022.3)
Общая информация о сервере gRPC в устройствах управления PLCnext доступна в информационном центре PLCnext.
В этой статье описывается, как создать простое клиентское приложение gRPC на языке C#, работающее на устройстве PLCnext Control.
Предпосылки
В приведенной ниже процедуре используются:
- AXC F 2152 с микропрограммой версии 2022.0.3 LTS или более поздней.
- PLCnext Engineer версии 2022.0.1 LTS или более поздней.
- Visual Studio 2019 (любая версия).
- Концепции, представленные в этой записи блога Makers:как создать простое консольное приложение PLCnext на C#
- Файлы определения Protobuf для сервера gRPC в каталоге protobuf репозитория PLCnext/gRPC Github.
- Служба RSC статуса устройства.
- Служба RSC для доступа к данным.
Процедура
1. Используя веб-страницу управления, убедитесь, что служба с именем GRPC LOCAL SERVER активирована.
2. Создайте новый проект PLCnext Engineer для целевого устройства. Этот проект должен иметь:
- Программа с переменной порта OUT с именем AI1 и типом INT.
- Экземпляр этой программы с именем MainInstance1.
3. Отправьте проект PLCnext Engineer на целевое устройство.
4. В Visual Studio создайте пустое консольное приложение C#, выполнив шаги 1–3 процедуры, описанной в предыдущем сообщении блога Makers.
5. В окне Проект => Свойство установите Целевую платформу проекта на «.NET 5.0».
6. В обозревателе решений щелкните решение правой кнопкой мыши, выберите «Управление пакетами NuGet для решения…» и установите следующие пакеты NuGet:
- Grpc.Tools
- Grpc.Net.Client
- Google.Protobuf
7. Скопируйте папку protobuf, содержащую файлы определения protobuf, в исходную папку проекта. Protobuf — это язык определения интерфейса (IDL), используемый для описания служб gRPC.
8. В файле конфигурации проекта добавьте ссылку на файл(ы) .proto для служб, которые будут использоваться в проекте. Раздел ItemGroup конфигурации проекта теперь будет выглядеть примерно так:
9. Замените содержимое файла .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() { // 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. В обозревателе решений щелкните правой кнопкой мыши решение и откройте терминал.
11. В терминале выполните следующие команды:
dotnet build ConsoleApp1.csproj dotnet publish -c RELEASE -r linux-arm .\ConsoleApp1.csproj -o MyApp
… где ConsoleApp1 — имя решения, а MyApp — имя выходного каталога, в котором будет опубликовано приложение. При необходимости приложение также можно опубликовать в режиме DEBUG.
12. Скопируйте выходной каталог и все его содержимое в ПЛК, используя (например) scp или WinSCP.
scp -r MyApp [email protected]:~
13. Откройте сеанс оболочки на ПЛК, используя (например) ssh или PuTTY.
14. Убедитесь, что у исполняемого файла есть права на выполнение:
$ chmod a+x /opt/plcnext/MyApp/ConsoleApp1
15. Запустите приложение:
$ /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
16. В PLCnext Engineer подключитесь к сети и измените значение переменной AI1. Значение, сообщаемое приложением, должно измениться.
Справочники и другие ресурсы
1. .NET Core ❤ gRPC
2. Вызовите службы gRPC с помощью клиента .NET
3. Рекомендуемый список полезных ресурсов для gRPC
Промышленные технологии
- Как спрос на электромобили повлияет на цепочку поставок
- Как подготовить холодовую цепочку к требованиям вакцины COVID-19
- Как логистика изобразительного искусства меняет рынок искусства к лучшему
- Как подготовиться к следующему нарушению цепочки поставок
- Как рассчитать подходящий размер конденсатора в мкФ и кВАр для улучшения коэффициента мощности
- Каким должен быть идеальный инструмент для управления производством?
- Intel Edison IoT:как выбрать Intel Edison для своего прототипа IoT
- Как создать простое консольное приложение PLCnext на C#
- Как измерить нужный мне гидравлический фитинг?
- Как вы управляете скоростью гидравлического двигателя?