跳到主要内容

C++ API

Darra Profinet Slave C++ SDK:header-only pns.hpp,命名空间 darra::pns。产品入口是 PnSService

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

周期自由配置,最低 1 ms。失败抛 PnSException

生命周期

Connect()StartWrite / Read / PDO().In · PDO().OutStopClose

快速开始

#include "pns.hpp"
#include <cstdio>
using namespace darra::pns;

int main()
{
PnSService service;
try {
service.Connect();
service.Start();

auto q = service.Read(); // Q:控制器 → 设备
service.Write({0x01, 0x02, 0x03, 0x04}); // I:设备 → 控制器

printf("PDO In[0]=0x%02X\n",
(unsigned)service.PDO().In[0].Content());
service.PDO().Out[0].Content(0x11);

service.Stop();
service.Close();
} catch (const PnSException& e) {
printf("错误: %s\n", e.what());
return 1;
}
return 0;
}

连接

类别成员类型读写说明
生命周期Connect()void本机会话
生命周期Connect("127.0.0.1")void指定本机服务
生命周期Connect(host, port, api_key)void完整签名。服务端配置密钥后必传 api_key
生命周期Close()void释放会话。析构自动调用
设备kDefaultPortuint16_t只读本机服务默认端口
设备IsConnected()bool只读会话是否已连接
设备Host() / Port()string / uint16_t只读服务主机 / 端口
  • 本机:service.Connect();
  • 指定服务:service.Connect("127.0.0.1"); —— 服务不可达抛 PnSException

方向契约

过程映像方向固定,写 Q 必须失败

方向允许禁止
I设备 → 控制器Write / PDO().Out / Write*
Q控制器 → 设备Read / PDO().In / Read*任何写 Q

WriteArea(PnSServiceArea::Output, …) / WriteBool("Q0.0", …)PnSException(文案:Q 区 (输出面, 控制器 -> 设备) 只读)。字 / 双字一律大端。

启停与运行态

类别成员类型读写说明
生命周期Start()void启动会话。已启动则成功返回
生命周期Stop()void停止本会话。主站在连时不要拆应用关系
生命周期IsStarted()bool只读本地会话是否已启动
生命周期ResetDevice(mode)void复位。mode = "communication" / "factory"
运行态State() / Status()PnSState只读运行态枚举
运行态StatusEx()PnSServiceStatus只读state / connected / error_code 一次取回
运行态ErrorCode()PnSRuntimeErrorCode只读运行错误码枚举。未识别 = Unknown
运行态ErrorMessage()string只读错误码中文消息
诊断LastError()const string&只读最近一次调用错误(成功后清空)
IOIoStatus()PnSIoStatus只读IOPS / IOCS 快照

PnSServiceStatus::connected = 是否已与 IO 控制器建立周期数据交换。error_code 为原值(0 = 无错误);未识别值仍经该字段透传。

整区 IO

类别成员类型读写说明
IORead()vector<uint8_t>只读读整区 Q
IOWrite(data)void只写I,从偏移 0 起,允许短写
IOReadArea(area, offset, length)vector<uint8_t>只读按区截取
IOWriteArea(area, offset, data)void只写按区写入。写 Q 抛异常
IOGetIo()pair<vector<uint8_t>, vector<uint8_t>>只读快照:first = I,second = Q
IOoperator[] / at(offset)IoByte读写绝对字节。get = Q,set = I
std::vector<uint8_t> q = service.Read();
service.Write({0x01, 0x02, 0x03, 0x04});

PDO

对齐 PDO().In / PDO().OutIn 只读 Q,Out 可写 I。无 live 指针。

类别成员类型方向说明
PDOPDO()Pdo取访问器
PDOPDO().In[offset]PdoDataItem只读Q 区字节偏移
PDOPDO().Out[offset]PdoDataItem只写I 区字节偏移
PDOContent() / Content(v)uint8_t / void只读 / 只写1 字节。In 只读;Out 可写
PDOAsInt16 / AsUInt16 / AsInt32 / AsUInt32对应宽度读写大端。In 读 Q,Out 写 I
PDOCopyInputsTo(dest, dest_size)int只读整区 Q → 缓冲。失败返 0
PDOCopyToOutputs(src, src_size)int只写短写 I。失败返 0
PDOInputsMapping<T>()T只读Q 打包字节拷到平凡结构体(无 live 指针)
uint8_t q0 = service.PDO().In[0].Content();
service.PDO().Out[0].Content(0x11);
service.PDO().Out[2].AsInt16(-2);

#pragma pack(push, 1)
struct QFrame { uint8_t b0; uint8_t b1; int16_t w; };
#pragma pack(pop)
QFrame frame = service.InputsMapping<QFrame>();

地址化读写

HSL 式地址,与 C# PnSAddress.Parse 对齐。字 / 双字偏移即字节偏移,不强制 2 / 4 对齐IW3 合法)。

区域地址方向
II0.0 / IB0 / IW2 / ID4设备 → 控制器
QQ0.0 / QB0 / QW2 / QD4控制器 → 设备;只读
MM0.0 / MB0 / MW100 / MD0内部存储,映射输入面
DBDB1.DBX0.0 / DB1.DBB2 / DB1.DBW0 / DB1.DBD4槽位 1。编号 > 1 抛 PnSException
类别成员类型读写说明
地址ParseAddress(text)PnSServiceAddress只读静态解析
IOReadBool / ReadInt16 / ReadInt32bool / int16_t / int32_t只读位 / 字 / 双字。字双字大端
IOWriteBool / WriteInt16 / WriteInt32void只写写 I / M / DB。写 Q 抛 PnSException
service.WriteBool("I0.0", true);
service.WriteInt16("IW2", 0x1234);
bool start = service.ReadBool("Q0.0");
int16_t cmd = service.ReadInt16("QW0");

报警 / 标识 / 记录

报警 / 标识 / 记录走服务接口。过程数据不必走这些接口。

类别成员类型读写说明
报警GetAlarms()vector<PnSServiceAlarmItem>只读活动报警。空列表不是失败
报警AcknowledgeAlarm(id)void确认单条
报警AcknowledgeAllAlarms()int确认全部,返回条数
报警SendProcessAlarm(slot, subslot, usi, data, len)void发送过程报警
标识GetIm()PnSServiceImInfo只读I&M 观测
记录GetRecords()PnSServiceRecords只读应用参数记录

异常与枚举

类别类型读写说明
诊断PnSException失败抛出。code() 为错误码,what() 为消息
运行态PnSState只读Disconnected / Connecting / Connected / Running / Idle / ConfigError / Unknown
运行态PnSRuntimeErrorCode只读Ok=0 / ErrInit=-1 / ErrCfg=-2 / ErrThread=-3 / ErrRunning=-4 / ErrPdi=-5 / Unknown=-10000

C++17,仅 Windows。运行前提:驱动已就绪(通常需管理员)。示例见 Darra_PnS_SDK/CPP/examples/basic_service.cpp

相关