Функция стиля C в структурированном тексте?

Наша компания купила наш первый из многих ПЛК Beckhoff, и в настоящее время я разрабатываю конечный автомат.

Что я обычно делаю в C, так это использую случай переключения, в котором каждый случай вызывает функцию, функцию состояния этого конкретного состояния. Эта функция состояния возвращает true, когда она завершена. Switch-case выбирает новое состояние после того, как функция состояния возвращает значение true.

Краткий пример:

// state functions
uint8_t fooF() {
    //do foo stuff
    if( /*whateevr*/ ) return 1;
    return 0;
}

uint8_t barF() {
    // do bar stuff
    if( /*whateevr*/ ) return 1;
    return 0;
}    

uint8_t foobarF() {
    // do foobar stuff
    if( /*whateevr*/ ) return 1;
    return 0;
}

// state machine 
void stateMachine() {
    switch( state ) {
        case foo: 
        if( fooF() ) {
            nextState( bar); 
        }
        break;

        case bar: 
        if( barF() ) {
            nextState( foobar); 
        }
        break;

        case foobar: 
        if( foobarF() ) {
            if( /* flow condition */ ) { nextState( foo ); 
            else                       { nextState( bar ); 
        }
        break;
    }
}

Это я хочу максимально воспроизвести эту структуру в ST.

Я пока не нашел, как сделать простую функцию в ST. Я понимаю, что могу использовать POU для создания нового функционального блока. Но проблема, которую это дает мне, заключается в том, что функция помещается в другой файл. Я хочу, чтобы функциональный блок находился в том же файле, что и мой конечный автомат, как я продемонстрировал в виде конечного автомата в стиле C, который я вам показывал.

Я могу это сделать? И если да, то как?

Бас

РЕДАКТИРОВАТЬ: Это сгенерированный код функционального блока:

FUNCTION_BLOCK fillBufferF
VAR_INPUT
END_VAR
VAR_OUTPUT
END_VAR
VAR
END_VAR

person bas knippels    schedule 03.07.2020    source источник


Ответы (1)


Если вы используете Twincat 3, вы можете добавить в свой FB методы, которые будут вызываться в вашем случае switch.

В противном случае, если вы используете Twincat 2, вы не сможете добавлять методы в свой FB, потому что Twincat 2 не поддерживает объектно-ориентированное программирование.

Однако вы можете создавать функции (не только функциональные блоки) для добавления в ваш проект. Затем вы можете сгруппировать свои конкретные функции в папку вместе с вашим функциональным блоком конечного автомата.

Еще одна вещь, которую вы можете сделать, если вы работаете с Twincat 2, — это добавить действия в свой функциональный блок. Они отличаются от методов Twincat 3 отсутствием собственного стека методов.

Вы не можете объявлять переменные в действии и не можете возвращать из них значения, но они пригодятся, если вы хотите лучше организовать код своего функционального блока.

Вы не можете объявлять свои функции внутри вызова функционального блока.

person Filippo Boido    schedule 04.07.2020