|
|
#include "claserpathdriver.h"
|
|
|
#include "claserpath.h"
|
|
|
#include "logic_local_def.h"
|
|
|
#include "cmotordriver_base.h"
|
|
|
#include "claserdriver_sp.h"
|
|
|
#include "csystem_external.h"
|
|
|
#include "logic_io_define.h"
|
|
|
#include "cdhgripper_rs485.h"
|
|
|
#include "base.h"
|
|
|
#include "logic_eap.h"
|
|
|
CLaserPathDriver::CLaserPathDriver(const QString& name, int32_t id)
|
|
|
:CDriverCard(name, id)
|
|
|
{
|
|
|
m_Variants.add_Variant(Var_GateStartDelay,
|
|
|
QObject::trUtf8("GateStartDelay"), double(3.08), false,
|
|
|
Variant::TOXML, QStringList(), "ms");
|
|
|
|
|
|
m_Variants.add_Variant(Var_GateEndDelay,
|
|
|
QObject::trUtf8("GateEndDelay"), double(3.82), false,
|
|
|
Variant::TOXML, QStringList(), "ms");
|
|
|
|
|
|
m_Variants.add_Variant(Var_LensFLow_VolumeCheck_WaitTime,
|
|
|
QObject::trUtf8("LensFlowVolumeCheckWaitTime"), int(200), false,
|
|
|
Variant::TOXML, QStringList(), "ms");
|
|
|
|
|
|
m_Variants.add_Variant(Var_LensFlow_Volume_MinThres,
|
|
|
QObject::trUtf8("LensFlowVolumeMinThres"), double(45), false,
|
|
|
Variant::TOXML);
|
|
|
|
|
|
m_Variants.add_Variant(Var_LensFlow_Volume_MaxThres,
|
|
|
QObject::trUtf8("LensFlowVolumeMaxThres"), double(48), false,
|
|
|
Variant::TOXML);
|
|
|
}
|
|
|
|
|
|
CLaserPathDriver::~CLaserPathDriver()
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
int32_t CLaserPathDriver::MovePathAngle(int pathid, int iEpulse, double dBeamWidth, int iFreq, double dPower, bool bWait/*=true*/)
|
|
|
{
|
|
|
#ifndef __USE_D_NARROW__
|
|
|
if (pathid == LASERPATH_D_NARROW)
|
|
|
{
|
|
|
MQT_THROW_CODESTR(ALARM_RESERVED, QObject::tr("Not support") + _SysExt_Instance.m_mapNameList[pathid]);
|
|
|
}
|
|
|
#endif
|
|
|
#ifndef __USE_S_NARROW__
|
|
|
if (pathid == LASERPATH_S_NARROW)
|
|
|
{
|
|
|
MQT_THROW_CODESTR(ALARM_RESERVED, QObject::tr("Not support") + _SysExt_Instance.m_mapNameList[pathid]);
|
|
|
}
|
|
|
#endif
|
|
|
#ifndef __USE_L_NARROW__
|
|
|
if (pathid == LASERPATH_L_NARROW)
|
|
|
{
|
|
|
MQT_THROW_CODESTR(ALARM_RESERVED, QObject::tr("Not support") + _SysExt_Instance.m_mapNameList[pathid]);
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
#ifndef __USE_D_WIDE__
|
|
|
if (pathid == LASERPATH_D_WIDE)
|
|
|
{
|
|
|
MQT_THROW_CODESTR(ALARM_RESERVED, QObject::tr("Not support") + _SysExt_Instance.m_mapNameList[pathid]);
|
|
|
}
|
|
|
#endif
|
|
|
//if(m_gSystem.IsDebug()) return RTN_SUCCESS1;
|
|
|
if (pathid == LASERPATH_L_NARROW || pathid == LASERPATH_S_NARROW)
|
|
|
{
|
|
|
dBeamWidth = 0;
|
|
|
}
|
|
|
|
|
|
CMotorDriver* pMotorDriver = GET_CARD(MOTOR_DRIVER, CMotorDriver);
|
|
|
Q_ASSERT(pMotorDriver);
|
|
|
CLaserPath* pLaserPath = GET_CHDIRECT(pathid, CLaserPath);
|
|
|
Q_ASSERT(pLaserPath);
|
|
|
CLaserDriver* pLaserDriver = GET_CARD(LASER_DRIVER, CLaserDriver);
|
|
|
Q_ASSERT(pLaserDriver);
|
|
|
|
|
|
//! 控制光闸
|
|
|
OpenShutter(pathid, true);
|
|
|
|
|
|
int iOldFreq = iFreq;
|
|
|
int iOldEpulse = iEpulse;
|
|
|
//设置频率
|
|
|
//是否使用固定频率
|
|
|
if (pLaserPath->m_Variants.get_VData(Var_LaserPath_UseFixFreq)->toBool())
|
|
|
{
|
|
|
iFreq = pLaserPath->m_Variants.get_VData(Var_LaserPath_FixFreqValue)->toDouble();
|
|
|
}
|
|
|
pLaserDriver->SetFreq(LASER, iFreq);
|
|
|
|
|
|
|
|
|
//设置Epulse频率
|
|
|
if (true == pLaserPath->m_Variants.get_VData(Var_LaserPath_UseFixEpulse)->toBool())
|
|
|
{
|
|
|
double dEpulse = pLaserPath->m_Variants.get_VData(Var_LaserPath_FixEpulseValue)
|
|
|
->toDouble();
|
|
|
iEpulse = (int)dEpulse;
|
|
|
}
|
|
|
CLaserDriver_Base* pLaserDriverBase = static_cast<CLaserDriver_Base*>(pLaserDriver);
|
|
|
if (nullptr != pLaserDriverBase)
|
|
|
{
|
|
|
pLaserDriverBase->SetEpulseFreq(LASER_DRIVER, 1000 * iEpulse);
|
|
|
}
|
|
|
|
|
|
iEpulse = iOldEpulse;
|
|
|
iFreq = iOldFreq;
|
|
|
#pragma region 计算G2位置
|
|
|
//double dLaserWidth = dDIndex;
|
|
|
double dPowerAngle = 0; //功率角度
|
|
|
//设置功率角度
|
|
|
//Wide宽度为0时,使用L_Narrow的光路替代
|
|
|
//S_Narrow宽度为0时,D_Narrow的光路替代, 注意:S_Narrow,D_Narrow的功率点检数据不与宽度相关联S_Narrow理论不需要点检数据
|
|
|
if (true == pLaserPath->m_Variants.get_VData(Var_LaserPath_UseFixPowerSetting)->toBool())
|
|
|
{
|
|
|
dPowerAngle = pLaserPath->m_Variants.get_VData(Var_LaserPath_PowerSet)->toDouble();
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
if (DEQUAL0(dBeamWidth))
|
|
|
{
|
|
|
CLaserPath* pLaserPathInvoker = pLaserPath;
|
|
|
if (pathid == LASERPATH_D_WIDE)
|
|
|
{
|
|
|
#ifdef __USE_L_NARROW__
|
|
|
pLaserPathInvoker = GET_CHDIRECT(LASERPATH_L_NARROW, CLaserPath);
|
|
|
#endif
|
|
|
}
|
|
|
else if (pathid == LASERPATH_S_NARROW)
|
|
|
{
|
|
|
#ifdef __USE_D_NARROW__
|
|
|
pLaserPathInvoker = GET_CHDIRECT(LASERPATH_D_NARROW, CLaserPath);
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
dPowerAngle = pLaserPathInvoker->PowerToAngle(iFreq, iEpulse, dBeamWidth, dPower);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
dPowerAngle = pLaserPath->PowerToAngle(iFreq, iEpulse, dBeamWidth, dPower);
|
|
|
}
|
|
|
}
|
|
|
#pragma endregion
|
|
|
|
|
|
//设置光路玻片位置
|
|
|
|
|
|
pMotorDriver->absmove(MOTORG2_POWER, dPowerAngle, FALSE);
|
|
|
|
|
|
//光路切换到BeamWidth位置
|
|
|
MoveBeamWidthPos(pathid, dBeamWidth);
|
|
|
|
|
|
pMotorDriver->wait_move_finished(MOTORG2_POWER);
|
|
|
|
|
|
return RTN_SUCCESS1;
|
|
|
}
|
|
|
int32_t CLaserPathDriver::MovePathInitAngle(int pathid)
|
|
|
{
|
|
|
if (pathid == LASERPATH_L_NARROW || pathid == LASERPATH_D_WIDE) {
|
|
|
CDHGripperRS485* pHgripDriver = GET_CARD(HGRIPPER_DRIVER, CDHGripperRS485);
|
|
|
Q_ASSERT(pHgripDriver);
|
|
|
pHgripDriver->do_msg(CDHGripperRS485::kReset, QVariantList(), nullptr);
|
|
|
|
|
|
QString str = QObject::tr("GripperDriver Reset");
|
|
|
_SysExt_Instance.AddProductInfo(m_iID, str, true);
|
|
|
|
|
|
}
|
|
|
|
|
|
#ifdef __USE_MOTOR_PATH__
|
|
|
CMotorDriver* pMotorDriver = GET_CARD(MOTOR_DRIVER, CMotorDriver);
|
|
|
Q_ASSERT(pMotorDriver);
|
|
|
CLaserPath* pLaserPath = (CLaserPath*)FindChannel(pathid);
|
|
|
Q_ASSERT(pLaserPath);
|
|
|
double dPowerMaxAngle = pLaserPath->m_Variants.get_VData(Var_LaserPath_PowerMaxAngle_ID)
|
|
|
->toDouble();
|
|
|
pMotorDriver->absmove(MOTORG2_POWER, dPowerMaxAngle, FALSE);
|
|
|
|
|
|
if(pathid == LASERPATH_D_WIDE) {
|
|
|
MoveBeamPos(pathid, 0);
|
|
|
}
|
|
|
//pMotorDriver->wait_move_finished(MOTORG1_PCHANGE);
|
|
|
pMotorDriver->wait_move_finished(MOTORG2_POWER);
|
|
|
|
|
|
#endif
|
|
|
return RTN_SUCCESS1;
|
|
|
}
|
|
|
|
|
|
int32_t CLaserPathDriver::MoveBeamWidthPos(int pathid, double dBeamWidth)
|
|
|
{
|
|
|
CMotorDriver* pMotorDriver = GET_CARD(MOTOR_DRIVER, CMotorDriver);
|
|
|
Q_ASSERT(pMotorDriver);
|
|
|
CLaserPath* pLaserPath = GET_CHDIRECT(pathid, CLaserPath);
|
|
|
Q_ASSERT(pLaserPath);
|
|
|
|
|
|
//设置线宽
|
|
|
if (pathid == LASERPATH_D_NARROW || pathid == LASERPATH_S_NARROW)
|
|
|
{
|
|
|
DIndexParam param;
|
|
|
CLaserPath* pLaserPathInvoker = GET_CHDIRECT(LASERPATH_L_NARROW, CLaserPath);
|
|
|
pLaserPath->GetLineWidthParam(dBeamWidth, param);
|
|
|
|
|
|
pMotorDriver->absmove(MOTORG5_NARROWINDEX, param.dAngle1, false);
|
|
|
pMotorDriver->absmove(MOTORG6_NARROW5050, param.dAngle2, false);
|
|
|
|
|
|
pMotorDriver->wait_move_finished(MOTORG5_NARROWINDEX);
|
|
|
pMotorDriver->wait_move_finished(MOTORG6_NARROW5050);
|
|
|
}
|
|
|
else if (pathid == LASERPATH_D_WIDE || pathid == LASERPATH_L_NARROW)
|
|
|
{
|
|
|
MoveBeamPos(pathid, dBeamWidth);
|
|
|
}
|
|
|
|
|
|
return RTN_SUCCESS1;
|
|
|
}
|
|
|
|
|
|
int32_t CLaserPathDriver::OpenShutter(int pathid, bool bOpen, bool bWait/*=true*/)
|
|
|
{
|
|
|
CMotorDriver* pMotorDriver = GET_CARD(MOTOR_DRIVER, CMotorDriver);
|
|
|
if (true == bOpen)
|
|
|
{
|
|
|
pMotorDriver->set_cylinder(OUT_Shutter_All_Open, IN_LASER_Shutter_All_Down, bOpen);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
pMotorDriver->set_cylinder(OUT_Shutter_All_Open, IN_LASER_Shutter_All_Up, bOpen);
|
|
|
}
|
|
|
#ifdef __LOWK_SOLUTION__
|
|
|
if (pathid == LASERPATH_D_NARROW || pathid == LASERPATH_S_NARROW)
|
|
|
{
|
|
|
if (!pMotorDriver->get_iodata(IO_INPUT, IN_LASER_Shutter_Narrow_Down, bOpen))
|
|
|
{
|
|
|
pMotorDriver->set_cylinder(OUT_Shutter_Wide_Open, IN_LASER_Shutter_Wide_Up, !bOpen);
|
|
|
pMotorDriver->set_cylinder(OUT_Shutter_Narrow_Open, IN_LASER_Shutter_Narrow_Down, bOpen);
|
|
|
}
|
|
|
}
|
|
|
else if (pathid == LASERPATH_D_WIDE || pathid == LASERPATH_L_NARROW)
|
|
|
{
|
|
|
if (!pMotorDriver->get_iodata(IO_INPUT, IN_LASER_Shutter_Wide_Down, bOpen))
|
|
|
{
|
|
|
pMotorDriver->set_cylinder(OUT_Shutter_Wide_Open, IN_LASER_Shutter_Wide_Down, bOpen);
|
|
|
pMotorDriver->set_cylinder(OUT_Shutter_Narrow_Open, IN_LASER_Shutter_Narrow_Up, !bOpen);
|
|
|
}
|
|
|
}
|
|
|
#endif
|
|
|
return RTN_SUCCESS1;
|
|
|
}
|
|
|
|
|
|
int32_t CLaserPathDriver::MoveBeamPos(int pathid, double dBeamWidth)
|
|
|
{
|
|
|
//只有以下光路通过档板
|
|
|
Q_ASSERT(pathid == LASERPATH_D_WIDE || pathid == LASERPATH_L_NARROW);
|
|
|
|
|
|
CMotorDriver* pMotorDriver = GET_CARD(MOTOR_DRIVER, CMotorDriver);
|
|
|
Q_ASSERT(pMotorDriver);
|
|
|
CLaserPath* pLaserPath = (CLaserPath*)FindChannel(pathid);
|
|
|
Q_ASSERT(pLaserPath);
|
|
|
|
|
|
int iPos = 1000;
|
|
|
//判断时否使用固定的卡抓角度
|
|
|
//TODO:L_Narrow是否需要配置文件
|
|
|
if (pLaserPath->m_Variants.get_VData(Var_LaserPath_UseFixGripper)->toBool())
|
|
|
{
|
|
|
iPos = pLaserPath->m_Variants.get_VData(Var_LaserPath_FixGripperPos)->toInt();
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
iPos = static_cast<int>(pLaserPath->GetBeamPos(dBeamWidth));
|
|
|
}
|
|
|
|
|
|
|
|
|
CDHGripperRS485* pHgripDriver = GET_CARD(HGRIPPER_DRIVER, CDHGripperRS485);
|
|
|
Q_ASSERT(pHgripDriver);
|
|
|
pHgripDriver->SetPosValue(iPos);
|
|
|
|
|
|
return RTN_SUCCESS1;
|
|
|
}
|
|
|
|
|
|
int32_t CLaserPathDriver::OpenLensBlow(int pathid, bool bOpen)
|
|
|
{
|
|
|
//开关吹风
|
|
|
CMotorDriver* pMotorDriver = GET_CARD(MOTOR_DRIVER, CMotorDriver);
|
|
|
Q_ASSERT(pMotorDriver);
|
|
|
pMotorDriver->setio(IO_OUTPUT, OUT_LENS_Blow_Inner, bOpen);
|
|
|
pMotorDriver->setio(IO_OUTPUT, OUT_LENS_Blow_Outter, bOpen);
|
|
|
|
|
|
return RTN_SUCCESS1;
|
|
|
}
|
|
|
|
|
|
int32_t CLaserPathDriver::CheckLensBlow(int pathid)
|
|
|
{
|
|
|
#ifndef __LOWK_SOLUTION__
|
|
|
|
|
|
OpenLensBlow(pathid, true);
|
|
|
|
|
|
int iWaitTime = m_Variants.get_VData(Var_LensFLow_VolumeCheck_WaitTime)->toInt();
|
|
|
|
|
|
if (iWaitTime > 0) {
|
|
|
MSleep(iWaitTime);
|
|
|
}
|
|
|
|
|
|
CMotorDriver_Base* pMotorDriver = GET_CARD(MOTOR_DRIVER, CMotorDriver_Base);
|
|
|
float dFlowVolume = pMotorDriver->get_iodata_analog(IO_INPUT_ANALOG, IN_ANALOG_BEAM_LENS_AIR, true);
|
|
|
OpenLensBlow(pathid, false);
|
|
|
double dFlowMin = m_Variants.get_VData(Var_LensFlow_Volume_MinThres)->toDouble();
|
|
|
double dFlowMax = m_Variants.get_VData(Var_LensFlow_Volume_MaxThres)->toDouble();
|
|
|
if (!INRANGE(dFlowVolume, dFlowMin, dFlowMax)) {
|
|
|
MQT_THROW_CODESTR(ALARM_PowerCheckOutrange, QObject::tr("Lens protect module, FlowVolume %1 is out range (%2, %3)").arg(dFlowVolume).arg(dFlowMin).arg(dFlowMax));
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
return RTN_SUCCESS1;
|
|
|
}
|
|
|
|
|
|
int32_t CLaserPathDriver::MoveBeamPosCali(int pathid, double dBeamWidth)
|
|
|
{
|
|
|
CMotorDriver* pMotorDriver = GET_CARD(MOTOR_DRIVER, CMotorDriver);
|
|
|
Q_ASSERT(pMotorDriver);
|
|
|
CLaserPath* pLaserPath = (CLaserPath*)FindChannel(pathid);
|
|
|
Q_ASSERT(pLaserPath);
|
|
|
|
|
|
int iPos = 900;
|
|
|
if (!DEQUAL0(dBeamWidth))
|
|
|
{
|
|
|
LPATHBEAMPOSMAP::iterator ii = pLaserPath->m_mBeamPos.find(int(dBeamWidth * 1000));
|
|
|
if (ii != pLaserPath->m_mBeamPos.end())
|
|
|
{
|
|
|
iPos = static_cast<int>(*ii);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
CDHGripperRS485* pHgripDriver = GET_CARD(HGRIPPER_DRIVER, CDHGripperRS485);
|
|
|
Q_ASSERT(pHgripDriver);
|
|
|
pHgripDriver->SetPosValue(iPos);
|
|
|
|
|
|
return RTN_SUCCESS1;
|
|
|
}
|
|
|
|
|
|
void CLaserPathDriver::do_msg(int iID, QVariantList& vlInput,
|
|
|
V_MsgOutput* pvlOutput)
|
|
|
{
|
|
|
int isize = vlInput.size();
|
|
|
switch (iID) {
|
|
|
case MOVEPATHANGLE:
|
|
|
{
|
|
|
if (isize >= 5) {
|
|
|
MovePathAngle(
|
|
|
vlInput[0].toInt(),
|
|
|
vlInput[1].toInt(),
|
|
|
vlInput[2].toDouble(),
|
|
|
vlInput[3].toInt(),
|
|
|
vlInput[4].toDouble()
|
|
|
, true);
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
case MOVEPATHINITANGLE:
|
|
|
{
|
|
|
if (isize >= 1) {
|
|
|
MovePathInitAngle(vlInput[0].toInt());
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
case MOVEBEAMPOS:
|
|
|
{
|
|
|
if (isize >= 2) {
|
|
|
MoveBeamPos(vlInput[0].toInt(),
|
|
|
vlInput[1].toDouble());
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
case OPENLENSPROTECT:
|
|
|
{
|
|
|
if (isize >= 2) {
|
|
|
OpenLensBlow(vlInput[0].toInt(),
|
|
|
vlInput[1].toBool());
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
case CHECKLESNPROTECT:
|
|
|
if (isize >= 1) {
|
|
|
CheckLensBlow(vlInput[0].toInt());
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
CDriverCard::do_msg(iID, vlInput, pvlOutput);
|
|
|
}
|