跳到主要内容

C++ SDK 概述

开发 PROFINET IO Device 应用的 header-only C++17 类库。入口类型 PnSService。头文件在下载页或安装目录 SDK\SDK_Cpp\。代码里 #include "pns.hpp"using namespace darra::pns;

环境

  • Windows 10 / 11 x64
  • C++17
  • 已装 Darra Profinet Slave

快速开始

Start 之后把 I / Q 映射一次成结构体,然后一直用这个变量读写字段。映射一次,结构体映射在过程映像上,源头变字段自己变(I 侧返回 const T& 只读 —— 控制器每周期整段覆盖,写 I 静默无效;Q 侧返回 T& 可写)。Read / Write 是快照,拷出来的实例不会自己变。写 In()[i]PnSException

总线周期由内核完成,不必自写周期循环,任意线程可同时用。

#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)

int main()
{
PnSService device;
if (!device.Start())
return 1;

// 映射一次
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:直接落过程映像
(void)present;
}

device.Stop();
return 0;
}

安装包见 下载页。上手循环见 从 SDK 继续

Start() 失败返回 false 并写 LastError(),不抛。读写 IO 失败抛 PnSExceptionStart() 成功不等于主站已经在换数据,看 device.Connected()

配置工具可导出同口径示例:

从 GUI 导出代码