【问题标题】:How to get the length of BOOL[] in SCL with RSLogix 5000如何使用 RSLogix 5000 在 SCL 中获取 BOOL[] 的长度
【发布时间】:2018-09-27 22:52:46
【问题描述】:

目标

我正在为 SCL 中的 Allen-Bradley / Rockwell CompactLogix PLC 进行编程。我想在运行时确定Arrays 的大小。可以在编译之前将Array 长度作为constants 输入到代码中。但是如果数组的长度可以自动确定,那么复用性会大大提高。

问题

SIZE(Source,Dimtovary,Size) 的功能正是我所需要的,尽管仅适用于 SINT[] INT[] DINT[] REAL[] structureSTRING。不幸的是,我需要BOOL[] 的长度。

"SIZE 指令求出 Source 数组或字符串操作数的指定维度中的元素个数(大小),并将结果放入 Size 操作数中。该指令求出数组一维的大小。 "

伪代码

Int_array := INT[16];
Bool_array := BOOL[64];

SIZE(Int_array[0],0,Int_array_len);
// Works, Int_array_len contains 16

SIZE(Bool_array[0],0,Bool_array_len); 
// Isn't compilable becaus size(); isn't defined for boolean arrays

环境

问题

有没有办法确定布尔数组的长度,例如BOOL[64]

此外,SIZE(Source,Dimtovary,Size); 不适用于布尔数组是否有根本原因?

【问题讨论】:

  • 我远不是这个主题的专家(更多的是相反的),但稍微搜索一下告诉我 BOOL 数组非常有限,因此人们倾向于避免使用它们。通常,解决方法涉及使用 DINT 数组并适当地处理位操作。

标签: arrays plc


【解决方案1】:

答案是否定的;无法获得 BOOL[] 数组的大小。

正如@DanMašek 正确建议的那样,BOOL[] 数组非常有限。甚至建议使用包含BOOL 类型成员的UDTs

不幸的是,我仍然没有解决方案来以某种方式排列多个BITs 的长度并在for loop 中循环它们。

【讨论】:

  • 如果您使用 UDT 包装单个 BOOL,那么不幸的是,每个包装的 BOOL 最终都会在后台填充一个 SINT,因为 BOOL 映射到 UDT 中隐藏 SINT 的位。您可以通过导出 UDT 并查看 XML 来看到这一点。
  • 您可以通过先将它们复制到 SINT 数组来遍历它们,然后遍历 SINT 数组中每个 SINT 的位。但 SIZE 并不可靠,因为 SINT 数组大小 (x8) 将匹配 BOOL 数组大小,如果它是硬编码的话。
  • 另外,您可以编写一个打包例程并使用 for 将一个与 BOOL 数组大小相同的 SINT 数组的第一个 bool 设置为 BOOL 值,然后另一个解包例程和一个 for将其从 SINT 数组复制回 BOOL 数组。这允许索引保持有意义但占用更多内存。
  • 我仍然同意避免使用 BOOL[],但如果您别无选择,这些都是变通方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多