Наша компания купила наш первый из многих ПЛК 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