用于读取和写入PLC标签(在AB Logix 5000控制器上)的CIP服务是原子的吗?

问题描述 投票:1回答:2

我正在关注使用CIP进行控制器数据访问的Allen-Bradley文档,特别是读取标记服务,写入标记服务以及有关读取/写入整个UDT的详细信息:https://literature.rockwellautomation.com/idc/groups/literature/documents/pm/1756-pm020_-en-p.pdf。我正在使用EIP库来执行读/写标记服务和多服务请求。

我想要澄清的是,读取或写入整个UDT是一个原子操作(使用手册中概述的方法在一个服务请求中执行读/写操作并理解元数据以解压缩它)?也就是说,当整个成功读/写时,PLC或软件方是否永远不会看到部分更新的UDT值?

一个相关的问题是:如果我想通过在多服务请求中发送多个读/写标签服务请求来读/写几个标签,我是否对这组标签的同步读/写有任何保证?我假设没有,但我似乎无法找到关于这个主题的任何明确的文件。特别是如果请求在多个CIP数据包中分段。

plc
2个回答
1
投票

我们通常检查消息响应字段中的“常规状态”以确定CIP消息的成功(完成??)或失败。但是,如果PLC在使用任何数据之前接收整个数据包这一点至关重要,我将添加某种类型的定时器逻辑,以确保在(使用数据)之前(自信地)发出足够的时间(在启动消息之后)。懒?是。但它的确有效。

特定于您通过读/写服务的原子性问题。一般的经验法则是不依赖于任何原子的消息数据(特别是大数据包)。您必须等待服务请求的反馈/响应。

From Logix 5000 Controllers Data Access document - Pg 18

希望这可以帮助。


1
投票

我能够测试这一点,并确认读/写标签CIP服务对于单个UDT或阵列不是原子的。我最初担心的是我是否可以安全地编写整个UDT或数组并确保PLC处理该数据会在“之前写入”或“写入后”状态中看到该数据,而不是某些部分写入状态。我执行了一些测试,从CIP写标签服务编写一个10元素的DINT数组。在PLC上,我执行同步复制(CPS)将数组复制到另一个标签,然后检查它以查看数据是否与原子复制一致。我看到数据偶尔处于部分写入状态,这意味着写标记服务与同步复制指令不同步。请注意,我使用单个CIP服务请求来编写数组,而不是对每个元素使用多个请求。这并非完全出乎意料,但知道任何从CIP服务读取/写入多个值的人都知道缺少同步是很好的。我可以在需要时添加自己的同步机制。

© www.soinside.com 2019 - 2024. All rights reserved.