C++ TwinCAT:获取文件(FB_fileget)
我正在开发一个代码来获取twincat中的文本文件。我正在使用块函数: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 ;
- FB_文件打开
- FB_fileget
- FB_文件关闭
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;