为 PLCnext Control gRPC 服务器创建 C# 客户端:分步指南
固件版本 2022.0 LTS 在 AXC F 1152 和 AXC F 2152 设备上引入了 gRPC 服务器。该 gRPC 服务器为客户端应用提供访问 PLCnext Control 设备上 RSC 服务的方式。客户端应用可:
- 用任何支持 gRPC 的语言编写。
- 在任何位置运行——本地 PLCnext Control 设备或远程机器*。
- 托管在 OCI 容器中。
(* 远程访问自固件版本 2022.3 起可用)
PLCnext Info Center 提供 PLCnext Control 设备中 gRPC 服务器的一般信息。
本文介绍如何在 PLCnext Control 设备上创建简单的 C# gRPC 客户端应用。
先决条件
以下过程使用:
- AXC F 2152,运行固件版本 2022.0.3 LTS 或更高版本。
- PLCnext Engineer 2022.0.1 LTS 或更高版本。
- Visual Studio 2019(任意版本)。
- 此 Maker 博客文章的概念:如何创建简单的 PLCnext C# 控制台应用
- PLCnext/gRPC Github 仓库 protobuf 目录中的 gRPC 服务 Protobuf 定义文件。
- 设备状态 RSC 服务。
- 数据访问 RSC 服务。
过程
1. 使用基于 Web 的管理页面,确保名为 GRPC LOCAL SERVER 的服务已激活。
2. 为目标设备创建新的 PLCnext Engineer 项目。此项目应包含:
- 一个程序,带有名为 AI1、类型为 INT 的 OUT 端口变量。
- 该程序的一个实例,名为 MainInstance1。
3. 将 PLCnext Engineer 项目发送到目标设备。
4. 在 Visual Studio 中,遵循前一篇 Maker 博客文章步骤 1-3 创建空 C# 控制台应用。
5. 在项目属性窗口中,将项目目标框架设为“.NET 5.0”。
6. 在解决方案资源管理器中,右键点击解决方案,选择“管理 NuGet 包…”,安装以下 NuGet 包:
- Grpc.Tools
- Grpc.Net.Client
- Google.Protobuf
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() { // 连接 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 }; // 创建到 PLCnext unix socket 的 gRPC 通道 using var channel = GrpcChannel.ForAddress("https://localhost", new GrpcChannelOptions { HttpHandler = socketsHttpHandler }); // 在该通道上创建设备状态服务的 gRPC 客户端 var grpc_status_client = new IDeviceStatusService.IDeviceStatusServiceClient(channel); // 在该通道上创建数据访问服务的 gRPC 客户端 var grpc_data_client = new IDataAccessService.IDataAccessServiceClient(channel); // 创建从设备状态服务获取的项 // 项标识符列于 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"; // 创建从数据访问服务获取的变量 var data = new IDataAccessServiceReadSingleRequest(); data.PortName = "Arp.Plc.Eclr/MainInstance1.AI1"; // 响应变量 IDeviceStatusServiceGetItemResponse grpc_status_response; IDataAccessServiceReadSingleResponse grpc_data_response; // 无限循环 while (true) { // 从设备状态服务请求项 grpc_status_response = grpc_status_client.GetItem(item); // 从数据访问服务请求数据 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; } } } }
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 admin@192.168.1.10:~
13. 使用 ssh 或 PuTTY 等在 PLC 上打开 Shell 会话。
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. 使用 .NET 客户端调用 gRPC 服务
3. gRPC 实用资源精选列表
工业技术
- 掌握线缆线束制造:在E3.series中设定精准长度
- 电动汽车需求激增:如何重塑全球供应链
- 优化冷链物流,保障COVID-19疫苗全球分发
- 艺术品物流:重塑全球艺术品市场流通新范式
- 主动应对供应链冲击:从苏伊士运河危机看数字化韧性建设
- 电容器组容量精算指南:kVAR 与 µF 双单位计算 (三法对比+在线工具)
- 定义理想生产管控工具:关键特性与最佳实践
- Intel Edison 物联网模组回顾:规格、扩展板、软件生态、气象站实战与替代方案
- 开发 PLCnext 控制台应用 (C#):初学者指南
- 航空制造中的激光测量:飞机零部件精密质量控制
- 精准测量液压接头:分步操作指南
- 液压马达PWM调速与远程控制实战指南