跳到主要内容

C API

Darra Profinet Slave C SDK:读写 I / Q。符号为 PnSService* / PnSPdo*

#include "pns.h"

周期自由配置,最低 1 ms。应用读写过程数据。

生命周期

PnSServiceConnectRealtimePnSServiceStart → 写 I / 读 Q / PnSPdoIn* · PnSPdoOut*PnSServiceStopPnSServiceClose

快速开始

#include "pns.h"
#include <stdio.h>

int main(void)
{
pns_service_handle_t session = NULL;
uint8_t q[32];
uint16_t q_len;
uint8_t i_area[4] = { 0x11, 0x22, 0x33, 0x44 };
uint8_t q0 = 0;

/* 本机会话;指定本机服务见 PnSServiceConnect */
if (PnSServiceConnectRealtime(&session) != PNS_OK)
return 1;
if (PnSServiceStart(session) != PNS_OK) {
PnSServiceClose(session);
return 1;
}

q_len = (uint16_t)sizeof(q);
PnSServiceRead(session, &q_len, q); /* 读 Q */
PnSServiceWrite(session, i_area, 4); /* 写 I,允许短写 */

PnSPdoInU8(session, 0, &q0); /* PDO:读 Q[0] */
PnSPdoOutU8(session, 0, 0x11); /* PDO:写 I[0] */

PnSServiceStop(session);
PnSServiceClose(session);
return 0;
}

连接

类别函数类型读写说明
生命周期PnSServiceConnectRealtime(p_session)pns_result_t本机会话
生命周期PnSServiceConnect(host, port, api_key, p_session)pns_result_t指定本机服务。host"127.0.0.1"(或 NULL 默认回环)
生命周期PnSServiceClose(session)pns_result_t释放会话。NULL 句柄安全
  • 本机:PnSServiceConnectRealtime
  • 指定服务:PnSServiceConnect("127.0.0.1", 0, NULL, &session) —— 服务不可达返回 PNS_ERR_NO_CONNECTION,会话不建立。

方向契约

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

方向允许禁止
I设备 → 控制器PnSServiceWrite / PnSPdoOut* / Write*
Q控制器 → 设备PnSServiceRead / PnSPdoIn* / Read*任何 Write* / PnSPdoOut* 写 Q

写 Q / WriteArea(OUTPUT, …) 返回 PNS_ERR_NOT_SUPPORTED。字 / 双字一律大端(PROFINET 网络序)。

启停与运行态

类别函数类型读写说明
生命周期PnSServiceStart / StartExpns_result_t启动会话。已启动则成功返回
生命周期PnSServiceStop / StopExpns_result_t停止本会话。主站在连时不要拆应用关系
生命周期PnSServiceIsStartedbool只读本地会话是否已启动
生命周期PnSServiceReset(session, mode)pns_result_t复位(COMMUNICATION / FACTORY
运行态PnSServiceGetStatuspns_result_t只读出参:state / connected / error_code
运行态PnSServiceLastRuntimeErrorpns_runtime_error_code_t只读最近一次运行错误码枚举
运行态PnSServiceLastRuntimeErrorRawint只读最近一次错误码原值(未识别时枚举为 UNKNOWN,原值不丢)
诊断PnSServiceLastErrorconst char *只读最近一次调用错误描述

StartEx / StopExp_error_code 出参返回枚举(可为 NULL,与无 Ex 版本等价)。

整区 IO

用户面:整区短名。

类别函数类型读写说明
IOPnSServiceRead(session, p_len, p_data)pns_result_t只读读整区 Qp_dataNULL 仅回写长度
IOPnSServiceWrite(session, p_data, length)pns_result_t只写I,从偏移 0 起,允许短写前 N 字节
IOPnSServiceReadArea(session, area, offset, length, p_len, p_data)pns_result_t只读按区截取。I / M = 设备→控制器;Q = 控制器→设备
IOPnSServiceWriteArea(session, area, offset, p_data, length)pns_result_t只写按区写入。Q 区返回 PNS_ERR_NOT_SUPPORTED
IOPnSServiceGetIo(session, …)pns_result_t只读过程映像快照(I 区 + Q 区)。缓冲过小回写实际长度

PDO

叠在 Read / Write 上,不另开映射。In = Q,Out = I。

类别函数类型方向说明
PDOPnSPdoInU8 / InU16 / InU32 / InI16 / InI32pns_result_t只读读 Q 区字节偏移。字 / 双字大端
PDOPnSPdoOutU8 / OutU16 / OutU32 / OutI16 / OutI32pns_result_t只写写 I 区字节偏移。字 / 双字大端
PDOPnSPdoCopyInputsTo(session, dest, dest_len, copied)pns_result_t只读整区 Q → 调用方缓冲。destNULL 仅回写长度
PDOPnSPdoCopyToOutputs(session, src, src_len, written)pns_result_t只写短写 I,从偏移 0 起
PDOPnSPdoReadStruct(session, dest, len)pns_result_t只读Q 前 len 字节 → 打包缓冲(网络大端)
PDOPnSPdoWriteStruct(session, src, len)pns_result_t只写打包缓冲 → I 前 len 字节(允许短写)
uint8_t q0 = 0;
PnSPdoInU8(session, 0, &q0); /* Q[0] */
PnSPdoOutU8(session, 0, 0x11); /* I[0] */

int16_t qw;
PnSPdoInI16(session, 0, &qw); /* Q 大端 Int16 */
PnSPdoOutI16(session, 2, -2); /* I 偏移 2 写大端 Int16 */

地址化读写

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

区域地址方向
II0.0 / IB0 / IW2 / ID4设备 → 控制器;Write* 发送,Read* 读回本地影子
QQ0.0 / QB0 / QW2 / QD4控制器 → 设备;只读。Write* 返回 PNS_ERR_NOT_SUPPORTED
MM0.0 / MB0 / MW100 / MD0内部存储,映射输入面
DBDB1.DBX0.0 / DB1.DBB2 / DB1.DBW0 / DB1.DBD4槽位 1 数据块。编号 > 1 返回 PNS_ERR_NOT_FOUND
类别函数类型读写说明
地址PnSServiceParseAddress(text, p_out)pns_result_t只读解析为 pns_service_address_t
IOPnSServiceReadBool / ReadInt16 / ReadInt32pns_result_t只读位 / 字 / 双字。字双字大端
IOPnSServiceWriteBool / WriteInt16 / WriteInt32pns_result_t只写写 I / M / DB。写 Q 返回 PNS_ERR_NOT_SUPPORTED
IOPnSServiceReadBytes / WriteBytespns_result_t只读 / 只写地址化底层原语

报警 / 标识 / 记录

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

类别函数类型读写说明
报警PnSServiceGetAlarmspns_result_t只读活动报警列表。空列表不是失败
报警PnSServiceAlarmAck / AlarmAckAllpns_result_t确认单条 / 全部
报警PnSServiceSendAlarmpns_result_t发送过程报警(设备 → 控制器)
标识PnSServiceGetImpns_result_t只读I&M 观测(pns_service_im_info_t
记录PnSServiceGetRecordspns_result_t只读应用参数记录列表

常量与返回码

类别符号类型读写说明
设备PNS_SERVICE_PORT_DEFAULT只读本机服务默认端口
设备PNS_SERVICE_APIKEY_HEADER只读X-Darra-PnSlave-Api-Key
设备PNS_OKpns_result_t只读成功。其余失败码见 PnSResultText

所有调用返回 pns_result_tPNS_OK = 0)。状态 / 运行错误码返回枚举,不返回裸整数充当语义。

运行前提:驱动已加载(通常需管理员)。示例见 Darra_PnS_SDK/C/examples/basic_service.c

相关