贝加莱通过MC_BR_GetHardwareInfo功能块获取驱动器序列号

时间:2018-09-22 17:52:10

标签: plc

在这里从未问过与B&R相关的问题,但我正尝试使用MC_BR_GetHardwareInfo功能块从驱动器中检索序列号。由于文档缺少有关此主题的任何示例代码,因此我无所适从。

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

下面的示例将在PLC中崩溃,可能是由于功能块要求某些指针需要寻址:

MC_HARDWARE_INFO_REF hwinfo;
MC_BR_GetHardwareInfo(&hwinfo);

1 个答案:

答案 0 :(得分:1)

您可能会遇到页面错误,因为为MC_BR_GetHardwareInfo功能块(FUB)提供了错误的类型,这导致了随机行为。

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

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

因此,FUB需要引用您想要了解其硬件信息的Axis对象和一个Execute命令。它将为您提供一些状态位,错误代码以及想要在类型MC_HARDWARE_INFO_REF的HardwareInfo结构中拥有的实际数据。

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

VAR
fbGetHwInfo : MC_BR_GetHardwareInfo := (0);
END_VAR

然后我们调用设置FUB的参数并调用它,看起来可能像这样:

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_BR_ReadDriveStatus FUB进行检查。仅用于测试,它足以在重新启动后等待几秒钟,并将Execute标志设置为监视模式。