瀏覽代碼

上传代码,功能fpga功能基本完成

l2736 1 周之前
父節點
當前提交
f8cd080bb3
共有 33 個文件被更改,包括 10100 次插入17041 次删除
  1. 二進制
      Fpga/FPGA/Fpga_Main.vi
  2. 二進制
      Fpga/FPGA/Monitor Loop Rate - Latching.vi
  3. 二進制
      Fpga/FPGA/伺服控制/Init.vi
  4. 二進制
      Fpga/FPGA/伺服控制/伺服开环输出.vi
  5. 二進制
      Fpga/FPGA/自由度/八缸力平衡控制.vi
  6. 二進制
      Fpga/FPGA/自由度/平衡缸驱动.vi
  7. 二進制
      Fpga/FPGA/自由度/求八缸位移.vi
  8. 二進制
      Fpga/FPGA/自由度/求八缸位移及自由度.vi
  9. 二進制
      Fpga/FPGA/自由度/计算位移.vi
  10. 二進制
      Fpga/FPGA/自由度/驱动计算.vi
  11. 二進制
      Fpga/FPGA/通道定义/位移通道定义.vi
  12. 二進制
      Fpga/FPGA/通道定义/压差通道定义.vi
  13. 二進制
      Fpga/FPGA/通道定义/寄存器初始化.vi
  14. 二進制
      Fpga/FPGA/通道定义/支撑压力通道定义.vi
  15. 二進制
      Fpga/FPGA/通道定义/阀输出.vi
  16. 二進制
      Fpga/FPGA/颤振/颤振信号.vi
  17. 1 1
      Fpga/fpga.aliases
  18. 1 1
      Fpga/fpga.lvlps
  19. 0 0
      Fpga/fpga.lvproj
  20. 1 0
      NIFPGA/FPGAArrayFXPReadProperty.cs
  21. 1 0
      NIFPGA/FPGAArrayFXPWriteProperty.cs
  22. 1 0
      NIFPGA/FPGAArrayReadProperty.cs
  23. 1 0
      NIFPGA/FPGAArrayWriteProperty.cs
  24. 1 0
      NIFPGA/FPGABaseProperty.cs
  25. 33 10
      Service/ShakerFpga/ShakerFpgaSourceGenerator.cs
  26. 9876 17029
      Service/ShakerService/Shaker.lvbitx
  27. 1 0
      Service/ShakerService/ShakerService.csproj
  28. 28 0
      Service/ShakerService/ViewModel/DisplacementConfigViewModel.cs
  29. 34 0
      Service/ShakerService/ViewModel/ShakerConfigViewModel.cs
  30. 37 0
      Service/ShakerService/ViewModel/ViewModelBase{TModel}.cs
  31. 29 0
      Shaker.Model/Models/DisplacementChannelConfigModel.cs
  32. 26 0
      Shaker.Model/Models/DisplacementConfigModel.cs
  33. 29 0
      Shaker.Model/Models/ShakerConfigModel.cs

二進制
Fpga/FPGA/Fpga_Main.vi


二進制
Fpga/FPGA/Monitor Loop Rate - Latching.vi


二進制
Fpga/FPGA/伺服控制/Init.vi


二進制
Fpga/FPGA/伺服控制/伺服开环输出.vi


二進制
Fpga/FPGA/自由度/八缸力平衡控制.vi


二進制
Fpga/FPGA/自由度/平衡缸驱动.vi


二進制
Fpga/FPGA/自由度/求八缸位移.vi


二進制
Fpga/FPGA/自由度/求八缸位移及自由度.vi


二進制
Fpga/FPGA/自由度/计算位移.vi


二進制
Fpga/FPGA/自由度/驱动计算.vi


二進制
Fpga/FPGA/通道定义/位移通道定义.vi


二進制
Fpga/FPGA/通道定义/压差通道定义.vi


二進制
Fpga/FPGA/通道定义/寄存器初始化.vi


二進制
Fpga/FPGA/通道定义/支撑压力通道定义.vi


二進制
Fpga/FPGA/通道定义/阀输出.vi


二進制
Fpga/FPGA/颤振/颤振信号.vi


+ 1 - 1
Fpga/fpga.aliases

@@ -2,4 +2,4 @@
 RT CompactRIO终端 = "0.0.0.0"
 
 [我的电脑]
-我的电脑 = "192.168.83.4"
+我的电脑 = "172.24.64.1"

+ 1 - 1
Fpga/fpga.lvlps

@@ -1,2 +1,2 @@
 [ÏîÄ¿´°¿ÚÊý¾Ý(_D)]
-ProjectExplorer.ClassicPosition[String] = "468,1204,1259,1682"
+ProjectExplorer.ClassicPosition[String] = "234,367,1025,845"

File diff suppressed because it is too large
+ 0 - 0
Fpga/fpga.lvproj


+ 1 - 0
NIFPGA/FPGAArrayFXPReadProperty.cs

@@ -57,6 +57,7 @@ namespace NIFPGA
                 return doubles;
             }
         }
+        public override bool IsArray => true;
         public uint Count { get; }
         public double[] Value { get => GetData(); }
     }

+ 1 - 0
NIFPGA/FPGAArrayFXPWriteProperty.cs

@@ -94,6 +94,7 @@ namespace NIFPGA
                 _Session.CheckResult(Write(_Session.Session, Register, ref Unsafe.As<ulong, byte>(ref tempbuffer[0]), bytescount));
             }
         }
+        public override bool IsArray => true;
         public uint Count { get; }
         public double[] Value { get => GetData(); set => SetData(value); }
     }

+ 1 - 0
NIFPGA/FPGAArrayReadProperty.cs

@@ -13,6 +13,7 @@ namespace NIFPGA
             Count = indicator.Size;
             tempvalue = new T[Count];
         }
+        public override bool IsArray => true;
         private T[] GetValues()
         {
             lock (lockObject)

+ 1 - 0
NIFPGA/FPGAArrayWriteProperty.cs

@@ -13,6 +13,7 @@ namespace NIFPGA
             Count = indicator.Size;
             tempvalue = new T[Count];
         }
+        public override bool IsArray => true;
         private void SetValue(T[] values)
         {
             lock (lockObject)

+ 1 - 0
NIFPGA/FPGABaseProperty.cs

@@ -14,6 +14,7 @@ namespace NIFPGA
         {
             this.register = register;
         }
+        public virtual bool IsArray { get; } = false;
         public uint SizeInBits => register.SizeInBits;
         public Boolean IsIndicator => register.Indicator;
         public uint Register => register.Offset;

+ 33 - 10
Service/ShakerFpga/ShakerFpgaSourceGenerator.cs

@@ -87,16 +87,28 @@ namespace ShakerFpga
             proname = RemovePropertySpecialcharacters(proname);
             stringBuilder.AppendLine($"        private {protype} _{proname};");
             stringBuilder.AppendLine($"        /// <summary>");
-            stringBuilder.AppendLine($"        /// {register.Name}");
+            stringBuilder.AppendLine($"        ///<para> {register.Name}{(register.Datatype == Datatype.Array?$",数组长度为:{register.Size}":"")}</para>");
+            if(register.Datatype == Datatype.FXP || register.ArrayValueType == Datatype.FXP)
+            {
+                stringBuilder.AppendLine($"        ///<para> 数据类型:定点数</para>");
+                stringBuilder.AppendLine($"        ///<para> 最大值:{register.FxpTypeInfo.Max}</para>");
+                stringBuilder.AppendLine($"        ///<para> 最小值:{register.FxpTypeInfo.Min}</para>");
+                stringBuilder.AppendLine($"        ///<para> 最小分辨率:{register.FxpTypeInfo.Delta}</para>");
+                stringBuilder.AppendLine($"        ///<para> 字长:{register.FxpTypeInfo.wordLength}</para>");
+                stringBuilder.AppendLine($"        ///<para> 整数字长:{register.FxpTypeInfo.integerWordLength}</para>");
+                stringBuilder.AppendLine($"        ///<para> {(register.FxpTypeInfo.isSigned?"有符号":"无符号")}</para>");
+            }
+            else
+            {
+                var type = register.Datatype != Datatype.Array ? register.Datatype : register.ArrayValueType;
+                stringBuilder.AppendLine($"        ///<para> 数据类型:{type}</para>");
+            }
             stringBuilder.AppendLine($"        /// </summary>");
             stringBuilder.AppendLine($"        public {protype} {proname}");
             stringBuilder.AppendLine("        {");
             stringBuilder.AppendLine("            get");
             stringBuilder.AppendLine("            {");
-            stringBuilder.AppendLine($"                if(_" + proname + "==null)");
-            stringBuilder.AppendLine("                {");
-            stringBuilder.AppendLine($"                    _" + proname + $"=({protype})fpga.Properties[\"{register.Name}\"];");
-            stringBuilder.AppendLine("                }");
+            stringBuilder.AppendLine($"                _" + proname + $" ??= ({protype})fpga.Properties[\"{register.Name}\"];");
             stringBuilder.AppendLine($"                return _" + proname + ";");
             stringBuilder.AppendLine("            }");
             stringBuilder.AppendLine("        }");
@@ -108,16 +120,27 @@ namespace ShakerFpga
             proname = RemovePropertySpecialcharacters(proname);
             stringBuilder.AppendLine($"        private {protype} _{proname};");
             stringBuilder.AppendLine($"        /// <summary>");
-            stringBuilder.AppendLine($"        /// {dma.Name}");
+            stringBuilder.AppendLine($"        ///<para> {dma.Name}</para>");
+            if(dma.Datatype == Datatype.FXP)
+            {
+                stringBuilder.AppendLine($"        ///<para> 数据类型:定点数</para>");
+                stringBuilder.AppendLine($"        ///<para> 最大值:{dma.FxpTypeInfo.Max}</para>");
+                stringBuilder.AppendLine($"        ///<para> 最小值:{dma.FxpTypeInfo.Min}</para>");
+                stringBuilder.AppendLine($"        ///<para> 最小分辨率:{dma.FxpTypeInfo.Delta}</para>");
+                stringBuilder.AppendLine($"        ///<para> 字长:{dma.FxpTypeInfo.wordLength}</para>");
+                stringBuilder.AppendLine($"        ///<para> 整数字长:{dma.FxpTypeInfo.integerWordLength}</para>");
+                stringBuilder.AppendLine($"        ///<para> {(dma.FxpTypeInfo.isSigned ? "有符号" : "无符号")}</para>");
+            }
+            else
+            {
+                stringBuilder.AppendLine($"        ///<para> 数据类型:{dma.Datatype}</para>");
+            }
             stringBuilder.AppendLine($"        /// </summary>");
             stringBuilder.AppendLine($"        public {protype} {proname}");
             stringBuilder.AppendLine("        {");
             stringBuilder.AppendLine("            get");
             stringBuilder.AppendLine("            {");
-            stringBuilder.AppendLine($"                if(_" + proname + "==null)");
-            stringBuilder.AppendLine("                {");
-            stringBuilder.AppendLine($"                    _" + proname + $"=({protype})fpga.Fifos[\"{dma.Name}\"];");
-            stringBuilder.AppendLine("                }");
+            stringBuilder.AppendLine($"                _" + proname + $" ??= ({protype})fpga.Fifos[\"{dma.Name}\"];");
             stringBuilder.AppendLine($"                return _" + proname + ";");
             stringBuilder.AppendLine("            }");
             stringBuilder.AppendLine("        }");

File diff suppressed because it is too large
+ 9876 - 17029
Service/ShakerService/Shaker.lvbitx


+ 1 - 0
Service/ShakerService/ShakerService.csproj

@@ -13,6 +13,7 @@
   <ItemGroup>
     <ProjectReference Include="..\..\Calc\SIMDFxpConvert\SIMDFxpConvert.csproj" />
     <ProjectReference Include="..\..\NativeLibraryLoader\NativeLibraryLoader.csproj" />
+    <ProjectReference Include="..\..\Shaker.Model\Shaker.Model.csproj" />
     <ProjectReference Include="..\ShakerFpga\ShakerFpga.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
   </ItemGroup>
 

+ 28 - 0
Service/ShakerService/ViewModel/DisplacementConfigViewModel.cs

@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ShakerService.ViewModel
+{
+    internal sealed class DisplacementConfigViewModel:ViewModelBase<Shaker.Models.DisplacementConfigModel>
+    {
+        /// <summary>
+        /// 位移灵敏度
+        /// </summary>
+        public IReadOnlyList<Shaker.Models.DisplacementChannelConfigModel> Models =>CurrentModel.DisplacementChannels;
+        /// <summary>
+        /// 位移前馈增益
+        /// </summary>
+        public double DisplacementFeedforwardGain =>CurrentModel.DisplacementFeedforwardGain;
+        public override void SetFpga()
+        {
+            base.SetFpga();
+            ShakerFpga.ShakerFpga.Instance.位移通道.Values = [.. Models.Select(x => x.Channel).Take(ShakerConfigViewModel.Instance.DisplacementCount)];
+            ShakerFpga.ShakerFpga.Instance.位移灵敏度.Value = [.. Models.Select(x => x.Sensitivity).Take(ShakerConfigViewModel.Instance.DisplacementCount)];
+            ShakerFpga.ShakerFpga.Instance.位移直偏.Value = [.. Models.Select(x => x.Bias).Take(ShakerConfigViewModel.Instance.DisplacementCount)];
+            ShakerFpga.ShakerFpga.Instance.位移前馈增益.Value = DisplacementFeedforwardGain;
+        }
+    }
+}

+ 34 - 0
Service/ShakerService/ViewModel/ShakerConfigViewModel.cs

@@ -0,0 +1,34 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ShakerService.ViewModel
+{
+    internal sealed class ShakerConfigViewModel:ViewModelBase<Shaker.Models.ShakerConfigModel>
+    {
+        private ShakerConfigViewModel():base()
+        {
+
+        }
+        static ShakerConfigViewModel()
+        {
+
+        }
+        /// <summary>
+        /// 位移通道数
+        /// </summary>
+        public int DisplacementCount =>CurrentModel.DisplacementCount;
+        /// <summary>
+        /// 加速度通道数
+        /// </summary>
+        public int AccelerationCount =>CurrentModel.AccelerationCount;
+        /// <summary>
+        /// 最大模拟通道数
+        /// </summary>
+        public int MaxAICount=>CurrentModel.MaxAICount;
+
+        public static ShakerConfigViewModel Instance { get; } = new ShakerConfigViewModel();
+    }
+}

+ 37 - 0
Service/ShakerService/ViewModel/ViewModelBase{TModel}.cs

@@ -0,0 +1,37 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics.CodeAnalysis;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ShakerService.ViewModel
+{
+    internal abstract class ViewModelBase
+    {
+        public ViewModelBase()
+        {
+
+        }
+        public virtual void SetFpga()
+        {
+
+        }
+    }
+    internal abstract class ViewModelBase<TModel> : ViewModelBase where TModel :IModel.IModel
+    {
+        public ViewModelBase():base()
+        {
+            if(typeof(TModel).IsAnsiClass && !typeof(TModel).IsAbstract)
+            {
+                InitModel();
+            }
+        }
+        private protected virtual void InitModel()
+        {
+
+        }
+        [AllowNull]
+        public TModel CurrentModel { get; }
+    }
+}

+ 29 - 0
Shaker.Model/Models/DisplacementChannelConfigModel.cs

@@ -0,0 +1,29 @@
+using IModel;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Shaker.Models
+{
+    public class DisplacementChannelConfigModel:BaseModel
+    {
+        /// <summary>
+        /// 位移灵敏度(mv/mm)
+        /// </summary>
+        public double Sensitivity = 100;
+        /// <summary>
+        ///  位移偏置(mm)
+        /// </summary>
+        public double Bias = 0;
+        /// <summary>
+        /// 通道序号
+        /// </summary>
+        public byte Channel = 0;
+        public override object Clone()
+        {
+            return this.CloneBase();
+        }
+    }
+}

+ 26 - 0
Shaker.Model/Models/DisplacementConfigModel.cs

@@ -0,0 +1,26 @@
+using IModel;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Shaker.Models
+{
+    public sealed class DisplacementConfigModel : BaseModel
+    {
+        /// <summary>
+        /// 位移灵敏度
+        /// </summary>
+        public List<DisplacementChannelConfigModel> DisplacementChannels = new List<DisplacementChannelConfigModel>();
+        /// <summary>
+        /// 位移前馈增益
+        /// </summary>
+        public double DisplacementFeedforwardGain = 0;
+
+        public override object Clone()
+        {
+            return this.CloneBase();
+        }
+    }
+}

+ 29 - 0
Shaker.Model/Models/ShakerConfigModel.cs

@@ -0,0 +1,29 @@
+using IModel;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Shaker.Models
+{
+    public sealed class ShakerConfigModel:BaseModel
+    {
+        /// <summary>
+        /// 位移通道数
+        /// </summary>
+        public int DisplacementCount = 8;
+        /// <summary>
+        /// 加速度通道数
+        /// </summary>
+        public int AccelerationCount = 3;
+        /// <summary>
+        /// 最大模拟通道数
+        /// </summary>
+        public int MaxAICount = 32;
+        public override object Clone()
+        {
+            return this.CloneBase();
+        }
+    }
+}

Some files were not shown because too many files changed in this diff