산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 산업기술

C#에서 PLCnext Control gRPC 서버용 클라이언트를 만드는 방법

펌웨어 버전 2022.0 LTS는 AXC F 1152 및 AXC F 2152 장치에 gRPC 서버를 도입합니다. 이 gRPC 서버는 클라이언트 응용 프로그램이 PLCnext Control 장치의 RSC 서비스에 액세스할 수 있는 방법을 제공합니다. 클라이언트 응용 프로그램은 다음과 같습니다.

(* 원격 접속은 펌웨어 버전 2022.3부터 가능합니다)

PLCnext Control 장치의 gRPC 서버에 대한 일반 정보는 PLCnext Info Center에서 확인할 수 있습니다.

이 문서에서는 PLCnext Control 장치에서 실행되는 C#으로 간단한 gRPC 클라이언트 응용 프로그램을 만드는 방법을 설명합니다.

전제조건

아래 절차는 다음을 사용합니다.

절차

1. 웹 기반 관리 페이지를 사용하여 GRPC LOCAL SERVER라는 서비스가 활성화되어 있는지 확인합니다.

2. 대상 장치에 대한 새 PLCnext Engineer 프로젝트를 생성합니다. 이 프로젝트에는 다음이 포함되어야 합니다.

3. PLCnext Engineer 프로젝트를 대상 장치로 보냅니다.

4. Visual Studio에서 이전 Makers Blog 게시물에 설명된 절차의 1-3단계에 따라 빈 C# 콘솔 애플리케이션을 만듭니다.

5. 프로젝트 => 속성 창에서 프로젝트 대상 프레임워크를 ".NET 5.0"으로 설정합니다.

6. 솔루션 탐색기에서 솔루션을 마우스 오른쪽 버튼으로 클릭하고 "솔루션용 NuGet 패키지 관리..."를 선택하고 다음 NuGet 패키지를 설치합니다.

7. protobuf 정의 파일이 포함된 protobuf 폴더를 프로젝트 소스 폴더에 복사합니다. Protobuf는 gRPC 서비스를 설명하는 데 사용되는 IDL(인터페이스 정의 언어)입니다.

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를 사용하여 출력 디렉토리와 모든 내용을 PLC에 복사합니다.

scp -r MyApp [email protected]:~

13. ssh 또는 PuTTY를 사용하여 PLC에서 셸 세션을 엽니다.

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 코어 ❤ gRPC

2. .NET 클라이언트로 gRPC 서비스 호출

3. gRPC에 대한 유용한 리소스의 선별된 목록


산업기술

  1. 전기 자동차 수요가 공급망에 미치는 영향
  2. COVID-19 백신 수요에 대한 콜드체인 준비 방법
  3. 순수 미술 물류가 미술 시장을 선의로 변화시키는 방법
  4. 차세대 공급망 붕괴에 대비하는 방법
  5. P.F 개선을 위해 µ-패럿 및 kVAR 단위로 적절한 커패시터 크기를 계산하는 방법
  6. 생산 관리를 위한 이상적인 도구는 어떠해야 합니까?
  7. Intel Edison IoT:IoT 프로토타입을 위한 Intel Edison을 선택하는 방법
  8. C#에서 간단한 PLCnext 콘솔 애플리케이션을 만드는 방법
  9. 필요한 유압 피팅을 어떻게 측정합니까?
  10. 유압 모터의 속도는 어떻게 제어합니까?