RobotStudio event

Remote operator dialog box can't send answer

Tompanhuhu
Tompanhuhu ✭✭
edited October 2018 in Developer Tools

I’m trying to create a remote operator dialog with my PC app but can’t get the SendAnswer() method to work.

I have followed this guide: http://developercenter.robotstudio.com/blobproxy/devcenter/RobotCommunication/html/ae435101-731d-4fb3-be77-96e70b9aff19.htm

I have managed to catch the event, create a operator dialog and display header & messages. But I can’t return answer to robotcontroller.

I have tried the following code both on a virtual and a real controller.

I don’t get any error messages when trying the send the answer, nothing just happens.

If I answer the operator dialog on the robotcontroller my dialog is closed in the PC app so abort message is working fine.

Tpwrite & Tperase also works fine, and everything with uimsgbox works except sendanswer.

 

First I have created a subscription on the event.

<p>//subscribing to event</p><p><br></p><p>robcontroller.Rapid.UIInstruction.UIInstructionEvent += new UIInstructionEventHandler(OnUIInstructionEvent);</p><p>&nbsp;</p>

This is my eventhandler.

<p>void OnUIInstructionEvent(object sender, ABB.Robotics.Controllers.RapidDomain.UIInstructionEventArgs e) {</p><p><br></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
//Check what eventType is coming in</p><p><br></p><p>if (e.InstructionEventType == UIInstructionEventType.Post)</p><p><br></p><p>{</p><p><br></p><p>&nbsp;&nbsp;&nbsp;if (e.InstructionType == UIInstructionType.TPWrite)&nbsp;&nbsp;&nbsp;&nbsp;</p><p>&nbsp;</p><p>{</p><p><br></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
//Put latest tpwrite message on main screen</p><p><br></p><p>Form3.Instance.labelTpwrite.Text = e.EventMessage;</p><p><br></p><p>//Creat a listviewitem to add message to log listview</p><p><br></p><p>ListViewItem _temp = new ListViewItem(e.TaskName);</p><p><br></p><p>_temp.SubItems.Add(e.EventMessage);</p><p><br></p><p>//Add item to top of listview</p><p><br></p><p>tpwrite.Instance.listView1.Items.Insert(0,_temp);</p><p><br></p><p>}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p><p><br></p><p>if (e.InstructionType == UIInstructionType.TPErase)&nbsp;&nbsp;&nbsp;</p><p><br></p><p>{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p><p><br></p><p>//Clear listview&nbsp;</p><p><br></p><p>tpwrite.Instance.listView1.Items.Clear();</p><p><br></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p><p><br></p><p>}</p><p><br></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p><p>
else if (e.InstructionEventType == UIInstructionEventType.Send) {</p><p><br></p><p>//If new op dialog is created, change image to alert operator message is avalible.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p><p><br></p><p>Form3.Instance.pDialog.Image = Properties.Resources.dialog_new;</p><p><br></p><p>if (e.InstructionType == UIInstructionType.UIMessageBox)&nbsp;&nbsp;&nbsp;{</p><p><br></p><p>//If messagetype is uimsgbox create new dialog window</p><p><br></p><p>uimsgbox Newbox = new uimsgbox(e);</p><p><br></p><p>}</p><p><br></p><p>else if (e.InstructionType == UIInstructionType.UIAlphaEntry) {</p><p><br></p><p>//If messagetype is AlphaEntry create new dialog window&nbsp;&nbsp;&nbsp;</p><p>&nbsp;&nbsp;&nbsp;</p><p>var aen = e as UIAlphaEntryEventArgs;</p><p><br></p><p>uialpha newal = new uialpha(aen);</p><p><br></p><p>}&nbsp;</p><p><br></p><p>}</p><p><br></p><p>else if (e.InstructionEventType == UIInstructionEventType.Abort)&nbsp;{</p><p><br></p><p>//Abort dialog in the current task if there is any</p><p><br></p><p>foreach (TabPage _tab in opDialog.Instance.tabControl1.TabPages)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</p><p><br></p><p>if (_tab.Name == e.TaskName) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p><p><br></p><p>_tab.Dispose();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p><p><br></p><p>}</p><p><br></p><p>}</p><p><br></p><p>//If there is no avalible dialog reset dialog image. </p><p><br></p><p>if (opDialog.Instance.tabControl1.TabPages.Count == 0) Form3.Instance.pDialog.Image = Properties.Resources.dialog1;</p><p><br></p><p>}</p><p><br></p><p>}</p><p>&nbsp;</p>

This is my operator window object:

  

<p>&nbsp;
public partial class uimsgbox : UserControl</p><p><br></p><p>{</p><p><br></p><p>UIMessageBoxEventArgs eventobj;</p><p><br></p><p>public uimsgbox(UIInstructionEventArgs _e) {</p><p><br></p><p>InitializeComponent();</p><p><br></p><p>this.Dock = DockStyle.Fill;</p><p><br></p><p>//Add data from event object to local UIMessageBoxEventArgs object</p><p><br></p><p>eventobj = _e as UIMessageBoxEventArgs;</p><p><br></p><p>//I have also tried to instantly send answer when creating object but it dosen't work either</p><p><br></p><p>//eventobj.SendAnswer(UIButtonResult.OK);</p><p><br></p><p>//Fill dialog with header & message lines.</p><p><br></p><p>labelHeader.Text = eventobj.Header;</p><p><br></p><p>labelmsgline1.Text = eventobj.MsgArray[0].ToString();</p><p><br></p><p>labelmsgline2.Text = eventobj.MsgArray[1].ToString();</p><p><br></p><p>labelmsgline3.Text = eventobj.MsgArray[2].ToString();</p><p><br></p><p>labelmsgline4.Text = eventobj.MsgArray[3].ToString();</p><p><br></p><p>labelmsgline5.Text = eventobj.MsgArray[4].ToString();</p><p><br></p><p>//Create a new tabpage and add this control to page</p><p><br></p><p>TabPage _page = new TabPage(eventobj.TaskName);</p><p><br></p><p>_page.Name = eventobj.TaskName;</p><p><br></p><p>_page.Controls.Add(this);</p><p><br></p><p>opDialog.Instance.tabControl1.TabPages.Add(_page);</p><p><br></p><p>}</p><p><br></p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
private void button1_Click(object sender, EventArgs e){</p><p><br></p><p>eventobj.SendAnswer(UIButtonResult.Abort);</p><p><br></p><p>}</p><p><br></p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
private void button2_Click(object sender, EventArgs e){</p><p><br></p><p>eventobj.SendAnswer(UIButtonResult.Cancel);</p><p><br></p><p>}</p><p><br></p><p><br></p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
private void button3_Click(object sender, EventArgs e){</p><p><br></p><p><br></p><p>eventobj.SendAnswer(UIButtonResult.Ignore);</p><p><br></p><p><br></p><p>}</p><p><br></p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
private void button4_Click(object sender, EventArgs e){</p><p><br></p><p>eventobj.SendAnswer(UIButtonResult.No);</p><p><br></p><p>}</p><p><br></p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
private void button5_Click(object sender, EventArgs e){</p><p><br></p><p><br></p><p>eventobj.SendAnswer(UIButtonResult.OK);</p><p><br></p><p><br></p><p>}</p><p><br></p><p><br></p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
private void button6_Click(object sender, EventArgs e){</p><p><br></p><p>eventobj.SendAnswer(UIButtonResult.Retry);</p><p><br></p><p>}</p><p><br></p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
private void button7_Click(object sender, EventArgs e){</p><p><br></p><p>eventobj.SendAnswer(UIButtonResult.Yes);</p><p><br></p><p>}</p><p><br></p><p>}</p>

 

I have created 7 buttons because I have tried every message available to return but none of them works.

 

Rapid code for messagebox:

<p></p><p>UIMsgBox\Header:=<b>"This is a header"</b>,<b>"my simple message"</b>;</p>

 

Image of operator dialog in PC app.



Can anyone tell me what I have done wrong?

I have tried everything I can think of.

 

Robotware: 6.07

PC SDK: 6.07

PC: Windows 10 pro

Systemintegrator - Web / C# / Rapid / Robotstudio

If I helped, please press Vote Up  :smile:

Best Answer

Answers

  • Excuse me for the crappy indentation I have tried to format the post in a readable fashion but it's not really displayed as in the editor. 
    Systemintegrator - Web / C# / Rapid / Robotstudio

    If I helped, please press Vote Up  :smile:
  • Thank you @Johannes Weiman this solved the problem.

    The manual was a little bit tricky to understand when it states "There is no mastership handling involved in using Remote operator dialog."

    But all good now thanks! 
    Systemintegrator - Web / C# / Rapid / Robotstudio

    If I helped, please press Vote Up  :smile:
  • I try to create following to the tutorial on developer center but it's not working. The OnUIInstructionEvent isn't called, the pointer is moved to next command. Here is my code:

    private void cb1_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
                scanner = new NetworkScanner();
                scanner.Scan();//scan all avaiable controllers
                ControllerInfoCollection controllers = scanner.Controllers;//save all avaiable controllers
                foreach (ControllerInfo controllerInfo in controllers)//search all avaiable controller and save into list
                {
                    if(controllerInfo.SystemName == cb1.SelectedItem.ToString())
                    {
                        c = ControllerFactory.CreateFrom(controllerInfo);
                        c.Logon(UserInfo.DefaultUser);
                        lb_message.Content = "User was logon into " + c.SystemName + "!";
                        c.Rapid.UIInstruction.UIInstructionEvent += new UIInstructionEventHandler(OnUIInstructionEvent);
                    }
                }
            }

            public void OnUIInstructionEvent(object sender, UIInstructionEventArgs e)
            {
                lb_message.Content = "A";
                if (e.InstructionEventType == UIInstructionEventType.Send)
                {
                    if (e.InstructionType == UIInstructionType.UIMsgBox)
                    {
                        lb_message.Content = e.EventMessage;
                    }
                }
            }