You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

387 lines
12 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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_NarrowD_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);
}