Search code examples
plcbr-automation-studio

B&R get drive serial number via MC_BR_GetHardwareInfo function block


I'm trying to retrieve the serial number from a drive using the MC_BR_GetHardwareInfo function block. Since the documentation lacks any kind of example code on this topic I'm getting nowhere.

Which information should I provide to the function block in order to get the desired serial number?

Below sample will crash in the PLC, probably because the function block requires certain pointers to be addressed:

MC_HARDWARE_INFO_REF hwinfo;
MC_BR_GetHardwareInfo(&hwinfo);

Solution

  • You are probably getting a page fault, because you provide the MC_BR_GetHardwareInfo function block (FUB) a wrong type, which leads to random behavior.

    A function block is basically a function which requires a reference to a specific type as parameter. This type contains the actual in- and outputs which are used, internal state variables, etc. We need this, because of the synchronous execution of the code. This means unlike a function, you need to call a FUB until it is done.

    Let's take a look to the help of the FUB: Guid: 056444ea-2a15-4af6-a5ae-0675894b17d3

    So the FUB needs a reference to the Axis object of which you want to know the HW info and an Execute command. It will give you some status bits, an error code and the actual data you want to have within the structure HardwareInfo of the type MC_HARDWARE_INFO_REF.

    First we need to instantiate the FUB by create a variable of its type. We do this in the local *.var file of the task:

    VAR
    fbGetHwInfo : MC_BR_GetHardwareInfo := (0);
    END_VAR
    

    Then we call set the parameters of the FUB and call it, which might look like this:

    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
        }
    }
    

    typically you would do this in some statemachine. Also you probably have to wait until the network to the drive is initialized. You could check this with the MC_BR_ReadDriveStatus FUB. Just for testing it should be enough to wait for some seconds after reboot and set the Execute flag in monitor mode.