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

Как создать клиент для gRPC-сервера PLCnext Control на C#

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

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

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

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

Предпосылки

В приведенной ниже процедуре используются:

Процедура

1. Используя веб-страницу управления, убедитесь, что служба с именем GRPC LOCAL SERVER активирована.

2. Создайте новый проект PLCnext Engineer для целевого устройства. Этот проект должен иметь:

3. Отправьте проект PLCnext Engineer на целевое устройство.

4. В Visual Studio создайте пустое консольное приложение C#, выполнив шаги 1–3 процедуры, описанной в предыдущем сообщении блога Makers.

5. В окне Проект => Свойство установите Целевую платформу проекта на «.NET 5.0».

6. В обозревателе решений щелкните решение правой кнопкой мыши, выберите «Управление пакетами NuGet для решения…» и установите следующие пакеты NuGet:

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


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

  1. Как спрос на электромобили повлияет на цепочку поставок
  2. Как подготовить холодовую цепочку к требованиям вакцины COVID-19
  3. Как логистика изобразительного искусства меняет рынок искусства к лучшему
  4. Как подготовиться к следующему нарушению цепочки поставок
  5. Как рассчитать подходящий размер конденсатора в мкФ и кВАр для улучшения коэффициента мощности
  6. Каким должен быть идеальный инструмент для управления производством?
  7. Intel Edison IoT:как выбрать Intel Edison для своего прототипа IoT
  8. Как создать простое консольное приложение PLCnext на C#
  9. Как измерить нужный мне гидравлический фитинг?
  10. Как вы управляете скоростью гидравлического двигателя?