从CodesysABB AC500 PLC访问PLC元数据

问题描述

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

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

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

我已经仔细查看过,但是找不到在运行时访问此信息的方法-我猜测模块中有一个直接函数可以返回这些信息中的一个或另一个

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

谢谢!

解决方法

如果您希望特定行为被硬件束缚,则可以使用DI模块。您可以将3个输入用作位。您可以使用跳线将7个具有3个输入(如3位)的PLC进行区分。

这样会更好,因为如果出于任何原因要更改PLC,则无需更改程序和序列号等。它将与任何PLC兼容。

例如,如果您有

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

以此类推。

但是我只需要在程序中使用常量变量,然后在下载程序之前对其进行更改。

,

正在查看Automation Builder帮助文件(from here),似乎应该有一个名为内部系统库的库(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