B & R получает серийный номер привода через функциональный блок MC_BR_GetHardwareInfo - PullRequest
0 голосов
/ 22 сентября 2018

Никогда не задавал здесь вопрос, связанный с B & R, но я пытаюсь получить серийный номер с привода, используя функциональный блок MC_BR_GetHardwareInfo.Поскольку в документации нет примеров кода на эту тему, я никуда не деться.

Какую информацию я должен предоставить функциональному блоку, чтобы получить желаемый серийный номер?

Ниже пример сбой в ПЛК, вероятно, потому что функциональный блок требует адреса определенных указателей:

MC_HARDWARE_INFO_REF hwinfo;
MC_BR_GetHardwareInfo(&hwinfo);

1 Ответ

0 голосов
/ 20 февраля 2019

Возможно, вы получаете ошибку страницы, поскольку вы предоставляете функциональному блоку MC_BR_GetHardwareInfo (FUB) неправильный тип, что приводит к случайному поведению.

Функциональный блок - это, в основном, функция, которая требует ссылки на определенный тип в качестве параметра.Этот тип содержит фактические входные и выходные данные, которые используются, внутренние переменные состояния и т. Д. Это необходимо нам из-за синхронного выполнения кода.Это означает, что в отличие от функции, вам нужно вызывать FUB до тех пор, пока это не будет сделано.

Давайте взглянем на помощь FUB: Guid: 056444ea-2a15-4af6-a5ae-0675894b17d3

Таким образом, FUB нужна ссылка на объект Axis, о котором вы хотите знать информацию HW, и команду Execute.Это даст вам несколько битов состояния, код ошибки и фактические данные, которые вы хотите иметь в структуре HardwareInfo типа MC_HARDWARE_INFO_REF.

Сначала нам нужно создать экземпляр FUB, создав переменную его типа.Мы делаем это в локальном файле * .var задачи:

VAR
fbGetHwInfo : MC_BR_GetHardwareInfo := (0);
END_VAR

Затем мы вызываем set параметры 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.Для тестирования достаточно подождать несколько секунд после перезагрузки и установить флаг «Выполнить» в режиме мониторинга.

...