TwinCAT: получение файла (FB_FileGets) - PullRequest
0 голосов
/ 05 мая 2020

Я разрабатываю код для получения текстового файла в 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

Большое спасибо! Буду очень признателен за вашу помощь

Ответы [ 3 ]

1 голос
/ 05 мая 2020

Вы забываете вызвать функциональные блоки. Как и сейчас, вы только предоставляете входные параметры различным функциональным блокам Beckhoff, но не выполняете их на самом деле (точно так же, как вы выполняете tRisingEdge, который также является функциональным блоком). Так что сделайте (в нужных местах или все в конце):

fbFileOpen();
fbFileGet();
fbFileClose();
0 голосов
/ 26 мая 2020

Вы устанавливаете bExecute на false, затем true на шаге 3. fbFileGet видит только bExecute как true, поскольку он выполняется позже в коде. Для срабатывания необходимо увидеть переход false-> true. Попробуйте поставить точку останова и пошагово посмотреть, что на самом деле происходит.

0 голосов
/ 05 мая 2020

@ Якоб Спасибо, что ответили мне. Я пытаюсь сделать это, но поведение такое же, блокируется в состоянии 3. Обратите внимание, что когда я отправляю его для вызова в основном коде таким образом, он переходит в состояние 3:

fbGetLabelFile.bExecute: = TRUE;
fbGetLabelFile ();

С другой стороны рука, если я отправлю его для вызова таким образом, он перейдет в состояние 2

fbGetLabelFile ();
fbGetLabelFile.bExecute: = TRUE;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...