ServoConfigViewModel.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. using Shaker.Models;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace ShakerService.ViewModel
  8. {
  9. internal sealed class ServoConfigViewModel:ViewModelBase<ServoConfigModel>
  10. {
  11. private ServoConfigViewModel():base()
  12. {
  13. }
  14. static ServoConfigViewModel()
  15. {
  16. }
  17. private protected override void ReadModel()
  18. {
  19. base.ReadModel();
  20. Communication.Instance.DbConnection.CreateTable<ServoConfigModel>();
  21. var model = Communication.Instance.DbConnection.Table<ServoConfigModel>().FirstOrDefault() ?? new ServoConfigModel();
  22. Communication.Instance.DbConnection.CreateTable<PIModel>();
  23. model.PI = Communication.Instance.DbConnection.Table<PIModel>()?.ToList()?? new List<PIModel>();
  24. if(model.PI.Count>4)
  25. {
  26. model.PI.RemoveRange(4, model.PI.Count - 4);
  27. }
  28. else if(model.PI.Count<4)
  29. {
  30. model.PI.AddRange(Enumerable.Repeat(new PIModel(), 4 - model.PI.Count));
  31. }
  32. CurrentModel = model;
  33. SaveModel();
  34. }
  35. private protected override void SaveModel()
  36. {
  37. base.SaveModel();
  38. Communication.Instance.DbConnection.DeleteAll<ServoConfigModel>();
  39. Communication.Instance.DbConnection.Insert(CurrentModel);
  40. Communication.Instance.DbConnection.DeleteAll<PIModel>();
  41. Communication.Instance.DbConnection.InsertAll(CurrentModel.PI);
  42. }
  43. private protected override void UpModel(ServoConfigModel model)
  44. {
  45. if(model.PI ==null) model.PI = new List<PIModel>();
  46. if (model.PI.Count > 4)
  47. {
  48. model.PI.RemoveRange(4, model.PI.Count - 4);
  49. }
  50. else if (model.PI.Count < 4)
  51. {
  52. model.PI.AddRange(Enumerable.Repeat(new PIModel(), 4 - model.PI.Count));
  53. }
  54. base.UpModel(model);
  55. }
  56. public override void SetFpga()
  57. {
  58. base.SetFpga();
  59. ShakerFpga.ShakerFpga.Instance.P参数.Value = [.. PI.Select(x => x.P)];
  60. ShakerFpga.ShakerFpga.Instance.I参数.Value = [.. PI.Select(x => x.I)];
  61. ShakerFpga.ShakerFpga.Instance.水平阀死区电压.Value = HorizontalBarrierPotential;
  62. ShakerFpga.ShakerFpga.Instance.竖直阀死区电压.Value = VerticalBarrierPotential;
  63. ShakerFpga.ShakerFpga.Instance.最大积分电压.Value = MaxIntegratedVoltage;
  64. ShakerFpga.ShakerFpga.Instance.最大驱动电压.Value = MaxDriverVoltage;
  65. ShakerFpga.ShakerFpga.Instance.急停后驱动限幅值.Value = EmerhencyDriverLimitVoltage;
  66. ShakerFpga.ShakerFpga.Instance.位移前馈增益.Value = DisplacementFeedforwardGain;
  67. ShakerFpga.ShakerFpga.Instance.驱动超限电压.Value = DriverOverLimitVoltage;
  68. }
  69. public static ServoConfigViewModel Instance { get; } = new ServoConfigViewModel();
  70. public IReadOnlyList<PIModel> PI => CurrentModel.PI;
  71. /// <summary>
  72. /// 水平阀死区电压(V)
  73. /// </summary>
  74. public double HorizontalBarrierPotential => CurrentModel.HorizontalBarrierPotential;
  75. /// <summary>
  76. /// 竖直阀死区电压(V)
  77. /// </summary>
  78. public double VerticalBarrierPotential => CurrentModel.VerticalBarrierPotential;
  79. /// <summary>
  80. /// 最大积分电压(V)
  81. /// </summary>
  82. public double MaxIntegratedVoltage => CurrentModel.MaxIntegratedVoltage;
  83. /// <summary>
  84. /// 位移前馈增益
  85. /// </summary>
  86. public double DisplacementFeedforwardGain => CurrentModel.DisplacementFeedforwardGain;
  87. /// <summary>
  88. /// 最大驱动电压(V)
  89. /// </summary>
  90. public double MaxDriverVoltage => CurrentModel.MaxDriverVoltage;
  91. /// <summary>
  92. /// 驱动超限电压(V)
  93. /// </summary>
  94. public double DriverOverLimitVoltage => CurrentModel.DriverOverLimitVoltage;
  95. /// <summary>
  96. /// 急停后驱动限幅值(V)
  97. /// </summary>
  98. public double EmerhencyDriverLimitVoltage => CurrentModel.EmerhencyDriverLimitVoltage;
  99. }
  100. }