问题描述
我有一个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