跳到主要内容

从 SDK 继续

上一步已经在配置工具里测过,并把代码导出。SDK 在安装目录 C:\DARRA\Profinet_Slave\SDK\,也可从公共仓库安装(C# 用 NuGet、Python 用 PyPI、Java 用 Maven Central、Rust 用 crates.io,见下载页)。C# 写 using Darra.PnS; 即可,其他语言见各 SDK 页。

最小循环

站名和网卡在配置工具里设。程序侧:newStart映射一次过程数据(0 拷贝:结构体映射在过程映像上,源头变字段自己变)→ Stop

总线周期由内核完成,不必自写周期循环,任意线程可同时用。Read / Write 这类是快照(拷出来的实例不会自己变);0 拷贝入口是各语言的 InputsMapping / OutputsMapping 同名入口(I 侧只读、Q 侧可写)。

using System.Runtime.InteropServices;
using Darra.PnS;

[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct FromPlc // I:控制器 → 设备
{
public byte Present;
public short Recipe; // 线上大端:布局对上即可,取值走 Read(ref rx)
}

[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct ToPlc // Q:设备 → 控制器
{
public byte Ready;
public byte Busy;
}

using (var device = new DarraPnS())
{
device.Start();

// 映射一次
ref readonly var inp = ref device.ProcessData.InputsMapping<FromPlc>();
ref ToPlc outp = ref device.ProcessData.OutputsMapping<ToPlc>();

while (running)
{
if (!device.Connected)
continue;

byte present = inp.Present; // 读 I:总线刷新后自己变
outp.Ready = 1; // 写 Q:直接落过程映像
}

device.Stop();
}

多字节字段是 PROFINET 网络大端(线上字节序):直接当宿主 short / int 读会字节颠倒,要宿主序数值走 Read / Write(大端编解码)。

#include "pns.hpp"
using namespace darra::pns;

#pragma pack(push, 1)
struct FromPlc // I:控制器 → 设备
{
uint8_t Present;
uint8_t Trigger;
int16_t Recipe;
};

struct ToPlc // Q:设备 → 控制器
{
uint8_t Ready;
uint8_t Busy;
uint8_t Ok;
uint8_t Ng;
};
#pragma pack(pop)

PnSService device;
device.Start();

// 映射一次
const FromPlc& inp = device.ProcessData().InputsMapping<FromPlc>();
ToPlc& outp = device.ProcessData().OutputsMapping<ToPlc>();

while (running)
{
if (!device.Connected())
continue;

uint8_t present = inp.Present; // 读 I:总线刷新后自己变
outp.Ready = 1; // 写 Q:直接落过程映像
}

device.Stop();

地址化读写(Q0.0 / I0.0)是兼容路径。

配置工具顶栏「导出」可写出各语言示例。

导出程序 — C# 等 6 语言

完整 API 见 C# SDK。可跑示例见 小型视觉质检