#pragma once //#include "../config/bean/AxisCfg.h" #include #include #include "AxisState.h" #include "AxisConfig.h" #include "AxisCtrl.h" template class AxisT { public: AxisT(); ~AxisT(); bool Init(void); void UpdateSpeed(float speed); void UpdateAcc(float acc); void MovLimitStart(AxisConfig::ActiveDirect dir); void MovLimitStop(AxisConfig::ActiveDirect dir); void MovPoint(bool isActive); void MovPoint(float value, bool isActive); void MovPoint(AxisConfig::ActiveDirect dir); void StopAxis(void); void SetZeroPos(void); void SetAxisOn(bool ison); AxisConfig* GetConfig(void) { return m_Config; } //bool IsReachLimit(AxisCfg::ActiveDirect dir); bool IsMoving(); T* GetState(void) { return m_State; } AxisCtrl* GetCtrl(void) { return m_Ctrl; } private: short m_ID; AxisConfig* m_Config; CRITICAL_SECTION m_cs; T* m_State; AxisCtrl* m_Ctrl; //AxisCfg* m_AxisCfg; }; template AxisT::AxisT() { m_State = new T; m_Config = new AxisConfig; m_Ctrl = new AxisCtrl; } template AxisT::~AxisT() { delete m_State; } template bool AxisT::Init(void) { bool rel = true; return rel; } template void AxisT::UpdateSpeed(float speed) { m_Config->m_Speed->SetValue(speed); } template void AxisT::UpdateAcc(float acc) { m_Config->m_Acc->SetValue(acc); } template void AxisT::MovPoint(bool isActive) { if (IsMoving()) return; if (isActive) { m_Ctrl->m_MoveP->SetValue(true); m_Ctrl->m_MoveP->SetValue(false); } else { m_Ctrl->m_MoveN->SetValue(true); m_Ctrl->m_MoveN->SetValue(false); } } template void AxisT::MovPoint(float value, bool isActive) { if (IsMoving()) return; m_Config->m_RefDistance->SetValue(value); if (isActive) { m_Ctrl->m_MoveP->SetValue(true); m_Ctrl->m_MoveP->SetValue(false); } else { m_Ctrl->m_MoveN->SetValue(true); m_Ctrl->m_MoveN->SetValue(false); } } template void AxisT::MovPoint(AxisConfig::ActiveDirect dir) { if (IsMoving()) { return; } if (m_State->m_AxisCfg->m_active_direct == dir) { m_Ctrl->m_MoveP->SetValue(true); Sleep(100); m_Ctrl->m_MoveP->SetValue(false); } else { m_Ctrl->m_MoveN->SetValue(true); Sleep(100); m_Ctrl->m_MoveN->SetValue(false); } } template void AxisT::StopAxis(void) { m_Ctrl->m_MotionStop->SetValue(true); m_Ctrl->m_MotionStop->SetValue(false); } template void AxisT::MovLimitStart(AxisConfig::ActiveDirect dir) { if (IsMoving()) return; if (m_State->m_AxisCfg->m_active_direct == dir) { m_Ctrl->m_MovePContinue->SetValue(true); } else { m_Ctrl->m_MoveNContinue->SetValue(true); } } template void AxisT::MovLimitStop(AxisConfig::ActiveDirect dir) { // if (m_State->m_ServoBusy) // return; if (m_State->m_AxisCfg->m_active_direct == dir) { m_Ctrl->m_MovePContinue->SetValue(false); } else { m_Ctrl->m_MoveNContinue->SetValue(false); } } template void AxisT::SetZeroPos(void) { m_Ctrl->m_ServoHomeIndexOn->SetValue(true); m_Ctrl->m_ServoHomeIndexOn->SetValue(false); } template void AxisT::SetAxisOn(bool ison) { m_Ctrl->m_ServoOn->SetValue(ison); } #if 0 bool Axis::IsReachLimit(AxisCfg::ActiveDirect dir) { long limit = m_Config->m_active_direct == dir ? GTS_STATE_ACTIVE_LIMIT_INDEX : GTS_STATE_REACTIVE_LIMIT_INDEX; //UpdateAxisState(); return m_State->state & limit; } #endif template bool AxisT::IsMoving() { //std::unique_lock lock(mtx); return m_State->m_ServoBusy; } class SysParamWrapper; class StateCtrlWrapper; class PLCAxis { public: PLCAxis(SysParamWrapper* params, StateCtrlWrapper* ctrl); ~PLCAxis(){} void StopAll(void); public: AxisT* m_Mold; AxisT* m_MoldSlave; AxisT* m_Clean; AxisT* m_CleanSlave; AxisT* m_Load; AxisT* m_Arm; AxisT* m_Supply; AxisT* m_Ele; AxisT* m_EleSlave; };