B & R PLC.Вычислить новое смещение после записи или как записать данные в новую строку - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть эта программа, которая создает файл на флешке.Проблема в том, что он сохраняет только одну строку (перезаписывает одну и ту же строку).Мне нужно было бы после каждого цикла записывать данные в новую строку.Я думаю, что это должно сделать что-то со смещением, мне нужно рассчитать смещение, чтобы оно не начиналось с 0 каждый раз.Вот часть кода

10: DevLink_0.enable := TRUE;
        DevLink_0.pDevice := ADR('Disk');
        DevLink_0.pParam := ADR(cesta_k_USB);
        DevLink_0();

        IF DevLink_0.status =0 THEN
            step :=20;
        END_IF

    20: FileCreate_0.enable := TRUE;
        FileCreate_0.pDevice := ADR('Disk');
        FileCreate_0.pFile := ADR('results.csv');
        FileCreate_0();

        IF FileCreate_0.status = 0 THEN
            identification_file := FileCreate_0.ident;
            offset :=0;
            step :=30;
        END_IF

        IF FileCreate_0.status = fiERR_EXIST THEN 
            step :=25;
        END_IF

    25: FileOpen_0.enable := TRUE;
        FileOpen_0.pDevice :=  ADR('Disk');
        FileOpen_0.pFile := ADR('results.csv');
        FileOpen_0.mode := FILE_W;
        FileOpen_0();

        IF FileOpen_0.status = 0 THEN
            identification_file := FileOpen_0.ident;
            offset := FileOpen_0.filelen;
            step := 30;
        END_IF

    30: data:=INT_TO_STRING(y);
        data:=INSERT(data,'$r$n',LEN(data));
        FileWrite_0.enable := TRUE;
        FileWrite_0.ident := identification_file;
        FileWrite_0.pSrc := ADR(data); 
        FileWrite_0.len := LEN(data); 
        FileWrite_0.offset := offset;
        FileWrite_0();


        IF FileWrite_0.status = 0 THEN

                step :=40;

            END_IF



    40: FileClose_0.enable := TRUE;
        FileClose_0.ident := identification_file;
        FileClose_0();

        IF FileClose_0.status =0 THEN
            IF save = FALSE THEN
                step :=50;
            ELSE
                step := 25;
            END_IF
        END_IF

    50: DevUnlink_0.enable := TRUE;
        DevUnlink_0.handle := DevLink_0.handle;
        DevUnlink_0();

        IF DevUnlink_0.status =0 THEN
            stav:= 0;
        END_IF

1 Ответ

0 голосов
/ 04 марта 2019

Как уже упоминалось в комментарии, вам необходимо установить смещение в FUB FileWrite соответственно.

Я обычно делаю это с помощью Guid FileInfo FUB 6eaf42f0-4ce5-44b7-95cb-275ae1c2fac5 в справке AS.Он сообщит вам, если файл уже существует, а также его размер.

Если он существует, следующим шагом будет FileOpen, в противном случае FileCreate.

Недавно я создал небольшой проект наGitLab, который, помимо прочего, также добавляет строку в файл: https://gitlab.com/kirni/bur_robotic_sample/blob/master/bur_robotic_sample/Logical/Libraries/TeachLib/Teach.c

Код написан на C, но я уверен, что вы поняли.

case stTEACH_INFO:

            /*setup fub*/
            this->fbInfo.enable = 1;
            this->fbInfo.pDevice = (UDINT)inst->szDevice;
            this->fbInfo.pName = (UDINT)inst->szFile;
            this->fbInfo.pInfo = &this->Info;

            //call fub
            FileInfo(&this->fbInfo);

            //fub is done..
            if(this->fbInfo.status != ERR_FUB_BUSY)
            {
                //file exists -> open it and append code
                if(this->fbInfo.status == ERR_OK)
                {
                    //start writing to the end of the file
                    this->Offset = this->Info.size;

                    //open existing file
                    this->Step = stTEACH_OPEN;
                }
                //file does not exist -> create it and insert code
                else if(this->fbInfo.status == fiERR_FILE_NOT_FOUND)
                {
                    //start writing at the beginning of the file
                    this->Offset = this->Info.size;

                    //crete new file
                    this->Step = stTEACH_CREATE;
                }
                //error
                else
                {
                    //set error status and goto error state
                    inst->Status = this->fbInfo.status;
                    this->Step = stTEACH_ERROR;
                }

                //disable fub
                this->fbInfo.enable = 0;            
                FileInfo(&this->fbInfo);
            }

            break;

        case stTEACH_CREATE:

            /*setup fub*/
            this->fbCreate.enable = 1;
            this->fbCreate.pDevice = (UDINT)inst->szDevice;
            this->fbCreate.pFile = (UDINT)inst->szFile;

            //call fub
            FileCreate(&this->fbCreate);

            //fub is done..
            if(this->fbCreate.status != ERR_FUB_BUSY)
            {
                //success
                if(this->fbCreate.status == ERR_OK)
                {
                    this->Ident = this->fbCreate.ident;

                    //open existing file
                    this->Step = stTEACH_WRITE;
                }           
                //error
                else
                {
                    //set error status and goto error state
                    inst->Status = this->fbCreate.status;
                    this->Step = stTEACH_ERROR;
                }

                //disable fub
                this->fbCreate.enable = 0;          
                FileCreate(&this->fbCreate);
            }

            break;

        case stTEACH_OPEN:

            /*setup fub*/
            this->fbOpen.enable = 1;
            this->fbOpen.pDevice = (UDINT)inst->szDevice;
            this->fbOpen.pFile = (UDINT)inst->szFile;
            this->fbOpen.mode = fiREAD_WRITE;

            //call fub
            FileOpen(&this->fbOpen);

            //fub is done..
            if(this->fbOpen.status != ERR_FUB_BUSY)
            {
                //success
                if(this->fbOpen.status == ERR_OK)
                {
                    this->Ident = this->fbOpen.ident;

                    //open existing file
                    this->Step = stTEACH_WRITE;
                }           
                //error
                else
                {
                    //set error status and goto error state
                    inst->Status = this->fbOpen.status;
                    this->Step = stTEACH_ERROR;
                }

                //disable fub
                this->fbOpen.enable = 0;            
                FileOpen(&this->fbOpen);
            }
            break;

        case stTEACH_WRITE:

            /*setup fub*/
            this->fbWrite.enable = 1;
            this->fbWrite.ident = this->Ident;
            this->fbWrite.offset = this->Offset;
            this->fbWrite.pSrc = this->szLine;
            this->fbWrite.len = this->Lenght;

            //call fub
            FileWrite(&this->fbWrite);

            //fub is done..
            if(this->fbWrite.status != ERR_FUB_BUSY)
            {
                //success
                if(this->fbWrite.status == ERR_OK)
                {
                    this->Ident = this->fbWrite.ident;

                    //Write existing file
                    this->Step = stTEACH_CLOSE;
                }           
                    //error
                else
                {
                    //set error status and goto error state
                    inst->Status = this->fbWrite.status;
                    this->Step = stTEACH_ERROR;
                }

                //disable fub
                this->fbWrite.enable = 0;           
                FileWrite(&this->fbWrite);
            }
            break;

Однакоэто также должно работать с выводом filelen FileOpen FUB - так, как вы это сделали.Я бы посоветовал установить точку торможения непосредственно перед записью и проверить, правильно ли установлено смещение на FUB.

Я также рекомендовал бы, чтобы вы вызывали каждый FUB после того, как это было сделано, снова с enable: = 0 (как я сделал в моем примере), т.е. отключив его.Некоторые FUB обновляют свои входные параметры только на положительном фронте команды ввода enable, execute, start, и т. Д.

Надеюсь, это поможет!

...