Exemplo n.º 1
0
static pwr_tStatus IoCardInit (
  io_tCtx	ctx,
  io_sAgent	*ap,
  io_sRack	*rp,
  io_sCard	*cp  
) 
{
  pwr_sClass_Ai_AI32uP	*op;
  io_sLocal 		*local;
  int			i;
  io_sChannel		*chanp;

  op = (pwr_sClass_Ai_AI32uP *) cp->op;
  local = calloc( 1, sizeof(*local));
  cp->Local = local;
  local->Address = op->RegAddress;
  local->Qbus_fp = ((io_sRackLocal *)(rp->Local))->Qbus_fp;

  errh_Info( "Init of ai card '%s'", cp->Name);

  /* Caluclate polycoeff */
  chanp = cp->chanlist;
  for  ( i = 0; i < cp->ChanListSize; i++)
  {
    AiRangeToCoef( chanp);
    chanp++;
  }

  return 1;
}
Exemplo n.º 2
0
static pwr_tStatus IoCardInit (
  io_tCtx	ctx,
  io_sAgent	*ap,
  io_sRack	*rp,
  io_sCard	*cp  
) 
{
  pwr_sClass_Ssab_BaseACard *op;
  io_sLocal 		*local;
  int			i;
  io_sChannel		*chanp;

  op = (pwr_sClass_Ssab_BaseACard *) cp->op;
  local = calloc( 1, sizeof(*local));
  cp->Local = local;
  local->Address = op->RegAddress;
  local->Qbus_fp = ((io_sRackLocal *)(rp->Local))->Qbus_fp;

  errh_Info( "Init of ai card '%s'", cp->Name);

  /* Caluclate polycoeff */
  chanp = cp->chanlist;
  for  ( i = 0; i < cp->ChanListSize; i++)
  {
    if ( chanp->sop)
      AiRangeToCoef( chanp);
    chanp++;
  }

  local->ErrReset = 1.0 / ctx->ScanTime + 0.5;
  if ( local->ErrReset < 2)
    local->ErrReset = 2;

  return 1;
}
Exemplo n.º 3
0
static pwr_tStatus IoCardInit (
    io_tCtx	ctx,
    io_sAgent	*ap,
    io_sRack	*rp,
    io_sCard	*cp
)
{
    pwr_tStatus		sts;
    pwr_sClass_Ai_7436	*op;
    io_sLocal 		*local;
    int			i;
    io_sChannel		*chanp;

    op = (pwr_sClass_Ai_7436 *) cp->op;
    local = calloc( 1, sizeof(*local));
    cp->Local = local;

    local->RackAddress = ((pwr_sClass_Rack_RTP *) rp->op)->RackAddress;

    local->Address = (op->CardAddress | 0xf0); /* Keep from being 0 */

    errh_Info( "Init of ai card '%s'", cp->Name);

    /* Caluclate polycoeff */
    chanp = cp->chanlist;
    for  ( i = 0; i < cp->ChanListSize; i++)
    {
        local->CardType[i] = RTP_AI_7436;
        if ( op->DiffInput)
            local->CardType[i] |= RTP_DIFFR;
        local->CardType[i] |=
            (io_get_rtp_ai_gain( ((pwr_sClass_ChanAi *)chanp->cop)->ChannelSigValRangeHigh) << 12);

        AiRangeToCoef( chanp);
        chanp++;
    }

    for ( i = 0; i < cp->ChanListSize; i++)
    {
        sts = io_InitAiFilter( cp->chanlist[i].cop, cp->chanlist[i].sop,
                               &local->FilterData[i], ctx->ScanTime);
    }
    return 1;
}
Exemplo n.º 4
0
/*----------------------------------------------------------------------------*\
  
\*----------------------------------------------------------------------------*/
static pwr_tStatus IoCardRead (
  io_tCtx	ctx,
  io_sAgent	*ap,
  io_sRack	*rp,
  io_sCard	*cp  
) 
{
  io_sLocal 		*local;
  pwr_tInt16		data = 0;
  pwr_sClass_Ai_AI32uP	*op;
  int			i;
  pwr_tFloat32		actvalue;
  io_sChannel		*chanp;
  pwr_sClass_ChanAi	*cop;
  pwr_sClass_Ai		*sop;
  int			sts;
  qbus_io_read 		rb;

  local = (io_sLocal *) cp->Local;
  op = (pwr_sClass_Ai_AI32uP *) cp->op;

  chanp = &cp->chanlist[0];
  for ( i = 0; i < cp->ChanListSize; i++)
  { 
    if ( !chanp->cop)
    {
      chanp++;
      continue;
    }
    cop = (pwr_sClass_ChanAi *) chanp->cop;
    sop = (pwr_sClass_Ai *) chanp->sop;

    if ( cop->CalculateNewCoef)
      AiRangeToCoef( chanp);

    if ( cop->ConversionOn)
    {
      if ( local->ScanCount[i] <= 1)
      {

#if defined(OS_ELN)
        vaxc$establish(machfailread);
#endif
        rb.Address = local->Address + 2*i;
        sts = read( local->Qbus_fp, &rb, sizeof(rb));
        data = (unsigned short) rb.Data;
        if ( sts == -1)
        {
#if 0
          /* Exceptionhandler was called */
          if ( io_fatal_error)
          {
            /* Activate emergency break */
            errh_Error( "Fatal read error, card '%s', IO is stopped", cp->Name);
            ctx->Node->EmergBreakTrue = 1;
            return IO__ERRDEVICE;
          }
#endif
          /* Increase error count and check error limits */
          op->ErrorCount++;

          if ( op->ErrorCount == op->ErrorSoftLimit)
            errh_Error( "IO Error soft limit reached on card '%s'", cp->Name);
          if ( op->ErrorCount >= op->ErrorHardLimit)
          {
            errh_Error( "IO Error hard limit reached on card '%s', IO stopped", cp->Name);
            ctx->Node->EmergBreakTrue = 1;
            return IO__ERRDEVICE;
          }
	  chanp++;
          continue;
        }
	/* Convert rawvalue to sigvalue and actualvalue */
	sop->RawValue = data;
        sop->SigValue = data * cop->SigValPolyCoef1 + cop->SigValPolyCoef0;
	switch ( chanp->ChanClass)
        {
          case pwr_cClass_ChanAi:
	    io_ConvertAi( cop, data, &actvalue);
	    break;
          case pwr_cClass_ChanAit:
	    io_ConvertAit( (pwr_sClass_ChanAit *) cop, data, &actvalue);
	    break;
	}

        /* Filter */
	if ( sop->FilterType == 1 &&
	     sop->FilterAttribute[0] > 0 &&
	     sop->FilterAttribute[0] > ctx->ScanTime)
        {
	  actvalue = *(pwr_tFloat32 *)chanp->vbp +
		ctx->ScanTime / sop->FilterAttribute[0] *
		(actvalue - *(pwr_tFloat32 *)chanp->vbp);
        }

	*(pwr_tFloat32 *) chanp->vbp = actvalue;
        local->ScanCount[i] = cop->ScanInterval + 1;
      }
      local->ScanCount[i]--;
    }
    chanp++;
  }
  return 1;
}
Exemplo n.º 5
0
/*----------------------------------------------------------------------------*\

\*----------------------------------------------------------------------------*/
static pwr_tStatus IoCardRead (
    io_tCtx	ctx,
    io_sAgent	*ap,
    io_sRack	*rp,
    io_sCard	*cp
)
{
    pwr_tStatus		sts;
    io_sLocal 		*local;
    pwr_tUInt16		data = 0;
    pwr_sClass_Ai_7436	*op;
    int			i;
    pwr_tFloat32		actvalue;
    pwr_tFloat32		*polycoef_p;
    io_sChannel		*chanp;
    pwr_sClass_ChanAi	*cop;
    pwr_sClass_Ai		*sop;

    if ( cp->AgentControlled)
        return IO__SUCCESS;

    local = (io_sLocal *) cp->Local;
    op = (pwr_sClass_Ai_7436 *) cp->op;

    chanp = &cp->chanlist[0];
    for ( i = 0; i < cp->ChanListSize; i++)
    {
        if ( !chanp->cop)
        {
            chanp++;
            continue;
        }
        cop = (pwr_sClass_ChanAi *) chanp->cop;
        sop = (pwr_sClass_Ai *) chanp->sop;

        if ( cop->CalculateNewCoef)
            AiRangeToCoef( chanp);

        if ( cop->ConversionOn)
        {
            if ( local->ScanCount[i] <= 1)
            {

                data = rtpai_read( local->RackAddress,
                                   (local->Address & 0xf), i, /* mask out fix bits */
                                   local->CardType[i]);
                if (io_readerr || io_fatal_error)
                {
                    /* Exceptionhandler was called */
                    if ( io_fatal_error)
                    {
                        /* Activate emergency break */
                        errh_Error( "Fatal read error, card '%s', IO is stopped", cp->Name);
                        ctx->Node->EmergBreakTrue = 1;
                        return IO__ERRDEVICE;
                    }

                    /* Increase error count and check error limits */
                    op->ErrorCount++;

                    if ( op->ErrorCount == op->ErrorSoftLimit)
                        errh_Error( "IO Error soft limit reached on card '%s'", cp->Name);
                    if ( op->ErrorCount >= op->ErrorHardLimit)
                    {
                        errh_Error( "IO Error hard limit reached on card '%s', IO stopped", cp->Name);
                        ctx->Node->EmergBreakTrue = 1;
                        return IO__ERRDEVICE;
                    }
                    chanp++;
                    continue;
                }
                /* Convert rawvalue to sigvalue and actualvalue */
                sop->RawValue = data;
                switch ( chanp->ChanClass)
                {
                case pwr_cClass_ChanAi:
                    io_ConvertAi( cop, (pwr_tInt16) data, &actvalue);
                    break;
                case pwr_cClass_ChanAit:
                    io_ConvertAit( (pwr_sClass_ChanAit *) cop, (pwr_tInt16) data,
                                   &actvalue);
                    break;
                }

                /* Filter */
                sts = io_AiFilter( (void *) op, &actvalue, local->FilterData[i]);

                *(pwr_tFloat32 *) chanp->vbp = actvalue;
                local->ScanCount[i] = cop->ScanInterval + 1;
            }
            local->ScanCount[i]--;
        }
        chanp++;
    }
    return 1;
}
Exemplo n.º 6
0
/*----------------------------------------------------------------------------*\
  
\*----------------------------------------------------------------------------*/
static pwr_tStatus IoCardRead (
  io_tCtx	ctx,
  io_sAgent	*ap,
  io_sRack	*rp,
  io_sCard	*cp  
) 
{
  io_sLocal 		*local;
  io_sRackLocal		*r_local = (io_sRackLocal *)(rp->Local);
  pwr_tInt16		data = 0;
  pwr_sClass_Ssab_BaseACard *op;
  pwr_sClass_Ssab_RemoteRack	*rrp;
  int			i;
  pwr_tFloat32		actvalue;
  io_sChannel		*chanp;
  pwr_sClass_ChanAi	*cop;
  pwr_sClass_Ai		*sop;
  int			sts;
  qbus_io_read 		rb;
  int			bfb_error = 0;
  pwr_tTime             now;

  local = (io_sLocal *) cp->Local;
  op = (pwr_sClass_Ssab_BaseACard *) cp->op;

  chanp = &cp->chanlist[0];
  for ( i = 0; i < cp->ChanListSize; i++)
  { 
    if ( !chanp->cop || !chanp->sop)
    {
      chanp++;
      continue;
    }
    cop = (pwr_sClass_ChanAi *) chanp->cop;
    sop = (pwr_sClass_Ai *) chanp->sop;

    if ( cop->CalculateNewCoef)
      AiRangeToCoef( chanp);

    if ( cop->ConversionOn)
    {
      if ( local->ScanCount[i] <= 1)
      {

#if defined(OS_ELN)
        vaxc$establish(machfailread);
#endif
        if (r_local->Qbus_fp != 0 && r_local->s == 0) {
          rb.Address = local->Address + 2*i;
          sts = read( local->Qbus_fp, &rb, sizeof(rb));
          data = (unsigned short) rb.Data;
	}
        else {
          /* Ethernet I/O, Get data from current address */
          data = bfbeth_get_data(r_local, (pwr_tUInt16) (local->Address + 2*i), &sts);
          /* Yes, we want to read this address the next time aswell */
          bfbeth_set_read_req(r_local, (pwr_tUInt16) (local->Address + 2*i));	 

          if (sts == -1) {
	    /* Error handling for ethernet Qbus-I/O */
  	    rrp = (pwr_sClass_Ssab_RemoteRack *) rp->op;
	    if (bfb_error == 0) {
              op->ErrorCount++;
	      bfb_error = 1;
              if ( op->ErrorCount == op->ErrorSoftLimit)
                errh_Error( "IO Error soft limit reached on card '%s'", cp->Name);
              if ( op->ErrorCount == op->ErrorHardLimit)
                errh_Error( "IO Error hard limit reached on card '%s', stall action %d", cp->Name, rrp->StallAction);
              if ( op->ErrorCount >= op->ErrorHardLimit && rrp->StallAction == pwr_eSsabStallAction_ResetInputs )
	      {
	        data = 0;
	        sts = 1;
              }
              if ( op->ErrorCount >= op->ErrorHardLimit && rrp->StallAction == pwr_eSsabStallAction_EmergencyBreak )
	      {
                ctx->Node->EmergBreakTrue = 1;
                return IO__ERRDEVICE;
              }
	    }
	    if (sts == -1) {
	      chanp++;
	      continue;
	    }
          }
          else {
	    op->ErrorCount = 0;
          }
        }
	
        if ( sts == -1)
	/* Error handling for local Qbus-I/O */
        {
#if 0
          /* Exceptionhandler was called */
          if ( io_fatal_error)
          {
            /* Activate emergency break */
            errh_Error( "Fatal read error, card '%s', IO is stopped", cp->Name);
            ctx->Node->EmergBreakTrue = 1;
            return IO__ERRDEVICE;
          }
#endif
          /* Increase error count and check error limits */
          time_GetTime( &now);

          if (op->ErrorCount > op->ErrorSoftLimit) {
            /* Ignore if some time has expired */
            if (now.tv_sec - local->ErrTime.tv_sec < 600)
              op->ErrorCount++;
          }
          else
            op->ErrorCount++;
          local->ErrTime = now;

          if ( op->ErrorCount == op->ErrorSoftLimit)
            errh_Error( "IO Error soft limit reached on card '%s'", cp->Name);
          if ( op->ErrorCount >= op->ErrorHardLimit)
          {
            errh_Error( "IO Error hard limit reached on card '%s', IO stopped", cp->Name);
            ctx->Node->EmergBreakTrue = 1;
            return IO__ERRDEVICE;
          }
	  chanp++;
          continue;
        }
	
        /* Convert rawvalue to sigvalue and actualvalue */
	sop->RawValue = data;
        sop->SigValue = data * cop->SigValPolyCoef1 + cop->SigValPolyCoef0;
	switch ( chanp->ChanClass)
        {
          case pwr_cClass_ChanAi:
	    io_ConvertAi( cop, data, &actvalue);
	    break;
          case pwr_cClass_ChanAit:
	    io_ConvertAit( (pwr_sClass_ChanAit *) cop, data, &actvalue);
	    break;
	}

        /* Filter */
	if ( sop->FilterType == 1 &&
	   sop->FilterAttribute[0] > 0 &&
	   sop->FilterAttribute[0] > ctx->ScanTime)
        {
	  actvalue = *(pwr_tFloat32 *)chanp->vbp +
	  ctx->ScanTime / sop->FilterAttribute[0] *
	  (actvalue - *(pwr_tFloat32 *)chanp->vbp);
        }

	*(pwr_tFloat32 *) chanp->vbp = actvalue;
        local->ScanCount[i] = cop->ScanInterval + 1;
	  
      }
      local->ScanCount[i]--;
    }
    chanp++;
  }
  return 1;
}