【问题标题】:Accessing PLC metadata from Codesys (ABB AC500 PLC)从 Codesys (ABB AC500 PLC) 访问 PLC 元数据
【发布时间】:2020-12-31 13:16:19
【问题描述】:

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

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

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

我仔细查看过,但找不到在运行时访问此信息的方法 - 我猜模块中有一个简单的函数将返回这些信息中的一个或其他?

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

谢谢!

【问题讨论】:

    标签: plc codesys


    【解决方案1】:

    如果您希望特定行为被硬件绑定,您可以使用 DI 模块。您可以采用 3 个输入并将它们用作位。您可以使用跳线来区分具有 3 个输入(如 3 位)的 7 个 PLC。

    这种方式会更好,因为无论出于何种原因要更换PLC,您都不需要更改程序和更改序列号等。它适用于任何 PLC。

    例如,如果你有

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

    等等。

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

    【讨论】:

      【解决方案2】:

      快速查看Automation Builder帮助文件(from here),似乎应该有一个名为Internal System Library(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
      

      【讨论】:

      • 如果它正在访问 PLC 的 IP 和 MAC 地址,根据CODESYS documentation,您应该能够使用标准库进行访问。虽然它在模拟中对我不起作用,但我以后可能会在真正的 PLC 上尝试它。 (如果我尝试,它将在施耐德 PLC 上使用他们的应用程序 Machine Expert,所以可能想自己尝试一下)
      • 在 TM241 PLC 上使用 Machine Expert 1.2.4 (codesys 3.5.12.80) 这不起作用(SysSockGetFirstAdapterInfo 返回结果 1,这是一般错误)。也许它对其他人会更好?
      • 感谢您的 cmets!希望菲利普能取得一些成果。
      【解决方案3】:

      mac地址使用下面的sn-p。

      变量:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-23
        • 2011-10-23
        • 2016-06-13
        • 2018-10-18
        • 2018-01-14
        • 1970-01-01
        • 1970-01-01
        • 2016-02-09
        相关资源
        最近更新 更多