跳到主要内容

PDO 输入输出

对齐 C#:GetIO / Mapping 已退场,请用 copyInputPdo / writeOutputPdo generation 整帧 API。

PDO 周期与邮箱的关系

邮箱通信(SDO/CoE/FoE 等)自动附带在 PDO 周期中,不占用额外帧。邮箱响应延迟约 2 个 PDO 周期。

应用层不是零拷贝指针

Java 应用层不得GetIOGetInputByteBuffer / GetOutputByteBufferInputArray / OutputArrayBindPdoStructInputsSliceMapping 当成 IOmap overlay。这些入口仍调用 native GetIO,而 GetIO 已退场(native fail-closed,不返回内部过程映像地址),指针侧通常为 null。

内核 SHM 零拷贝只存在于驱动内部(IOmap / GlobalIO),不向应用层暴露指针

主路径是 PDO.copyInputPdo / PDO.writeOutputPdoSlavePdo 同名),分别绑定 native CopySlaveInputPdo(ordinal 1745 / D_1745)与 WriteSlaveOutputPdo(ordinal 1747 / D_1747)。读回当前 RxPDO 镜像用 copyOutputPdo(ordinal 1746 / D_1746)。

主路径:generation 整帧

与 C# slave.CopyInputPdo / slave.WriteOutputPdo 同一套 native 合同。DarraCore 已按 ordinal 绑定:

nativeordinalJava
CopySlaveInputPdo1745 D_1745PDO.copyInputPdo / SlavePdo.copyInputPdo
CopySlaveOutputPdo1746 D_1746PDO.copyOutputPdo / SlavePdo.copyOutputPdo
WriteSlaveOutputPdo1747 D_1747PDO.writeOutputPdo / SlavePdo.writeOutputPdo

公开状态 PDO.PdoIoStatus 与 C# PdoIoStatus 一致:Failed=0, Success=1, BufferTooSmall=2, SizeMismatch=3, Conflict=4, Stale=5, Busy=6。

native 返回的是线上 uint8 编码(OK=0x00,FAILED=0xFF,BUSY=0xFE,BUFFER_TOO_SMALL=0xFD,SIZE_MISMATCH=0xFC,STALE=0xFB,CONFLICT=0xFA)。Java 已归一化,不要把 native 0 当成 Failed

copyInputPdo()

public PDO.PdoIoStatus copyInputPdo(
byte[] destination, int[] copiedSize, int[] requiredSize)

把当前 generation 的完整 TxPDO(从站→主站)复制到调用方缓冲区。copiedSize / requiredSize 必须是长度至少 1 的出参数组。

返回值: PDO.PdoIoStatus。成功时 copiedSize[0] == requiredSize[0],且必须等于当前输入映射长度。

查询尺寸: 传入 null 或空数组可读 requiredSize[0](此时不拷数据)。

示例:

byte[] inputFrame = new byte[slaveInputBytes];
int[] copied = new int[1];
int[] required = new int[1];
PDO.PdoIoStatus status = pdo.copyInputPdo(inputFrame, copied, required);
if (status == PDO.PdoIoStatus.Success
&& copied[0] == required[0]
&& required[0] == inputFrame.length) {
// 按小端解析 inputFrame,不要假设存在跨周期仍有效的 IOmap 指针
}

copyOutputPdo()

public PDO.PdoIoStatus copyOutputPdo(
byte[] destination, int[] copiedSize, int[] requiredSize)

把当前 generation 的完整 RxPDO 镜像(主站→从站)复制到调用方缓冲区。用于读回已下发的输出映像;局部改写请在托管缓冲上改完后,再用 writeOutputPdo 提交完整帧。

writeOutputPdo()

public PDO.PdoIoStatus writeOutputPdo(
byte[] source, int[] writtenSize, int[] requiredSize)

单 owner 提交完整 RxPDO。source 长度必须与当前输出映射完全相等,无静默截断。此入口不提供并发 CAS,禁止当局部/typed/batch 读改写用。

已退场(不要再用)

PDO / SlavePdo 下列方法仍走 GetIO 指针路径。GetIO 已退场后会拿到空指针并返回 0 / 空 buffer / false不是第二套可用 overlay API:

  • ReadInputDataDirect / WriteOutputDataDirect
  • InputArray / OutputArray / PDODataItem
  • GetInputByteBuffer / GetOutputByteBuffer / AsBuffer
  • BatchRead / BatchWrite
  • SlavePdo.Inputs() / Outputs() / BindPdoStruct / InputsSliceMapping

类型化 PDOReadInput* / readInputU8 走 native 类型化读(错误会折叠为 0,无法区分真零值)。类型化写 PDOWriteOutput* 在 C ABI 上已 fail-closed。不要把调用返回当成写入成功。

PDO 状态与健康

类别方法类型读写说明
周期AvgCycleTimeNs()long只读本从站 PDO 平均周期时间(纳秒,来自 GetPDOStats)
错误ErrorCount()int只读本从站 PDO 错误计数
有效性IsValid()boolean只读输入或输出字节数 > 0
大小ExpectedSize()int只读输入 + 输出总字节数
变化Changed()boolean只读native 无该导出,始终返回 false

GetPerformanceStats() / ResetPerformanceStats()

public Pointer GetPerformanceStats()
public void ResetPerformanceStats()

GetPerformanceStats() 返回底层性能统计结构的不透明指针(结构布局为内部细节);ResetPerformanceStats() 清零该从站的 PDO 性能统计。

已退场对照

旧写法现状
GetIO 指针主路径已退场;native fail-closed
GetInputByteBuffer() / GetOutputByteBuffer() 当 IOmap overlay不是零拷贝过程映像
InputArray / OutputArray / PDODataItem 指针读写仍走 GetIO,指针通常为空
InputsMappingInfo / OutputsMappingInfo / BindPdoStructMapping 已退场
InputsSliceMapping / OutputsSliceMapping同上

需要结构体视图时:先 copyInputPdo 到调用方缓冲区,再按小端解析。不要假设能拿到跨周期仍有效的 IOmap 指针。