Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ TwinCAT:获取文件(FB_fileget)_C++_Debugging_Twincat_Structured Text - Fatal编程技术网

C++ TwinCAT:获取文件(FB_fileget)

C++ TwinCAT:获取文件(FB_fileget),c++,debugging,twincat,structured-text,C++,Debugging,Twincat,Structured Text,我正在开发一个代码来获取twincat中的文本文件。我正在使用块函数: FB_文件打开 FB_fileget FB_文件关闭 我以网站上的示例为基础 当程序运行my FB_GetLabelFile时,运行到步骤3,然后不前进 我想知道我在哪里犯了错误。我在此附上以下代码: FUNCTION_BLOCK FB_GetLabelFile VAR_INPUT bExecute : BOOL ; hFile : UINT ;

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

  • FB_文件打开

  • FB_fileget

  • FB_文件关闭

我以网站上的示例为基础

当程序运行my 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
功能块FB\u GetLabelFile
变量输入
执行:布尔;
hFile:UINT;
斯奈蒂德:字符串;
sFileName:STRING:=“src\version.txt”;
tTimeout:TIME:=T#5S;
结束变量
变量输出
bBusy:BOOL;
伯罗:布尔;(*TRUE=>错误,FALSE=>无错误*)
内里德:乌迪内;(*错误代码*)
结果:字符串;
tRisingEdge:R_TRIG;
结束变量
变量
fbFileOpen:FB_FileOpen;
fbFileClose:FB_FileClose;
fbFileGet:FB_FileGets;
hSrcFile:UINT;
nState:INT;
结束变量
tRisingEdge(CLK:=bExecute);
案例说明
0:
如果是tRisingEdge.Q,那么
bBusy:=真;
错误:=错误;
nErrId:=0;
nState:=1;
sResult:='';
hSrcFile:=0;
结束(如有)
1: 
fbFileOpen.bExecute:=FALSE;
fbFileOpen.sNetId:=sNetId;
fbFileOpen.sPathName:=sFileName;
fbFileOpen.nMode:=FOPEN\u MODEREAD或FOPEN\u MODETEXT;
fbFileOpen.ePath:=路径\通用;
fbFileOpen.tTimeout:=tTimeout;
nState:=nState+1;
2:
fbFileOpen.bExecute:=FALSE;
如果不是fbFileOpen.bBusy,则
如果fbFileOpen.bError,则
nErrId:=fbFileOpen.nErrId;
贝罗:=真;
nState:=10;
其他的
hSrcFile:=fbFileOpen.hFile;
nState:=nState+1;
结束(如有)
结束(如有)
三:
sResult:='';
fbFileGet.bExecute:=FALSE;
fbFileGet.sNetId:=sNetId;
fbFileGet.hFile:=hSrcFile;
fbFileGet.bExecute:=真;
fbFileGet.tTimeout:=tTimeout;
nState:=nState+1;
4:
fbFileGet.bExecute:=FALSE;
如果不是fbFileGet.bBusy,则
如果fbFileGet.bError,则
nErrId:=fbFileGet.nErrId;
贝罗:=真;
nState:=10;
其他的
sResult:=fbFileGet.sLine;
nState:=nState+1;
结束(如有)
结束(如有)
5:
fbFileClose.bExecute:=FALSE;
fbFileClose.sNetId:=sNetId;
fbFileClose.hFile:=hSrcFile;
fbFileClose.bExecute:=TRUE;
fbFileClose.tTimeout:=tTimeout;
nState:=nState+1;
6: 
fbFileClose.bExecute:=FALSE;
如果不是fbFileClose.bBusy,则
如果fbFileClose.bError,则
nErrId:=fbFileClose.nErrId;
贝罗:=真;
结束(如有)
nState:=10;
hSrcFile:=0;
结束(如有)
10:
如果是HSRC0文件,则
nState:=5;
其他的
nState:=0;
bBusy:=假;
结束(如有)
结案

多谢各位!如果您忘记调用功能块,我将非常感谢您的帮助。现在,您只向不同的Beckhoff函数块提供输入参数,而不是实际执行它们(就像您执行tRisingEdge一样,它也是一个函数块)。 也要这样做(在正确的地方,或在最后):


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

fbGetLabelFile.bExecute: = TRUE;
fbGetLabelFile ();
另一方面,如果我以这种方式发送它来调用,它将前进到状态2

fbGetLabelFile ();
fbGetLabelFile.bExecute: = TRUE;

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

fbGetLabelFile ();
fbGetLabelFile.bExecute: = TRUE;