GSIDrive.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381
  1. using GSG.NET.Concurrent;
  2. using GSG.NET.Extensions;
  3. using GSG.NET.Logging;
  4. using GSG.NET.Utils;
  5. using OHV.Common.Model;
  6. using OHV.Common.Shareds;
  7. using OHV.SqliteDAL;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Linq;
  11. using System.Text;
  12. using VehicleControlSystem.ControlLayer.MQ;
  13. using VehicleControlSystem.Managers;
  14. namespace VehicleControlSystem.ControlLayer.Drive
  15. {
  16. public class GSIDrive : ControlObjectBase
  17. {
  18. public enum eDriveServoState
  19. {
  20. ServoFault = -1,
  21. WrongServoNum = 0,
  22. ServoOn = 1,
  23. ServoOff = 2,
  24. ServoStop = 3,
  25. None,
  26. }
  27. Logger logger = Logger.GetLogger();
  28. public bool IsStop { get; set; }
  29. double currentPos = 0;
  30. public double CurrentPos { get { return this.currentPos; } set { SetField( ref this.currentPos, value ); } }
  31. private int currentTag;
  32. public int CurrentTag { get { return currentTag; } set { SetField( ref this.currentTag, value ); } }
  33. private double currentSpeed = 0;
  34. public double CurrentSpeed { get { return currentSpeed; } set { SetField( ref this.currentSpeed, value ); } }
  35. private double currentTorque = 0;
  36. public double CurrentTorque { get { return currentTorque; } set { SetField( ref this.currentTorque, value ); } }
  37. public bool IsErrorOn { get; set; }
  38. private eDriveServoState driveServoState;
  39. public eDriveServoState DriveServoState
  40. {
  41. get { return driveServoState; }
  42. set { SetField( ref driveServoState, value ); }
  43. }
  44. TaskCancel taskCancel = new TaskCancel();
  45. ThreadCancel threadCancel = new ThreadCancel();
  46. SqliteManager sql = null;
  47. Steering steering = null;
  48. ZmqManager zmq = null;
  49. List<Alarm> Alarms { get; set; }
  50. //이후 상태가 불일치가 나온다면 필요시 마다 요구 하는 방식으로 변경.
  51. public bool IsDriveFault { get; set; } = false;
  52. public GSIDrive( SqliteManager sql, Steering steering, ZmqManager zmq, List<Alarm> alarms )
  53. {
  54. this.sql = sql;
  55. this.steering = steering;
  56. this.zmq = zmq;
  57. this.Alarms = alarms;
  58. }
  59. private void Zmq_OnDriveAlarmBitArrayChg(System.Collections.BitArray obj)
  60. {
  61. bool isFault = false;
  62. for (int i = 0; i < obj.Count; i++)
  63. {
  64. if (obj[i])
  65. {
  66. var alarm = this.Alarms.Where(a => a.AlarmId == i + 1000).SingleOrDefault();
  67. if (alarm == null)
  68. {
  69. logger.D($"[Drive] - AlarmID [ {i+1000} ] - is Null");
  70. continue;
  71. }
  72. if ( alarm.Level == eAlarmLevel.Fault )
  73. isFault = true; //알람 중 하나라도 Fault 가 있으면 상태 Fault.
  74. }
  75. }
  76. if (isFault)
  77. this.IsDriveFault = true;
  78. else
  79. this.IsDriveFault = false;
  80. }
  81. public void Init()
  82. {
  83. //this.threadCancel.AddGo( Thread_DriveStateChcker );
  84. //this.threadCancel.AddGo( Thread_Logger );
  85. //zmq.PropertyChanged += Zmq_PropertyChanged;
  86. this.zmq.OnDriveAlarmBitArrayChg += Zmq_OnDriveAlarmBitArrayChg;
  87. //PhysicalCheckupLogger.Instance.Connecte();
  88. }
  89. private void Zmq_PropertyChanged( object sender, System.ComponentModel.PropertyChangedEventArgs e )
  90. {
  91. var property = sender.GetType().GetProperty( e.PropertyName );
  92. var newValue = property.GetValue( sender, null );
  93. switch ( property.Name )
  94. {
  95. //case "RequestSteering":
  96. // {
  97. // var v = CastTo<eSteeringState>.From<object>( newValue );
  98. // this.ReqSteeringState = v;
  99. // }
  100. // break;
  101. //case "CurrentPointNo":
  102. // {
  103. // var v = CastTo<int>.From<object>( newValue );
  104. // this.CurrentTag = v;
  105. // }
  106. // break;
  107. //case "RearLoadFactor":
  108. // {
  109. // var v = CastTo<double>.From<object>( newValue );
  110. // this.RearLoadFactor = v;
  111. // }
  112. // break;
  113. //case "RearRPM":
  114. // {
  115. // var v = CastTo<double>.From<object>( newValue );
  116. // this.RearRpm = v;
  117. // }
  118. // break;
  119. //case "FrontLoadFactor":
  120. // {
  121. // var v = CastTo<double>.From<object>( newValue );
  122. // this.FrontLoadFactor = v;
  123. // }
  124. // break;
  125. //case "FrontRPM":
  126. // {
  127. // var v = CastTo<double>.From<object>( newValue );
  128. // this.FrontRpm = v;
  129. // }
  130. // break;
  131. default:
  132. break;
  133. }
  134. }
  135. public void Dispose()
  136. {
  137. this.threadCancel.Cancel();
  138. LockUtils.Wait( 50 );
  139. this.threadCancel.StopWaitAll();
  140. }
  141. void Thread_DriveStateChcker()
  142. {
  143. logger.D( "[Drive] - Thread Drive State Checker Start" );
  144. while ( !this.threadCancel.Canceled )
  145. {
  146. try
  147. {
  148. LockUtils.Wait( 10 );
  149. //this.GetReqSteeringState();
  150. //if (Redis.Instance.GetDriveMove() )
  151. //{
  152. // this.LoggingState();
  153. //}
  154. }
  155. catch ( Exception e )
  156. {
  157. logger.E( $"[Drive] - Error : [{e}]" );
  158. }
  159. }
  160. logger.D( "[Drive] - Thread Drive State Checker Disposed" );
  161. }
  162. void Thread_Logger()
  163. {
  164. while ( !this.threadCancel.Canceled )
  165. {
  166. try
  167. {
  168. LockUtils.Wait( 10 );
  169. }
  170. catch ( Exception e )
  171. {
  172. logger.E( $"[Drive] - Error : [{e}]" );
  173. }
  174. }
  175. }
  176. public void SetCurrentSteeringState( eSteeringState state )
  177. {
  178. this.zmq.SetCurrentSteeringState( state );
  179. }
  180. public bool IsDriveStop() => !zmq.IsDriveMoving;
  181. public bool IsDriveMoving() => zmq.IsDriveMoving;
  182. /// <summary>
  183. /// Drive 측 초기화 기능
  184. /// 실패 시 알람 처리
  185. /// </summary>
  186. /// <returns></returns>
  187. public int DriveInit( )
  188. {
  189. int result = ConstInt.EXECUTE_SUCCESS;
  190. if (zmq.DriveState == eDriveState.Fault)
  191. {
  192. zmq.SetDriveControl(eDriveControl.ResetFault);
  193. LockUtils.Wait(1000);
  194. }
  195. if (zmq.DriveState == eDriveState.Fault || IsDriveFault)
  196. return 45;
  197. //Init Request
  198. result = this.zmq.SetDriveControl(eDriveControl.Initialize);
  199. if (result != ConstInt.EXECUTE_SUCCESS )
  200. return result;
  201. long sTime = SwUtils.CurrentTimeMillis;
  202. while (true)
  203. {
  204. LockUtils.Wait(5);
  205. if ( SwUtils.Gt(sTime, 30 * ConstUtils.ONE_SECOND))
  206. {
  207. return 46;
  208. }
  209. //Initialize 완료 확인
  210. if (zmq.Isinitialized)
  211. break;
  212. }
  213. return result;
  214. }
  215. public eOperatationMode GetDriveOperationMode()
  216. {
  217. //var ret = Redis.Instance.GetSystemState();
  218. //if ( ret == 3 )
  219. // return eOperatationMode.ManualMode;
  220. //else if ( ret == 4 )
  221. // return eOperatationMode.AutoMode;
  222. //else
  223. return eOperatationMode.InitialMode;
  224. }
  225. public int MoveToPoint( SubCmd sub, double velocity )
  226. {
  227. //if ( this.DriveServoState != eDriveServoState.ServoStop )
  228. // return 9999;
  229. //Drive Fault 상태 확인
  230. if ( this.IsDriveFault )
  231. return 45;
  232. int result = ConstInt.EXECUTE_SUCCESS;
  233. var steeringState = steering.GetSteeringState();
  234. if (steeringState == eSteeringState.None ) //현재 가 None 이면 기다렸다가 다시 확인 필요.
  235. LockUtils.Wait( 500 );
  236. //zmq.SetCurrentSteeringState( steering.GetSteeringState() );
  237. LockUtils.Wait( 200 );
  238. StringBuilder sb = new StringBuilder();
  239. if ( sub.TargetList.Count <= 0 )
  240. {
  241. sb.Append( sub.TargetID );
  242. result = zmq.SetTargetPoint( sb.ToString() );
  243. LockUtils.Wait( 100 );
  244. if ( result != ConstInt.EXECUTE_SUCCESS )
  245. return result;
  246. result = zmq.SetStartMove();
  247. if ( result != ConstInt.EXECUTE_SUCCESS )
  248. return result;
  249. }
  250. else
  251. {
  252. sub.TargetList.ForEach( x => { sb.Append( x ); sb.Append( ";" ); } );
  253. result = zmq.SetTargetPointArray( sb.ToString() );
  254. LockUtils.Wait( 100 );
  255. if ( result != ConstInt.EXECUTE_SUCCESS )
  256. return result;
  257. result = zmq.SetStartMove(true);
  258. if ( result != ConstInt.EXECUTE_SUCCESS )
  259. return result;
  260. }
  261. //result = zmq.SetStartMove();
  262. //if ( result != ConstInt.EXECUTE_SUCCESS )
  263. // return result;
  264. //10sec 동안 출발 하는지 확인.
  265. int waitTime = 10000;
  266. long st = SwUtils.CurrentTimeMillis;
  267. while ( true )
  268. {
  269. LockUtils.Wait( 10 );
  270. if ( SwUtils.Gt( st, waitTime ) )
  271. {
  272. logger.D( "Move Start Time Out In 10sec!" );
  273. return 37;
  274. }
  275. if ( zmq.IsDriveMoving )
  276. break;
  277. }
  278. return ConstInt.EXECUTE_SUCCESS;
  279. }
  280. public void CancelCommand(SubCmd subCmd)
  281. {
  282. }
  283. /// <summary>
  284. /// 급 정지 사용.
  285. /// </summary>
  286. public void EStop()
  287. {
  288. this.zmq.SetEStop();
  289. }
  290. /// <summary>
  291. /// Manual 상태 에서 가감속 Stop
  292. /// </summary>
  293. public void Stop()
  294. {
  295. this.zmq.SetDecelStop();
  296. }
  297. public void SetObstacleState( eObstacleState state ) => zmq.SetObstruction( state );
  298. public bool VelocityChainge( double velocity )
  299. {
  300. return true;
  301. }
  302. public bool JogForword()
  303. {
  304. this.zmq.SetJogMove();
  305. return true;
  306. }
  307. public bool JogBackword()
  308. {
  309. this.zmq.SetJogMove( false );
  310. return true;
  311. }
  312. #region Test Method
  313. #endregion
  314. }
  315. }