跳到主要内容

C++ API

Darra PnSlave C++ SDK:header-only pnet.hpp,命名空间 darra::pnet。产品入口是 PnetService

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

实时主路径映射 \Device\DarraRT_Pnet_GlobalIO,不打开 \\.\DarraRT_Pnet,不加载 darra_pnet.dll。用户面无周期 / Tick:只要读、写。失败抛 PnetException

生命周期

Connect()StartWrite / Read / PDO().In · PDO().OutStop(卸映射)→ Close

快速开始

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

int main()
{
PnetService service;
try {
service.Connect(); // 无 host = 实时
service.Start(); // 映射 GlobalIO

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(); // 卸映射;在连不撕 AR
service.Close();
} catch (const PnetException& e) {
printf("错误: %s\n", e.what());
return 1;
}
return 0;
}

连接

类别成员类型读写说明
生命周期Connect()void实时主路径。无 host,不探测 HTTP。Start 时映射 GlobalIO
生命周期Connect("127.0.0.1")voidHTTP 备用。探测 GET /api/info。仅本地回环可达;端口默认 kDefaultPort(18840)
生命周期Connect(host, port, api_key)void备用完整签名。服务端配置密钥后必传 api_key
生命周期Close()void释放会话。不向服务端发 stop。析构自动调用
设备kDefaultPortuint16_t只读HTTP 备用端口 18840(编译期常量,不可配置)
设备IsConnected()bool只读会话是否已连接
设备Host() / Port()string / uint16_t只读备用路径主机 / 端口
  • 实时:service.Connect(); —— 空 host。
  • 备用:service.Connect("127.0.0.1"); —— 服务不可达 / 非 Darra 服务抛 PnetException

方向契约

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

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

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

启停与运行态

类别成员类型读写说明
生命周期Start()void映射 GlobalIO。已映射不 POST /api/start。Section 打不开才走 HTTP 备用
生命周期Stop()void卸映射。仅空闲才备用 POST /api/stop;主站在连不撕 AR
生命周期IsStarted()bool只读本地会话是否已启动
生命周期ResetDevice(mode)void复位。mode = "communication" / "factory"
运行态State() / Status()PnetState只读运行态枚举。SHM 已映射时只信共享内存头
运行态StatusEx()PnetServiceStatus只读state / connected / error_code 一次取回
运行态ErrorCode()PnetRuntimeErrorCode只读运行错误码枚举。未识别 = Unknown
运行态ErrorMessage()string只读错误码中文消息
诊断LastError()const string&只读最近一次调用错误(成功后清空)
IOIoStatus()PnetIoStatus只读IOPS / IOCS 快照。空快照不虚构 GOOD

PnetServiceStatus::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# PnetAddress.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 抛 PnetException
类别成员类型读写说明
地址ParseAddress(text)PnetServiceAddress只读静态解析
IOReadBool / ReadInt16 / ReadInt32bool / int16_t / int32_t只读位 / 字 / 双字。字双字大端
IOWriteBool / WriteInt16 / WriteInt32void只写写 I / M / DB。写 Q 抛 PnetException
service.WriteBool("I0.0", true);
service.WriteInt16("IW2", 0x1234);
bool start = service.ReadBool("Q0.0");
int16_t cmd = service.ReadInt16("QW0");

报警 / 标识 / 记录

HTTP 备用路径。实时 IO 不必走这些接口。

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

异常与枚举

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

C++17,仅 Windows(WinHTTP / ntdll)。运行前提:驱动已创建 GlobalIO Section(通常需管理员)。示例见 Darra_Pnet_SDK/CPP/examples/basic_service.cpp

相关