简介
CPU 可以作为多种通信服务的服务器。这也就是说,即使还没有为 CPU 组态和编程建立连接,其它通信参与者也可以访问 CPU 数据。
因此作为服务器的本地 CPU 无法控制与客户端的通信。
CPU 参数的“保护”(Protection) 区域中的参数“连接机制”(Connection mechanisms) 用于指定运行期间本地 CPU 是否允许执行此类通信。
允许借助 PUT/GET 通信从远程伙伴访问
默认情况下,禁用“允许借助 PUT/GET 通信从远程伙伴访问 (...) ”(Permit access with PUT/GET communication from remote partners (...)) 选项。如果激活该选项,则只能在本地 CPU 和通信伙伴间需要通过组态或编程建立的通信连接中对 CPU 数据进行读写访问。例如,可以通过 BSEND/BRCV 指令进行访问。
本地 CPU 仅作为服务器的连接(即表示本地 CPU 上不存在使用通信伙伴进行的通信组态/编程),因此无法在操作 CPU 时进行。例如,
在通过通信模块进行 PUT/GET、FETCH/WRITE 或 FTP 访问时
在从其它 S7 CPU 进行 PUT/GET 访问时
在通过 PUT/GET 通信实现 HMI 访问时
如果要允许从客户端访问 CPU 数据,也就是不希望限制 CPU 的通信服务,则激活“允许借助 PUT/GET 通信从远程伙伴访问”(Permit access with PUT/GET communication from remote partners) 选项。
功能运用
GET:从远程 CPU 读取数据 |
说明
使用指令“GET”,可以从远程 CPU 读取数据。
在控制输入 REQ 的上升沿启动指令:
要读出的区域的相关指针 (ADDR_i) 随后会发送给伙伴 CPU。伙伴 CPU 则可以处于 RUN 模式或 STOP 模式。
伙伴 CPU 返回数据:
如果回复超出最大用户数据长度,那么将在 STATUS 参数处显示错误代码“2”。
下次调用时,会将所接收到的数据复制到已组态的接收区 (RD_i) 中。
如果状态参数 NDR 的值变为“1”,则表示该动作已经完成。
只有在前一读取过程已经结束之后,才可以再次激活读取功能。如果读取数据时访问出错,或如果未通过数据类型检查, 则会通过 ERROR 和 STATUS 输出错误和警告。
“GET”指令不会记录伙伴 CPU 上所寻址到的数据区域中的变化。
使用指令的要求
已在伙伴 CPU 属性的“保护”(Protection) 保护中激活“允许借助 PUT/GET 通信从远程伙伴访问”(Permit access with PUT/GET communication from remote partner) 函数。
使用“GET”指令访问的块是通过访问类型“标准”创建的。
请确保由参数 ADDR_i 和 SD_i 定义的区域在数量、长度和数据类型等方面都匹配。
待读取的区域(ADDR_i 参数)不能大于存储数据的区域(RD_i 参数)。
参数
下表列出了“GET”指令的参数:
参数 | 声明 | 数据类型 | 存储区 | 说明 |
---|---|---|---|---|
REQ | Input | BOOL | I、Q、M、D、L 或常量 | 控制参数 request,在上升沿时激活数据交换功能。 |
ID | Input | WORD | I、Q、M、D、L 或常量 | 用于指定与伙伴 CPU 连接的寻址参数。 |
NDR | Output | BOOL | I、Q、M、D、L | 状态参数 NDR:
|
ERROR | Output | BOOL | I、Q、M、D、L | 状态参数 ERROR 和 STATUS,错误代码:
|
STATUS | Output | WORD | I、Q、M、D、L | |
ADDR_1 | InOut | REMOTE | I、Q、M、D | 指向伙伴 CPU 上待读取区域的指针。 指针 REMOTE 访问某个数据块时,必须始终指定该数据块。 示例:P#DB10.DBX5.0 字节 10。 |
ADDR_2 | InOut | REMOTE | ||
ADDR_3 | InOut | REMOTE | ||
ADDR_4 | InOut | REMOTE | ||
RD_1 | InOut | VARIANT | I、Q、M、D、L | 指向本地 CPU 上用于输入已读数据的区域的指针。 |
RD_2 | InOut | VARIANT | ||
RD_3 | InOut | VARIANT | ||
RD_4 | InOut | VARIANT |
有关有效数据类型的更多信息,请参见“有效数据类型概述”。
参数 ERROR 和 STATUS
下表列出了关于由指令“GET”通过参数 ERROR 和 STATUS 输出的所有特定错误信息。
ERROR | STATUS(十进制) | 说明 |
---|---|---|
0 | 11 | 警告:由于前一作业仍处于忙碌状态,因此未激活新作业。 |
0 | 25 | 已开始通信。作业正在处理。 |
1 | 1 | 通信故障,例如
|
1 | 2 |
|
1 | 4 | 指向数据存储 RD_i 的指针出错:
|
1 | 8 | 访问伙伴 CPU 时出错。 |
1 | 10 | 无法访问本地用户存储器(例如,访问某个已经删除的数据块)。 |
1 | 20 |
|
1 | W#16#80C3 | (仅 S7-1500)
|
说明 数据一致性 在初始化另一个作业之前,如果完整读取当前正使用的接收区域 RD_i 部分内容,将一致性地接收数据。 |
示例
在以下示例中,通过 S7 连接在 CPU 1 中读取 CPU2 的数据记录。待发送数据记录的数据类型为 INT。
要求
两个 S7-1500 系列的 CPU 通过 PROFINET 进行互连,但连接尚未组态。
通过“<CPU> > 属性 > 保护”(<CPU> > Properties > Protection) 下的低保护级别,确保可以对 CPU 进行读写访问。
可通过指令 PUT/GET 进行访问。
CPU 1 中的程序
在全局数据块中,创建 6 个变量存储“GET”数据。
在全局数据块中,创建 1 个变量存储待接收的数据记录。
程序段 1:互连“GET”指令的参数,如下所示:
程序段 2:保存 GET 的错误状态,如下所示。
程序段 3:保存 GET 的成功状态,如下所示。
GET 的组态
要互连输入参数 ID,可通过“属性 > 组态”(Properties > Configuration) 打开指令“GET”的向导。
执行以下连接设置:
区域 | 设置 |
---|---|
端点 | 选择通信伙伴。 系统将自动输入剩余的连接数据。将自动创建一个 S7 连接,并在输入参数 ID 处输入该标识符。 |
激活 | 确保与 CPU 1间的连接激活。 |
CPU 2 中的程序
在全局数据块中,创建 1 个变量存储待发送的数据记录。
在数据块的“属性 > 特性”(Properties > Attributes) 中,禁用优化块访问。
GET 的操作特性
输入参数 REQ(“start”)的信号状态为“TRUE”时,启动指令“GET”。该指令将调用连接数据,并与 S7 连接的通信伙伴进行数据通信。为此,S7 连接的标识符将存储在输入参数 ID 中。
通过参数 ADDR_1,识别待发送 CPU 2 数据记录的存储位置(“myValue”)。系统将读取输出数据记录(“myValue”),并在参数 RD_1 处输入识别的存储位置(“readValue”)。
执行成功时,输出参数 NDR(“done”)处的信号状态为“TRUE”,且输出参数 STATUS(“status”)的值为“16#0000”。由于输出参数的值仅在有效时才显示,因此成功状态将保存在变量“memDoneStat”中。输出参数 ERROR(“error”)或变量“memErrStatus”用于指示处理无错误。