bradp Posted September 9, 2009 Posted September 9, 2009 To determine if a motion program is running in a C.S. look at Coord[n].Ldata.Status. If all of the four low bits are zero then it is executing. To determine if a PLC program is executing look at Plc[n].Ldata.Status. If all of the four low bits are zero then it is executing.
bradp Posted April 15, 2011 Author Posted April 15, 2011 This is not exact code but pseudo code used in the IDE Task Manager for checking if PLCs, Motion Programs and Sub Programs running. ------------------------------------------------------------------------------------------------------------------------------------------------- PLCs Tab PLCs Tab -- PLCs and RTPLCs Sys.MaxRtPlc - Tells how many PLCs are RTPLCs. For example if Sys.MaxRtPlc is 5 then Plc 0,1,2,3,4,5 are RTPLCs and rest are PLCs for (int i = 0; i < 32; i++) // 32 Plcs { if( (i) <= Sys.MaxRtPlc ) { if ( plc[i].Ldata.Status == Hex 20 ) RTPLC (i) is Running. else RTPLC (i) is not Running. } else { if ( plc[i].Ldata.Status == Hex 20 ) PLC (i) is Running. else PLC (i) is not Running. } } PLCs Tab -- CPLCs if ( 'librtiplcc.so' is available in ("/var/ftp/usrflash/Project/C Language/CPLCs/rti/" folder)) { if( Useralgo.Rticplc is 1 ) rtiplc.so CPLC is running else rtiplc.so CPLC not running } for (int i = 0; i < 32; i++) // 32 CPLCs { if ( ‘libplcc(i)’ is available in (“/var/ftp/usrflash/Project/C Language/CPLCs/user/”) folder) { if(UserAlgo.BgCplc[i] is 1 ) CPLC (i) is Running. else CPLC (i) is Not Running. } } PLCs Tab -- Application check pp_proj.ini file in '/var/ftp/usrflash/Project/Configuration' folder . Look for LINUX_PROGRAMS section in that file. This section will list all PLC applications. For example. [LINUX_PROGRAMS] program1=/var/ftp/usrflash/Project/C Language/Background Programs/capp1.out program2=/var/ftp/usrflash/Project/C Language/Background Programs/cap21.out for(program[1 .. n] in LINUX_PROGRAMS section) { // example with program1 if( ‘capp1.out’ is available in ‘linux top’ command) { Application ‘capp1.out’ is running. } else { Application ‘capp1.out’ is not running. } } ----------------------------------------------------------------------------------------------------------- Programs Tab ( Displays Motion programs) For( all prog[0..n] till you get prog[i].Number as ‘nan’) { For( all Coord[0..Sys.MaxCoordinates].Program.Number ) { if( prog[i].Number is available in Coord[j].Program.Number and Coord[j].Program.Size > 0 ) { if( coord[j].ldata.Status == hex 20) (Coord[j].Program.Number) is Running. Else (Coord[j].Program.Number) is Not Running. } } } for( all Coord[0.. Sys.MaxCoordinates]) { if( Coord[i].inverse.Size > 0 ) (i) is ‘Inverse Kinematic’; if( Coord[i].Forward.Size > 0 ) (i) is ‘Forward Kinematic’ } ----------------------------------------------------------------------------------------------------------- SubProgram Tab For( all SubProg[0..n] till you get SubProg[i].Number as ‘nan’) { SubProg[i]. Number is Running . }
curtwilson Posted April 21, 2011 Posted April 21, 2011 Version 1.2 of the Power PMAC firmware, released in Jan 2011, has 2 new status elements that make it easier for the user to determine the status of motion program operation. Coord[x].ProgRunning is 1 if the motion program and/or moves resulting from the program are presently executing. It is 1 even in "feed hold" (H) mode, because execution is still active, but it thinks that no time is elapsing. Coord[x].ProgActive is 1 if the motion program is running, or suspended in a way that execution can resume from that point (as with an S or Q command). These elements are "function" elements, computed only on request from several status bits, and so are not directly accessible from C programs.
KEJR Posted April 26, 2011 Posted April 26, 2011 [quote='curtwilson' pid='1773' dateline='1303408319'] These elements are "function" elements, computed only on request from several status bits, and so are not directly accessible from C programs. [/quote] Is it possible to create C API calls for these types of things? Alternatively if it is documented we can create our own C calls from the data structure access. KEJR
Omron Forums Support Posted April 29, 2011 Posted April 29, 2011 [quote='bradp' pid='206' dateline='1252511542'] To determine if a motion program is running in a C.S. look at Coord[n].Ldata.Status. If all of the four low bits are zero then it is executing. To determine if a PLC program is executing look at Plc[n].Ldata.Status. If all of the four low bits are zero then it is executing. [/quote] We will add C API call to access these elements. As soon as it is available I will post it ! Atul
paddax Posted March 12, 2014 Posted March 12, 2014 [quote='bradp' pid='206' dateline='1252511542'] To determine if a motion program is running in a C.S. look at Coord[n].Ldata.Status. If all of the four low bits are zero then it is executing. To determine if a PLC program is executing look at Plc[n].Ldata.Status. If all of the four low bits are zero then it is executing. [/quote] This no longer works after upgrading 1.6.0.30. Is this a bug or intended and what replaces it :(
iclim Posted September 12, 2014 Posted September 12, 2014 Can I please have an update on this, specifically for the C API. Base on previous comments, at present I am looking at pshm->Coord[x].Ldata.Status However it looks like this bit is set when the Coord system is trying to hold a position. ie. [code] int status = pshm->Coord[1].Ldata.Status & 0x1; return !status; [/code] Are there any other bits that I should be looking at? FYI I am using this bit to determine if I need to send an "abort" command and reissue a motion program Thanks
MClement Posted September 12, 2014 Posted September 12, 2014 I seem to recall an issue with the IDE not correctly finding ALL instances of C programs running. If you start two copies of the same program, it used to find the first one and that was it. It also did not correctly work to kill a C program. I cannot recall the exact behavior but it would not start the applications either, it would start a new copy of the C application. I have not revisited any of this in the latest IDE but the previous version had issues.
Omron Forums Support Posted September 17, 2014 Posted September 17, 2014 [quote='iclim' pid='7120' dateline='1410483789'] Can I please have an update on this, specifically for the C API. Base on previous comments, at present I am looking at pshm->Coord[x].Ldata.Status However it looks like this bit is set when the Coord system is trying to hold a position. ie. [code] int status = pshm->Coord[1].Ldata.Status & 0x1; return !status; [/code] Are there any other bits that I should be looking at? FYI I am using this bit to determine if I need to send an "abort" command and reissue a motion program Thanks [/quote] I don't have direct C API function but you can make one using GetResponse. Coord[1].Ldata.Status The GetResponse function signature : (You can type the command in editor and then press F1 to see details.) -------------------------------------- int GetResponse (char * pinstr, char * poutstr, size_t outlen, unsigned char EchoMode) Performs a string send to with an expected return from the Pmac Command Processor The input string must have PMAC compatible commands Note: Doesn't handle "gpascii" commands like "$$$" or "reboot" Parameters: *pinstr - ptr to input string outlen - max length of output string EchoMode - PMAC "echo" parameter which determines the format of the response *poutstr - ptr to output string Returns: 0 == OK, - == error number -------------------------------------------------- How to use: #define CHAR_BUF_SIZE 0x100 retval= GetResponse("Coord[1].Ldata.Status",szdata, CHAR_BUF_SIZE, 0) where; int retval; char *szdata; ----------------------- Also please open DemoBox_4X, working example program that installs with IDE and shows how to use this API call. Hope this help. Thanks, Atul
curtwilson Posted September 18, 2014 Posted September 18, 2014 You want to use Atul's method to check the status of Coord[1].ProgActive. This is a "function" status bit that is computed from several internal status bits. It is 1 if the program is running or suspended so that execution could continue at that point. In this case, you would need to abort the program before you could work with the program buffer.
Recommended Posts