0

我正在开发一个代码来获取 twincat 中的文本文件。我正在使用块功能:

  • FB_FileOpen

  • FB_FileGets

  • FB_FileClose

我以网站https://infosys.beckhoff.com/english.php?content=../content/1033/tcplclibsystem/html/tcplclibsys_fileio_example.htm&id=5958930695166849062上的示例为基础

当程序运行时,我的 FB_GetLabelFile 运行到第 3 步,然后不前进

我想知道我在哪里犯了错误。我在下面附上代码:

FUNCTION_BLOCK FB_GetLabelFile
VAR_INPUT
    bExecute        : BOOL ;
    hFile           : UINT ;          
    sNetId          : STRING ;  
    sFileName       : STRING    := 'src\version.txt';                     
    tTimeout        : TIME      := T#5S;
END_VAR
VAR_OUTPUT
    bBusy           : BOOL ;
    bError          : BOOL ;        (* TRUE => Error, FALSE => No error *)
    nErrId          : UDINT;        (* Error code *)
    sResult         : STRING ;
    tRisingEdge     : R_TRIG;
END_VAR
VAR
    fbFileOpen      : FB_FileOpen;
    fbFileClose     : FB_FileClose;
    fbFileGet       : FB_FileGets;

    hSrcFile        : UINT;
    nState          : INT ;
END_VAR

tRisingEdge(CLK:=bExecute);

CASE nState OF
    0:
    IF tRisingEdge.Q THEN
        bBusy   := TRUE;
        bError  := FALSE;
        nErrId  := 0;
        nState  := 1;
        sResult := '';
        hSrcFile:= 0;
    END_IF

    1: 
    fbFileOpen.bExecute     := FALSE;
    fbFileOpen.sNetId       := sNetID;
    fbFileOpen.sPathName    := sFileName;
    fbFileOpen.nMode        := FOPEN_MODEREAD OR FOPEN_MODETEXT;
    fbFileOpen.ePath        := PATH_GENERIC;
    fbFileOpen.tTimeout     := tTimeout;

    nState := nState + 1;

    2:
    fbFileOpen.bExecute := FALSE;
    IF NOT fbFileOpen.bBusy THEN
        IF fbFileOpen.bError THEN
            nErrId := fbFileOpen.nErrId;
            bError := TRUE;
            nState := 10;
        ELSE
            hSrcFile := fbFileOpen.hFile;
            nState := nState + 1;
        END_IF
    END_IF

    3:
    sResult             := '';
    fbFileGet.bExecute  := FALSE;
    fbFileGet.sNetId    := sNetID;
    fbFileGet.hFile     := hSrcFile;
    fbFileGet.bExecute  := TRUE;
    fbFileGet.tTimeout  := tTimeOut;

    nState := nState + 1;

    4:
    fbFileGet.bExecute  := FALSE;
    IF NOT fbFileGet.bBusy THEN
        IF fbFileGet.bError THEN
            nErrId := fbFileGet.nErrId;
            bError := TRUE;
            nState := 10;
        ELSE
            sResult := fbFileGet.sLine;
            nState := nState + 1;
        END_IF
    END_IF

    5:
    fbFileClose.bExecute    := FALSE;
    fbFileClose.sNetId      := sNetID;
    fbFileClose.hFile       := hSrcFile;
    fbFileClose.bExecute    := TRUE;
    fbFileClose.tTimeout    := tTimeOut;

    nState := nState + 1;

    6: 
    fbFileClose.bExecute := FALSE;
    IF NOT fbFileClose.bBusy THEN
        IF fbFileClose.bError THEN
            nErrId  := fbFileClose.nErrId;
            bError  := TRUE;
        END_IF
        nState   := 10;
        hSrcFile := 0;
    END_IF

    10:
    IF hSrcFile <> 0 THEN
        nState := 5;
    ELSE
        nState := 0;
        bBusy := FALSE;
    END_IF
END_CASE

非常感谢!非常感谢您的帮助

4

3 回答 3

1

您忘记调用功能块。就像现在一样,您只是将输入参数提供给不同的 Beckhoff 功能块,而不是实际执行它们(就像您执行 tRisingEdge,它也是一个功能块一样)。这样做(在正确的地方,或者在最后):

fbFileOpen();
fbFileGet();
fbFileClose();
于 2020-05-05T14:52:35.993 回答
0

@Jakob感谢您回答我。我尝试这样做,但行为是相同的,锁定在状态 3。请注意,当我以这种方式发送它以调用主代码时,它会进入状态 3:

fbGetLabelFile.bExecute: = TRUE;
fbGetLabelFile ();

另一方面,如果我以这种方式发送它来调用,它会进入状态 2

fbGetLabelFile ();
fbGetLabelFile.bExecute: = TRUE;
于 2020-05-05T18:50:06.743 回答
0

您将在第 3 步设置bExecutefalsethen 。唯一将 bExecute 视为 true,因为它稍后在代码中执行。它需要看到一个 false->true 转换才能触发。尝试在其中设置断点并单步执行以查看实际发生的情况。truefbFileGet

于 2020-05-26T07:25:17.027 回答