LinMotOtherControl.xaml.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  1. using Aitex.Core.RT.DataCenter;
  2. using Caliburn.Micro.Core;
  3. using MECF.Framework.Common.Device.LinMot;
  4. using MECF.Framework.Common.OperationCenter;
  5. using MECF.Framework.Common.Persistent.SRD;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Collections.ObjectModel;
  9. using System.ComponentModel;
  10. using System.Linq;
  11. using System.Reflection;
  12. using System.Runtime.CompilerServices;
  13. using System.Text;
  14. using System.Threading.Tasks;
  15. using System.Windows;
  16. using System.Windows.Controls;
  17. using System.Windows.Data;
  18. using System.Windows.Documents;
  19. using System.Windows.Input;
  20. using System.Windows.Media;
  21. using System.Windows.Media.Imaging;
  22. using System.Windows.Navigation;
  23. using System.Windows.Shapes;
  24. namespace CyberX8_Themes.UserControls
  25. {
  26. /// <summary>
  27. /// LinMotOtherControl.xaml 的交互逻辑
  28. /// </summary>
  29. public partial class LinMotOtherControl : UserControl
  30. {
  31. #region 属性
  32. public static readonly DependencyProperty ModuleNameProperty = DependencyProperty.Register("ModuleName", typeof(string), typeof(LinMotOtherControl),
  33. new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.AffectsRender));
  34. /// <summary>
  35. /// 模块名称
  36. /// </summary>
  37. public string ModuleName
  38. {
  39. get
  40. {
  41. return (string)this.GetValue(ModuleNameProperty);
  42. }
  43. set
  44. {
  45. this.SetValue(ModuleNameProperty, value);
  46. }
  47. }
  48. public static readonly DependencyProperty ModuleTitleProperty = DependencyProperty.Register("ModuleTitle", typeof(string), typeof(LinMotOtherControl),
  49. new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.AffectsRender));
  50. /// <summary>
  51. /// 标题
  52. /// </summary>
  53. public string ModuleTitle
  54. {
  55. get
  56. {
  57. return (string)this.GetValue(ModuleTitleProperty);
  58. }
  59. set
  60. {
  61. this.SetValue(ModuleTitleProperty, value);
  62. }
  63. }
  64. public static readonly DependencyProperty ParentModuleProperty = DependencyProperty.Register("ParentModule", typeof(string), typeof(LinMotOtherControl),
  65. new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.AffectsRender));
  66. /// <summary>
  67. /// ParentModule
  68. /// </summary>
  69. public string ParentModule
  70. {
  71. get
  72. {
  73. return (string)this.GetValue(ParentModuleProperty);
  74. }
  75. set
  76. {
  77. this.SetValue(ParentModuleProperty, value);
  78. }
  79. }
  80. public static readonly DependencyProperty IsConnectedProperty = DependencyProperty.Register("IsConnected", typeof(bool), typeof(LinMotOtherControl),
  81. new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));
  82. /// <summary>
  83. /// 连接状态
  84. /// </summary>
  85. public bool IsConnected
  86. {
  87. get
  88. {
  89. return (bool)this.GetValue(IsConnectedProperty);
  90. }
  91. set
  92. {
  93. this.SetValue(IsConnectedProperty, value);
  94. }
  95. }
  96. public static readonly DependencyProperty StatusWordProperty = DependencyProperty.Register("StatusWord", typeof(short), typeof(LinMotOtherControl),
  97. new FrameworkPropertyMetadata((short)0, new PropertyChangedCallback(StatusWordPropertyChangedCallBack)));
  98. /// <summary>
  99. /// 状态字
  100. /// </summary>
  101. public short StatusWord
  102. {
  103. get { return (short)this.GetValue(StatusWordProperty); }
  104. set
  105. {
  106. this.SetValue(StatusWordProperty, value);
  107. }
  108. }
  109. private static void StatusWordPropertyChangedCallBack(DependencyObject d, DependencyPropertyChangedEventArgs e)
  110. {
  111. short statusWord = (short)e.NewValue;
  112. d.SetValue(ReadyProperty, (statusWord & 0x01) == 1);
  113. d.SetValue(DisableProperty, (statusWord & 0b0100) >> 2 == 0);
  114. d.SetValue(ErrorProperty, ((statusWord & 0b01000) >> 3 == 1) || ((statusWord & 0b01000000000000) >> 12 == 1));
  115. d.SetValue(InitProperty, (statusWord & 0b0100000000000) >> 11 == 1);
  116. d.SetValue(RunProperty, (statusWord & 0b010000000000000) >> 13 == 1);
  117. }
  118. public static readonly DependencyProperty ReadyProperty = DependencyProperty.Register("Ready", typeof(bool), typeof(LinMotOtherControl),
  119. new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));
  120. public bool Ready
  121. {
  122. get { return (bool)this.GetValue(ReadyProperty); }
  123. set { SetValue(ReadyProperty, value); }
  124. }
  125. public static readonly DependencyProperty DisableProperty = DependencyProperty.Register("Disable", typeof(bool), typeof(LinMotOtherControl),
  126. new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));
  127. public bool Disable
  128. {
  129. get { return (bool)this.GetValue(DisableProperty); }
  130. set { SetValue(DisableProperty, value); }
  131. }
  132. public static readonly DependencyProperty RunProperty = DependencyProperty.Register("Run", typeof(bool), typeof(LinMotOtherControl),
  133. new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));
  134. public bool Run
  135. {
  136. get { return (bool)this.GetValue(RunProperty); }
  137. set { SetValue(RunProperty, value); }
  138. }
  139. public static readonly DependencyProperty ErrorProperty = DependencyProperty.Register("Error", typeof(bool), typeof(LinMotOtherControl),
  140. new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));
  141. public bool Error
  142. {
  143. get { return (bool)this.GetValue(ErrorProperty); }
  144. set { SetValue(ErrorProperty, value); }
  145. }
  146. public static readonly DependencyProperty InitProperty = DependencyProperty.Register("Init", typeof(bool), typeof(LinMotOtherControl),
  147. new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));
  148. public bool Init
  149. {
  150. get { return (bool)this.GetValue(InitProperty); }
  151. set { SetValue(InitProperty, value); }
  152. }
  153. public static readonly DependencyProperty DirectionProperty = DependencyProperty.Register("Direction", typeof(string), typeof(LinMotOtherControl),
  154. new FrameworkPropertyMetadata("",new PropertyChangedCallback(DirectionChangedCallBack)));
  155. public string Direction
  156. {
  157. get { return (string)this.GetValue(DirectionProperty); }
  158. set { SetValue(DirectionProperty, value); }
  159. }
  160. public static readonly DependencyProperty LinMotDeviceDataProperty = DependencyProperty.Register("LinMotDeviceData", typeof(LinMotDeviceData), typeof(LinMotOtherControl)
  161. ,new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender));
  162. public LinMotDeviceData LinMotDeviceData
  163. {
  164. get { return (LinMotDeviceData)this.GetValue(LinMotDeviceDataProperty); }
  165. set { SetValue(LinMotDeviceDataProperty, value); }
  166. }
  167. public static readonly DependencyProperty PositionProperty = DependencyProperty.Register("Position", typeof(double), typeof(LinMotOtherControl));
  168. public double Position
  169. {
  170. get { return (double)this.GetValue(PositionProperty); }
  171. set { SetValue(PositionProperty, value); }
  172. }
  173. public static readonly DependencyProperty CycleProperty = DependencyProperty.Register("Cycle", typeof(int), typeof(LinMotOtherControl),
  174. new FrameworkPropertyMetadata(10));
  175. public int Cycle
  176. {
  177. get { return (int)this.GetValue(CycleProperty); }
  178. set { SetValue(CycleProperty, value); }
  179. }
  180. public static readonly DependencyProperty CurrentScanProperty = DependencyProperty.Register("CurrentScan", typeof(int), typeof(LinMotOtherControl),
  181. new FrameworkPropertyMetadata(0));
  182. public int CurrentScan
  183. {
  184. get { return (int)this.GetValue(CurrentScanProperty); }
  185. set { SetValue(CurrentScanProperty, value); }
  186. }
  187. public static readonly DependencyProperty AccelProperty = DependencyProperty.Register("Accel", typeof(string), typeof(LinMotOtherControl)
  188. , new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.AffectsRender));
  189. public string Accel
  190. {
  191. get { return (string)this.GetValue(AccelProperty); }
  192. set { SetValue(AccelProperty, value); }
  193. }
  194. public static readonly DependencyProperty DecelProperty = DependencyProperty.Register("Decel", typeof(string), typeof(LinMotOtherControl)
  195. , new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.AffectsRender));
  196. public string Decel
  197. {
  198. get { return (string)this.GetValue(DecelProperty); }
  199. set { SetValue(DecelProperty, value); }
  200. }
  201. public static readonly DependencyProperty SpeedProperty = DependencyProperty.Register("Speed", typeof(string), typeof(LinMotOtherControl)
  202. , new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.AffectsRender));
  203. public string Speed
  204. {
  205. get { return (string)this.GetValue(SpeedProperty); }
  206. set { SetValue(SpeedProperty, value); }
  207. }
  208. public static readonly DependencyProperty InputSpeedProperty = DependencyProperty.Register("InputSpeed", typeof(double), typeof(LinMotOtherControl)
  209. , new FrameworkPropertyMetadata(0.00, FrameworkPropertyMetadataOptions.AffectsRender));
  210. public double InputSpeed
  211. {
  212. get { return (double)this.GetValue(InputSpeedProperty); }
  213. set { SetValue(InputSpeedProperty, value); }
  214. }
  215. public static readonly DependencyProperty InputDecelProperty = DependencyProperty.Register("InputDecel", typeof(double), typeof(LinMotOtherControl)
  216. , new FrameworkPropertyMetadata(0.00, FrameworkPropertyMetadataOptions.AffectsRender));
  217. public double InputDecel
  218. {
  219. get { return (double)this.GetValue(InputDecelProperty); }
  220. set { SetValue(InputDecelProperty, value); }
  221. }
  222. public static readonly DependencyProperty InputAccelProperty = DependencyProperty.Register("InputAccel", typeof(double), typeof(LinMotOtherControl)
  223. , new FrameworkPropertyMetadata(0.00, FrameworkPropertyMetadataOptions.AffectsRender));
  224. public double InputAccel
  225. {
  226. get { return (double)this.GetValue(InputAccelProperty); }
  227. set { SetValue(InputAccelProperty, value); }
  228. }
  229. public static readonly DependencyProperty SelectDirectionItemSourceProperty = DependencyProperty.Register("SelectDirectionItem", typeof(List<string>), typeof(LinMotOtherControl)
  230. , new FrameworkPropertyMetadata(new List<string>() { "up", "down" }, FrameworkPropertyMetadataOptions.AffectsRender));
  231. public List<string> SelectDirectionItemSource
  232. {
  233. get { return (List<string>)this.GetValue(SelectDirectionItemSourceProperty); }
  234. set { SetValue(SelectDirectionItemSourceProperty, value); }
  235. }
  236. public static readonly DependencyProperty DirectionSelectedItemProperty = DependencyProperty.Register("DirectionSelectedItem", typeof(string), typeof(LinMotOtherControl)
  237. , new FrameworkPropertyMetadata("", new PropertyChangedCallback(OnItemsSourceChanged)));
  238. /// <summary>
  239. /// DirectionSelectedItem
  240. /// </summary>
  241. public string DirectionSelectedItem
  242. {
  243. get { return (string)this.GetValue(DirectionSelectedItemProperty); }
  244. set { this.SetValue(DirectionSelectedItemProperty, value);}
  245. }
  246. private static void OnItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  247. {
  248. if (e.NewValue != null)
  249. {
  250. LinMotDevice data = (LinMotDevice)d.GetValue(DataContextProperty);
  251. string direction = (string)e.NewValue;
  252. if ("up".Equals(direction))
  253. {
  254. d.SetValue(InputSpeedProperty, data.LinMotDeviceData.UpMaxSpeed);
  255. d.SetValue(InputAccelProperty, (double)data.LinMotDeviceData.UpMaxAcceleration);
  256. d.SetValue(InputDecelProperty, (double)data.LinMotDeviceData.UpMaxDeceleration);
  257. }
  258. else if ("down".Equals(direction))
  259. {
  260. d.SetValue(InputSpeedProperty, data.LinMotDeviceData.DownMaxSpeed);
  261. d.SetValue(InputAccelProperty, (double)data.LinMotDeviceData.DownMaxAcceleration);
  262. d.SetValue(InputDecelProperty, (double)data.LinMotDeviceData.DownMaxDeceleration);
  263. }
  264. else
  265. {
  266. d.SetValue(InputSpeedProperty, 0.00);
  267. d.SetValue(InputAccelProperty, 0.00);
  268. d.SetValue(InputDecelProperty, 0.00);
  269. }
  270. }
  271. }
  272. public static readonly DependencyProperty IsEditEnableProperty = DependencyProperty.Register("IsEditEnable", typeof(bool), typeof(LinMotOtherControl));
  273. public bool IsEditEnable
  274. {
  275. get { return (bool)this.GetValue(IsEditEnableProperty); }
  276. set { SetValue(IsEditEnableProperty, value); }
  277. }
  278. /// <summary>
  279. /// 方向改变后的回调函数
  280. /// </summary>
  281. /// <param name="sender"></param>
  282. /// <param name="e"></param>
  283. private static void DirectionChangedCallBack(DependencyObject sender, DependencyPropertyChangedEventArgs e)
  284. {
  285. if(e.NewValue!=null)
  286. {
  287. string newValue = e.NewValue.ToString();
  288. LinMotDevice data = (LinMotDevice)sender.GetValue(DataContextProperty);
  289. LinMotDeviceData linMotDeviceData = data.LinMotDeviceData;
  290. if (linMotDeviceData != null)
  291. {
  292. if (newValue == "up")
  293. {
  294. sender.SetValue(SpeedProperty, linMotDeviceData.UpMaxSpeed.ToString());
  295. sender.SetValue(AccelProperty, linMotDeviceData.UpMaxAcceleration.ToString());
  296. sender.SetValue(DecelProperty, linMotDeviceData.UpMaxDeceleration.ToString());
  297. }
  298. else if(newValue=="down")
  299. {
  300. sender.SetValue(SpeedProperty, linMotDeviceData.DownMaxSpeed.ToString());
  301. sender.SetValue(AccelProperty, linMotDeviceData.DownMaxAcceleration.ToString());
  302. sender.SetValue(DecelProperty, linMotDeviceData.DownMaxDeceleration.ToString());
  303. }
  304. else
  305. {
  306. sender.SetValue(SpeedProperty, "");
  307. sender.SetValue(AccelProperty, "");
  308. sender.SetValue(DecelProperty, "");
  309. }
  310. }
  311. }
  312. }
  313. #endregion
  314. /// <summary>
  315. /// 构造函数
  316. /// </summary>
  317. public LinMotOtherControl()
  318. {
  319. InitializeComponent();
  320. }
  321. /// <summary>
  322. /// 启动
  323. /// </summary>
  324. /// <param name="sender"></param>
  325. /// <param name="e"></param>
  326. private void Start_Click(object sender, RoutedEventArgs e)
  327. {
  328. InvokeClient.Instance.Service.DoOperation($"{ModuleName}.StartPosition",Cycle);
  329. }
  330. private void Stop_Click(object sender, RoutedEventArgs e)
  331. {
  332. InvokeClient.Instance.Service.DoOperation($"{ModuleName}.Stop");
  333. }
  334. private void Abort_Click(object sender, RoutedEventArgs e)
  335. {
  336. InvokeClient.Instance.Service.DoOperation($"{ModuleName}.Abort");
  337. }
  338. private void Reset_Click(object sender, RoutedEventArgs e)
  339. {
  340. InvokeClient.Instance.Service.DoOperation($"{ModuleName}.Reset");
  341. }
  342. private void Apply_Click(object sender, RoutedEventArgs e)
  343. {
  344. if (String.IsNullOrEmpty(DirectionSelectedItem))
  345. {
  346. MessageBox.Show("Select direction first", "Warning", MessageBoxButton.OK, MessageBoxImage.Error);
  347. }
  348. else if (DirectionSelectedItem == "up")
  349. {
  350. double speed = InputSpeed == 0.00 ? LinMotDeviceData.UpMaxSpeed : InputSpeed;
  351. int acc = InputAccel == 0.00 ? LinMotDeviceData.UpMaxAcceleration : (int)InputAccel;
  352. int dec = InputDecel == 0.00 ? LinMotDeviceData.UpMaxDeceleration : (int)InputDecel;
  353. InvokeClient.Instance.Service.DoOperation($"{ModuleName}.UpdateSpeedData", ModuleName, DirectionSelectedItem, speed, acc, dec);
  354. }
  355. else
  356. {
  357. double speed = InputSpeed != 0.00 ? InputSpeed : LinMotDeviceData.DownMaxSpeed;
  358. int acc = InputAccel != 0.00 ? (int)InputAccel : LinMotDeviceData.DownMaxAcceleration;
  359. int dec = InputDecel != 0.00 ? (int)InputDecel : LinMotDeviceData.DownMaxDeceleration;
  360. InvokeClient.Instance.Service.DoOperation($"{ModuleName}.UpdateSpeedData", ModuleName, DirectionSelectedItem, speed, acc, dec);
  361. }
  362. }
  363. private void Status_Click(object sender, RoutedEventArgs e)
  364. {
  365. IsEditEnable = false;
  366. }
  367. private void Setting_Click(object sender, RoutedEventArgs e)
  368. {
  369. IsEditEnable = true;
  370. }
  371. }
  372. }