PDO 输入输出
对齐 C#:GetIO / Mapping 已退场,请用 copyInputPdo / writeOutputPdo generation 整帧 API。
邮箱通信(SDO/CoE/FoE 等)自动附带在 PDO 周期中,不占用额外帧。邮箱响应延迟约 2 个 PDO 周期。
Java 应用层不得把 GetIO、GetInputByteBuffer / GetOutputByteBuffer、InputArray / OutputArray、BindPdoStruct、InputsSliceMapping 当成 IOmap overlay。这些入口仍调用 native GetIO,而 GetIO 已退场(native fail-closed,不返回内部过程映像地址),指针侧通常为 null。
内核 SHM 零拷贝只存在于驱动内部(IOmap / GlobalIO),不向应用层暴露指针。
主路径是 PDO.copyInputPdo / PDO.writeOutputPdo(SlavePdo 同名),分别绑定 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 绑定:
| native | ordinal | Java |
|---|---|---|
CopySlaveInputPdo | 1745 D_1745 | PDO.copyInputPdo / SlavePdo.copyInputPdo |
CopySlaveOutputPdo | 1746 D_1746 | PDO.copyOutputPdo / SlavePdo.copyOutputPdo |
WriteSlaveOutputPdo | 1747 D_1747 | PDO.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/WriteOutputDataDirectInputArray/OutputArray/PDODataItemGetInputByteBuffer/GetOutputByteBuffer/AsBufferBatchRead/BatchWriteSlavePdo.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 / BindPdoStruct | Mapping 已退场 |
InputsSliceMapping / OutputsSliceMapping | 同上 |
需要结构体视图时:先 copyInputPdo 到调用方缓冲区,再按小端解析。不要假设能拿到跨周期仍有效的 IOmap 指针。