C SDK 概述
纯 C 接口,用来开发 PROFINET IO Device 应用。头文件在下载页或安装目录 SDK\SDK_C\。代码里 #include "pns.h"。
环境
- Windows 10 / 11 x64
- 已装 Darra Profinet Slave
快速开始
Start 之后把 I / Q 映射一次成结构体,然后一直按 Pack=1 结构体读写字段。结构体映射在过程映像上,源头变字段自己变;ReadStruct / WriteStruct 是快照,拷出来的实例不会自己变。写 I 不支持。
总线周期由内核完成,不必自写周期循环,任意线程可同时用。
#include "pns.h"
#pragma pack(push, 1)
typedef struct { /* I:控制器 → 设备 */
uint8_t Present;
uint8_t Trigger;
} from_plc_t;
typedef struct { /* Q:设备 → 控制器 */
uint8_t Ready;
uint8_t Busy;
uint8_t Ok;
uint8_t Ng;
} to_plc_t;
#pragma pack(pop)
int main(void)
{
pns_service_handle_t session = NULL;
if (PnSServiceConnectRealtime(&session) != PNS_OK)
return 1;
if (PnSServiceStart(session) != PNS_OK)
return 1;
/* 映射一次 */
const uint8_t *i = NULL; /* I 只读:用 RO 视图 */
volatile uint8_t *q = NULL; /* Q 可写 */
size_t ni = 0, nq = 0;
if (PnSProcessDataInputsMappingRO(session, &i, &ni) != PNS_OK ||
PnSProcessDataOutputsMapping(session, &q, &nq) != PNS_OK ||
i == NULL || q == NULL || /* 失败时 *p = NULL:绝不解引用 */
ni < sizeof(from_plc_t) || nq < sizeof(to_plc_t))
{
PnSServiceStop(session);
PnSServiceClose(session);
return 1;
}
const from_plc_t *inp = (const from_plc_t *)i;
to_plc_t *outp = (to_plc_t *)q;
while (running)
{
if (!PnSServiceIsConnected(session))
continue;
uint8_t present = inp->Present; /* 读 I:总线刷新后自己变 */
outp->Ready = 1; /* 写 Q:直接落过程映像 */
(void)present;
}
PnSServiceStop(session);
PnSServiceClose(session);
return 0;
}