IoTriStateLift4.cs 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740
  1. using Aitex.Core.RT.Device;
  2. using Aitex.Core.RT.Event;
  3. using Aitex.Core.RT.IOCore;
  4. using System.Xml;
  5. using System.Diagnostics;
  6. using Aitex.Core.Common.DeviceData;
  7. using Aitex.Core.RT.DataCenter;
  8. using Aitex.Core.RT.SCCore;
  9. using Aitex.Core.RT.OperationCenter;
  10. using VirgoCommon;
  11. using Aitex.Core.Util;
  12. using System;
  13. namespace VirgoRT.Devices
  14. {
  15. public class IoTriStateLift4 : BaseDevice, IDevice
  16. {
  17. private readonly DIAccessor _diOrigin;//是否到达原点
  18. private readonly DIAccessor _diP1;//是否到达位置1
  19. private readonly DIAccessor _diP2;//是否到达位置2
  20. private readonly DIAccessor _diP3;//是否到达位置3
  21. private readonly DIAccessor _diABSAlarm;//去位置1,2,3超时
  22. private readonly DIAccessor _diORGAlarm;//去原点超时
  23. //private readonly DIAccessor _diServoAlarm; // servo alarm
  24. //private readonly DIAccessor _diCCWLimitSensorAlarm; //
  25. private readonly DIAccessor _diOverSoftwareLimitAlarm; //
  26. private readonly DIAccessor _diServo1BrakeON;
  27. private readonly DIAccessor _diServo2BrakeON;
  28. private readonly DIAccessor _diServo3BrakeON;
  29. private readonly DIAccessor _diServo4BrakeON;
  30. private readonly DIAccessor _diServoFSTP;
  31. private readonly DOAccessor _doReset;
  32. private readonly DOAccessor _doOrigin;//去原点
  33. private readonly DOAccessor _doP1;//去位置1
  34. private readonly DOAccessor _doP2;//去位置2
  35. private readonly DOAccessor _doP3;//去位置3
  36. private readonly DOAccessor _doStop;
  37. private readonly DOAccessor _doUp;
  38. private readonly DOAccessor _doDown;
  39. private readonly DOAccessor _doServo1JogUP;
  40. private readonly DOAccessor _doServo1JogDOWN;
  41. private readonly DOAccessor _doServo1Stop;
  42. private readonly DOAccessor _doServo1StepUp;
  43. private readonly DOAccessor _doServo1StepDOWN;
  44. private readonly DOAccessor _doServo2JogUP;
  45. private readonly DOAccessor _doServo2JogDOWN;
  46. private readonly DOAccessor _doServo2Stop;
  47. private readonly DOAccessor _doServo2StepUp;
  48. private readonly DOAccessor _doServo2StepDOWN;
  49. private readonly DOAccessor _doServo3JogUP;
  50. private readonly DOAccessor _doServo3JogDOWN;
  51. private readonly DOAccessor _doServo3Stop;
  52. private readonly DOAccessor _doServo3StepUp;
  53. private readonly DOAccessor _doServo3StepDOWN;
  54. private readonly DOAccessor _doServo4JogUP;
  55. private readonly DOAccessor _doServo4JogDOWN;
  56. private readonly DOAccessor _doServo4Stop;
  57. private readonly DOAccessor _doServo4StepUp;
  58. private readonly DOAccessor _doServo4StepDOWN;
  59. private readonly AIAccessor _currentValue;
  60. private readonly AIAccessor _currentSpeed;//aiCurrentSpeed
  61. private readonly AIAccessor _aiMotor1CurrentPosition;
  62. private readonly AIAccessor _aiMotor2CurrentPosition;
  63. private readonly AIAccessor _aiMotor3CurrentPosition;
  64. private readonly AIAccessor _aiMotor4CurrentPosition;
  65. private readonly AIAccessor _aiServo1AlarmCode;
  66. private readonly AIAccessor _aiServo2AlarmCode;
  67. private readonly AIAccessor _aiServo3AlarmCode;
  68. private readonly AIAccessor _aiServo4AlarmCode;
  69. private readonly AIAccessor _aiServoSVRAlarmCode;
  70. private readonly AIAccessor _aiServo1WarningCode;
  71. private readonly AIAccessor _aiServo2WarningCode;
  72. private readonly AIAccessor _aiServo3WarningCode;
  73. private readonly AIAccessor _aiServo4WarningCode;
  74. private readonly AIAccessor _aiServoSVRWarningCode;
  75. private readonly AOAccessor _aoSetP1;
  76. private readonly AOAccessor _aoSetP2;
  77. private readonly AOAccessor _aoSetP3;
  78. //private readonly AOAccessor _aoServoEnable;
  79. private readonly AOAccessor _aoAutoSpeed;
  80. private readonly AOAccessor _aoManualSpeed;
  81. private readonly AOAccessor _aoAccOrDecTime;
  82. //private readonly AOAccessor _aoDecTime;
  83. private readonly AOAccessor _aoCCWLimitPosition;
  84. private readonly AOAccessor _aoCWLimitPosition;
  85. //private readonly AOAccessor _aoCorrectionValue;
  86. private readonly AOAccessor _aoStepDistance;
  87. private readonly AOAccessor _aoWorkMode;
  88. private readonly AOAccessor _aoSingleAxisManualSpeed;
  89. private readonly AOAccessor _aoOriginOffset;
  90. private Stopwatch sw = new Stopwatch();
  91. private Stopwatch _manualStopTimer = new Stopwatch();
  92. private readonly int _stopButtonAutoResetTime = 1000;
  93. private Position _currentTarget = Position.Invalid;
  94. long _timeout = 10000;
  95. private bool _bAlarmReported = false;
  96. private AITTriStateLiftPinData DeviceData
  97. {
  98. get
  99. {
  100. AITTriStateLiftPinData deviceData = new AITTriStateLiftPinData
  101. {
  102. Module = Module,
  103. DeviceName = Name,
  104. DeviceSchematicId = DeviceID,
  105. DisplayName = Display,
  106. };
  107. return deviceData;
  108. }
  109. }
  110. public MovementPosition PinPosition
  111. {
  112. get
  113. {
  114. if (_diP1.Value && _diP2.Value == false && _diP3.Value == false)
  115. return MovementPosition.Up;
  116. else if (_diP1.Value == false && _diP2.Value && _diP3.Value == false)
  117. return MovementPosition.Middle;
  118. else if (_diP1.Value == false && _diP2.Value == false && _diP3.Value)
  119. return MovementPosition.Down;
  120. else if (_diOrigin.Value)
  121. return MovementPosition.Origin;
  122. return MovementPosition.Unknown;
  123. }
  124. }
  125. public int PinPositionint
  126. {
  127. get
  128. {
  129. if (PinPosition == MovementPosition.Up)
  130. return 3;
  131. else if (PinPosition == MovementPosition.Middle)
  132. return 2;
  133. else if (PinPosition == MovementPosition.Down)
  134. return 1;
  135. else if (PinPosition == MovementPosition.Origin)
  136. return 0;
  137. return -1;
  138. }
  139. }
  140. public IoTriStateLift4(string module, XmlElement node, string ioModule = "")
  141. {
  142. base.Module = module;
  143. base.Name = node.GetAttribute("id");
  144. base.Display = node.GetAttribute("display");
  145. base.DeviceID = node.GetAttribute("schematicId");
  146. _diOrigin = ParseDiNode("diOrigin", node, ioModule);
  147. _diP1 = ParseDiNode("diP1", node, ioModule);
  148. _diP2 = ParseDiNode("diP2", node, ioModule);
  149. _diP3 = ParseDiNode("diP3", node, ioModule);
  150. _diABSAlarm = ParseDiNode("diABSAlarm", node, ioModule);
  151. _diORGAlarm = ParseDiNode("diORGAlarm", node, ioModule);
  152. _diOverSoftwareLimitAlarm = ParseDiNode("diOverSoftwareLimitAlarm", node, ioModule);
  153. _diServo1BrakeON = ParseDiNode("diServo1BrakeON", node, ioModule);
  154. _diServo2BrakeON = ParseDiNode("diServo2BrakeON", node, ioModule);
  155. _diServo3BrakeON = ParseDiNode("diServo3BrakeON", node, ioModule);
  156. _diServo4BrakeON = ParseDiNode("diServo4BrakeON", node, ioModule);
  157. _diServoFSTP = ParseDiNode("diServoFSTP", node, ioModule);
  158. //_diServoAlarm = ParseDiNode("diServoAlarm", node, ioModule);
  159. //_diCCWLimitSensorAlarm = ParseDiNode("diCCWLimitAlarm", node, ioModule);
  160. _doReset = ParseDoNode("doReset", node, ioModule);
  161. _doOrigin = ParseDoNode("doOrigin", node, ioModule);
  162. _doP1 = ParseDoNode("doP1", node, ioModule);
  163. _doP2 = ParseDoNode("doP2", node, ioModule);
  164. _doP3 = ParseDoNode("doP3", node, ioModule);
  165. _doStop = ParseDoNode("doStop", node, ioModule);
  166. _doUp = ParseDoNode("doUp", node, ioModule);
  167. _doDown = ParseDoNode("doDown", node, ioModule);
  168. _currentValue = ParseAiNode("aiCurrentValue", node, ioModule);
  169. _currentSpeed = ParseAiNode("aiCurrentSpeed", node, ioModule);
  170. _aiMotor1CurrentPosition = ParseAiNode("aiMotor1CurrentPosition", node, ioModule);
  171. _aiMotor2CurrentPosition = ParseAiNode("aiMotor2CurrentPosition", node, ioModule);
  172. _aiMotor3CurrentPosition = ParseAiNode("aiMotor3CurrentPosition", node, ioModule);
  173. _aiMotor4CurrentPosition = ParseAiNode("aiMotor4CurrentPosition", node, ioModule);
  174. _aiServo1AlarmCode = ParseAiNode("aiServo1AlarmCode", node, ioModule);
  175. _aiServo2AlarmCode = ParseAiNode("aiServo2AlarmCode", node, ioModule);
  176. _aiServo3AlarmCode = ParseAiNode("aiServo3AlarmCode", node, ioModule);
  177. _aiServo4AlarmCode = ParseAiNode("aiServo4AlarmCode", node, ioModule);
  178. _aiServoSVRAlarmCode = ParseAiNode("aiServoSVRAlarmCode", node, ioModule);
  179. _aiServo1WarningCode = ParseAiNode("aiServo1WarningCode", node, ioModule);
  180. _aiServo2WarningCode = ParseAiNode("aiServo2WarningCode", node, ioModule);
  181. _aiServo3WarningCode = ParseAiNode("aiServo3WarningCode", node, ioModule);
  182. _aiServo4WarningCode = ParseAiNode("aiServo4WarningCode", node, ioModule);
  183. _aiServoSVRWarningCode = ParseAiNode("aiServoSVRWarningCode", node, ioModule);
  184. _aoSetP1 = ParseAoNode("aoSetP1", node, ioModule);
  185. _aoSetP2 = ParseAoNode("aoSetP2", node, ioModule);
  186. _aoSetP3 = ParseAoNode("aoSetP3", node, ioModule);
  187. //_aoServoEnable = ParseAoNode("aoServoEnable", node, ioModule);
  188. _aoAutoSpeed = ParseAoNode("aoAutoSpeed", node, ioModule);
  189. _aoManualSpeed = ParseAoNode("aoManualSpeed", node, ioModule);
  190. _aoAccOrDecTime = ParseAoNode("aoAccOrDecTime", node, ioModule);
  191. //_aoDecTime = ParseAoNode("aoDecTime", node, ioModule);
  192. _aoCCWLimitPosition = ParseAoNode("aoCCWLimitPosition", node, ioModule);
  193. _aoCWLimitPosition = ParseAoNode("aoCWLimitPosition", node, ioModule);
  194. //_aoCorrectionValue = ParseAoNode("aoCorrectionValue", node, ioModule);
  195. _aoStepDistance = ParseAoNode("aoStepDistance", node, ioModule);
  196. _aoWorkMode = ParseAoNode("aoWorkMode", node, ioModule);
  197. _aoSingleAxisManualSpeed = ParseAoNode("aoSingleAxisManualSpeed", node, ioModule);
  198. _aoOriginOffset = ParseAoNode("aoOriginOffset", node, ioModule);
  199. _doServo1JogUP = ParseDoNode("doServo1JogUP", node, ioModule);
  200. _doServo1JogDOWN = ParseDoNode("doServo1JogDOWN", node, ioModule);
  201. _doServo1Stop = ParseDoNode("doServo1Stop", node, ioModule);
  202. _doServo1StepUp = ParseDoNode("doServo1StepUp", node, ioModule);
  203. _doServo1StepDOWN = ParseDoNode("doServo1StepDOWN", node, ioModule);
  204. _doServo2JogUP = ParseDoNode("doServo2JogUP", node, ioModule);
  205. _doServo2JogDOWN = ParseDoNode("doServo2JogDOWN", node, ioModule);
  206. _doServo2Stop = ParseDoNode("doServo2Stop", node, ioModule);
  207. _doServo2StepUp = ParseDoNode("doServo2StepUp", node, ioModule);
  208. _doServo2StepDOWN = ParseDoNode("doServo2StepDOWN", node, ioModule);
  209. _doServo3JogUP = ParseDoNode("doServo3JogUP", node, ioModule);
  210. _doServo3JogDOWN = ParseDoNode("doServo3JogDOWN", node, ioModule);
  211. _doServo3Stop = ParseDoNode("doServo3Stop", node, ioModule);
  212. _doServo3StepUp = ParseDoNode("doServo3StepUp", node, ioModule);
  213. _doServo3StepDOWN = ParseDoNode("doServo3StepDOWN", node, ioModule);
  214. _doServo4JogUP = ParseDoNode("doServo4JogUP", node, ioModule);
  215. _doServo4JogDOWN = ParseDoNode("doServo4JogDOWN", node, ioModule);
  216. _doServo4Stop = ParseDoNode("doServo4Stop", node, ioModule);
  217. _doServo4StepUp = ParseDoNode("doServo4StepUp", node, ioModule);
  218. _doServo4StepDOWN = ParseDoNode("doServo4StepDOWN", node, ioModule);
  219. _timeout = (int)SC.GetValue<int>($"{Module}.LiftUpDownTimeout") * 1000;
  220. }
  221. private void updatePinCfg()
  222. {
  223. // AO-27, Lift Servo Enable: 0=Lift Pin ,1=Lift Servo
  224. //_SetRealFloat(_aoServoEnable, 1);
  225. void _updateItem(string data, AOAccessor ao)
  226. {
  227. var value = (float)SC.GetValue<double>($"{Module}.{Name}.{data}");
  228. _SetRealFloat(ao, value);
  229. }
  230. _updateItem("AutoSpeed", _aoAutoSpeed);
  231. _updateItem("ManualSpeed", _aoManualSpeed);
  232. _updateItem("AccOrDecTime", _aoAccOrDecTime);
  233. _updateItem("CCWLimitPosition", _aoCCWLimitPosition);
  234. _updateItem("CWLimitPosition", _aoCWLimitPosition);
  235. //_updateItem("CorrectionValue", _aoCorrectionValue);
  236. _updateItem("Position1", _aoSetP1);
  237. _updateItem("Position2", _aoSetP2);
  238. _updateItem("Position3", _aoSetP3);
  239. _updateItem("StepDistance", _aoStepDistance);
  240. _updateItem("WorkMode", _aoWorkMode);
  241. _updateItem("SingleAxisManualSpeed", _aoSingleAxisManualSpeed);
  242. _updateItem("OriginOffset", _aoOriginOffset);
  243. }
  244. public bool GoPosition(Position position)
  245. {
  246. Reset();
  247. if (!_diServo1BrakeON.Value)
  248. {
  249. NoDuplicatedAlarm($"Lift Pin DI-{_diServo1BrakeON.Index} alarm");
  250. return false;
  251. }
  252. if (!_diServo2BrakeON.Value)
  253. {
  254. NoDuplicatedAlarm($"Lift Pin DI-{_diServo2BrakeON.Index} alarm");
  255. return false;
  256. }
  257. if (!_diServo3BrakeON.Value)
  258. {
  259. NoDuplicatedAlarm($"Lift Pin DI-{_diServo3BrakeON.Index} alarm");
  260. return false;
  261. }
  262. if (!_diServo4BrakeON.Value)
  263. {
  264. NoDuplicatedAlarm($"Lift Pin DI-{_diServo4BrakeON.Index} alarm");
  265. return false;
  266. }
  267. if (!_diServoFSTP.Value)
  268. {
  269. NoDuplicatedAlarm($"Lift Pin DI-{_diServoFSTP.Index} alarm");
  270. return false;
  271. }
  272. if (_diABSAlarm.Value)
  273. {
  274. NoDuplicatedAlarm($"Lift Pin DI-{_diABSAlarm.Index} alarm");
  275. return false;
  276. }
  277. _currentTarget = position;
  278. sw.Restart();
  279. switch (position)
  280. {
  281. case Position.position1:
  282. _doP1.Value = true;
  283. _doP2.Value = false;
  284. _doP3.Value = false;
  285. break;
  286. case Position.position2:
  287. _doP1.Value = false;
  288. _doP2.Value = true;
  289. _doP3.Value = false;
  290. break;
  291. case Position.position3:
  292. _doP1.Value = false;
  293. _doP2.Value = false;
  294. _doP3.Value = true;
  295. break;
  296. case Position.origin:
  297. {
  298. if (_diOrigin.Value)
  299. {
  300. EV.PostInfoLog(Module, $"Lift Pin already on original position.");
  301. sw.Stop();
  302. return true;
  303. }
  304. _doOrigin.Value = true;
  305. }
  306. break;
  307. }
  308. EV.PostInfoLog(Module, $"Lift Pin goto {_currentTarget}");
  309. return true;
  310. }
  311. public bool ManulStop()
  312. {
  313. if (_diABSAlarm.Value)
  314. return false;
  315. _doUp.Value = false;
  316. _doDown.Value = false;
  317. _doStop.Value = true;
  318. _manualStopTimer.Restart();
  319. return true;
  320. }
  321. public bool ManulUp()
  322. {
  323. if (_diABSAlarm.Value)
  324. return false;
  325. _doDown.Value = false;
  326. _doStop.Value = false;
  327. _doUp.Value = !_doUp.Value;
  328. return true;
  329. }
  330. public bool ManulDown()
  331. {
  332. if (_diABSAlarm.Value)
  333. return false;
  334. _doUp.Value = false;
  335. _doStop.Value = false;
  336. _doDown.Value = !_doDown.Value;
  337. return true;
  338. }
  339. public bool ServoOP(DOAccessor doTrue, params DOAccessor[] otherDoFalses)
  340. {
  341. if (_diABSAlarm.Value)
  342. return false;
  343. doTrue.Value = true;
  344. Array.ForEach(otherDoFalses, p => p.Value = false);
  345. return true;
  346. }
  347. public float CurrentValue
  348. {
  349. get
  350. {
  351. if (_currentValue == null)
  352. {
  353. return 0;
  354. }
  355. return _GetRealFloat(_currentValue); ;
  356. }
  357. }
  358. public bool Initialize()
  359. {
  360. DATA.Subscribe($"{Module}.{Name}.DeviceData", () => DeviceData, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  361. DATA.Subscribe($"{Module}.{Name}.PinPosition", () => PinPositionint, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  362. DATA.Subscribe($"{Module}.{Name}.CurrentValue", () => CurrentValue, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  363. DATA.Subscribe($"{Module}.{Name}.ServoWithOrigin", () => _diOrigin.Value, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  364. DATA.Subscribe($"{Module}.{Name}.CurrentSpeed", () => _GetRealFloat(_currentSpeed), SubscriptionAttribute.FLAG.IgnoreSaveDB);
  365. DATA.Subscribe($"{Module}.{Name}.ManualStopState", () => _doStop.Value, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  366. DATA.Subscribe($"{Module}.{Name}.ManualUpState", () => _doUp.Value, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  367. DATA.Subscribe($"{Module}.{Name}.ManualDownState", () => _doDown.Value, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  368. DATA.Subscribe($"{Module}.{Name}.Motor1CurrentPosition", () => _GetRealFloat(_aiMotor1CurrentPosition), SubscriptionAttribute.FLAG.IgnoreSaveDB);
  369. DATA.Subscribe($"{Module}.{Name}.Motor2CurrentPosition", () => _GetRealFloat(_aiMotor2CurrentPosition), SubscriptionAttribute.FLAG.IgnoreSaveDB);
  370. DATA.Subscribe($"{Module}.{Name}.Motor3CurrentPosition", () => _GetRealFloat(_aiMotor3CurrentPosition), SubscriptionAttribute.FLAG.IgnoreSaveDB);
  371. DATA.Subscribe($"{Module}.{Name}.Motor4CurrentPosition", () => _GetRealFloat(_aiMotor4CurrentPosition), SubscriptionAttribute.FLAG.IgnoreSaveDB);
  372. DATA.Subscribe($"{Module}.{Name}.Servo1AlarmCode", () => _GetRealFloat(_aiServo1AlarmCode), SubscriptionAttribute.FLAG.IgnoreSaveDB);
  373. DATA.Subscribe($"{Module}.{Name}.Servo2AlarmCode", () => _GetRealFloat(_aiServo2AlarmCode), SubscriptionAttribute.FLAG.IgnoreSaveDB);
  374. DATA.Subscribe($"{Module}.{Name}.Servo3AlarmCode", () => _GetRealFloat(_aiServo3AlarmCode), SubscriptionAttribute.FLAG.IgnoreSaveDB);
  375. DATA.Subscribe($"{Module}.{Name}.Servo4AlarmCode", () => _GetRealFloat(_aiServo4AlarmCode), SubscriptionAttribute.FLAG.IgnoreSaveDB);
  376. DATA.Subscribe($"{Module}.{Name}.ServoSVRAlarmCode", () => _GetRealFloat(_aiServoSVRAlarmCode), SubscriptionAttribute.FLAG.IgnoreSaveDB);
  377. DATA.Subscribe($"{Module}.{Name}.Servo1WarningCode", () => _GetRealFloat(_aiServo1WarningCode), SubscriptionAttribute.FLAG.IgnoreSaveDB);
  378. DATA.Subscribe($"{Module}.{Name}.Servo2WarningCode", () => _GetRealFloat(_aiServo2WarningCode), SubscriptionAttribute.FLAG.IgnoreSaveDB);
  379. DATA.Subscribe($"{Module}.{Name}.Servo3WarningCode", () => _GetRealFloat(_aiServo3WarningCode), SubscriptionAttribute.FLAG.IgnoreSaveDB);
  380. DATA.Subscribe($"{Module}.{Name}.Servo4WarningCode", () => _GetRealFloat(_aiServo4WarningCode), SubscriptionAttribute.FLAG.IgnoreSaveDB);
  381. DATA.Subscribe($"{Module}.{Name}.ServoSVRWarningCode", () => _GetRealFloat(_aiServoSVRWarningCode), SubscriptionAttribute.FLAG.IgnoreSaveDB);
  382. DATA.Subscribe($"{Module}.{Name}.ServoWorkMode", () => _GetRealFloat(_aoWorkMode), SubscriptionAttribute.FLAG.IgnoreSaveDB);
  383. OP.Subscribe($"{Module}.{Name}.SetState", (out string reason, int time, object[] param) => {
  384. reason = string.Empty;
  385. Position pos = Position.Invalid;
  386. if ((string)param[0] == "Up")
  387. pos = Position.position1;
  388. else if ((string)param[0] == "Down")
  389. pos = Position.position3;
  390. else if ((string)param[0] == "Middle")
  391. pos = Position.position2;
  392. else
  393. {
  394. reason = "Invalid moving position";
  395. return false;
  396. }
  397. GoPosition(pos);
  398. return true;
  399. });
  400. OP.Subscribe($"{Module}.{Name}.Stop", (out string reason, int time, object[] param) => {
  401. reason = string.Empty;
  402. ManulStop();
  403. return true;
  404. });
  405. OP.Subscribe($"{Module}.{Name}.Up", (out string reason, int time, object[] param) => {
  406. reason = string.Empty;
  407. ManulUp();
  408. return true;
  409. });
  410. OP.Subscribe($"{Module}.{Name}.Down", (out string reason, int time, object[] param) => {
  411. reason = string.Empty;
  412. ManulDown();
  413. return true;
  414. });
  415. OP.Subscribe($"{Module}.{Name}.Home", (out string reason, int time, object[] param) => {
  416. reason = string.Empty;
  417. GoPosition(Position.origin);
  418. return true;
  419. });
  420. OP.Subscribe($"{Module}.{Name}.UpdateConfig", (out string reason, int time, object[] param) => {
  421. reason = string.Empty;
  422. return true;
  423. });
  424. OP.Subscribe($"{Module}.{Name}.StepDistance", (out string reason, int time, object[] param) => {
  425. reason = string.Empty;
  426. SetRealFloat(_aoStepDistance, Convert.ToSingle(param[0]));
  427. return true;
  428. });
  429. OP.Subscribe($"{Module}.{Name}.WorkMode", (out string reason, int time, object[] param) => {
  430. reason = string.Empty;
  431. SetRealFloat(_aoWorkMode, Convert.ToSingle(param[0]));
  432. return true;
  433. });
  434. OP.Subscribe($"{Module}.{Name}.SingleAxisManualSpeed", (out string reason, int time, object[] param) => {
  435. reason = string.Empty;
  436. SetRealFloat(_aoSingleAxisManualSpeed, Convert.ToSingle(param[0]));
  437. return true;
  438. });
  439. OP.Subscribe($"{Module}.{Name}.ServoJogUP", (out string reason, int time, object[] param) => {
  440. reason = string.Empty;
  441. var servo = param[0].ToString();
  442. if (servo == "Servo1")
  443. {
  444. ServoOP(_doServo1JogUP, _doServo1JogDOWN, _doServo1Stop);
  445. }
  446. else if (servo == "Servo2")
  447. {
  448. ServoOP(_doServo2JogUP, _doServo2JogDOWN, _doServo2Stop);
  449. }
  450. else if (servo == "Servo3")
  451. {
  452. ServoOP(_doServo3JogUP, _doServo3JogDOWN, _doServo3Stop);
  453. }
  454. else if (servo == "Servo4")
  455. {
  456. ServoOP(_doServo4JogUP, _doServo4JogDOWN, _doServo4Stop);
  457. }
  458. return true;
  459. });
  460. OP.Subscribe($"{Module}.{Name}.ServoJogDOWN", (out string reason, int time, object[] param) => {
  461. reason = string.Empty;
  462. var servo = param[0].ToString();
  463. if (servo == "Servo1")
  464. {
  465. ServoOP(_doServo1JogDOWN, _doServo1JogUP, _doServo1Stop);
  466. }
  467. else if (servo == "Servo2")
  468. {
  469. ServoOP(_doServo2JogDOWN, _doServo2JogUP, _doServo2Stop);
  470. }
  471. else if (servo == "Servo3")
  472. {
  473. ServoOP(_doServo3JogDOWN, _doServo3JogUP, _doServo3Stop);
  474. }
  475. else if (servo == "Servo4")
  476. {
  477. ServoOP(_doServo4JogDOWN, _doServo4JogUP, _doServo4Stop);
  478. }
  479. return true;
  480. });
  481. OP.Subscribe($"{Module}.{Name}.ServoStop", (out string reason, int time, object[] param) => {
  482. reason = string.Empty;
  483. var servo = param[0].ToString();
  484. if (servo == "Servo1")
  485. {
  486. ServoOP(_doServo1Stop, _doServo1JogUP, _doServo1JogDOWN, _doServo1StepUp, _doServo1StepDOWN);
  487. }
  488. else if (servo == "Servo2")
  489. {
  490. ServoOP(_doServo2Stop, _doServo2JogUP, _doServo2JogDOWN, _doServo2StepUp, _doServo2StepDOWN);
  491. }
  492. else if (servo == "Servo3")
  493. {
  494. ServoOP(_doServo3Stop, _doServo3JogUP, _doServo3JogDOWN, _doServo3StepUp, _doServo3StepDOWN);
  495. }
  496. else if (servo == "Servo4")
  497. {
  498. ServoOP(_doServo4Stop, _doServo4JogUP, _doServo4JogDOWN, _doServo4StepUp, _doServo4StepDOWN);
  499. }
  500. return true;
  501. });
  502. OP.Subscribe($"{Module}.{Name}.ServoStepUP", (out string reason, int time, object[] param) => {
  503. reason = string.Empty;
  504. var servo = param[0].ToString();
  505. if (servo == "Servo1")
  506. {
  507. ServoOP(_doServo1StepUp, _doServo1StepDOWN, _doServo1Stop);
  508. }
  509. else if (servo == "Servo2")
  510. {
  511. ServoOP(_doServo2StepUp, _doServo2StepDOWN, _doServo2Stop);
  512. }
  513. else if (servo == "Servo3")
  514. {
  515. ServoOP(_doServo3StepUp, _doServo3StepDOWN, _doServo3Stop);
  516. }
  517. else if (servo == "Servo4")
  518. {
  519. ServoOP(_doServo4StepUp, _doServo4StepDOWN, _doServo4Stop);
  520. }
  521. return true;
  522. });
  523. OP.Subscribe($"{Module}.{Name}.ServoStepDOWN", (out string reason, int time, object[] param) => {
  524. reason = string.Empty;
  525. var servo = param[0].ToString();
  526. if (servo == "Servo1")
  527. {
  528. ServoOP(_doServo1StepDOWN, _doServo1StepUp, _doServo1Stop);
  529. }
  530. else if (servo == "Servo2")
  531. {
  532. ServoOP(_doServo2StepDOWN, _doServo2StepUp, _doServo2Stop);
  533. }
  534. else if (servo == "Servo3")
  535. {
  536. ServoOP(_doServo3StepDOWN, _doServo3StepUp, _doServo3Stop);
  537. }
  538. else if (servo == "Servo4")
  539. {
  540. ServoOP(_doServo4StepDOWN, _doServo4StepUp, _doServo4Stop);
  541. }
  542. return true;
  543. });
  544. updatePinCfg();
  545. return true;
  546. }
  547. public bool SetRealFloat(IOAccessor<short> ao, float value)
  548. {
  549. if (_diABSAlarm.Value)
  550. return false;
  551. _SetRealFloat(ao, value);
  552. return true;
  553. }
  554. public void Terminate()
  555. {
  556. }
  557. public void Monitor()
  558. {
  559. if (_manualStopTimer.ElapsedMilliseconds > _stopButtonAutoResetTime)
  560. {
  561. _doStop.Value = false;
  562. _manualStopTimer.Stop();
  563. }
  564. if (_diORGAlarm.Value)
  565. {
  566. NoDuplicatedAlarm($"Lift Pin DI-{_diORGAlarm.Index} ORG alarm");
  567. }
  568. //if (_diServoAlarm.Value)
  569. //{
  570. // NoDuplicatedAlarm($"Lift Pin DI-{_diServoAlarm.Index} 伺服驱动器报警");
  571. //}
  572. //if (_diCCWLimitSensorAlarm.Value)
  573. //{
  574. // NoDuplicatedAlarm($"Lift Pin DI-{_diCCWLimitSensorAlarm.Index} CCW Limit sensor 报警");
  575. //}
  576. if (_diOverSoftwareLimitAlarm.Value)
  577. {
  578. NoDuplicatedAlarm($"Lift Pin DI-{_diOverSoftwareLimitAlarm.Index} Over Software Limit alarm");
  579. }
  580. if (_diABSAlarm.Value)
  581. {
  582. NoDuplicatedAlarm($"Lift Pin DI-{_diABSAlarm.Index} ABS alarm");
  583. }
  584. if (_currentTarget == Position.Invalid)
  585. return;
  586. if ((_currentTarget == Position.position1 && _diP1.Value) ||
  587. (_currentTarget == Position.position2 && _diP2.Value) ||
  588. (_currentTarget == Position.position3 && _diP3.Value) ||
  589. (_currentTarget == Position.origin && _diOrigin.Value))
  590. {
  591. EV.PostInfoLog(Module, $"Lift Pin arrive {_currentTarget}");
  592. Reset();
  593. return;
  594. }
  595. if (sw.ElapsedMilliseconds > _timeout)
  596. {
  597. NoDuplicatedAlarm($"Lift Pin timeout, Not arrived yet {_currentTarget}");
  598. }
  599. }
  600. public void Reset()
  601. {
  602. _currentTarget = Position.Invalid;
  603. sw.Reset();
  604. _doP1.Value = false;
  605. _doP2.Value = false;
  606. _doP3.Value = false;
  607. _doOrigin.Value = false;
  608. _doUp.Value = false;
  609. _doDown.Value = false;
  610. _doStop.Value = false;
  611. _bAlarmReported = false;
  612. EV.PostInfoLog(Module, $"Lift Pin reset all do to off.");
  613. }
  614. private void NoDuplicatedAlarm(string log)
  615. {
  616. if (_bAlarmReported == false)
  617. {
  618. EV.PostAlarmLog(Module, log);
  619. _bAlarmReported = true;
  620. }
  621. }
  622. }
  623. }