【发布时间】:2021-12-07 02:37:47
【问题描述】:
是否可以编写带有一些静态参数化的功能块?具体来说,我可以制作一个具有静态容量的缓冲区,但不同的实例可以有不同的容量吗?
理想情况下,我会想象一些常量参数,如下所示:
FUNCTION_BLOCK FB_Buffer
VAR_INPUT CONSTANT
StorageSize : DINT;
END_VAR
VAR
Storage : ARRAY [1..StorageSize] OF REAL;
END_VAR
然后实例化将是这样的:
FUNCTION_BLOCK FB_Usage
VAR
SmallBuffer : FB_Buffer := (StorageSize := 10);
LargeBuffer : FB_Buffer := (StorageSize := 1000);
END_VAR
假设这是不可能的,为不同功能块实例管理不同存储大小的最佳方法是什么?
我将发布我最不坏的解决方法作为回答。
【问题讨论】:
-
我同意史蒂夫关于如何从理论上实现您所要求的回答。我想提出的一点是,编译器不允许您在功能块中动态声明数组是有原因的。原因与机器需要在一年中的每一天全天候工作有关,我们需要不惜一切代价尽量减少停机时间。机器程序应该遵循 KISS 原则,这就是为什么即使你可以像史蒂夫建议的那样进行构造,但你不应该这样做。相反,您应该静态声明您的数组,并拥有一个简洁明了的架构。
-
与机器无关的程序部分应该转移到 plc 运行时之外,并用更高级别的语言(例如:Python 或 Java 或 C#)进行编程。因此,您大大减少了机器代码产生异常的机会。然后应该创建备份或紧急生产计划,以确保在过度结构不正常时生产仍然可以运行(例如连接到数据库)这样即使系统的一部分不工作,您的机器也始终可以继续生产.你明白我要指向哪里了吗?
-
@FilippoBoido 我不想动态声明数组,这就是重点。我理解为什么 PLC 和其他实时系统从不使用动态内存管理。我想要的是能够定义某种类型的多个变量,但具有不同的 static 容量。你已经可以用字符串做到这一点:声明一个
STRING(10)类型的变量和另一个STRING(50)类型的变量。另一种方法是要么让所有缓冲区变量变得异常庞大,即使其中一个变量需要超过 10 个容量,或者具有复制粘贴类型,这是维护的噩梦。 -
@FilippoBoido 我同意你关于管理风险的观点:让所有必须运行的东西尽可能可靠,并与所有“奖励”功能分开。只是有时您还需要使实时事物更加复杂,以使它们变得可行或可重用。可重用性不仅可以节省时间,而且从长远来看,它甚至可以让事情变得更加可靠。
-
通过坚持 KISS 原则,您可以使您的系统面向未来且可重复使用。我发布了一个带有其他建议的答案。
标签: plc twincat structured-text iec61131-3