我有一个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