通过 PROFIBUS DP V1 读取/写入非循环数据
概述
对于非循环 DP V1 访问,在 LTMR 控制器中实施了一种基于槽/索引和长度寻址的机制。
每 10 个寄存器即会对变量进行一次访问。您不能访问位于 2 个子组之间的寄存器。如果无法进行访问,将不会访问寄存器,并会通过 DP V1 返回一个检测到的错误值(例如,“未找到所有寄存器”)。
读取非循环数据 (DS_Read)
使用
DS_Read
功能,PROFIBUS DP 主控制器能够读取从控制器中的数据。下表说明了
DS_Read 帧的内容。
|
字节 |
语法 |
|---|---|
|
0 [功能编号] |
0x5E [ |
|
1 [插槽号] |
常量值 = 1 |
|
2 [索引] |
寄存器地址 / 10 通常每 10 个寄存器即对寄存器进行一次访问。 索引始终向下圆整至整数。 |
|
3 [长度] |
以字节表示的数据块长度 (寄存器数量)x 2 寄存器最大数量 = 20(40 字节) 长度介于 2 和 40 字节之间均可以。 |
|
4 至(长度+ 3) |
要读取的数据块字节。 |
DS_Read 示例
示例:读取标识寄存器 50 至 62
|
字节 |
数值 |
|---|---|
|
0 [功能编号] |
0x5E [ |
|
1 [插槽号] |
1 |
|
2 [索引] |
5 [50/10] |
|
3 [长度] |
26 [(50 至 62 = 13) x 2] |
|
4 到 29 |
寄存器 50 至 62 的值 |
发送非循环数据 (DS_Write)
使用
DS_Write
功能,PROFIBUS DP 主控制器能够将数据发送到从控制器。
在写入数据块之前,建议先读取数据块,以便保护未受影响的数据。只有当您有写入权限时才能写入整个块,将在通讯变量组章节中的每个寄存器表内进行检查。列 3 的表标题指示每个表中的变量为只读变量还是为读/写变量。
下表说明了 DS_Write 帧的内容。
|
字节 |
语法 |
|---|---|
|
0 [功能编号] |
0x5F [ |
|
1 [插槽号] |
常量值 = 1 |
|
2 [索引] |
寄存器地址 / 10 通常每 10 个寄存器即对寄存器进行一次访问。 索引始终向下圆整至整数。 |
|
3 [长度] |
以字节表示的数据块长度 (寄存器数量)x 2 寄存器最大数量 = 20(40 字节) 长度介于 2 和 40 字节之间均可以。 |
|
4 至(长度+ 3) |
要写入的数据块字节。 |
DS_Write 例如:过程描述
示例:通过将位 704.3 设置为 1 来复位脱扣
1. 读取 700 到 704。
|
字节 |
数值 |
|---|---|
|
0 [功能编号] |
0x5E [ |
|
1 [插槽号] |
1 |
|
2 [索引] |
70 [700/10] |
|
3 [长度] |
10 [(700 至 704 = 5) x 2] |
|
4 到 13 |
寄存器 700 至 704 的当前值 |
2. 将寄存器 704 的位 3 设置为 1。
3. 写入寄存器 700 至 704。
|
字节 |
数值 |
|---|---|
|
0 [功能编号] |
0x5F [ |
|
1 [插槽号] |
1 |
|
2 [索引] |
70 [700/10] |
|
3 [长度] |
10 [(700 至 704 = 5) x 2] |
|
4 到 13 |
寄存器 700 至 704 的新值 |
检测到错误时的反馈
如果无法进行访问,则不会访问寄存器,并会通过 DP V1 返回一个检测到的错误值。
检测到错误时,DP 上响应的前 4 个字节如下:
|
字节 |
数值 |
含义 |
|---|---|---|
|
0 |
0xDE/ 0xDF |
用于 DS_Read / DS_Write |
|
1 |
0x80 |
指示 DP V1 |
|
2 |
0xB6 |
检测到错误类 + 检测到错误代码 1 = 拒绝访问 |
|
3 |
0xXX |
特定于 LTMR 的检测到的错误代码 2(请参见下表) |
特定于 LTMR 的检测到的错误代码 2 如下:
|
检测到的错误代码 2 |
含义 |
|---|---|
|
01 |
内部栈请求已满 |
|
03 |
寄存器不受管理,或者需要超级用户访问权限 |
|
06 |
寄存器已定义,但未对其执行写入操作 |
|
07 |
未找到所有寄存器 |
|
08 |
要写入的未授权的寄存器 |
|
10 |
写入值超出了寄存器范围,字值过大(过高) |
|
11 |
写入值超出了寄存器范围,字值过小(过低) |
|
12 |
写入值超出了寄存器范围(MSB 值过大) |
|
13 |
写入值超出了寄存器范围(MSB 值过小) |
|
14 |
写入值超出了寄存器范围(LSB 值过大) |
|
15 |
写入值超出了寄存器范围(LSB 值过小) |
|
16 |
写入的值不是有效值 |
|
20 |
模块拒绝、返回一个检测到的错误帧 |
|
255 |
检测到内部错误 |
用户逻辑中是否存在检测到的错误代码和检测到的错误类取决于主控制器实现方式(例如 PLC)。
该机制只能访问以专用参数(MB 地址)开始的参数块。这意味着,未使用的参数(MB 地址)也将被访问。从这些参数中读取的数据值为 0x00;但如果是写入操作,则需要将值 0x00 写入到这些参数中。否则,将会拒绝整个写入访问。
TeSys T 内部寄存器
有关 TeSys T 内部寄存器的更多详细信息,请参阅 Communication Variables tables。