【问题标题】:TwinCAT : Getting a file (FB_FileGets)TwinCAT:获取文件 (FB_FileGets)
【发布时间】:2020-05-26 17:09:45
【问题描述】:

我正在开发一个代码来获取 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

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

【问题讨论】:

    标签: c++ debugging twincat structured-text


    【解决方案1】:

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

    fbFileOpen();
    fbFileGet();
    fbFileClose();
    

    【讨论】:

      【解决方案2】:

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

      fbGetLabelFile.bExecute: = TRUE;
      fbGetLabelFile ();
      

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

      fbGetLabelFile ();
      fbGetLabelFile.bExecute: = TRUE;
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-09-01
          • 2023-02-03
          • 1970-01-01
          • 2021-02-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多