跳到主要内容

初始化

推荐方式

PnSServiceConnectRealtime 建会话,外面拿到句柄后调一次 PnSServiceStart,循环里写 Q、读 I。
先装好 Darra Profinet Slave。站名和网卡在配置工具里设好,这里不用传。不要每个周期 Connect / Close。

C 无构造函数。同一时刻只允许一个实时会话,第二个返回 PNS_ERR_BUSY。见 SDK 连接契约

创建会话

PnSServiceConnectRealtime()

pns_result_t PnSServiceConnectRealtime(pns_service_handle_t * p_session);

新建会话,返回句柄。服务没起来会失败。这只是拿到句柄,还没启用 IO,主站也还没连上。须再调 PnSServiceStart

失败时 *p_sessionNULL

参数:

  • p_session (pns_service_handle_t *) — 出参,成功为会话句柄

返回值:

  • PNS_OK 成功
  • PNS_ERR_BUSY 已有其它实时会话
  • PNS_ERR_NO_CONNECTION 服务不可达
  • PNS_ERR_INVALID_PARAM 参数非法
  • PNS_ERR_MEMORY / PNS_ERR_NATIVE 分配或建会话失败

示例:

pns_service_handle_t session = NULL;
if (PnSServiceConnectRealtime(&session) != PNS_OK)
return 1;

if (PnSServiceStart(session) != PNS_OK)
return 1;

while (running)
{
/* 写 Q、读 I 写在这里 */
}

PnSServiceStop(session);
PnSServiceClose(session);

句柄包住整个程序寿命,循环写在 Close 之前Start 一次就够。每个周期 Close 会把 Q 清掉,下一圈再写等于输出被扔掉。

启停

PnSServiceStart()

pns_result_t PnSServiceStart(pns_service_handle_t session);

启用 IO,返回 pns_result_t。成功不等于主站已经在换数据,那要看 PnSServiceIsConnected。已经 Start 且还没 Stop,再调一次直接返回 PNS_OK

失败写 PnSServiceLastError。句柄无效返回 PNS_ERR_INVALID_PARAM;服务没起来返回 PNS_ERR_NO_CONNECTION;启动失败返回 PNS_ERR_NATIVE

示例:

pns_result_t rc = PnSServiceStart(session);
if (rc != PNS_OK)
{
printf("%s\n", PnSServiceLastError(session));
return 1;
}

PnSServiceStop()

pns_result_t PnSServiceStop(pns_service_handle_t session);

停用 IO。句柄还在,可以再 Start。没 Start 过或已经 Stop,再调一次没事。失败写 PnSServiceLastError

彻底放开用 PnSServiceClose(),不是 Stop()

示例:

PnSServiceStop(session);

资源释放

PnSServiceClose()

pns_result_t PnSServiceClose(pns_service_handle_t session);

还在跑就先 Stop,再放开句柄。Q 会被清掉(清的是 Q 的净荷窗:PPM 输出区前 3 字节 IOPS 前缀不动);I 留着,等下一个程序。NULL 句柄安全返回 PNS_OK。放开之后这个句柄不能再用,要重新 PnSServiceConnectRealtime

停 IO 用 PnSServiceStop()Stop 之后句柄还在,可以再 Start

示例:

PnSServiceClose(session);