PKW:DP V0 中的封装非循环访问
概述
一些 PROFIBUS DP 主设备(主站)不提供 DP V1 服务。实现了 PKW 功能,以允许在 DP V0 中进行非循环读写访问。
通过选择相应的模块可在 PROFIBUS DP 配置工具中启用此功能。对于每个模块,存在另外一个带 PKW 的条目。
PKW 数据已添加到循环数据。
读取/写入寄存器
借助 PKW 数据,您可以对任何寄存器执行读取或写入操作。8 字节将被解释为被封装在 IN 数据和 OUT 数据中的请求电报或响应电报。
PKW OUT 数据
PKW OUT 数据请求(PROFIBUS DP 主站 → LTMR)在支持 PKW 的模块中进行映射。
要访问寄存器,您必须选择下面的其中一个功能代码:
-
R_REG_16 = 0x25,用于读取 1 个寄存器
-
R_REG_32 = 0x26,用于读取 2 个寄存器
-
W_REG_16 = 0x2A,用于写入 1 个寄存器
-
W_REG_32 = 0x2B,用于写入 2 个寄存器
寄存器编号如Register Map (Organization of Communication Variables)所示。
|
字 1 |
字 2 |
字 3 |
字 4 |
||
|---|---|---|---|---|---|
|
寄存器地址 |
切换位 (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 中写入的数据 |
|||
根据所使用的 PLC 平台,请参阅循环数据说明章节中描述采用小端和大端格式 PKW OUT 的表格,以了解每个字中各个字段的位置。
功能字段中的任何更改都将触发请求处理(除非功能代码 = 0x00)。
切换位必须在进行每个连续请求时进行更改。此机制通过轮询响应中的切换位可使请求启动器检测响应是否就绪。当 OUT 数据中的此位等于 IN 数据中发出响应的切换位时,响应就绪。
PKW IN 数据
PKW IN 数据响应(LTMR → PROFIBUS DP 主站)在支持 PKW 的模块中进行映射。LTMR 回应同一个寄存器地址和功能代码或最终检测到的错误代码:
|
字 1 |
字 2 |
字 3 |
字 4 |
||
|---|---|---|---|---|---|
|
寄存器地址 |
切换位 (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 |
_ |
_ |
|||
根据所使用的 PLC 平台,请参阅循环数据说明章节中描述采用小端和大端格式 PKW IN 的表格,以了解每个字中各个字段的位置。
如果启动器尝试将 TeSys T 对象或寄存器写入到未授权值,或尝试访问不可访问的寄存器,则回应一个检测到的错误代码(功能代码 = 切换位 + 0x4E)。同样的检测到的错误代码可在字 3 和 4 中找到。请求未被接受,并且对象或寄存器仍保留原来的值。
如果您要重新触发完全相同的命令,您必须:
-
将功能代码重置为 0x00,
-
等待响应帧,其中功能代码等于 0x00,然后
-
再次将其设置为其先前的值。
这对于受限的主设备(主站)比较有用,例如 HMI。
重新触发完全相同命令的另一种方法是:
-
反转功能代码字节中的切换位。
当响应的切换位等于应答中写入的切换位时,响应有效(这是更有效的方法,但需要更高的编程功能)。
PKW 检测到的错误代码
检测到写入错误
|
检出错误代码 |
检测到的错误名称 |
说明 |
|---|---|---|
|
1 |
FGP_ERR_REQ_STACK_FULL |
外部请求:回送检测到的错误帧 |
|
3 |
FGP_ERR_REGISTER_NOT_FOUND |
寄存器不受管理(或请求需要超级用户访问权限) |
|
4 |
FGP_ERR_ANSWER_DELAYED |
外部请求:答复延迟 |
|
7 |
FGP_ERR_NOT_ALL_REGISTER_FOUND |
无法找到一个或两个寄存器 |
|
8 |
FGP_ERR_READ_ONLY |
要写入的未授权的寄存器 |
|
10 |
FGP_ERR_VAL_1WORD_TOOHIGH |
写入的值不在寄存器范围内(字值太高) |
|
11 |
FGP_ERR_VAL_1WORD_TOOLOW |
写入的值不在寄存器范围内(字值太低) |
|
12 |
FGP_ERR_VAL_2BYTES_INF_TOOHIGH |
写入的值不在寄存器范围内(MSB 值太高) |
|
13 |
FGP_ERR_VAL_2BYTES_INF_TOOLOW |
写入的值不在寄存器范围内(MSB 值太低) |
|
16 |
FGP_ERR_VAL_INVALID |
写入的值不是有效值 |
|
20 |
FGP_ERR_BAD_ANSWER |
外部请求:回送检测到的错误帧 |
检测到读取错误
|
检出错误代码 |
检测到的错误名称 |
说明 |
|---|---|---|
|
1 |
FGP_ERR_REQ_STACK_FULL |
外部请求:回送检测到的错误帧 |
|
3 |
FGP_ERR_REGISTER_NOT_FOUND |
寄存器不受管理(或请求需要超级用户访问权限) |
|
4 |
FGP_ERR_ANSWER_DELAYED |
外部请求:答复延迟 |
|
7 |
FGP_ERR_NOT_ALL_REGISTER_FOUND |
无法找到一个或两个寄存器 |