Calling a cicode function from a page event doesn't work at times

Further to an earlier post about passing a cicode global variable argument into a function that is called by a super genie graphic window, I have got all the code working properly thanks to the wonderful help from this community!

It seems now the problem I have is that the function is not always called when the supergenie window is called. I have created a variable on the supergenie window that tells me if the code has been executed and in some cases it has not.

The variable that is set true by the code, so I then created a 'while do' loop to try and execute the code continuously until the variable is set true.

I think the problem is that for some reason the page event doesn't always run when the page (supergenie) is called and leaves check variable false, indicating the code has not been executed.

I have read all the help documentation and believe everything is correct. The documentation notes that there can be issues when using the 'on page entry' event so I have used 'on page shown event'. I note that the 'while page shown' event does not at work at all and not sure why this is.

Any help appreciated

Regards

Daryl

Parents
  • Two possible causes I can think of right now:
    1. If no user is logged in when opening the page, the tag cannot be written to (standard security feature).
    2. The statements take too long (blocking) and the event is aborted while not finished. To overcome this you can put the statements in a cicode function and then call that function from the event using TaskNew().

  • In addition to moving the code to a function called by TaskNew, you could:

    1. Add the command: ErrSet(1) to the beginning of the function. That keeps citect from terminating the task if one of the commands causes a fatal error. 

    2. Add a TraceMsg() call to the beginning and end of the function. For example: 

    Tracemsg("TrendFn started");

    ...

    TraceMsg("TrendFn finished");

    That way you know for sure if the function gets called and finishes successfully. You could also check the return value from each BlockedTrnSetPen call or step into them in the debugger to make sure they are successful. 

    You could also consider using the Process Analyst trend viewer instead of the legacy trend viewer.

    With the legacy viewer, TrnSetPen will fail until the trend object initializes, which depends on the speed of the trend server and whether it is on the local machine. 

    Process analyst uses a different function to set pens and shouldn't have that problem. 

Reply
  • In addition to moving the code to a function called by TaskNew, you could:

    1. Add the command: ErrSet(1) to the beginning of the function. That keeps citect from terminating the task if one of the commands causes a fatal error. 

    2. Add a TraceMsg() call to the beginning and end of the function. For example: 

    Tracemsg("TrendFn started");

    ...

    TraceMsg("TrendFn finished");

    That way you know for sure if the function gets called and finishes successfully. You could also check the return value from each BlockedTrnSetPen call or step into them in the debugger to make sure they are successful. 

    You could also consider using the Process Analyst trend viewer instead of the legacy trend viewer.

    With the legacy viewer, TrnSetPen will fail until the trend object initializes, which depends on the speed of the trend server and whether it is on the local machine. 

    Process analyst uses a different function to set pens and shouldn't have that problem. 

Children
  • Thanks again for your help

    I have successfully added the trace messages as suggested.

    I have used the debugger to step through the code on the SCADA servers and looks to be working perfectly.

    The problem is only on the workstations which to not have studio installed, hence no access to debugger where the problem is occurring.

    The TraceMsg help says Displays a message in the Kernel and Debugger debug windows. Do you know which kernel window ?

    kindest regards

    Daryl