PKW 对象
概述
CANopen 控制器支持 PKW( 以非循环字定期保留)。PKW 功能由 4 个制造商特定对象组成:0x3000:0x01 至 0x3000:0x04。
这些对象使得 CANopen 客户端能够使用 PDO 读取或写入任何寄存器。缺省情况下,在传输和接收 PDO4 中其进行映射。
您可以选择使用寄存器的编号或 CANopen 索引和子索引来对寄存器进行寻址,具体取决于功能代码。
PKW OUT 数据寄存器编号寻址
缺省情况下,在接收 PDO4 中对 PDPKW OUT 数据请求(
)进行映射。要使用编号寻址访问寄存器,您必须选择下面的其中一个功能代码:
-
R_REG_16 = 0x25,用于读取 1 个寄存器
-
R_REG_32 = 0x26,用于读取 2 个寄存器
-
W_REG_16 = 0x2A,用于写入 1 个寄存器
-
W_REG_32 = 0x2B,用于写入 2 个寄存器。
0x3000:0x01 |
0x3000:0x02 |
||||
---|---|---|---|---|---|
字 1 |
字 2 |
字 3 |
字 4 |
||
MSB |
LSB |
||||
寄存器地址 |
切换位 (15 位) |
功能位 (位 8 到 14) |
未使用 (位 0 到 7) |
要写入的数据 |
|
寄存器编号 |
0/1 |
R_REG_16 代码 0x25 |
0x00 |
_ |
_ |
R_REG_32 代码 0x26 |
_ |
_ |
|||
W_REG_16 代码 0x2A |
要在寄存器中写入的数据 |
_ |
|||
W_REG_32 代码 0x2B |
要在寄存器 1 中写入的数据 |
要在寄存器 2 中写入的数据 |
PKW OUT 数据 CANopen 寻址
要使用 CANopen 寻址访问寄存器,您必须选择下面的其中一个功能代码:
-
R_CO_16 = 0x35,用于读取 1 个寄存器
-
R_CO_32 = 0x36,用于读取 2 个寄存器
-
W_CO_16 = 0x3A,用于写入 1 个寄存器
-
W_CO_32 = 0x3B,用于写入 2 个寄存器
0x3000:0x01 |
0x3000:0x02 |
||||
---|---|---|---|---|---|
字 1 |
字 2 |
字 3 |
字 4 |
||
MSB |
LSB |
||||
寄存器地址 |
切换位 (15 位) |
功能位 (位 8 到 14) |
寄存器地址 |
要写入的数据 |
|
CANopen 索引 |
0/1 |
R_CO_16 代码 0x35 |
CANopen 子索引 |
_ |
_ |
R_CO_32 代码 0x36 |
_ |
_ |
|||
W_CO_16 代码 0x3A |
要在寄存器中写入的数据 |
_ |
|||
W_CO_32 代码 0x3B |
要在寄存器 1 中写入的数据 |
要在寄存器 2 中写入的数据 |
功能代码中的任何更改都将触发请求处理(除非功能代码 [位 8...位 14] = 0x00)。
这一机制使请求发起方能够通过轮询对象 30000x:03 中功能代码的位 15 来检测响应是否就绪。当(开始请求时)OUT 项目中的此位等于 IN 数据中发出响应的切换位时,响应就绪。
PKW IN 数据寄存器编号寻址
缺省情况下,在传输 PDO4 中对 PDPKW IN 数据响应(LTMR 回应同一个寄存器地址和功能代码或最终检测到的错误代码:
)进行映射。
0x3000:0x03 |
0x3000:0x04 |
||||
---|---|---|---|---|---|
字 1 |
字 2 |
字 3 |
字 4 |
||
MSB |
LSB |
||||
寄存器地址 |
切换位 (15 位) |
功能位 (位 8 到 14) |
未使用 (位 0 到 7) |
要写入的数据 |
|
与请求中相同的寄存器编号 |
与请求相同 |
检测到错误 代码 0x4E |
0x00 |
检测到的错误代码 |
|
R_REG_16 代码 0x25 |
寄存器中读取的数据 |
_ |
|||
R_REG_32 代码 0x26 |
寄存器 1 中读取的数据 |
寄存器 2 中读取的数据 |
|||
W_REG_16 代码 0x2A |
_ |
_ |
|||
W_REG_32 代码 0x2B |
_ |
_ |
PKW IN 数据 CANopen 寻址
LTMR 回应同一个寄存器地址和功能代码或最终检测到的错误代码:
0x3000:0x03 |
0x3000:0x04 |
||||
---|---|---|---|---|---|
字 1 |
字 2 |
字 3 |
字 4 |
||
MSB |
LSB |
||||
寄存器地址 |
切换位 (15 位) |
功能位 (位 8 到 14) |
寄存器地址 |
要写入的数据 |
|
与请求中相同的 CANopen 索引 |
与请求相同 |
检测到错误 代码 0x4E |
CANopen 子索引 |
检测到的错误代码 |
|
R_REG_16 代码 0x55 |
寄存器中读取的数据 |
_ |
|||
R_REG_32 代码 0x36 |
寄存器 1 中读取的数据 |
寄存器 2 中读取的数据 |
|||
W_REG_16 代码 0x3A |
_ |
_ |
|||
W_REG_32 代码 0x3B |
_ |
_ |
如果启动器尝试将 TeSys T 对象或寄存器写入到未授权值,或尝试访问不可访问的寄存器,则返回一个检测到的错误代码(功能代码 = 切换位 + 0x4E)。同样的代码可在字 3 和 4 中找到。
这些代码与 SDO 中止代码 SDO 中止代码 相同。
请求未被接受,并且对象/寄存器仍保留原来的值。
要重新触发同样的命令:
-
将功能代码重置为 0x00,
-
等待响应帧,其中功能代码等于 0x00,
-
将其重置为之前的值。
这对于受限的客户端(例如 HMI)比较有用。
准确地重新触发同一个命令的其他方式是反转功能代码字节中的切换位。
当响应的切换位等于应答中写入的切换位时,响应有效(这是更有效的方法,但需要更高的编程功能)。