代码之家  ›  专栏  ›  技术社区  ›  bas

通过MC\u BR\u GetHardwareInfo功能块获取驱动器序列号(&R)

plc
  •  1
  • bas  · 技术社区  · 6 年前

    为了获得所需的序列号,我应该向功能块提供哪些信息?

    以下示例将在PLC中崩溃,可能是因为功能块需要寻址某些指针:

    MC_HARDWARE_INFO_REF hwinfo;
    MC_BR_GetHardwareInfo(&hwinfo);
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   kirni    5 年前

    您可能会遇到页面错误,因为您为MC\u BR\u GetHardwareInfo函数块(FUB)提供了错误的类型,这会导致随机行为。

    功能块基本上是一个函数,它需要引用一个特定类型作为参数。这种类型包含实际使用的输入和输出、内部状态变量等。由于代码的同步执行,我们需要这种类型。这意味着与函数不同,您需要调用FUB直到它完成。

    让我们看看FUB的帮助: Guid: 056444ea-2a15-4af6-a5ae-0675894b17d3

    因此FUB需要一个对Axis对象的引用,您需要知道它的HW信息和一个Execute命令。它将为您提供一些状态位、错误代码以及您希望在MC\u HARDWARE\u INFO\u REF类型的结构HardwareInfo中包含的实际数据。

    首先,我们需要通过创建FUB类型的变量来实例化FUB。我们在任务的本地*.var文件中执行此操作:

    VAR
    fbGetHwInfo : MC_BR_GetHardwareInfo := (0);
    END_VAR
    

    void _CYCLIC ProgramCyclic(void)
    {
        //should be set by the application or in watch/monitor; now it only 
        //executes once
        fbGetHwInfo.Execute = 1;
        //reference to your axis object; when using a wizard the first axis 
        //will be gAxis01 on default
        fbGetHwInfo.Axis = (UDINT)&gAxis01;
    
        //call the FUB
        MC_BR_GetHardwareInfo(&fbGetHwInfo);
    
        if(fbGetHwInfo.Error == 1)
        {
            //TODO: errorhandling
        }
        else if(fbGetHwInfo.Done == 1)
        {
            //TODO use output
            //fbGetHwInfo.HardwareInfo
        }
    }
    

    通常,您会在某个状态机中执行此操作。另外,您可能还需要等到驱动器的网络初始化之后。你可以用MC\u BR\u ReadDriveStatus FUB检查这个。只是为了测试,在重新启动后等待几秒钟并在监视模式下设置Execute标志就足够了。