Deploy from AppStudio

Hello,

I am trying to deploy an Operator Panel from ABB AppStudio 1.4.0 to a physical ABB GoFa controller.

Controller details

  • Controller ID: 15000-101956

  • RobotWare: 7.20.0+1391

  • AppStudio: 1.4.0.260916107

Problem

  • AppStudio can log in to the controller as Default User.

  • Subsequent requests to retrieve the task list and RMMP state fail with 401 Unauthorized.

  • The log also contains SSL certificate errors during logout.

  • Accessing https://192.168.125.1/rw/version in Edge produces NET::ERR_CERT_AUTHORITY_INVALID, but the controller responds with an authentication prompt when proceeding.

  • HTTP access is refused.

  • Deployment has worked once previously, but subsequent attempts fail.

I have tried Manual mode and logging out and back in. Neither resolved the issue. The computer is company-managed, so some Windows settings are restricted.

Could you advise whether this is a known AppStudio 1.4.0 / RobotWare 7.20.0 issue, and what specific logs or diagnostics you need to identify the cause?

I can provide the existing AppStudio log.

Best regards

Henrik

I have the same problem. It worked last time I used it 22/9 with the same AppStudio and RobotWare version. Since that time I have installed latest RobotStudio version, but otherwise it is the same setup. Other nearby experience the same issue. I have tried different physical robot controllers and different VC RW versions. Same on all.

Best regards
Per

We have also taken note of this issue.

This is caused by the update of the browser’s Edge WebView2 Runtime. Affected functionalities include deploying web apps and data binding for selecting data.

You can temporarily deploy locally and then copy it to the controller.

We will release a new package as soon as possible to resolve this issue.

2 Likes

Thanks for the answer!
Ok, so deploy to local file path and then just copy the whole folder to a USB memory and and paste it into $HOME/WebApps on the FlexPendant?

1 Like

I am having a very similar problem that I did not have at all 2 days ago. Here is the message I am seeing. I can connect to controller (virtual) but am unable to deploy to flexpendant or browser. I can, however, deploy locally and copy the folder over to virtual flexpendant.

I get that exact message.
Have you tried to copy the folder over to the physical FlexPendant and not only the virtual one?
I’m not sure if that’s the way to do it. (Waiting for an answer from Yitong)

1 Like

That should work, I’ll try it right now and you let you know.

Yes, this worked for me. What I did was connect to the controller in RobotStudio, then transfered my deployment (folder of the WebApp I made) into HOME/WebApps. I used transfer expanded on controller in broswer), but I assume USB would be fine as well directly into FlexPendant. I then restarted the controller.

1 Like

The beta version 1.4.1 that only includes the fix compared with 1.4.0 has been uploaded to https://campaign-ra.abb.com/AppStudio_Beta_SoftWare, please try if it works, and let us know if still any issue.

Hi,

Thank you for providing the updated version of AppStudio. I can confirm that the new version (1.4.1.261014108) has resolved the deployment issue. I can now deploy my app “Operator Panel” to the controller successfully and also release write access..

However, the app now displays a completely white screen when opened on the physical FlexPendant. The app works in the AppStudio preview, but the problem remains on the robot.

I have included the details below in the hope that you can help me identify the cause of this remaining issue.

System configuration:

  • Robot: ABB GoFa CRB 15000 (5 kg, 0.95 m reach)

  • Controller: OmniCore

  • RobotWare: 7.20.0

  • AppStudio: 1.4.1.261014108 (Beta)

  • FlexPendant Web App Mode: Chromium

What I have tested:

  • The Operator Panel works in the AppStudio preview.

  • Deploying to the controller completes successfully, and AppStudio confirms that the app has been deployed.

  • I enabled “Show debug log on the teach pendant UI”, but the FlexPendant still displays a completely white screen.

  • I have redeployed the app several times, including overwriting the existing files when prompted.

  • Bundle must be disabled for deployment to succeed. When Bundle is enabled, the build fails with the following error:

memory-entry:index.js:5:7: ERROR: The symbol "Select_Rullf_120_GV" has already been declared

  • AppStudio’s “Check program” reports no errors.

  • I also tried opening the deployed app in Microsoft Edge on the PC, but the browser reports NET::ERR_CERT_AUTHORITY_INVALID and an authentication-related error when accessing the controller’s HTTPS address.

I have not deleted the existing WebApps folder or changed the controller configuration.

I would appreciate any advice or troubleshooting steps. Thank you.

Hello,

First, regarding the NET::ERR_CERT_AUTHORITY_INVALID error, this is expected behavior when accessing the controller’s web interface through a browser. The controller uses a self-signed HTTPS certificate that is not trusted by the browser by default.

You can click Advanced and then Proceed to xxx.xxx.xxx.xxx to continue accessing the controller’s web interface, provided you have verified that you are connecting to your trusted controller.

Second, regarding the JavaScript error:

ERROR: The symbol "Select_Rullf_120_GV" has already been declared

This indicates that the same variable has been declared more than once in your JavaScript code.

Depending on where the code is written, the error may behave differently:

  1. User Functions: If the duplicate declaration is in a User Function, the syntax error will be reported during deployment, regardless of whether Bundle mode is enabled or disabled.

  2. Component Events: If the duplicate declaration is in a component event handler, such as onCreated or onMounted, the error will only be reported during deployment when Bundle mode is enabled.

Both types of JavaScript errors can cause the application to display a completely white screen when opened on the FlexPendant. Therefore, you will need to locate and fix the duplicate declaration in your code.

Finally, regarding the Check Program feature in AppStudio, please note that it currently performs only basic syntax validation. It does not detect all JavaScript compilation or runtime errors. Some of these errors may only become apparent when the deployed application is opened in the browser.

I would recommend checking your JavaScript code, particularly the declaration of Select_Rullf_120_GV, and fixing any duplicate declarations before deploying the application again.

1 Like

Thanks!
It was indeed an error in the code that I wrote.

Now I’m facing another problem, I’ll post it here but maybe I should open a new thread or if any admin wants to move it?

(I asked ChatGPT to formulate the answer for me so that it would be as accurate as possible. :slight_smile: )

______________________
I have created a simple Operator Panel in AppStudio to allow operators to select one of four existing RAPID programs directly from the FlexPendant, without having to enter Wizard.

The four programs are:

  • PLATTFORM

  • RULLFASTJARN_120_GV

  • Referensprogram

  • Gejdbalkar_tappar

The application deploys successfully, and the Operator Panel is displayed correctly on the FlexPendant. However, pressing any of the four program selection buttons produces the same error.

Error message

The error displayed on the FlexPendant is:

1102002 – Failed to execute onClick event

The event execution failed due to a logic error or an undefined variable.

{
  "message": "",
  "httpStatus": {
    "code": 405,
    "text": "Method Not Allowed"
  },
  "controllerStatus": {
    "name": "SYS_CTRL_E_FAIL",
    "code": -1073414146,
    "severity": "Error",
    "description": "Unspecified error."
  }
}

Current implementation

The button functions use RWS.Network.post() to load a RAPID program. For example, the PLATTFORM button uses:

const Select_Plattform = async () => {
  await RWS.Network.post(
    '/rw/rapid/tasks/T_ROB1/program?action=loadprog',
    'progpath=$HOME/Programs/PLATTFORM/PLATTFORM.pgf&loadmode=replace'
  );
};

export default Select_Plattform;

The other three functions use the same endpoint and request format, with different program paths.

The programs already exist in the controller’s HOME/Programs directory.

Troubleshooting already performed

  • Updated AppStudio after an earlier deployment issue.

  • Successfully deployed the application with the Bundle option disabled.

  • Corrected a duplicate/mismatched function definition that previously caused a build error.

  • Confirmed that AppStudio’s program check reports no errors.

  • Confirmed that the Operator Panel displays correctly on the physical FlexPendant.

  • Confirmed that all four buttons produce the same HTTP 405 error when pressed.

Assistance requested

Could you please clarify the following for OmniCore with RobotWare 7.20.0 and AppStudio 1.4.1?

  1. Is POST /rw/rapid/tasks/T_ROB1/program?action=loadprog supported for loading an entire RAPID program (.pgf) on this RobotWare version?

  2. If so, what is the exact supported endpoint, request body, content type and required HTTP headers?

  3. Should the program be loaded using a different RWS 2.0 endpoint or an AppStudio API function instead of RWS.Network.post()?

  4. Is any specific mastership, authentication or write-access handling required when loading a program from an AppStudio Operator Panel?

The intended functionality is simply to let the operator select which existing RAPID program to load. The operator will then start the robot manually using the FlexPendant. The application is not intended to start the robot automatically.

I have attached a photograph of the error message displayed on the FlexPendant.

Thank you for your assistance.

Best regards
Henrik

It looks like you’re trying to achieve this functionality through a relatively low-level RWS API call. This approach may involve additional considerations such as controller permissions, authentication, and mastership.

AppStudio provides higher-level functionality to simplify certain robot operations, so I would suggest exploring the built-in features first.

For example, you can:

  1. Drag a Button onto your Operator Panel.

  2. Go to the button’s Appearance panel.

  3. Find the Functionality section.

  4. Select Execute Procedure.

Once configured, AppStudio will automatically populate the corresponding logic in the button’s onClick event.

Also, since you’re using AppStudio 1.4.1, I would recommend checking the AppStudio API documentation, especially the higher-level APIs designed to simplify interactions with the robot controller. RAPID | AppStudio API Documentation

1 Like

Thanks for your help.

I have tested the built-in Execute Procedure functionality, it works, however, it executes the main procedure in the currently loaded program on all of the buttons pressed rather than selecting and loading the program associated with the button.

The programs are stored in separate folders under HOME/Programs, and each folder contains its own .pgf file and associated RAPID modules.

My goal is to let the operator select one of four existing RAPID programs using buttons in the Operator Panel:

  • PLATTFORM

  • Gejdbalkar_tappar

  • Referensprogram

  • Rullfastjarn_120_GV

    What is the recommended, supported way in AppStudio to select and load one of these existing RAPID programs from its .pgf file when an operator presses the corresponding button?

Is there a suitable high-level AppStudio API or built-in functionality for this purpose?

OK, you can try the follow code:

const programFolderName = "Test"
const programName = "Program1.pgf";

const path =
    `$HOME/Programs/${programFolderName }/${programName}`;

const body =
    "progpath=" + encodeURIComponent(path) +
    "&loadmode=replace";

try {
    await API.RWS.requestMastership("edit");

    try {
        await RWS.Network.post(
            "/rw/rapid/tasks/T_ROB1/program/load",
            body
        );
    } finally {
        await API.RWS.releaseMastership("edit");
    }

    TComponents.Popup_A.info("Load request succeeded");

    // Do not immediately call setPPToMain()

} catch (error) {
    console.error("Load failed:", error);
}

Then you can verify this:

Before:

After clicking the button:

Hello,

The code you previously provided for loading a .pgf program now works and reports Load request succeeded. However, starting the program using API.RAPID.startExecution() usually fails with either FailedToSetPPToRoutine or FailedToResetPP.

There was one occasion when the complete sequence worked: I switched the Wizard’s Edit program setting to On, then pressed the GEJDBALKAR button in the Operator Panel. The program loaded and started successfully, and the FlexPendant displayed “Please push operator ready”. On the next attempt, the error FailedToSetPPToRoutine occurred again. I have not been able to reproduce the successful result consistently, so I do not know whether enabling Edit program was the reason it worked.

The loaded program is Gejdbalkar_tappar.pgf, located in:

$HOME/Programs/Gejdbalkar_tappar/Gejdbalkar_tappar.pgf

The program contains Wizard → main, and the program pointer is positioned at the InitEAW instruction.

InitEAW belongs to Axson Teknik AB’s EasyAutoWelder (EAW) application, not ABB’s standard RAPID functionality. It displays “Please push operator ready” and waits for the operator to press a physical Operator Ready button before the welding sequence continues. It also includes other safety features. I tried removing the InitEAW instruction to see whether it was causing the problem, but the same error persisted.

The intended behaviour is for the operator to press the GEJDBALKAR button on the AppStudio Operator Panel. This should load the selected .pgf program and start execution until it reaches InitEAW, where it waits for the physical Operator Ready button.

What I have observed

  • The .pgf loading code works and reports Load request succeeded.

  • Starting the program manually from the FlexPendant works and displays “Please push operator ready”.

  • On one occasion, the Operator Panel successfully loaded and started the program after I switched Edit program to On. On subsequent attempts, the start failed again.

  • The errors encountered include FailedToSetPPToRoutine and FailedToResetPP.

  • The controller event log shows program load, program start, and program stop events. The stop event reports that task T_ROB1 was aborted because the RESET or POWER_ON event routine completed.

  • The program is stopped when I press the Operator Panel button.

I have tried API.RAPID.startExecution() with moduleName: "Wizard", procName: "main", setPP: true, and also without specifying the module and procedure. I have also tried calling API.RAPID.setPPToMain() and API.RAPID.setPPToRoutine() separately. These attempts have not resolved the issue consistently.

Current code in the button’s onClick handler

This is the current code in GEJDBALKAR → Behavior → onClick:

const programFolderName = "Gejdbalkar_tappar";
const programName = "Gejdbalkar_tappar.pgf";

const path =
    `$HOME/Programs/${programFolderName}/${programName}`;

const body =
    "progpath=" + encodeURIComponent(path) +
    "&loadmode=replace";

try {
    await API.RWS.requestMastership("edit");

    try {
        await RWS.Network.post(
            "/rw/rapid/tasks/T_ROB1/program/load",
            body
        );
    } finally {
        await API.RWS.releaseMastership("edit");
    }

    await API.RAPID.startExecution({
        cycleMode: "once",
        taskName: "T_ROB1"
    });

    TComponents.Popup_A.info(
        "Program loaded and start requested"
    );

} catch (error) {
    TComponents.Popup_A.info(
        "Error: " + String(error)
    );
}

Current code in the Function section

I also have a separate function named Select_Gejdbalkar:

const Select_Gejdbalkar = async () => {
    const programFolderName = "Gejdbalkar_tappar";
    const programName = "Gejdbalkar_tappar.pgf";

    const path =
        `$HOME/Programs/${programFolderName}/${programName}`;

    const body =
        "progpath=" + encodeURIComponent(path) +
        "&loadmode=replace";

    try {
        await API.RWS.requestMastership("edit");

        try {
            await RWS.Network.post(
                "/rw/rapid/tasks/T_ROB1/program/load",
                body
            );
        } finally {
            await API.RWS.releaseMastership("edit");
        }

        TComponents.Popup_A.info("Load request succeeded");
    } catch (error) {
        console.error("Load failed:", error);
    }
};

export default Select_Gejdbalkar;

The Function version only loads the program; it does not start RAPID execution. The loading code is currently duplicated directly in onClick.

When I previously tried calling Select_Gejdbalkar() from onClick, the result was Select_Gejdbalkar is not defined, so I moved the loading code directly into the handler.

Could you please review both code sections and perhaps provide a working example for loading the .pgf program and starting its main procedure reliably? I would also appreciate your advice on whether the loading code should be placed in the Function section or directly in the button’s onClick handler.

Thank you for your help!

In addition, I have now managed to start the program successfully about three times without making any code changes. It then stopped working again.

The AppStudio console shows FailedToResetPP originating from API.RAPID.setPPToMain(). The error details include SYS_CTRL_E_SYSORCMAJREADY_ACTIVE and indicate that the operation was rejected because the system was busy with a state-changing operation.

This appears to be intermittent and may depend on the controller’s state or the timing of the API calls. Could you advise how to detect when the controller is ready before setting the program pointer and starting execution?