从Codesys(ABB AC500 PLC)访问PLC元数据



我有一个PLC程序,将在多个ABB AC500 PLC上运行。我需要每个PLC都有一个稍微不同的行为(仅限于为每个PLC选择一个唯一的整数值,以允许每个PLC上特定事件的时间不同(。

为了允许维护单个相同的程序并将其上传到多个PLC,我想到的策略是访问一段关于PLC的唯一元数据,以确定特定PLC的正确值。

合理的信息可能包括分配给PLC的IP地址,或者PLC序列号。

我仔细查看了一下,但找不到在运行时访问这些信息的方法——我猜模块中有一个简单的函数会返回这些信息中的一个或另一个?

或者,也许有一种更好的方式来实现这种PLC特定的行为?

谢谢!

如果您想通过硬件绑定特定行为,可以使用DI模块。您可以接受3个输入,并将它们用作位。您可以使用跳线将7个PLC与3个输入(如3位(进行区分。

这种方式会更好,因为如果出于任何原因想要更改PLC,您不需要更改程序和序列号等。它可以与任何PLC一起工作。

例如,如果你有

|DI|PLC1|PLC2|PLC3||-----|------|------|------||DI1|0|1|0||DI2|0|0|1||DI3|0|0||

依此类推。

但我会简单地在程序中使用常量变量,并在程序下载前更改它。

Quicly查看Automation Builder帮助文件(从这里(,似乎应该有一个名为内部系统库(SysInt_AC500_Vx.lib(的库。

该库包括称为SLOT_PROD_ENTRY_READ的功能块;从通信模块的闪存中的生产数据中读取一行"您可以使用手册中的搜索功能找到它。

可以读取的值之一是序列号。另一种解决方案是使用例如MAC地址。我没有ABB PLC可供尝试,文件中也没有一个非常清晰的例子。但这应该是可能的。请注意,以下内容不是经过测试的。​

​VAR
instance    : CPU_PROD_ENTRY_READ; //Might need a library namespace
serial      : STRING(80);
END_VAR

instance(
EN          := TRUE, 
SLOT        := 0,
SECTION     := 'Common',
KEY_SEARCH​  := 'SERIAL_NR',
INDEX       := 0,
ACT         := FLASH_DATA_READ
);

IF instance.DONE THEN
serial := instance.VALUE;

instance(EN := FALSE);
END_IF

使用以下代码段作为mac地址。

变量:

diNumber: DINT;
iAdapter: DINT;
stName: STRING(255);
stDescription: STRING(255);
aby_address:ARRAY[1..6]OF BYTE;

程序:

getnumberofadapters(ADR(diNumber));
FOR iAdapter := 0 TO diNumber DO
getadapterinfo(
iAdapterNum := iAdapter,
pbName := ADR(stName),
pbDescrition := ADR(stDescription),
iBuffersize := SIZEOF(stName),
iMacLength := 6,
sMacAdress := ADR(aby_address));
END_FOR

最新更新