123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401 |
- #include "stdafx.h"
- #include "CArmResetMotionModel.h"
- #include "ResetMotionStageArgs.h"
- #include "MotionStages.h"
- #include "IMachineryManager.h"
- #include "CArmComponentNameDef.h"
- #include "ICircularController.h"
- #include "ISwingController.h"
- #include "ISensorEncoderController.h"
- #include "ILandmarkController.h"
- #include "IPositionManager.h"
- #include "FluoroSwitchController.h"
- using namespace DIOS::Dev::Detail::MachineryECOM;
- CArmResetMotionModel::CArmResetMotionModel()
- :m_StageName(""),
- m_stageArgs(new ResetMotionStageArgs()),
- m_coordinates(nullptr),
- m_circular(nullptr),
- m_swing(nullptr),
- m_circularencoder(nullptr),
- m_swingencoder(nullptr),
- m_landmark(nullptr),
- m_fluoroSwitch(nullptr),
- m_resetSwingPeriod(250),
- m_resetCircularPeriod(250),
- m_tubeSwingLandmarkDirection(0),
- m_tubeCircularLandmarkDirection(0),
- m_tubeSwingResetAngle(0.0f),
- m_tubeCircularResetAngle(0.0f),
- m_tubeCircularAxisPositiveDirection(1),
- m_tubeSwingAxisPositiveDirection(1)
- {
- }
- CArmResetMotionModel::~CArmResetMotionModel()
- {
- if (m_stageArgs)
- {
- delete m_stageArgs;
- m_stageArgs = nullptr;
- }
- }
- void CArmResetMotionModel::ChangeStage(const std::string &stageName)
- {
- if (gmotionLog) gmotionLog->Info("[CArmResetMotionModel][ChangeStage]->[{$}]", stageName.c_str());
- m_StageName = stageName;
- OnMotionStage(m_StageName);
- }
- std::string CArmResetMotionModel::GetStageName()
- {
- return m_StageName;
- }
- IMotionStageArgs *CArmResetMotionModel::GetStageArgs()
- {
- return m_stageArgs;
- }
- void CArmResetMotionModel::Initialize(IMachineryManager *machineryManager, IPositionManager *coordinates)
- {
- m_coordinates = coordinates;
- m_circular = (ICircularController*)machineryManager->Resove(CONTROLLER_CARM_TUBE_CIRCULAR);
- m_swing = (ISwingController*)machineryManager->Resove(CONTROLLER_CARM_TUBE_SWING);
- m_circularencoder = (ISensorEncoderController*)machineryManager->Resove(CONTROLLER_CARM_TUBE_CIRCULAR_ENCODER);
- m_swingencoder = (ISensorEncoderController*)machineryManager->Resove(CONTROLLER_CARM_TUBE_SWING_ENCODER);
- m_landmark = (ILandmarkController *)(machineryManager->Resove(CONTROLLER_LANDMARK));
- m_fluoroSwitch = (IOutputController*)(machineryManager->Resove(CONTROLLER_FLUOROSWITCH));
- }
- void CArmResetMotionModel::LoadMachineryParams(ResDataObject ¶ms)
- {
- m_resetSwingPeriod = (DWORD)atoi((const char *)params["ResetRotatePeriod"]);
- m_resetCircularPeriod = (DWORD)atoi((const char *)params["ResetHeightPeriod"]);
- m_tubeSwingLandmarkDirection = (int)atoi((const char *)params["TubeRotateLandmarkDirection"]);
- m_tubeCircularLandmarkDirection = (int)atoi((const char *)params["TubeHeightLandmarkDirection"]);
- m_tubeSwingResetAngle = (float)atof((const char *)params["TubeRotateResetAngle"]);
- m_tubeCircularResetAngle = (float)atof((const char *)params["TubeHeightResetPos"]);
- m_tubeCircularAxisPositiveDirection = (int)atoi((const char *)params["TubeHeightAxisPositiveDirection"]);
- m_tubeSwingAxisPositiveDirection = (int)atoi((const char *)params["TubeRotateAxisPositiveDirection"]);
- }
- void CArmResetMotionModel::LoadModelParams(ResDataObject ¶ms)
- {
- }
- void CArmResetMotionModel::SetTechnicalParams(ResDataObject ¶ms)
- {
- }
- void CArmResetMotionModel::OnFeedbackMotionParams(ResDataObject ¶ms)
- {
- }
- BOOL CArmResetMotionModel::GetMotionParams(ResDataObject ¶ms)
- {
- return TRUE;
- }
- void CArmResetMotionModel::OnMotionStage(const std::string &stageName)
- {
- if (stageName == RESET_STAGE_STOP_MOVE)
- {
- OnMotionStageStopMove();
- }
- else if (stageName == CARM_RESET_TUBE_SWING_FIND_LANDMARK)
- {
- OnMotionStageFindSwingLandmark();
- }
- else if (stageName == CARM_RESET_TUBE_CIRCULAR_FIND_LANDMARK)
- {
- OnMotionStageFindCircularLandmark();
- }
- else if (stageName == CARM_RESET_TUBE_SWING_ATTACH_Z_AXIS)
- {
- OnMotionStageAttachSwingZAxis();
- }
- else if (stageName == CARM_RESET_TUBE_SWING_DETACH_Z_AXIS)
- {
- OnMotionStageDetachSwingZAxis();
- }
- else if (stageName == CARM_RESET_TUBE_CIRCULAR_ATTACH_Z_AXIS)
- {
- OnMotionStageAttachCircularZAxis();
- }
- else if (stageName == CARM_RESET_TUBE_CIRCULAR_DETACH_Z_AXIS)
- {
- OnMotionStageDetachCircularZAxis();
- }
- else if (stageName == CARM_RESET_TUBE_SWING_FINISHRESET)
- {
- OnMotionStageSwingFinish();
- }
- else if (stageName == CARM_RESET_TUBE_CIRCULAR_FINISHRESET)
- {
- OnMotionStageCircularFinish();
- }
- else if (stageName == CARM_RESET_TUBE_SWING_STOP_AT_LANDMARK)
- {
- OnMotionStageSwingStopAtLandmark();
- }
- else if (stageName == CARM_RESET_TUBE_CIRCULAR_STOP_AT_LANDMARK)
- {
- OnMotionStageCircularStopAtLandmark();
- }
- else if (stageName == CARM_RESET_START_EXPOSURE)
- {
- OnStartExposure();
- }
- else if (stageName == CARM_RESET_STOP_EXPOSURE)
- {
- OnStopExposure();
- }
- }
- void CArmResetMotionModel::OnMotionStageStopMove()
- {
- m_circular->StopRotation();
- m_swing->StopSwing();
- }
- void CArmResetMotionModel::OnMotionStageFindSwingLandmark()
- {
- //if (IsTubeSwingAtResetLandmark())
- //{
- // m_stageArgs->IsTubeAngleAtResetLandmark = TRUE;
- // return;
- //}
- int direction = JudgeTubeSwingLandmarkDirection();
- m_swing->Swing(direction, -1, m_resetSwingPeriod);
- }
- BOOL CArmResetMotionModel::IsTubeSwingAtResetLandmark()
- {
- BOOL ret = FALSE;
- if (m_tubeSwingLandmarkDirection > 0)
- {
- auto highstatus = m_landmark->ReadTubeAngleHighLandmarkStatus();
- ret = (highstatus == 1);
- if (ret)
- {
- m_stageArgs->ActivedTubeAngleLandmark = 1;
- }
- }
- else
- {
- auto lowstatus = m_landmark->ReadTubeAngleLowLandmarkStatus();
- ret = (lowstatus == 1);
- if (ret)
- {
- m_stageArgs->ActivedTubeAngleLandmark = 0;
- }
- }
- return ret;
- }
- int CArmResetMotionModel::JudgeTubeSwingLandmarkDirection()
- {
- int direction = m_tubeSwingAxisPositiveDirection > 0 ? 1 : -1;
- return m_tubeSwingLandmarkDirection > 0 ? direction : (-1 * direction);
- }
- void CArmResetMotionModel::OnMotionStageFindCircularLandmark()
- {
-
- //if (IsTubeCircularAtResetLandmark())
- //{
- // if (gmotionLog) gmotionLog->Info("[CArmResetMotionModel][OnMotionStageFindCircularLandmark]->[Is At Landmark]");
- // m_stageArgs->IsTubeHeightAtResetLandmark = TRUE;
- // return;
- //}
- int direction = JudgeTubeCircularLandmarkDirection();
- if (gmotionLog) gmotionLog->Info("[CArmResetMotionModel][OnMotionStageFindCircularLandmark]->[dir {$:d}]", direction);
- m_circular->Rotate(direction, -1, m_resetCircularPeriod);
- }
- BOOL CArmResetMotionModel::IsTubeCircularAtResetLandmark()
- {
- BOOL ret = FALSE;
- if (m_tubeCircularLandmarkDirection > 0)
- {
- auto highstatus = m_landmark->ReadTubeHeightHighLandmarkStatus();
- ret = (highstatus == 0/*1*/);
- if (ret)
- {
- m_stageArgs->ActivedTubeHeightLandmark = 1;
- }
- }
- else
- {
- auto lowstatus = m_landmark->ReadTubeHeightLowLandmarkStatus();
- ret = (lowstatus == 0/*1*/);
- if (ret)
- {
- m_stageArgs->ActivedTubeHeightLandmark = 0;
- }
- }
- return ret;
- }
- int CArmResetMotionModel::JudgeTubeCircularLandmarkDirection()
- {
- if (gmotionLog) gmotionLog->Info("[CArmResetMotionModel][JudgeTubeCircularLandmarkDirection]->[Positive:{$:d} Landmark:{$:d}]",
- m_tubeCircularAxisPositiveDirection, m_tubeCircularLandmarkDirection);
- int direction = m_tubeCircularAxisPositiveDirection > 0 ? 1 : -1;
- return m_tubeCircularLandmarkDirection > 0 ? direction : (-1 * direction);
- }
- void CArmResetMotionModel::OnMotionStageAttachSwingZAxis()
- {
- m_swingencoder->BindABAxis();
- m_swingencoder->BindZAxis();
- m_swingencoder->ActiveAutoNotifyWhenZClear(true);
- }
- void CArmResetMotionModel::OnMotionStageDetachSwingZAxis()
- {
- m_swingencoder->UnBindZAxis();
- m_swingencoder->ActiveAutoNotifyWhenZClear(false);
- }
- void CArmResetMotionModel::OnMotionStageAttachCircularZAxis()
- {
- m_circularencoder->BindABAxis();
- m_circularencoder->BindZAxis();
- m_circularencoder->ActiveAutoNotifyWhenZClear(true);
- }
- void CArmResetMotionModel::OnMotionStageDetachCircularZAxis()
- {
- m_circularencoder->UnBindZAxis();
- m_circularencoder->ActiveAutoNotifyWhenZClear(false);
- }
- void CArmResetMotionModel::OnMotionStageSwingFinish()
- {
- auto resetAngle = GetTubeSwingResetPosition();
- auto tubeangle = m_coordinates->GetCurrentPhysical(CARM_TUBE_SWING);
- int direction = -1 * JudgeTubeSwingLandmarkDirection();
- if (gmotionLog) gmotionLog->Info("[CArmResetMotionModel][OnStageTubeSwingFinishReset]->[ResetPos:{$:f6} Current:{$:f6}]",resetAngle, tubeangle);
- auto steps = m_coordinates->ConvertMotorStepValue(CONTROLLER_CARM_TUBE_SWING, abs(tubeangle - resetAngle));
- m_swing->Swing(direction, steps, m_resetSwingPeriod);
- }
- float CArmResetMotionModel::GetTubeSwingResetPosition()
- {
- return m_tubeSwingResetAngle;
- }
- int CArmResetMotionModel::JudgeSwingDirection(float current, float target)
- {
- int direction = m_tubeSwingAxisPositiveDirection > 0 ? 1 : -1;
- if (current > target)
- {
- return -1 * direction;
- }
- if (current < target)
- {
- return 1 * direction;
- }
- return 0;
- }
- void CArmResetMotionModel::OnMotionStageCircularFinish()
- {
- auto resetAngle = GetTubeCircularResetPosition();
- auto tubeangle = m_coordinates->GetCurrentPhysical(CARM_TUBE_CIRCULAR);
- int direction = -1 * JudgeTubeCircularLandmarkDirection();
- if (gmotionLog) gmotionLog->Info("[CArmResetMotionModel][OnStageTubeCircularFinishReset]->[ResetPos:{$:f6} Current:{$:f6}]", resetAngle, tubeangle);
- auto steps = m_coordinates->ConvertMotorStepValue(CONTROLLER_CARM_TUBE_CIRCULAR, abs(tubeangle - resetAngle));
- m_circular->Rotate(direction, steps, m_resetCircularPeriod);
- }
- float CArmResetMotionModel::GetTubeCircularResetPosition()
- {
- return m_tubeCircularResetAngle;
- }
- int CArmResetMotionModel::JudgeCircularDirection(float current, float target)
- {
- int direction = m_tubeCircularAxisPositiveDirection > 0 ? 1 : -1;
- if (current > target)
- {
- return -1 * direction;
- }
- if (current < target)
- {
- return 1 * direction;
- }
- return 0;
- }
- void CArmResetMotionModel::OnMotionStageSwingStopAtLandmark()
- {
- m_swing->StopSwing();
- }
- void CArmResetMotionModel::OnMotionStageCircularStopAtLandmark()
- {
- m_circular->StopRotation();
- }
- void CArmResetMotionModel::SwitchScanningComponents(int nSwitch)
- {
-
- }
- void CArmResetMotionModel::OnStartExposure()
- {
- if (m_fluoroSwitch)
- {
- if (gbusinessLog) gbusinessLog->Info("[CArmResetMotionModel][OnStartExposure]->[Enable fluoro switch signal]");
- m_fluoroSwitch->OutputSignal(true);
- }
- }
- void CArmResetMotionModel::OnStopExposure()
- {
- if (m_fluoroSwitch)
- {
- if (gbusinessLog) gbusinessLog->Info("[CArmResetMotionModel][OnStopExposure]->[Disable fluoro switch signal]");
- m_fluoroSwitch->OutputSignal(false);
- }
- }
- void CArmResetMotionModel::SwitchWorkstation(string ws)
- {
- m_CurWS = ws;
- }
|