C++ 特有语法糖
本页只介绍 PnSService C++ SDK 独有的便捷写法。它们 不是新功能,只是把已有入口包装成更顺手的 C++ 写法(
ScopedStart、ProcessData().In()[i].AsInt16()这类索引)。
可选,不用不影响标准入口 ——
Connected()/Status()/ErrorCode()、ReadInt16/WriteInt16、ProcessData().Read/ProcessData().Write照常用。语法糖只是另一种写法。
头文件 ——
#include "pns.hpp"。ScopedStart另加#include "pns_sugar.hpp"。类型在darra::pns。
一、ScopedStart
进入调 Start(),离开调 Stop()。不 Close。析构不抛。不可拷贝、不可移动。
构造不抛:Start() 失败时 ok() 为 false、active() 为 false,析构不会 Stop()。判断起没起来先查 ok(),失败码看 errorCode()。
| 写法 | 调用 |
|---|---|
| 标准 API | device.Start(); … device.Stop(); |
| 语法糖 | ScopedStart guard(device); |
#include "pns.hpp"
#include "pns_sugar.hpp"
using namespace darra::pns;
int main()
{
PnSService device;
{
ScopedStart guard(device);
if (!guard.ok())
return 1;
device.WriteBool("Q0.0", true);
} // 离开时 Stop
return 0;
}
离开时不要 Stop,调 guard.release()。
临时开一段 IO 用 ScopedStart,免漏 Stop()。一直跑就直接 Start()。
二、过程数据索引自动转换
ProcessData().In()[i] / ProcessData().Out()[i] 从当前偏移按类型读写。读 I 用 In,写 Q 用 Out。完整属性表见 过程数据 · 自动转换。
| 写法 | 调用 |
|---|---|
| 标准 API | int16_t v = device.ReadInt16("IW2"); |
| 语法糖 | int16_t v = device.ProcessData().In()[2].AsInt16(); |
| 标准 API | device.WriteInt16("QW2", 123); |
| 语法糖 | device.ProcessData().Out()[2].AsInt16(123); |
uint8_t i0 = device.ProcessData().In()[0].Content();
int16_t iw = device.ProcessData().In()[2].AsInt16();
float f = device.ProcessData().In()[8].AsFloat();
device.ProcessData().Out()[0].Content(0x11);
device.ProcessData().Out()[2].AsInt16(123);
device.ProcessData().Out()[8].AsFloat(1.5f);
写 In()[i] 抛 PnSException(I 只读)。
何时用
- 就几个字段:不想为几个字去建结构体。
- 字段多:还是
ProcessData().Read/ProcessData().Write。
能力清单
| 分组 | 内容 |
|---|---|
| 作用域启停 | ScopedStart:进入 Start(),离开 Stop()。release() / active() |
| 过程数据自动转换 | Content / AsInt8 / AsUInt8 / AsInt16 / AsUInt16 / AsInt32 / AsUInt32 / AsInt64 / AsUInt64 / AsFloat / AsDouble / AsBool / GetBit / SetBit |