Example #1
0
void FanucAdapter::getStatus()
{
  if (!mConnected)
    return;
  int ret;

  ODBST status;
  memset(&status, 0, sizeof(status));
  ret = cnc_statinfo(mFlibhndl, &status);
  if (ret == EW_OK)
  {
	// This will take care of JOG 
	if (status.aut == 5 || status.aut == 6) 
      mMode.setValue(ControllerMode::eMANUAL);
    else if (status.aut == 0 ||status.aut == 3) // MDI and EDIT
      mMode.setValue(ControllerMode::eMANUAL_DATA_INPUT);
    else // Otherwise AUTOMATIC
      mMode.setValue(ControllerMode::eAUTOMATIC);
              
    if (status.run == 3 || status.run == 4) // STaRT
      mExecution.setValue(Execution::eACTIVE);
    else 
    {
      if (status.run == 2 || status.motion == 2 || status.mstb != 0) // HOLD or motion is Wait
        mExecution.setValue(Execution::eINTERRUPTED);
      else if (status.run == 0) // STOP
        mExecution.setValue(Execution::eSTOPPED);
      else
        mExecution.setValue(Execution::eREADY);
    }
    if (status.emergency == 1)
      mEstop.setValue(EmergencyStop::eTRIGGERED);
    else
      mEstop.setValue(EmergencyStop::eARMED);

    char buf[1024];
    unsigned short len = sizeof(buf);
    short num;
    ret = cnc_rdexecprog(mFlibhndl, (unsigned short*) &len, &num, buf);
    if (ret == EW_OK)
    {
      buf[len] = '\0';
      for (int i = 0; i < len; i++)
      {
        if (buf[i] == '\n')
        {
          buf[i] = '\0';
          break;
        }
      }
              
      mBlock.setValue(buf);
    }
  }
  else
  {
    disconnect();
  }
}
int CiSeries::getLine()
{
	GLogger.LogMessage("iSeries::getLine Enter\n", 3);
	std::string prognum,progname;

	short ret;
	if (!_adapter->mConnected)
		return -1;

	GLogger.Info("iSeries::getLine\n");
	ODBSEQ block;
	ret = cnc_rdseqnum(_adapter->mFlibhndl, &block ); // 15,16,18,21,0,powermate
	if (ret == EW_OK)
	{
		_adapter->SetMTCTagValue("line", StdStringFormat("%d", block.data));
	}
	else
	{
		GLogger.Info(StdStringFormat("Error iSeries::cnc_rdseqnum=%d\n", ret));
	}

	ODBPRO buf ;
	ret = cnc_rdprgnum( _adapter->mFlibhndl, &buf ) ; // 15,16,18,21,0,powermate
	if (ret == EW_OK)
	{
		//prognum=StdStringFormat("O%04hd", buf.data); // mdata -  Main program number. data- Running program number.
		prognum=StdStringFormat("O%04d", buf.data); // mdata -  Main program number. data- Running program number.
		GLogger.Info(StdStringFormat("iSeries::cnc_rdprgnum prognum = %d\n", buf.mdata));
		GLogger.Info(StdStringFormat("iSeries::cnc_rdprgnum prognum = %d\n",(int) (buf.mdata&0xFFFF)));
		GLogger.Info(StdStringFormat("iSeries::cnc_rdprgnum prognum data = %d\n",(int) (buf.data&0xFFFF)));
	}
	else
	{
		GLogger.Info(StdStringFormat("Error CiSeries::cnc_rdprgnum=%d", ret));
		LogErrorMessage(" CiSeries::cnc_rdprgnum FAILED\n", ret );
	}

	if(1) // Globals.ProgramLogic == "FirstComment")
	{

		short i, blk;
		unsigned short num;
		short top = 0;
		char prg[BUFSIZE+1];
		std::string sLine;
		//do {
			num = BUFSIZE;

			ret = cnc_rdexecprog(_adapter->mFlibhndl,&num, &blk, prg);

			if ( ret == EW_LENGTH  ) 
			{
				LogErrorMessage(" iSeries::cnc_rdexecprog FAILED Length Error\n", ret );
				goto error;
			}

			if ( ret ) 
			{
				LogErrorMessage("iSeries::cnc_rdexecprog NOSPECIFIC ERROR\n", ret );
				goto error;
			}

			// Find first comment  (  ) SHOULD BE ON FIRST LINE
			// Extract comment, if not null assign to progname, which is output as program to MTConnect
			{
				//sLine = prg[i].comment;
				sLine = prg; // [i].comment;
				int n = sLine.find("(");
				int m= sLine.find(")");

				if(std::string::npos ==n && std::string::npos ==m)
				{
					LOGONCE GLogger.Fatal(StdStringFormat("Didn't find comment %s\n",sLine.c_str()));
					goto error;
				}

				sLine= sLine.substr(n+1,m-n-1);

				if(!sLine.empty() && sLine != "()")
				{
					// GLogger.Fatal(StdStringFormat("Program Name = %s\n",sLine.c_str()));
					progname=sLine;
				}
			}
	}
error:
	if(!progname.empty())
	{
		_adapter->SetMTCTagValue("program", progname);
	}
	else if(!prognum.empty())
	{
		_adapter->SetMTCTagValue("program", prognum);
	}
	else
	{
		_adapter->SetMTCTagValue("program", "O1");
	}
	GLogger.LogMessage("iSeries::getLine Leave\n", 3);
	return EW_OK;
}