Cara membuat klien untuk server gRPC Kontrol PLCnext di C#
Versi firmware 2022.0 LTS memperkenalkan server gRPC pada perangkat AXC F 1152 dan AXC F 2152. Server gRPC ini menyediakan cara bagi aplikasi klien untuk mengakses layanan RSC pada perangkat Kontrol PLCnext. Aplikasi klien dapat berupa:
- Ditulis dalam bahasa apa pun yang mendukung gRPC.
- Jalankan di mana saja – secara lokal di perangkat PLCnext Control, atau di mesin jarak jauh*.
- Dihosting dalam wadah OCI.
(* akses jarak jauh akan tersedia dari firmware versi 2022.3)
Informasi umum tentang server gRPC di perangkat Kontrol PLCnext tersedia di Pusat Info PLCnext.
Artikel ini menjelaskan cara membuat aplikasi klien gRPC sederhana di C#, berjalan pada perangkat Kontrol PLCnext.
Prasyarat
Prosedur di bawah ini menggunakan:
- AXC F 2152 menjalankan firmware versi 2022.0.3 LTS atau lebih baru.
- PLCnext Engineer versi 2022.0.1 LTS atau lebih baru.
- Visual Studio 2019 (edisi apa saja).
- Konsep yang diperkenalkan dalam posting Blog Makers ini:Cara membuat aplikasi konsol PLCnext sederhana di C#
- File definisi protobuf untuk server gRPC, di direktori protobuf dari repositori Github PLCnext/gRPC.
- Layanan RSC Status Perangkat.
- Layanan RSC Akses Data.
Prosedur
1. Menggunakan halaman Manajemen Berbasis Web, pastikan layanan bernama GRPC LOCAL SERVER diaktifkan.
2. Buat proyek Insinyur PLCnext baru untuk perangkat target Anda. Proyek ini harus memiliki:
- Program dengan variabel port OUT yang disebut AI1, bertipe INT.
- Sebuah instance dari program yang disebut MainInstance1.
3. Kirim proyek PLCnext Engineer ke perangkat target.
4. Di Visual Studio, buat aplikasi konsol C# kosong dengan mengikuti Langkah 1-3 dari prosedur yang dijelaskan dalam posting Blog Makers sebelumnya.
5. Di jendela Project => Properti, setel kerangka kerja Target proyek ke “.NET 5.0”.
6. Di Solution Explorer, klik kanan pada Solution, pilih “Manage NuGet Packages for Solution…”, dan instal paket NuGet berikut:
- Grpc.Alat
- Grpc.Net.Klien
- Google.Protobuf
7. Salin folder protobuf yang berisi file definisi protobuf ke folder sumber proyek. Protobuf adalah Interface Definition Language (IDL) yang digunakan untuk mendeskripsikan layanan gRPC.
8. Dalam file konfigurasi proyek, tambahkan referensi ke file .proto untuk layanan yang akan digunakan dalam proyek. Bagian ItemGroup dari konfigurasi proyek sekarang akan terlihat seperti ini:
9. Ganti isi file .cs proyek dengan kode ini (Anda mungkin perlu mengubah nama namespace):
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. Di Solution Explorer, klik kanan pada Solution dan buka Terminal.
11. Di terminal, jalankan perintah berikut:
dotnet build ConsoleApp1.csproj
dotnet publish -c RELEASE -r linux-arm .\ConsoleApp1.csproj -o MyApp
… di mana ConsoleApp1 adalah nama solusi, dan MyApp adalah nama direktori keluaran tempat aplikasi akan dipublikasikan. Aplikasi ini juga dapat dipublikasikan dalam mode DEBUG jika diperlukan.
12. Salin direktori keluaran dan semua isinya ke PLC menggunakan (misalnya) scp atau WinSCP.
scp -r MyApp [email protected]:~
13. Buka sesi shell pada PLC menggunakan (misalnya) ssh atau Putty.
14. Pastikan bahwa executable memiliki hak eksekusi:
$ chmod a+x /opt/plcnext/MyApp/ConsoleApp1
15. Jalankan aplikasinya:
$ /opt/plcnext/MyApp/ConsoleApp1
Outputnya harus mirip dengan:
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. Di PLCnext Engineer, online dan ubah nilai variabel AI1. Nilai yang dilaporkan oleh aplikasi harus berubah.
Referensi dan sumber daya lainnya
1. .NET Core ❤ gRPC
2. Panggil layanan gRPC dengan klien .NET
3. Daftar sumber daya yang berguna untuk gRPC