0

我们公司购买了许多 Beckhoff PLC 中的第一台,我目前正在开发状态机。

我通常在 C 中做的是使用 switch case,其中每个 case 调用一个函数,即该特定状态的状态函数。此状态函数在完成时返回 true。状态函数返回 true 后 switch-case 选择新状态

一个简短的例子:

// 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
4

1 回答 1

0

如果您使用的是 Twincat 3,您可以向您的 FB 添加方法以在您的 switch case 中调用。

否则,如果您使用的是 Twincat 2,则无法向 FB 添加方法,因为 Twincat 2 不支持面向对象的编程。

不过,您可以创建要添加到项目中的功能(不仅是功能块)。然后,您可以将您的特定功能与您的状态机功能块一起分组到一个文件夹中。

如果您正在使用 Twincat 2,您可以做的另一件事是将动作添加到您的功能块。它们与 Twincat 3 方法不同,因为没有自己的方法堆栈。

您不能在 Action 中声明变量,也不能从它们返回值,但如果您想更好地组织功能块的代码,它们会派上用场。

您不能在功能块调用中声明您的函数。

于 2020-07-04T01:45:08.837 回答