ImplPositionManager.cpp 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717
  1. #include "stdafx.h"
  2. #include "ImplPositionManager.h"
  3. #include "IMachineryManager.h"
  4. #include "ISensorADController.h"
  5. #include "ISensorEncoderController.h"
  6. #include "ConfigurerMotion.h"
  7. #include "PacketAnalizer.h"
  8. #include "ConfigurerCalibration.h"
  9. #include "DIOS.Dev.Machinery.Driver.ECOM.h"
  10. using namespace DIOS::Dev::Detail::MachineryECOM;
  11. ImplPositionManager::ImplPositionManager()
  12. :m_isSystemReady(FALSE),
  13. m_nTomoMotionLimitationStatus(0),
  14. m_notifyLogicDriver(nullptr),
  15. m_machineryManager(nullptr),
  16. m_motorTubeAngle(nullptr),
  17. m_motorTubeHeight(nullptr),
  18. m_adTubeHeight(nullptr),
  19. m_adTubeAngle(nullptr),
  20. m_adDetectorHeight(nullptr),
  21. m_encoderTubeAngle(nullptr),
  22. m_encoderTubeHeight(nullptr),
  23. m_adTubeHorizontal(nullptr),
  24. m_encoderTubeHorizontal(nullptr),
  25. m_adDetectorHorizontal(nullptr)
  26. {
  27. }
  28. ImplPositionManager::~ImplPositionManager()
  29. {
  30. }
  31. void ImplPositionManager::Initialize(IMachineryManager *machmanager)
  32. {
  33. m_machineryManager = machmanager;
  34. assert(m_machineryManager);
  35. m_motorTubeAngle = (ITubeAngleController *)(m_machineryManager->Resove(CONTROLLER_TUBE_ANGLE));
  36. m_motorTubeHeight = (ITubeHeightController *)(m_machineryManager->Resove(CONTROLLER_TUBE_HEIGHT));
  37. m_adTubeHeight = (ISensorADController *)(m_machineryManager->Resove(CONTROLLER_TUBE_HEIGHT_AD));
  38. m_adTubeAngle = (ISensorADController *)(m_machineryManager->Resove(CONTROLLER_TUBE_ANGLE_AD));
  39. m_adDetectorHeight = (ISensorADController *)(m_machineryManager->Resove(CONTROLLER_DETECTOR_HEIGHT_AD));
  40. m_encoderTubeAngle = (ISensorEncoderController *)(m_machineryManager->Resove(CONTROLLER_TUBE_ANGLE_ENCODER));
  41. m_encoderTubeHeight = (ISensorEncoderController *)(m_machineryManager->Resove(CONTROLLER_TUBE_HEIGHT_ENCODER));
  42. m_adTubeHorizontal = (ISensorADController*)(m_machineryManager->Resove(CONTROLLER_TUBE_HORIZONTAL_AD));
  43. m_adDetectorHorizontal = (ISensorADController*)(m_machineryManager->Resove(CONTROLLER_DETECTOR_HORIZONTAL_AD));
  44. m_encoderTubeHorizontal = (ISensorEncoderController*)(m_machineryManager->Resove(CONTROLLER_TUBE_HORIZONTAL_ENCODER)),
  45. assert(m_motorTubeAngle);
  46. assert(m_motorTubeHeight);
  47. assert(m_adDetectorHeight);
  48. assert(m_encoderTubeAngle);
  49. assert(m_encoderTubeHeight);
  50. assert(m_adTubeHorizontal);
  51. assert(m_adDetectorHorizontal);
  52. assert(m_encoderTubeHorizontal);
  53. DigitalTwinRecordConvertParams();
  54. }
  55. float ImplPositionManager::GetLandmarkPosition(DOF_MECH dof, LANDMARK_TYPE landmarkType)
  56. {
  57. float ret = 0.0f;
  58. switch (dof)
  59. {
  60. case TOMO_TUBE_ANGLE:
  61. ret = GetTubeAngleLandmarkPosition(landmarkType);
  62. break;
  63. case TOMO_TUBE_HEIGHT:
  64. ret = GetTubeHeightLandmarkPosition(landmarkType);
  65. break;
  66. case TOMO_TUBE_HORIZONTAL:
  67. ret = GetTubeHorizontalLandmarkPosition(landmarkType);
  68. break;
  69. default:
  70. if(gbusinessLog) gbusinessLog->Error("[GetLandmarkPosition] [DOF [{$:d}] Not implemented]", dof);
  71. break;
  72. }
  73. return ret;
  74. }
  75. float ImplPositionManager::GetCurrentAbsolutePhysical(DOF_MECH dof)
  76. {
  77. float ret = 0.0f;
  78. switch (dof)
  79. {
  80. case TOMO_TUBE_ANGLE:
  81. ret = GetCurrentAbsoluteTubeAngle();
  82. break;
  83. case TOMO_TUBE_HEIGHT:
  84. ret = GetCurrentAbsoluteTubeHeight();
  85. break;
  86. case TOMO_TUBE_HORIZONTAL:
  87. ret = GetCurrentAbsoluteTubeHorizontalPos();
  88. break;
  89. default:
  90. if(gbusinessLog) gbusinessLog->Error("[GetCurrentAbsolutePhysical] [DOF [{$:d}] Not implemented]", dof);
  91. break;
  92. }
  93. return ret;
  94. }
  95. float ImplPositionManager::GetPhysicalPerMotorPulse(DOF_MECH dof)
  96. {
  97. float ret = 0.0f;
  98. switch (dof)
  99. {
  100. case TOMO_TUBE_ANGLE:
  101. ret = GetTubeAnglePerPulse();
  102. break;
  103. default:
  104. if(gbusinessLog) gbusinessLog->Error("[GetPhysicalPerMotorPulse] [DOF [{$:d}] Not implemented]", dof);
  105. break;
  106. }
  107. return ret;
  108. }
  109. float ImplPositionManager::GetCurrentPhysical(DOF_MECH dof)
  110. {
  111. float ret = 0.0f;
  112. switch (dof)
  113. {
  114. case TOMO_TUBE_ANGLE:
  115. ret = GetCurrentTubeAngle();
  116. break;
  117. case TOMO_TUBE_HEIGHT:
  118. ret = GetCurrentTubeHeight();
  119. break;
  120. case TOMO_TUBE_HORIZONTAL:
  121. ret = GetCurrentTubeHorizontalPos();
  122. break;
  123. case TOMO_DETECTOR_HEIGHT:
  124. ret = GetDetectorVerticalPos();
  125. break;
  126. case TOMO_DETECTOR_HORIZONTAL:
  127. ret = GetDetectorHorizontalPos();
  128. break;
  129. default:
  130. if(gbusinessLog) gbusinessLog->Error("[GetCurrentPhysical] [DOF [{$:d}] Not implemented]", dof);
  131. break;
  132. }
  133. return ret;
  134. }
  135. int ImplPositionManager::GetCurrentSensorValue(DOF_MECH dof)
  136. {
  137. int ret = 0;
  138. switch (dof)
  139. {
  140. case TOMO_TUBE_ANGLE:
  141. ret = GetCurrentTubeAngleSensorValue();
  142. break;
  143. case TOMO_TUBE_HEIGHT:
  144. ret = GetCurrentEncoderSensorValue(m_encoderTubeHeight);
  145. break;
  146. case TOMO_TUBE_HORIZONTAL:
  147. //ret = GetCurrentEncoderSensorValue(m_encoderTubeHorizontal);
  148. ret = GetCurrentDetectorADSensorValue(m_adTubeHorizontal);
  149. break;
  150. case TOMO_DETECTOR_HEIGHT:
  151. ret = GetCurrentDetectorADSensorValue(m_adDetectorHeight);
  152. break;
  153. case TOMO_DETECTOR_HORIZONTAL:
  154. ret = GetCurrentDetectorADSensorValue(m_adDetectorHorizontal);
  155. break;
  156. default:
  157. if(gbusinessLog) gbusinessLog->Error("[GetCurrentSensorValue] [DOF [{$:d}] Not implemented]", dof);
  158. break;
  159. }
  160. return ret;
  161. }
  162. void ImplPositionManager::SetNotifyLogicDevice(MachineryECOMDriver* logicdriver)
  163. {
  164. m_notifyLogicDriver = logicdriver;
  165. }
  166. float ImplPositionManager::ConvertSensorValue(const std::string &componentName, int sensorValue)
  167. {
  168. float ret = 0.0f;
  169. if (componentName == CONTROLLER_TUBE_ANGLE_ENCODER)
  170. {
  171. ret = DoConvertTubeAngleEncoder(sensorValue);
  172. }
  173. else if (componentName == CONTROLLER_TUBE_HEIGHT_ENCODER)
  174. {
  175. ret = DoConvertTubeHeightEncoder(sensorValue);
  176. }
  177. else if (componentName == CONTROLLER_DETECTOR_HEIGHT_AD)
  178. {
  179. ret = DoConvertDetectorHeightAD(sensorValue);
  180. }
  181. else if (componentName == CONTROLLER_TUBE_ANGLE_AD)
  182. {
  183. ret = DoConvertTubeAngleAD(sensorValue);
  184. }
  185. else if (componentName == CONTROLLER_TUBE_HEIGHT_AD)
  186. {
  187. ret = DoConvertTubeHeightAD(sensorValue);
  188. }
  189. else if (componentName == CONTROLLER_DETECTOR_HORIZONTAL_AD)
  190. {
  191. ret = DoConvertDetectorHorizontalAD(sensorValue);
  192. }
  193. else if (componentName == CONTROLLER_TUBE_HORIZONTAL_AD)
  194. {
  195. ret = DoConvertTubeHorizontalAD(sensorValue);
  196. }
  197. else if (componentName == CONTROLLER_TUBE_HORIZONTAL_ENCODER)
  198. {
  199. ret = DoConvertTubeHorizontalEncoder(sensorValue);
  200. }
  201. if (gmotionLog) gmotionLog->Info("[ImplPositionManager][ConvertSensorValue]->[{$}][{$:d04}][{$:f6}]", componentName.c_str(), sensorValue, ret);
  202. return ret;
  203. }
  204. int ImplPositionManager::ConvertPhysicsValue(const std::string &componentName, float physicsValue)
  205. {
  206. DWORD ret = 0;
  207. if (componentName == CONTROLLER_TUBE_ANGLE_ENCODER)
  208. {
  209. ret = DoConvertTubeAngleToEncoder(physicsValue);
  210. }
  211. else if (componentName == CONTROLLER_TUBE_HEIGHT_ENCODER)
  212. {
  213. ret = DoConvertTubeHeightToEncoder(physicsValue);
  214. }
  215. else if (componentName == CONTROLLER_TUBE_HORIZONTAL_ENCODER)
  216. {
  217. ret = DoConvertTubeHorizontalToEncoder(physicsValue);
  218. }
  219. else if (componentName == CONTROLLER_DETECTOR_HEIGHT_AD)
  220. {
  221. ret = DoConvertDetectorToAD(physicsValue);
  222. }
  223. else if (componentName == CONTROLLER_DETECTOR_HORIZONTAL_AD)
  224. {
  225. ret = DoConvertDetectorHorizontalToAD(physicsValue);
  226. }
  227. if (gmotionLog) gmotionLog->Info("[ImplPositionManager][ConvertPhysicsValue]->[{$}][{$:f6}][{$:d04}]", componentName.c_str(), physicsValue, ret);
  228. return ret;
  229. }
  230. DWORD ImplPositionManager::ConvertMotorStepValue(const std::string &componentName, float physicsOffset)
  231. {
  232. DWORD ret = 0;
  233. if (componentName == CONTROLLER_TUBE_ANGLE)
  234. {
  235. ret = DoConvertTubeAngleMotorPulse(physicsOffset);
  236. }
  237. else if (componentName == CONTROLLER_TUBE_HEIGHT)
  238. {
  239. ret = DoConvertTubeHeightMotorPulse(physicsOffset);
  240. }
  241. else if (componentName == CONTROLLER_TUBE_HORIZONTAL)
  242. {
  243. ret = DoConvertTubeHorizontalMotorPulse(physicsOffset);
  244. }
  245. if (gmotionLog) gmotionLog->Info("[ImplPositionManager][ConvertMotorStepValue]->[{$}][{$:f6}][{$:d04}]", componentName.c_str(), physicsOffset, ret);
  246. return ret;
  247. }
  248. DWORD ImplPositionManager::ConvertMotorSpeed(const std::string &componentName, float speed)
  249. {
  250. DWORD ret = 0;
  251. if (componentName == CONTROLLER_TUBE_ANGLE)
  252. {
  253. ret = DoConvertTubeAngleMotorSpeed(speed);
  254. }
  255. else if (componentName == CONTROLLER_TUBE_HEIGHT)
  256. {
  257. ret = DoConvertTubeHeightMotorSpeed(speed);
  258. }
  259. else if (componentName == CONTROLLER_TUBE_HORIZONTAL)
  260. {
  261. ret = DoConvertTubeHorizontalMotorSpeed(speed);
  262. }
  263. if (gmotionLog) gmotionLog->Info("[ImplPositionManager][ConvertMotorSpeed]->[{$}][{$:f6}][{$:d04}]", componentName.c_str(), speed, ret);
  264. return ret;
  265. }
  266. void ImplPositionManager::ResetSystem()
  267. {
  268. m_isSystemReady = FALSE;
  269. }
  270. BOOL ImplPositionManager::IsSystemReady()
  271. {
  272. return m_isSystemReady;
  273. }
  274. int ImplPositionManager::IsTomoMotionLimitationStatus()
  275. {
  276. return m_nTomoMotionLimitationStatus;
  277. }
  278. BOOL ImplPositionManager::IsNeedCenterAdjust()
  279. {
  280. auto prisionAngle = 1.0f; //(°)
  281. auto prisionHeight = 0.02f; //(m)
  282. auto tubeAngle = GetCurrentTubeAngle();
  283. auto tubeHeight = GetCurrentTubeHeight();
  284. auto detectorHeight = GetDetectorVerticalPos();
  285. if (abs(tubeAngle) <= prisionAngle && abs(tubeHeight - detectorHeight) <= prisionHeight)
  286. {
  287. return FALSE;
  288. }
  289. return TRUE;
  290. }
  291. void ImplPositionManager::NotifyAlignStatus(BOOL isAligned)
  292. {
  293. if (m_notifyLogicDriver)
  294. {
  295. ResDataObject NotifyData;
  296. ResDataObject tmp;
  297. tmp.add("Alignstatus", (bool)isAligned);
  298. PacketAnalizer::MakeNotify(NotifyData, PACKET_CMD_UPDATE, NOTIFY_KEY_ALIGNSTATUS.c_str(), (const char *)tmp["Alignstatus"]);
  299. m_notifyLogicDriver->FireNotify("Alignstatus", std::to_string(isAligned));
  300. }
  301. }
  302. void ImplPositionManager::NotifySystemIsReady()
  303. {
  304. m_isSystemReady = TRUE;
  305. if (m_notifyLogicDriver)
  306. {
  307. ResDataObject NotifyData;
  308. ResDataObject tmp;
  309. tmp.add("MachineryReady", (bool)m_isSystemReady);
  310. PacketAnalizer::MakeNotify(NotifyData, PACKET_CMD_UPDATE, NOTIFY_KEY_SYSTEM_READY.c_str(), (const char *)tmp["MachineryReady"]);
  311. m_notifyLogicDriver->FireNotify("MachineryReady", std::to_string(m_isSystemReady));
  312. }
  313. }
  314. void ImplPositionManager::NotifySystemIsTomoMotionLimitation(int nLimitaionStatus)
  315. {
  316. m_nTomoMotionLimitationStatus = nLimitaionStatus;
  317. if (m_notifyLogicDriver)
  318. {
  319. ResDataObject NotifyData;
  320. ResDataObject tmp;
  321. tmp.add("MachineryTomoMotionLimitation", m_nTomoMotionLimitationStatus);
  322. PacketAnalizer::MakeNotify(NotifyData, PACKET_CMD_UPDATE, NOTIFY_KEY_SYSTEM_READY.c_str(), (const char*)tmp["MachineryTomoMotionLimitation"]);
  323. m_notifyLogicDriver->FireNotify("MachineryTomoMotionLimitation", std::to_string(m_nTomoMotionLimitationStatus));
  324. }
  325. }
  326. float ImplPositionManager::GetTubeHeightLandmarkPosition(LANDMARK_TYPE landmarkType)
  327. {
  328. if (LANDMARK_HIGH == landmarkType)
  329. {
  330. return ConfigurerMotion::GetTubeHeightHighLandmarkHeight();
  331. }
  332. else if (LANDMARK_LOW == landmarkType)
  333. {
  334. //int ad = ConfigurerMotion::GetTubeHeightLowLandmarkAD();
  335. //return ConvertSensorValue(m_adTubeHeight->Name(), ad);
  336. return ConfigurerMotion::GetTubeHeightLowLandmarkPos();
  337. }
  338. return 0.0f;
  339. }
  340. float ImplPositionManager::GetTubeAngleLandmarkPosition(LANDMARK_TYPE landmarkType)
  341. {
  342. if (LANDMARK_HIGH == landmarkType)
  343. {
  344. return ConfigurerMotion::GetTubeAngleHighLandmarkAngle();
  345. }
  346. else if (LANDMARK_LOW == landmarkType)
  347. {
  348. return ConfigurerMotion::GetTubeAngleLowLandmarkAngle();
  349. }
  350. return 0.0f;
  351. }
  352. float ImplPositionManager::GetTubeAnglePerPulse()
  353. {
  354. float angleinonecircle = ConfigurerMotion::GetDistanceInOneCircleOfTubeAngleMotor();
  355. DWORD pulseinonecircle = ConfigurerMotion::GetPulseInOneCircleOfTubeAngleMotor();
  356. if (pulseinonecircle == 0)
  357. {
  358. return 0.0f;
  359. }
  360. return (angleinonecircle / pulseinonecircle);
  361. }
  362. float ImplPositionManager::GetCurrentTubeHeight()
  363. {
  364. auto heightencoder = m_encoderTubeHeight->GetCurrentEncoderValue();
  365. return ConvertSensorValue(m_encoderTubeHeight->Name(), heightencoder);
  366. }
  367. float ImplPositionManager::GetCurrentAbsoluteTubeAngle()
  368. {
  369. auto ad = m_adTubeAngle->GetCurrentADValue();
  370. return ConvertSensorValue(m_adTubeAngle->Name(), ad);
  371. }
  372. float ImplPositionManager::GetCurrentAbsoluteTubeHeight()
  373. {
  374. auto ad = m_adTubeHeight->GetCurrentADValue();
  375. return ConvertSensorValue(m_adTubeHeight->Name(), ad);
  376. }
  377. float ImplPositionManager::GetCurrentTubeAngle()
  378. {
  379. auto angleencoder = m_encoderTubeAngle->GetCurrentEncoderValue();
  380. return ConvertSensorValue(m_encoderTubeAngle->Name(), angleencoder);
  381. }
  382. float ImplPositionManager::GetDetectorVerticalPos()
  383. {
  384. auto detectorad = m_adDetectorHeight->GetCurrentADValue();
  385. return ConvertSensorValue(m_adDetectorHeight->Name(), detectorad);
  386. }
  387. float ImplPositionManager::GetDetectorHorizontalPos()
  388. {
  389. auto detectorad = m_adDetectorHorizontal->GetCurrentADValue();
  390. return ConvertSensorValue(m_adDetectorHorizontal->Name(), detectorad);
  391. }
  392. int ImplPositionManager::GetCurrentTubeAngleSensorValue()
  393. {
  394. return m_encoderTubeAngle->GetCurrentEncoderValue();
  395. }
  396. int ImplPositionManager::GetCurrentEncoderSensorValue(ISensorEncoderController* pSensorEncoder)
  397. {
  398. //return m_encoderTubeHeight->GetCurrentEncoderValue();
  399. if (pSensorEncoder)
  400. {
  401. return pSensorEncoder->GetCurrentEncoderValue();
  402. }
  403. return -1;
  404. }
  405. int ImplPositionManager::GetCurrentDetectorADSensorValue(ISensorADController* pSensorAD)
  406. {
  407. //return m_adDetectorHeight->GetCurrentADValue();
  408. if (pSensorAD)
  409. {
  410. return pSensorAD->GetCurrentADValue();
  411. }
  412. return -1;
  413. }
  414. float ImplPositionManager::DoConvertTubeAngleEncoder(int sensorvalue)
  415. {
  416. float angleinonecircle = ConfigurerMotion::GetDistanceInOneCircleOfTubeAngleMotor();
  417. auto encodervalueinonecircle = ConfigurerMotion::GetEncoderValueInOneCircleOfTubeAngleMotor();
  418. auto absolutevalueAtorigin = ConfigurerMotion::GetAbsoluteValueAtTubeAngleOrigin();
  419. return DoConvertEncoder(sensorvalue, angleinonecircle, encodervalueinonecircle, absolutevalueAtorigin);
  420. }
  421. float ImplPositionManager::DoConvertTubeHeightEncoder(int sensorvalue)
  422. {
  423. float distanceinonecircle = ConfigurerMotion::GetDistanceInOneCircleOfTubeHeightMotor();
  424. auto encodervalueinonecircle = ConfigurerMotion::GetEncoderValueInOneCircleOfTubeHeightMotor();
  425. auto absolutevalueAtorigin = ConfigurerMotion::GetAbsoluteValueAtTubeHeightOrigin();
  426. return DoConvertEncoder(sensorvalue, distanceinonecircle, encodervalueinonecircle, absolutevalueAtorigin);
  427. }
  428. int ImplPositionManager::DoConvertTubeAngleToEncoder(float physics)
  429. {
  430. float angleinonecircle = ConfigurerMotion::GetDistanceInOneCircleOfTubeAngleMotor();
  431. auto encodervalueinonecircle = ConfigurerMotion::GetEncoderValueInOneCircleOfTubeAngleMotor();
  432. auto absolutevalueAtorigin = ConfigurerMotion::GetAbsoluteValueAtTubeAngleOrigin();
  433. return DoConvertPhysicsToEncoder(physics, angleinonecircle, encodervalueinonecircle, absolutevalueAtorigin);
  434. }
  435. int ImplPositionManager::DoConvertTubeHeightToEncoder(float physics)
  436. {
  437. float distanceinonecircle = ConfigurerMotion::GetDistanceInOneCircleOfTubeHeightMotor();
  438. auto encodervalueinonecircle = ConfigurerMotion::GetEncoderValueInOneCircleOfTubeHeightMotor();
  439. auto absolutevalueAtorigin = ConfigurerMotion::GetAbsoluteValueAtTubeHeightOrigin();
  440. return DoConvertPhysicsToEncoder(physics, distanceinonecircle, encodervalueinonecircle, absolutevalueAtorigin);
  441. }
  442. float ImplPositionManager::DoConvertEncoder(int encoder, float physicsinonecircle, float encoderinonecircle, float physicsAtOrigin)
  443. {
  444. return physicsAtOrigin + (physicsinonecircle / encoderinonecircle) * (encoder);
  445. }
  446. int ImplPositionManager::DoConvertPhysicsToEncoder(float physics, float physicsinonecircle, float encoderinonecircle, float physicsAtOrigin)
  447. {
  448. return (int)((physics - physicsAtOrigin) / (physicsinonecircle / encoderinonecircle));
  449. }
  450. DWORD ImplPositionManager::DoConvertTubeAngleMotorPulse(float physicsoffset)
  451. {
  452. float angleinonecircle = ConfigurerMotion::GetDistanceInOneCircleOfTubeAngleMotor();
  453. DWORD pulseinonecircle = ConfigurerMotion::GetPulseInOneCircleOfTubeAngleMotor();
  454. return DoConvertMotorPulse(physicsoffset, angleinonecircle, pulseinonecircle);
  455. }
  456. DWORD ImplPositionManager::DoConvertTubeHeightMotorPulse(float physicsoffset)
  457. {
  458. float heightinonecircle = ConfigurerMotion::GetDistanceInOneCircleOfTubeHeightMotor();
  459. DWORD pulseinonecircle = ConfigurerMotion::GetPulseInOneCircleOfTubeHeightMotor();
  460. return DoConvertMotorPulse(physicsoffset, heightinonecircle, pulseinonecircle);
  461. }
  462. DWORD ImplPositionManager::DoConvertMotorPulse(float physicsoffset, float physicsinonecircle, DWORD pulseinonecircle)
  463. {
  464. return (DWORD)(pulseinonecircle * (abs(physicsoffset) / physicsinonecircle));
  465. }
  466. DWORD ImplPositionManager::DoConvertTubeAngleMotorSpeed(float speed)
  467. {
  468. float angleinonecircle = ConfigurerMotion::GetDistanceInOneCircleOfTubeAngleMotor();
  469. DWORD pulseinonecircle = ConfigurerMotion::GetPulseInOneCircleOfTubeAngleMotor();
  470. return DoConvertSpeed(speed, angleinonecircle, pulseinonecircle);
  471. }
  472. DWORD ImplPositionManager::DoConvertTubeHeightMotorSpeed(float speed)
  473. {
  474. float heightinonecircle = ConfigurerMotion::GetDistanceInOneCircleOfTubeHeightMotor();
  475. DWORD pulseinonecircle = ConfigurerMotion::GetPulseInOneCircleOfTubeHeightMotor();
  476. return DoConvertSpeed(speed, heightinonecircle, pulseinonecircle);
  477. }
  478. DWORD ImplPositionManager::DoConvertSpeed(float speed, float physicsinonecircle, DWORD pulseinonecircle)
  479. {
  480. return (DWORD)(1000000 / ((speed / physicsinonecircle) * pulseinonecircle));
  481. }
  482. float ImplPositionManager::DoConvertDetectorHeightAD(int sensorvalue)
  483. {
  484. auto slope = ConfigurerCalibration::GetDetectorADToHeightSlope();
  485. auto intercept = ConfigurerCalibration::GetDetectorADToHeightIntercept();
  486. return slope * sensorvalue + intercept;
  487. }
  488. DWORD ImplPositionManager::DoConvertDetectorToAD(float physics)
  489. {
  490. auto slope = ConfigurerCalibration::GetDetectorADToHeightSlope();
  491. auto intercept = ConfigurerCalibration::GetDetectorADToHeightIntercept();
  492. if (abs(slope) < 1e-3)
  493. {
  494. return 0;
  495. }
  496. return (DWORD)((physics - intercept) / slope);
  497. }
  498. float ImplPositionManager::DoConvertTubeAngleAD(DWORD sensorvalue)
  499. {
  500. auto slope = ConfigurerCalibration::GetTubeAngleADToAngleSlope();
  501. auto intercept = ConfigurerCalibration::GetTubeAngleADToAngleIntercept();
  502. return slope * sensorvalue + intercept;
  503. }
  504. float ImplPositionManager::DoConvertTubeHeightAD(DWORD sensorvalue)
  505. {
  506. auto slope = ConfigurerCalibration::GetTubeHeightADToHeightSlope();
  507. auto intercept = ConfigurerCalibration::GetTubeHeightADToHeightIntercept();
  508. return slope * sensorvalue + intercept;
  509. }
  510. void ImplPositionManager::DigitalTwinRecordConvertParams()
  511. {
  512. float angleinonecircle = ConfigurerMotion::GetDistanceInOneCircleOfTubeAngleMotor();
  513. auto angleencodervalueinonecircle = ConfigurerMotion::GetEncoderValueInOneCircleOfTubeAngleMotor();
  514. auto angleabsolutevalueAtorigin = ConfigurerMotion::GetAbsoluteValueAtTubeAngleOrigin();
  515. float distanceinonecircle = ConfigurerMotion::GetDistanceInOneCircleOfTubeHeightMotor();
  516. auto heightencodervalueinonecircle = ConfigurerMotion::GetEncoderValueInOneCircleOfTubeHeightMotor();
  517. auto heightabsolutevalueAtorigin = ConfigurerMotion::GetAbsoluteValueAtTubeHeightOrigin();
  518. if (gdigitalTwinLog) gdigitalTwinLog->Info("[CP]->[({$:f6},{$:f6},{$:f6}),({$:f6},{$:f6},{$:f6})]",
  519. angleabsolutevalueAtorigin,
  520. angleinonecircle,
  521. angleencodervalueinonecircle,
  522. heightabsolutevalueAtorigin,
  523. distanceinonecircle,
  524. heightencodervalueinonecircle);
  525. }
  526. void ImplPositionManager::ResetSystem(const std::string& componentName)
  527. {
  528. }
  529. BOOL ImplPositionManager::IsSystemReady(const std::string& componentName)
  530. {
  531. return TRUE;
  532. }
  533. void ImplPositionManager::NotifySystemIsReady(const std::string& componentName)
  534. {
  535. }
  536. DWORD ImplPositionManager::DoConvertTubeHorizontalMotorPulse(float physicsoffset)
  537. {
  538. float horizontalinonecircle = ConfigurerMotion::GetDistanceInOneCircleOfTubeHorizontalMotor();
  539. DWORD pulseinonecircle = ConfigurerMotion::GetPulseInOneCircleOfTubeHorizontalMotor();
  540. return DoConvertMotorPulse(physicsoffset, horizontalinonecircle, pulseinonecircle);
  541. }
  542. DWORD ImplPositionManager::DoConvertTubeHorizontalMotorSpeed(float speed)
  543. {
  544. float horizontalinonecircle = ConfigurerMotion::GetDistanceInOneCircleOfTubeHorizontalMotor();
  545. DWORD pulseinonecircle = ConfigurerMotion::GetPulseInOneCircleOfTubeHorizontalMotor();
  546. return DoConvertSpeed(speed, horizontalinonecircle, pulseinonecircle);
  547. }
  548. float ImplPositionManager::DoConvertTubeHorizontalEncoder(int sensorvalue)
  549. {
  550. float distanceinonecircle = ConfigurerMotion::GetDistanceInOneCircleOfTubeHorizontalMotor();
  551. auto encodervalueinonecircle = ConfigurerMotion::GetEncoderValueInOneCircleOfTubeHorizontalMotor();
  552. auto absolutevalueAtorigin = ConfigurerMotion::GetAbsoluteValueAtTubeHorizontalOrigin();
  553. return DoConvertEncoder(sensorvalue, distanceinonecircle, encodervalueinonecircle, absolutevalueAtorigin);
  554. }
  555. float ImplPositionManager::DoConvertTubeHorizontalAD(DWORD sensorvalue)
  556. {
  557. auto slope = ConfigurerCalibration::GetTubeHorizontalADToPositionSlope();
  558. auto intercept = ConfigurerCalibration::GetTubeHorizontalADToPositionIntercept();
  559. return slope * sensorvalue + intercept;
  560. }
  561. int ImplPositionManager::DoConvertTubeHorizontalToEncoder(float physics)
  562. {
  563. float distanceinonecircle = ConfigurerMotion::GetDistanceInOneCircleOfTubeHorizontalMotor();
  564. auto encodervalueinonecircle = ConfigurerMotion::GetEncoderValueInOneCircleOfTubeHorizontalMotor();
  565. auto absolutevalueAtorigin = ConfigurerMotion::GetAbsoluteValueAtTubeHorizontalOrigin();
  566. return DoConvertPhysicsToEncoder(physics, distanceinonecircle, encodervalueinonecircle, absolutevalueAtorigin);
  567. }
  568. float ImplPositionManager::DoConvertDetectorHorizontalAD(DWORD sensorvalue)
  569. {
  570. auto slope = ConfigurerCalibration::GetDetectorHorizontalADToPositionSlope();
  571. auto intercept = ConfigurerCalibration::GetDetectorHorizontalADToPositionIntercept();
  572. return slope * sensorvalue + intercept;
  573. }
  574. DWORD ImplPositionManager::DoConvertDetectorHorizontalToAD(float physics)
  575. {
  576. auto slope = ConfigurerCalibration::GetDetectorHorizontalADToPositionSlope();
  577. auto intercept = ConfigurerCalibration::GetDetectorHorizontalADToPositionIntercept();
  578. if (abs(slope) < 1e-3)
  579. {
  580. return 0;
  581. }
  582. return (DWORD)((physics - intercept) / slope);
  583. }
  584. float ImplPositionManager::GetTubeHorizontalLandmarkPosition(LANDMARK_TYPE landmarkType)
  585. {
  586. if (LANDMARK_HIGH == landmarkType)
  587. {
  588. return ConfigurerMotion::GetTubeHorizontalRightLandmark();
  589. }
  590. else if (LANDMARK_LOW == landmarkType)
  591. {
  592. return ConfigurerMotion::GetTubeHorizontalLowLandmarkPos();
  593. }
  594. return 0.0f;
  595. }
  596. float ImplPositionManager::GetCurrentAbsoluteTubeHorizontalPos()
  597. {
  598. auto ad = m_adTubeHorizontal->GetCurrentADValue();
  599. return ConvertSensorValue(m_adTubeHorizontal->Name(), ad);
  600. }
  601. float ImplPositionManager::GetCurrentTubeHorizontalPos()
  602. {
  603. auto encoder = m_encoderTubeHorizontal->GetCurrentEncoderValue();
  604. return ConvertSensorValue(m_encoderTubeHorizontal->Name(), encoder);
  605. }