ZmqManager.cs 39 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304
  1. using GSG.NET.Concurrent;
  2. using GSG.NET.Extensions;
  3. using GSG.NET.Logging;
  4. using GSG.NET.Utils;
  5. using NetMQ;
  6. using NetMQ.Monitoring;
  7. using NetMQ.Sockets;
  8. using OHV.Common.Model;
  9. using OHV.Common.Shareds;
  10. using Quartz.Xml;
  11. using System;
  12. using System.Collections;
  13. using System.Collections.Concurrent;
  14. using System.Collections.Generic;
  15. using System.Linq;
  16. using System.Text;
  17. using System.Threading;
  18. using VehicleControlSystem.ControlLayer.IO;
  19. using VehicleControlSystem.ControlLayer.Serial.BatteryTabos;
  20. using VehicleControlSystem.ControlLayer.Serial.DataModel;
  21. using VehicleControlSystem.Managers;
  22. namespace VehicleControlSystem.ControlLayer.MQ
  23. {
  24. public enum eDriveControl
  25. {
  26. None = 0,
  27. ParameterSave,
  28. ResetFault,
  29. CancelRoute,
  30. ServoOn,
  31. ServoOff,
  32. ClearWarning = 9,
  33. }
  34. public enum eDriveState
  35. {
  36. ServoOff,
  37. ServoOn,
  38. Fault,
  39. }
  40. public class ZmqMessage
  41. {
  42. public string Key { get; set; }
  43. public string Message { get; set; }
  44. }
  45. public class ZmqManager : ControlObjectBase, IDisposable
  46. {
  47. Logger logger = Logger.GetLogger();
  48. PublisherSocket pub = null;
  49. SubscriberSocket sub = null;
  50. RequestSocket req = null;
  51. ResponseSocket rep = null;
  52. NetMQPoller poller = null;
  53. NetMQPoller subPoller = null;
  54. NetMQMonitor monitor = null;
  55. NetMQMonitor pubMonitor = null;
  56. BMUManager bMUManager = null;
  57. Steering steering = null;
  58. ThreadCancel threadCancel = new ThreadCancel();
  59. BlockingCollection<ZmqMessage> sendQueue = new BlockingCollection<ZmqMessage>( new ConcurrentQueue<ZmqMessage>() );
  60. string endServer = "tcp://127.0.0.1:5567";
  61. private bool isReqConnected = false;
  62. public bool IsReqConnected
  63. {
  64. get { return isReqConnected; }
  65. set { isReqConnected = value; }
  66. }
  67. #region Properties
  68. private eDriveState driveState = eDriveState.ServoOff;
  69. public eDriveState DriveState
  70. {
  71. get { return driveState; }
  72. set
  73. {
  74. SetField(ref this.driveState, value);
  75. }
  76. }
  77. private eSteeringState requestSteering = eSteeringState.None;
  78. public eSteeringState RequestSteering
  79. {
  80. get { return requestSteering; }
  81. set { SetField( ref this.requestSteering, value, false ); }
  82. }
  83. private bool isDriveMoving = false;
  84. public bool IsDriveMoving
  85. {
  86. get { return isDriveMoving; }
  87. set
  88. {
  89. if ( SetField( ref isDriveMoving, value ) )
  90. Publish( "DriveStart", value.ToString() );
  91. }
  92. }
  93. private eOperatationMode operatationMode;
  94. public eOperatationMode OperationMode
  95. {
  96. get { return operatationMode; }
  97. set { operatationMode = value; }
  98. }
  99. private int currentPointNo;
  100. public int CurrentPointNo
  101. {
  102. get { return currentPointNo; }
  103. set
  104. {
  105. if ( SetField( ref this.currentPointNo, value ) )
  106. Publish( "CurrentPoint", value.ToString() );
  107. }
  108. }
  109. private int segmentID;
  110. public int SegmentID
  111. {
  112. get { return segmentID; }
  113. set
  114. {
  115. if ( SetField( ref this.segmentID, value ) )
  116. {
  117. var segment = RouteManager.Instance.Segments.Where( s => s.ID == value ).FirstOrDefault();
  118. if ( segment == null )
  119. return;
  120. Publish( "CurrentRailFrom", segment.route_type );
  121. }
  122. }
  123. }
  124. private double frontLoadFactor;
  125. public double FrontLoadFactor
  126. {
  127. get { return frontLoadFactor * 0.1; }
  128. set { SetField( ref this.frontLoadFactor, value ); }
  129. }
  130. private double rearLoadFactor;
  131. public double RearLoadFactor
  132. {
  133. get { return rearLoadFactor * 0.1; }
  134. set { SetField( ref this.rearLoadFactor, value ); }
  135. }
  136. private double frontRPM;
  137. public double FrontRPM
  138. {
  139. get { return Math.Truncate( frontRPM * 10 ) / 10; }
  140. set { SetField( ref this.frontRPM, value ); }
  141. }
  142. private double rearRPM;
  143. public double RearRPM
  144. {
  145. get { return Math.Truncate( rearRPM * 10 ) / 10; }
  146. set { SetField( ref this.rearRPM, value ); }
  147. }
  148. private string currentMCR;
  149. public string CurrentMCR
  150. {
  151. get { return currentMCR; }
  152. set
  153. {
  154. SetField( ref this.currentMCR, value );
  155. }
  156. }
  157. //Drive State Code
  158. private int warningCode;
  159. public int WarningCode
  160. {
  161. get { return warningCode; }
  162. set { SetField( ref this.warningCode, value ); }
  163. }
  164. private int faultCode;
  165. public int FaultCode
  166. {
  167. get { return faultCode; }
  168. set { SetField( ref this.faultCode, value ); }
  169. }
  170. private string warningMessage;
  171. public string WarningMessage
  172. {
  173. get { return warningMessage; }
  174. set { SetField( ref this.warningMessage, value ); }
  175. }
  176. private string faultMessage;
  177. public string FaultMessage
  178. {
  179. get { return faultMessage; }
  180. set { SetField( ref this.faultMessage, value ); }
  181. }
  182. private bool isCanStanbyLocation;
  183. public bool IsCanStanbyLocation
  184. {
  185. get { return isCanStanbyLocation; }
  186. set { SetField(ref this.isCanStanbyLocation, value); }
  187. }
  188. private double linearSpeed;
  189. public double LinearSpeed
  190. {
  191. get { return linearSpeed; }
  192. set { SetField(ref this.linearSpeed, value); }
  193. }
  194. private double curveSpeed;
  195. public double CurveSpeed
  196. {
  197. get { return curveSpeed; }
  198. set { SetField(ref this.curveSpeed, value); }
  199. }
  200. private double accelSpeed;
  201. public double AccelSpeed
  202. {
  203. get { return accelSpeed; }
  204. set { SetField(ref this.accelSpeed, value); }
  205. }
  206. private double decelSpeed;
  207. public double DecelSpeed
  208. {
  209. get { return decelSpeed; }
  210. set { SetField(ref this.decelSpeed, value); }
  211. }
  212. private double creepSpeed;
  213. public double CreepSpeed
  214. {
  215. get { return creepSpeed; }
  216. set { SetField(ref this.creepSpeed, value); }
  217. }
  218. private double creepDistance;
  219. public double CreepDistance
  220. {
  221. get { return creepDistance; }
  222. set { SetField(ref this.creepDistance, value); }
  223. }
  224. private double jogSpeed;
  225. public double JogSPeed
  226. {
  227. get { return jogSpeed; }
  228. set { SetField(ref this.jogSpeed, value); }
  229. }
  230. private bool isDriveOn;
  231. public bool IsDriveOn
  232. {
  233. get { return isDriveOn; }
  234. set
  235. {
  236. if(SetField(ref this.isDriveOn, value))
  237. {
  238. }
  239. }
  240. }
  241. #endregion
  242. IO.EzIO iO = null;
  243. public ZmqManager( BMUManager bMU, Steering steering, IIO io )
  244. {
  245. this.iO = io as EzIO;
  246. NetMQ.NetMQConfig.Cleanup();
  247. this.bMUManager = bMU;
  248. this.steering = steering;
  249. }
  250. public void Init()
  251. {
  252. pub = new PublisherSocket();
  253. this.pubMonitor = new NetMQMonitor(pub, "inproc://pub.inproc", SocketEvents.Accepted);
  254. this.pubMonitor.Accepted += (s, e) =>
  255. {
  256. PublishSyncData();
  257. //logger.D("pub Connected");
  258. };
  259. this.pubMonitor.StartAsync();
  260. pub.Bind( "tcp://127.0.0.1:5570" );
  261. sub = new SubscriberSocket();
  262. sub.Connect( "tcp://127.0.0.1:5565" );
  263. sub.Subscribe( "" ); //All
  264. sub.ReceiveReady += Sub_ReceiveReady;
  265. rep = new ResponseSocket();
  266. rep.Bind( "tcp://127.0.0.1:5568" );
  267. rep.ReceiveReady += Rep_ReceiveReady;
  268. req = new RequestSocket();
  269. this.monitor = new NetMQMonitor( req, "inproc://rep.inproc", SocketEvents.Disconnected | SocketEvents.Connected );
  270. this.monitor.Connected += ( s, a ) =>
  271. {
  272. this.SynchronizedParmeter();
  273. };
  274. this.monitor.Disconnected += ( s, a ) => { this.IsReqConnected = false; };
  275. this.monitor.StartAsync();
  276. req.Connect( "tcp://127.0.0.1:5567" );
  277. this.poller = new NetMQPoller { this.rep };
  278. this.poller.RunAsync();
  279. this.subPoller = new NetMQPoller { this.sub };
  280. this.subPoller.RunAsync();
  281. this.bMUManager.OnChangedReceivedData += BMUManager_OnChangedReceivedData;
  282. }
  283. void PublishSyncData()
  284. {
  285. if ( this.iO.IsOn("IN_CV_DETECT_01"))
  286. Publish("Contain", true.ToString());
  287. else
  288. Publish("Contain", false.ToString());
  289. }
  290. private void SynchronizedParmeter()
  291. {
  292. this.IsReqConnected = true;
  293. CurrentPointNo = GetCurrentPointNo();
  294. SetCurrentSteeringState(this.steering.GetSteeringState());
  295. this.LinearSpeed = this.GetDriveLinerSpeed();
  296. this.CurveSpeed = this.GetDriveCurveSpeed();
  297. this.JogSPeed = this.GetJogSpeed();
  298. this.AccelSpeed = this.GetAccelSpeed();
  299. this.DecelSpeed = this.GetDecelSpeed();
  300. this.CreepSpeed = this.GetCreepSpeed();
  301. this.CreepDistance = this.GetCreepDistance();
  302. }
  303. private void BMUManager_OnChangedReceivedData( Serial.DataModel.ReceivedData obj )
  304. {
  305. try
  306. {
  307. var kind = CastTo<eDataKind>.From<Enum>( obj.DataKind );
  308. switch ( kind )
  309. {
  310. case eDataKind.Current:
  311. this.pub.SendMoreFrame( "BatteryCurrent" ).SendFrame( obj.Value.ToString() );
  312. break;
  313. case eDataKind.Voltage:
  314. this.pub.SendMoreFrame( "BatteryVoltage" ).SendFrame( obj.Value.ToString() );
  315. break;
  316. case eDataKind.BatteryState:
  317. case eDataKind.ChargeCompleteTime:
  318. case eDataKind.DisChargeCompleteTime:
  319. break;
  320. case eDataKind.SOC:
  321. this.pub.SendMoreFrame( "BatterySOC" ).SendFrame( obj.Value.ToString() );
  322. break;
  323. case eDataKind.SOH:
  324. case eDataKind.ResidualCapacity:
  325. case eDataKind.ResidualEnergy:
  326. case eDataKind.Temperature:
  327. break;
  328. default:
  329. break;
  330. }
  331. }
  332. catch ( Exception ex )
  333. {
  334. logger.E( ex );
  335. }
  336. }
  337. public void Dispose()
  338. {
  339. this.threadCancel.Cancel();
  340. this.monitor.Stop();
  341. this.monitor.Dispose();
  342. this.pubMonitor.Stop();
  343. this.pubMonitor.Dispose();
  344. this.poller.Stop();
  345. this.poller.Dispose();
  346. this.subPoller.Stop();
  347. this.subPoller.Dispose();
  348. this.sub.Dispose();
  349. this.req.Dispose();
  350. this.rep.Dispose();
  351. this.pub.Dispose();
  352. }
  353. object lockPulish = new object();
  354. public void Publish( string key, string val )
  355. {
  356. lock ( lockPulish )
  357. this.pub.SendMoreFrame( key ).SendFrame( val );
  358. }
  359. private void Rep_ReceiveReady( object sender, NetMQSocketEventArgs e )
  360. {
  361. var ret = e.Socket.ReceiveMultipartStrings();
  362. logger.D( $"[rep] - {ret[1]}" );
  363. //rep.SendMoreFrame( ret[0] ).SendFrame( $"ok/{ret[1]}" ); //응답처리 부터 하자.
  364. try
  365. {
  366. if ( ret[0].Equals( "setm" ) )
  367. {
  368. var v = ret[1].Split( '/' );
  369. rep.SendMoreFrame( "setm" ).SendFrame( $"ok/{v[0]}" ); //응답처리 부터 하자.
  370. switch ( v[0] )
  371. {
  372. case "3050":
  373. {
  374. logger.D( $"[Steering_Rep] - 3050/{v[0]}" );
  375. switch ( v[1] )
  376. {
  377. case "1":
  378. this.RequestSteering = eSteeringState.Left;
  379. break;
  380. case "-1":
  381. this.RequestSteering = eSteeringState.Right;
  382. break;
  383. default:
  384. this.RequestSteering = eSteeringState.None;
  385. break;
  386. }
  387. }
  388. break;
  389. case "111":
  390. {
  391. if ( v[1].Equals( "1" ) )
  392. OperationMode = eOperatationMode.AutoMode;
  393. else
  394. OperationMode = eOperatationMode.ManualMode;
  395. }
  396. break;
  397. case "113":
  398. {
  399. }
  400. break;
  401. case "4012":
  402. if ( v[1].Equals( "3" ) )
  403. IsDriveMoving = true;
  404. else
  405. IsDriveMoving = false;
  406. break;
  407. case "3009":
  408. {
  409. int iV = 0;
  410. int.TryParse( v[1], out iV );
  411. this.CurrentPointNo = iV;
  412. int.TryParse( v[2], out iV );
  413. this.SegmentID = iV;
  414. //TODO: 6.29 DriveAutoReadyState
  415. if ( v[3].Equals( "0" ) )
  416. IsCanStanbyLocation = false;
  417. else
  418. IsCanStanbyLocation = true;
  419. }
  420. break;
  421. case "4094":
  422. {
  423. var mb = new MemoryBuffer();
  424. for ( int i = 1; i < v.Length; i++ )
  425. {
  426. var _2b = v[i].Replace( "0x", "" );
  427. mb.Append( HexaUtils.StringToByte( _2b ) );
  428. }
  429. var ba = new BitArray( mb.ToBytes );
  430. }
  431. break;
  432. case "4098":
  433. break;
  434. default:
  435. break;
  436. }
  437. }
  438. else if ( ret[0].Equals( "getm" ) )
  439. {
  440. var v = ret[1].Split( '/' );
  441. switch ( v[0] )
  442. {
  443. case "3060":
  444. {
  445. switch ( this.steering.GetSteeringState() )
  446. {
  447. case eSteeringState.None:
  448. rep.SendMoreFrame( "getm" ).SendFrame( $"ok/{v[0]}/0" );
  449. break;
  450. case eSteeringState.Left:
  451. rep.SendMoreFrame( "getm" ).SendFrame( $"ok/{v[0]}/1" );
  452. break;
  453. case eSteeringState.Right:
  454. rep.SendMoreFrame( "getm" ).SendFrame( $"ok/{v[0]}/-1" );
  455. break;
  456. default:
  457. rep.SendMoreFrame( "getm" ).SendFrame( $"ok/{v[0]}/0" );
  458. break;
  459. }
  460. }
  461. break;
  462. default:
  463. break;
  464. }
  465. }
  466. else if ( ret[0].Equals( "sync" ) )
  467. {
  468. var v = ret[1].Split( '/' );
  469. rep.SendMoreFrame( ret[0] ).SendFrame( $"ok/{ret[1]}" ); //응답처리 부터 하자.
  470. }
  471. else if ( ret[0].Equals( "parameter" ) )
  472. {
  473. var v = ret[1].Split( '/' );
  474. rep.SendMoreFrame( ret[0] ).SendFrame( $"ok/{ret[1]}" ); //응답처리 부터 하자.
  475. }
  476. else
  477. rep.SendMoreFrame( ret[0] ).SendFrame( $"ok/{ret[1]}" );
  478. }
  479. catch ( Exception exception )
  480. {
  481. logger.E( exception );
  482. }
  483. }
  484. private void Sub_ReceiveReady( object sender, NetMQ.NetMQSocketEventArgs e )
  485. {
  486. var ret = e.Socket.ReceiveMultipartStrings();
  487. //logger.I( ret );
  488. var vl = ret[1].Split( '/' );
  489. switch ( ret[0] )
  490. {
  491. case "7028":
  492. {
  493. var ll = Convert.ToDouble( vl[0] );
  494. this.FrontRPM = Math.Truncate( ll * 100 ) / 100;
  495. var li = Convert.ToDouble( vl[1] );
  496. this.RearRPM = Math.Truncate( li * 100 ) / 100;
  497. }
  498. break;
  499. case "7030":
  500. {
  501. var ll = Convert.ToDouble( vl[0] );
  502. this.FrontLoadFactor = Math.Truncate( ll * 100 ) / 100;
  503. var rL = Convert.ToDouble( vl[1] );
  504. this.RearLoadFactor = Math.Truncate( rL * 100 ) / 100;
  505. }
  506. break;
  507. case "7121":
  508. this.CurrentMCR = vl[0];
  509. break;
  510. case "111": //0=StartUp, 1=DeviceOpened, 2=DiviceOpenFailed, 3=ManualOP, 4=AutomaticOp, 5=DeviceCloseed, 6=Finished
  511. break;
  512. case "3010": //진행중의 길의 모양, 0이면 정지 상태
  513. {
  514. var v = ret[1].Split( ';' );
  515. switch ( v[0] )
  516. {
  517. case "1":
  518. //this.RequestSteering = eSteeringState.Left;
  519. break;
  520. case "-1":
  521. //this.RequestSteering = eSteeringState.Right;
  522. break;
  523. default:
  524. //this.RequestSteering = eSteeringState.None;
  525. break;
  526. }
  527. }
  528. break;
  529. //case "Tag":
  530. // {
  531. // var v = ret[1].Split( ';' );
  532. // this.CurrentPointNo = Convert.ToInt16(v[0]);
  533. // }
  534. //break;
  535. default:
  536. break;
  537. }
  538. }
  539. object lockObj = new object();
  540. bool Request( string topic, string value, out string response )
  541. {
  542. logger.D( $"req - {value}" );
  543. List<string> repll = new List<string>();
  544. response = string.Empty;
  545. lock ( lockObj )
  546. {
  547. if ( !this.IsReqConnected )
  548. return false;
  549. try
  550. {
  551. //if ( this.req.HasOut )
  552. this.req.SendMoreFrame( topic ).SendFrame( value );
  553. if ( this.req.TryReceiveMultipartStrings( TimeSpan.FromSeconds( 5 ), ref repll ) )
  554. return true;
  555. else
  556. return false;
  557. }
  558. catch ( Exception e )
  559. {
  560. logger.E( e );
  561. this.req.Disconnect( "tcp://127.0.0.1:5567" );
  562. //this.monitor.Stop();
  563. //this.monitor.Dispose();
  564. //this.monitor = new NetMQMonitor( req, "inproc://rep.inproc", SocketEvents.Disconnected | SocketEvents.Connected );
  565. //this.monitor.Connected += ( s, a ) => { this.IsReqConnected = true; CurrentPointNo = GetCurrentPointNo(); };
  566. //this.monitor.Disconnected += ( s, a ) => { this.IsReqConnected = false; };
  567. //this.monitor.StartAsync();
  568. req.Connect( "tcp://127.0.0.1:5567" );
  569. return false;
  570. }
  571. }
  572. }
  573. bool SetRequest( string index, string value )
  574. {
  575. logger.D( $"req - {index} / {value}" );
  576. List<string> repll = new List<string>();
  577. if ( !this.IsReqConnected )
  578. return false;
  579. lock ( lockObj )
  580. {
  581. try
  582. {
  583. //if ( this.req.HasOut )
  584. this.req.SendMoreFrame( "setm" ).SendFrame( index + "/" + value );
  585. if ( !this.req.TryReceiveMultipartStrings( TimeSpan.FromSeconds( 5 ), ref repll ) )
  586. return false;
  587. }
  588. catch ( Exception e )
  589. {
  590. logger.E( e );
  591. this.req.Disconnect( "tcp://127.0.0.1:5567" );
  592. //this.monitor.Stop();
  593. //this.monitor.Dispose();
  594. //this.monitor = new NetMQMonitor( req, "inproc://rep.inproc", SocketEvents.Disconnected | SocketEvents.Connected );
  595. //this.monitor.Connected += ( s, a ) => { this.IsReqConnected = true; CurrentPointNo = GetCurrentPointNo(); };
  596. //this.monitor.Disconnected += ( s, a ) => { this.IsReqConnected = false; };
  597. //this.monitor.StartAsync();
  598. req.Connect( "tcp://127.0.0.1:5567" );
  599. return false;
  600. }
  601. }
  602. return true;
  603. }
  604. bool GetRequst( string index, out List<string> vll )
  605. {
  606. logger.D( $"req - {index}" );
  607. vll = new List<string>();
  608. if ( !this.IsReqConnected )
  609. return false;
  610. lock ( lockObj )
  611. {
  612. try
  613. {
  614. //if ( this.req.HasOut )
  615. this.req.SendMoreFrame( "getm" ).SendFrame( index );
  616. List<string> repll = new List<string>();
  617. if ( !this.req.TryReceiveMultipartStrings( TimeSpan.FromSeconds( 5 ), ref repll ) )
  618. return false;
  619. repll.RemoveAt( 0 );
  620. var ret = repll[0].Split( '/' );
  621. repll.Clear();
  622. foreach ( var item in ret )
  623. {
  624. if ( item.Equals( "ok" ) || item.Equals( "nok" ) || item.Equals( index ) )
  625. continue;
  626. repll.Add( item );
  627. }
  628. vll = repll;
  629. }
  630. catch ( Exception e )
  631. {
  632. logger.E( e );
  633. this.req.Dispose();
  634. req = new RequestSocket();
  635. req.Connect( "tcp://127.0.0.1:5567" );
  636. return false;
  637. }
  638. }
  639. return true;
  640. }
  641. #region RequestSocket
  642. List<string> GetRequest( string index )
  643. {
  644. var rll = RequestDrive( "getm", index );
  645. if ( rll.Count == 0 )
  646. return rll;
  647. rll.RemoveAt( 0 );
  648. var ret = rll[0].Split( '/' );
  649. List<string> retll = new List<string>();
  650. foreach ( var item in ret )
  651. {
  652. if ( item.Equals( "ok" ) || item.Equals( "nok" ) || item.Equals( index ) )
  653. continue;
  654. retll.Add( item );
  655. }
  656. return retll;
  657. }
  658. List<string> RequestDrive( string key, string msg )
  659. {
  660. logger.D( $"[Request] - {key} / {msg}" );
  661. var client = this.CreateRequestSocket( endServer );
  662. client.SendMoreFrame( key ).SendFrame( msg );
  663. var ll = new List<string>();
  664. //if ( !client.Poll( TimeSpan.FromMilliseconds( 2000 ) ) )
  665. // isSuccess = false;
  666. if ( !client.TryReceiveMultipartStrings( TimeSpan.FromSeconds( 1 ), ref ll ) )
  667. logger.D( $"[Reply Timeout] - {key} / {msg}" );
  668. this.TerminateRequestSocket( client );
  669. return ll;
  670. }
  671. RequestSocket CreateRequestSocket( string endServer )
  672. {
  673. var guid = Guid.NewGuid();
  674. var client = new RequestSocket
  675. {
  676. Options =
  677. {
  678. Linger = TimeSpan.Zero,
  679. Identity = Encoding.Unicode.GetBytes(guid.ToString())
  680. }
  681. };
  682. client.Connect( endServer );
  683. //client.ReceiveReady += Client_ReceiveReady;
  684. return client;
  685. }
  686. void TerminateRequestSocket( RequestSocket client )
  687. {
  688. client.Disconnect( this.endServer );
  689. client.Close();
  690. }
  691. private void Client_ReceiveReady( object sender, NetMQSocketEventArgs e )
  692. {
  693. var rsp = e.Socket.ReceiveMultipartStrings();
  694. logger.D( $"[Reply] - {rsp[0]} / {rsp[1]}" );
  695. switch ( rsp[0] )
  696. {
  697. case "3009":
  698. break;
  699. default:
  700. break;
  701. }
  702. }
  703. #endregion
  704. #region Get Request Method
  705. public int GetWarningCode()
  706. {
  707. int ret = 0;
  708. var rll = this.GetRequest( "4094" );
  709. if ( rll.Count == 0 )
  710. return 0;
  711. if ( !int.TryParse( rll[0], out ret ) )
  712. logger.E( $"[Get Warning Code] - Try Parse Error" );
  713. return ret;
  714. }
  715. public int GetFaultCode()
  716. {
  717. int ret = 0;
  718. var rll = this.GetRequest( "4098" );
  719. if ( rll.Count == 0 )
  720. return 0;
  721. if ( !int.TryParse( rll[0], out ret ) )
  722. logger.E( $"[Get Fault Code] - Try Parse Error" );
  723. return ret;
  724. }
  725. public eOperatationMode GetOperationMode()
  726. {
  727. var rll = GetRequest( "111" );
  728. if ( rll.Count == 0 )
  729. {
  730. logger.E( $"[Get Operation Mode] - Response Time Out" );
  731. return eOperatationMode.InitialMode;
  732. }
  733. if ( rll[0].Equals( "4" ) )
  734. return eOperatationMode.AutoMode;
  735. else
  736. return eOperatationMode.ManualMode;
  737. }
  738. public int GetCurrentPointNo()
  739. {
  740. int ret = 0;
  741. var rll = this.GetRequest( "3009" );
  742. if ( rll.Count == 0 )
  743. return 0;
  744. if ( !int.TryParse( rll[0], out ret ) )
  745. logger.E( $"[Get Current Point] - Try Parse Error" );
  746. return ret;
  747. }
  748. #endregion
  749. #region Set Request Method
  750. internal int SetDriveControl( eDriveControl control )
  751. {
  752. int result = ConstInt.EXECUTE_SUCCESS;
  753. switch ( control )
  754. {
  755. case eDriveControl.None:
  756. break;
  757. case eDriveControl.ParameterSave:
  758. break;
  759. case eDriveControl.ResetFault:
  760. break;
  761. case eDriveControl.CancelRoute:
  762. break;
  763. case eDriveControl.ServoOn:
  764. break;
  765. case eDriveControl.ServoOff:
  766. break;
  767. case eDriveControl.ClearWarning:
  768. break;
  769. default:
  770. break;
  771. }
  772. var rll = this.RequestDrive( "setm", $"4011/{( (int)control ).ToString()}" );
  773. if ( rll.Count == 0 )
  774. {
  775. logger.E( $"[Set Drive Control] - Response Time Out" );
  776. return 38;
  777. }
  778. return result;
  779. }
  780. internal int SetStartMove( bool isArrayCommand = false )
  781. {
  782. string cmd = string.Empty;
  783. if ( isArrayCommand )
  784. cmd = "3";
  785. else
  786. cmd = "2";
  787. var rll = this.RequestDrive( "setm", $"3031/{cmd}" );
  788. if ( rll.Count == 0 )
  789. {
  790. logger.E( $"[Set Start Move] - Response Time Out" );
  791. return 38;
  792. }
  793. return ConstInt.EXECUTE_SUCCESS;
  794. }
  795. internal int SetTargetPoint( string point )
  796. {
  797. var rll = this.RequestDrive( "setm", $"3033/{point}" );
  798. if ( rll.Count == 0 )
  799. {
  800. logger.E( $"[Set TargetPoint] - Response Time Out" );
  801. return 38;
  802. }
  803. return ConstInt.EXECUTE_SUCCESS;
  804. }
  805. internal int SetTargetPointArray( string point )
  806. {
  807. var rll = this.RequestDrive( "setm", $"3034/{point}" );
  808. if ( rll.Count == 0 )
  809. {
  810. logger.E( $"[Set TargetPoint] - Response Time Out" );
  811. return 38;
  812. }
  813. return ConstInt.EXECUTE_SUCCESS;
  814. }
  815. internal void SetObstruction( eObstacleState state )
  816. {
  817. string outStr = string.Empty;
  818. string val = string.Empty;
  819. switch ( state )
  820. {
  821. case eObstacleState.Normal:
  822. val = "0";
  823. break;
  824. case eObstacleState.Abnormal:
  825. val = "3";
  826. break;
  827. case eObstacleState.Blocked:
  828. val = "2";
  829. break;
  830. case eObstacleState.Decelerate:
  831. val = "1";
  832. break;
  833. default:
  834. break;
  835. }
  836. var rll = this.RequestDrive( "setm", $"5001/{val}" );
  837. if ( rll.Count == 0 )
  838. logger.E( $"[Set Obstruction] - Response Time Out" );
  839. }
  840. internal bool SetOperationState( eOperatationMode mode )
  841. {
  842. string outStr = string.Empty;
  843. string val = string.Empty;
  844. if ( mode == eOperatationMode.AutoMode )
  845. val = "2";
  846. else if ( mode == eOperatationMode.ManualMode )
  847. val = "3";
  848. else
  849. return false;
  850. var rll = this.RequestDrive( "setm", $"112/{val}" );
  851. if ( rll.Count == 0 )
  852. {
  853. logger.E( $"[Set Operation State] - Response Time Out" );
  854. return false;
  855. }
  856. return true;
  857. }
  858. internal void SetMCState( bool isOn )
  859. {
  860. string outStr = string.Empty;
  861. string val = string.Empty;
  862. if ( isOn )
  863. val = "1";
  864. else
  865. val = "0";
  866. var rll = this.RequestDrive( "setm", $"5000/{val}" );
  867. if ( rll.Count == 0 )
  868. logger.E( $"[Set MCState] - Response Time Out" );
  869. }
  870. internal void SetCurrentSteeringState( eSteeringState state )
  871. {
  872. string outStr = string.Empty;
  873. string val = string.Empty;
  874. switch ( state )
  875. {
  876. case eSteeringState.None:
  877. val = "0";
  878. break;
  879. case eSteeringState.Left:
  880. val = "1";
  881. break;
  882. case eSteeringState.Right:
  883. val = "-1";
  884. break;
  885. default:
  886. break;
  887. }
  888. var rll = this.RequestDrive( "setm", $"3060/{val}" );
  889. if ( rll.Count == 0 )
  890. {
  891. logger.E( $"[Set Current Steering] - Response Time Out" );
  892. return;
  893. }
  894. logger.D( $"[Steering_Req] - 3060/{val}" );
  895. }
  896. internal void SetSafetyBumper()
  897. {
  898. var rll = this.RequestDrive( "setm", $"6105/1" );
  899. if ( rll.Count == 0 )
  900. {
  901. logger.E( $"[Set Safety Bumper] - Bumper is Pushed Time Out" );
  902. return;
  903. }
  904. logger.D( $"[Set Safety Bumper] - Bumper is Pushed" );
  905. }
  906. /// <summary>
  907. /// forward 1, backward -1
  908. /// </summary>
  909. /// <param name="isForward"></param>
  910. internal void SetJogMove( bool isForward = true )
  911. {
  912. string v = string.Empty;
  913. if ( isForward )
  914. v = "1";
  915. else
  916. v = "-1";
  917. logger.E( $"Jog Dir : <True +, False -> {isForward}" );
  918. var rll = this.RequestDrive( "setm", $"4091/{v}" );
  919. if ( rll.Count == 0 )
  920. {
  921. logger.E( $"[Set Jog Move] - Jog Move Time Out" );
  922. return;
  923. }
  924. }
  925. internal void SetQuickStop()
  926. {
  927. var rll = this.RequestDrive( "setm", $"4092/3" );
  928. if ( rll.Count == 0 )
  929. {
  930. logger.E( $"[Set Drive Command] - Quick Stop Time Out" );
  931. return;
  932. }
  933. logger.D( $"[Set Drive Command] - Set Quick Stop" );
  934. }
  935. #endregion
  936. #region Get/Set Parameter
  937. public double GetJogSpeed()
  938. {
  939. var rll = this.RequestDrive( "getm", "4053" );
  940. if ( rll.Count == 0 )
  941. {
  942. logger.E( $"[Set Jog Speed] - Jog Speed Time Out" );
  943. return 0d;
  944. }
  945. double ret = 0d;
  946. double.TryParse( rll[0], out ret );
  947. return ret;
  948. }
  949. /// <summary>
  950. /// 전진 후진 동시에 같은 값으로 설정.
  951. /// </summary>
  952. /// <param name="speed"></param>
  953. internal bool SetJogSpeed( double speed )
  954. {
  955. var rll = this.RequestDrive( "setm", $"4053/{speed}/{speed}" );
  956. if ( rll.Count == 0 )
  957. {
  958. logger.E( $"[Set Drive Speed] - Drive Speed Time Out" );
  959. return false;
  960. }
  961. //if ( !this.SetRequest( "6105", "1" ) )
  962. // logger.E( $"[Set Safety Bumper] - Bumper is Pushed Time Out" );
  963. logger.D( $"[Set Jog Speed] - Set Jog Speed {speed}" );
  964. return true;
  965. }
  966. public double GetDriveLinerSpeed()
  967. {
  968. var rll = this.RequestDrive( "getm", "3016" );
  969. if ( rll.Count == 0 )
  970. {
  971. logger.E( $"[Set Drive Speed] - Drive Speed Time Out" );
  972. return 0d;
  973. }
  974. double ret = 0d;
  975. double.TryParse( rll[0], out ret );
  976. return ret;
  977. }
  978. public double GetDriveCurveSpeed()
  979. {
  980. var rll = this.RequestDrive( "getm", "3016" );
  981. if ( rll.Count == 0 )
  982. {
  983. logger.E( $"[Set Drive Speed] - Drive Speed Time Out" );
  984. return 0d;
  985. }
  986. double ret = 0d;
  987. double.TryParse( rll[1], out ret );
  988. return ret;
  989. }
  990. public double GetAccelSpeed()
  991. {
  992. //TODO: GetAccelSpeed(???) Value 입력 필요
  993. var rll = this.RequestDrive("getm", "9999");
  994. if(rll.Count == 0)
  995. {
  996. logger.E($"[Get Accel Speed] - Accel Speed Time Out");
  997. return 0d;
  998. }
  999. var ret = 0d;
  1000. double.TryParse(rll[1], out ret);
  1001. return ret;
  1002. }
  1003. public double GetDecelSpeed()
  1004. {
  1005. //TODO: GetDecelSpeed(??) Value 입력 필요
  1006. var rll = this.RequestDrive("getm", "9999");
  1007. if (rll.Count == 0)
  1008. {
  1009. logger.E($"[Get Decel Speed] - Decel Speed Time Out");
  1010. return 0d;
  1011. }
  1012. var ret = 0d;
  1013. double.TryParse(rll[1], out ret);
  1014. return ret;
  1015. }
  1016. public double GetCreepSpeed()
  1017. {
  1018. //TODO: GetCreepSpeed(???) Vlaue 입력 필요
  1019. var rll = this.RequestDrive("getm", "9999");
  1020. if (rll.Count == 0)
  1021. {
  1022. logger.E($"[Get Creep Speed] - Creep Speed Time Out");
  1023. return 0d;
  1024. }
  1025. var ret = 0d;
  1026. double.TryParse(rll[1], out ret);
  1027. return ret;
  1028. }
  1029. public double GetCreepDistance()
  1030. {
  1031. //TODO: GetCreepDistance(???) Vlaue 입력 필요
  1032. var rll = this.RequestDrive("getm", "9999");
  1033. if (rll.Count == 0)
  1034. {
  1035. logger.E($"[Get Creep Distance] - Creep Distance Time Out");
  1036. return 0d;
  1037. }
  1038. var ret = 0d;
  1039. double.TryParse(rll[1], out ret);
  1040. return ret;
  1041. }
  1042. internal bool SetDriveSpeed( string linear, string curve )
  1043. {
  1044. var rll = this.RequestDrive("setm", $"3016/{linear}/{curve}");
  1045. if ( rll.Count == 0 )
  1046. {
  1047. logger.E( $"[Set Drive Speed] - Drive Speed Time Out" );
  1048. return false;
  1049. }
  1050. //if ( !this.SetRequest( "6105", "1" ) )
  1051. // logger.E( $"[Set Safety Bumper] - Bumper is Pushed Time Out" );
  1052. logger.D( $"[Set Drive Speed] - Set Drive Speed Liner{linear}, Curve{curve}" );
  1053. return true;
  1054. }
  1055. internal bool SetDriveSpeedProfile( string accel, string decel, string creep, string creepDistance )
  1056. {
  1057. var rll = this.RequestDrive( "setm", $"3013/{accel}/{decel}/{creep}/{creepDistance}" );
  1058. if ( rll.Count == 0 )
  1059. {
  1060. logger.E( $"[Set Drive Speed] - Drive Speed Time Out" );
  1061. return false;
  1062. }
  1063. //if ( !this.SetRequest( "6105", "1" ) )
  1064. // logger.E( $"[Set Safety Bumper] - Bumper is Pushed Time Out" );
  1065. logger.D( $"[Set Drive Speed] - Set Drive Speed Accel {accel}, Decel {decel}, Creep{creep}/{creepDistance}" );
  1066. return true;
  1067. }
  1068. #endregion
  1069. }
  1070. }