Browse Source

20250909001 图标添加,PLC32位数据读写高低位结构修改,添加新的数粒结果通讯代码(隐藏未使用),添加了自制软键盘窗口(逻辑未实现)

向羽 孟 7 tháng trước cách đây
mục cha
commit
2c992eed2a

BIN
CCDCountWpf/23s6k-ono7l-001.ico


+ 16 - 0
CCDCountWpf/CCDCountWpf.csproj

@@ -38,6 +38,9 @@
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
   </PropertyGroup>
+  <PropertyGroup>
+    <ApplicationIcon>23s6k-ono7l-001.ico</ApplicationIcon>
+  </PropertyGroup>
   <ItemGroup>
     <Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
       <HintPath>..\packages\EntityFramework.6.4.4\lib\net45\EntityFramework.dll</HintPath>
@@ -92,6 +95,9 @@
     <Compile Include="WpfFrom\ChangeUserWindow.xaml.cs">
       <DependentUpon>ChangeUserWindow.xaml</DependentUpon>
     </Compile>
+    <Compile Include="WpfFrom\KeyBorad.xaml.cs">
+      <DependentUpon>KeyBorad.xaml</DependentUpon>
+    </Compile>
     <Compile Include="WpfFrom\SplashWindow.xaml.cs">
       <DependentUpon>SplashWindow.xaml</DependentUpon>
     </Compile>
@@ -121,6 +127,10 @@
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
     </Page>
+    <Page Include="WpfFrom\KeyBorad.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
     <Page Include="WpfFrom\SplashWindow.xaml">
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
@@ -276,6 +286,12 @@
   <ItemGroup>
     <Resource Include="FromImage\键盘_白.png" />
   </ItemGroup>
+  <ItemGroup>
+    <Resource Include="FromImage\23s6k-ono7l-001.ico" />
+  </ItemGroup>
+  <ItemGroup>
+    <Resource Include="23s6k-ono7l-001.ico" />
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
     <PropertyGroup>

BIN
CCDCountWpf/FromImage/23s6k-ono7l-001.ico


+ 4 - 0
CCDCountWpf/PlcMessageShowBindingClass.cs

@@ -542,6 +542,10 @@ namespace CCDCountWpf
             get { return returnToZeroOffsetValue.ToString("F2"); }
             set
             {
+                if (value == "-")
+                {
+                    return;
+                }
                 if (float.TryParse(value, out float result))
                 {
                     returnToZeroOffsetValue = result;

+ 80 - 0
CCDCountWpf/WpfFrom/KeyBorad.xaml

@@ -0,0 +1,80 @@
+<Window x:Class="CCDCountWpf.WpfFrom.KeyBorad"
+        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+        xmlns:local="clr-namespace:CCDCountWpf.WpfFrom"
+        mc:Ignorable="d" Height="304" Width="1050">
+    <Grid>
+        <Grid.ColumnDefinitions>
+            <ColumnDefinition Width="*"/>
+            <ColumnDefinition Width="220"/>
+        </Grid.ColumnDefinitions>
+        <Grid Grid.Column="0">
+            <Grid.RowDefinitions>
+                <RowDefinition Height="*"/>
+                <RowDefinition Height="*"/>
+                <RowDefinition Height="*"/>
+                <RowDefinition Height="*"/>
+            </Grid.RowDefinitions>
+            <Button Grid.Row="0" Content="1" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="10,0,0,0"/>
+            <Button Grid.Row="0" Content="2" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="80,0,0,0"/>
+            <Button Grid.Row="0" Content="3" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="150,0,0,0"/>
+            <Button Grid.Row="0" Content="4" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="220,0,0,0"/>
+            <Button Grid.Row="0" Content="5" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="290,0,0,0"/>
+            <Button Grid.Row="0" Content="6" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="360,0,0,0"/>
+            <Button Grid.Row="0" Content="7" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="430,0,0,0"/>
+            <Button Grid.Row="0" Content="8" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="500,0,0,0"/>
+            <Button Grid.Row="0" Content="9" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="570,0,0,0"/>
+            <Button Grid.Row="0" Content="0" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="640,0,0,0"/>
+            <Button Grid.Row="1" Content="1" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="10,0,0,0"/>
+            <Button Grid.Row="1" Content="2" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="80,0,0,0"/>
+            <Button Grid.Row="1" Content="3" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="150,0,0,0"/>
+            <Button Grid.Row="1" Content="4" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="220,0,0,0"/>
+            <Button Grid.Row="1" Content="5" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="290,0,0,0"/>
+            <Button Grid.Row="1" Content="6" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="360,0,0,0"/>
+            <Button Grid.Row="1" Content="7" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="430,0,0,0"/>
+            <Button Grid.Row="1" Content="8" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="500,0,0,0"/>
+            <Button Grid.Row="1" Content="9" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="570,0,0,0"/>
+            <Button Grid.Row="1" Content="0" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="640,0,0,0"/>
+            <Button Grid.Row="2" Content="1" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="10,0,0,0"/>
+            <Button Grid.Row="2" Content="2" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="80,0,0,0"/>
+            <Button Grid.Row="2" Content="3" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="150,0,0,0"/>
+            <Button Grid.Row="2" Content="4" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="220,0,0,0"/>
+            <Button Grid.Row="2" Content="5" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="290,0,0,0"/>
+            <Button Grid.Row="2" Content="6" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="360,0,0,0"/>
+            <Button Grid.Row="2" Content="7" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="430,0,0,0"/>
+            <Button Grid.Row="2" Content="8" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="500,0,0,0"/>
+            <Button Grid.Row="2" Content="9" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="570,0,0,0"/>
+            <Button Grid.Row="2" Content="0" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="640,0,0,0"/>
+            <Button Grid.Row="3" Content="1" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="10,0,0,0"/>
+            <Button Grid.Row="3" Content="2" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="80,0,0,0"/>
+            <Button Grid.Row="3" Content="3" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="150,0,0,0"/>
+            <Button Grid.Row="3" Content="4" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="220,0,0,0"/>
+            <Button Grid.Row="3" Content="5" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="290,0,0,0"/>
+            <Button Grid.Row="3" Content="6" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="360,0,0,0"/>
+            <Button Grid.Row="3" Content="7" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="430,0,0,0"/>
+            <Button Grid.Row="3" Content="8" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="500,0,0,0"/>
+            <Button Grid.Row="3" Content="9" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="570,0,0,0"/>
+            <Button Grid.Row="3" Content="0" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="640,0,0,0"/>
+        </Grid>
+        <Grid Grid.Column="1">
+            <Grid.RowDefinitions>
+                <RowDefinition Height="*"/>
+                <RowDefinition Height="*"/>
+                <RowDefinition Height="*"/>
+                <RowDefinition Height="*"/>
+            </Grid.RowDefinitions>
+            <Button Grid.Row="0" Content="7" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="10,0,0,0"/>
+            <Button Grid.Row="0" Content="8" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="80,0,0,0"/>
+            <Button Grid.Row="0" Content="9" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="150,0,0,0"/>
+            <Button Grid.Row="1" Content="4" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="10,0,0,0"/>
+            <Button Grid.Row="1" Content="5" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="80,0,0,0"/>
+            <Button Grid.Row="1" Content="6" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="150,0,0,0"/>
+            <Button Grid.Row="2" Content="1" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="10,0,0,0"/>
+            <Button Grid.Row="2" Content="2" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="80,0,0,0"/>
+            <Button Grid.Row="2" Content="3" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="150,0,0,0"/>
+            <Button Grid.Row="3" Content="0" HorizontalAlignment="Left" VerticalAlignment="Center" Width="60" Height="60" Margin="80,0,0,0"/>
+        </Grid>
+    </Grid>
+</Window>

+ 27 - 0
CCDCountWpf/WpfFrom/KeyBorad.xaml.cs

@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Shapes;
+
+namespace CCDCountWpf.WpfFrom
+{
+    /// <summary>
+    /// KeyBorad.xaml 的交互逻辑
+    /// </summary>
+    public partial class KeyBorad : Window
+    {
+        public KeyBorad()
+        {
+            InitializeComponent();
+        }
+    }
+}

+ 12 - 11
CCDCountWpf/WpfFrom/MainWindow.xaml.cs

@@ -464,15 +464,15 @@ namespace CCDCountWpf
         private void ShowErrorMesPage(ErrorMesDataEventModelClass e)
         {
             ShowMessageBus.ShowBinding.ShowErrMessage = e.ErrorMesData.Message;
-            ShowUri = new Uri("WpfPage\\MessagePage.xaml", UriKind.Relative);
-            try
-            {
-                ShowFrame.Navigate(ShowUri);
-            }
-            catch (Exception)
-            {
-                Console.WriteLine("MianWindows-ShowErrorMesPage:显示错误信息页面失败");
-            }
+            //ShowUri = new Uri("WpfPage\\MessagePage.xaml", UriKind.Relative);
+            //try
+            //{
+            //    ShowFrame.Navigate(ShowUri);
+            //}
+            //catch (Exception)
+            //{
+            //    Console.WriteLine("MianWindows-ShowErrorMesPage:显示错误信息页面失败");
+            //}
         }
 
         /// <summary>
@@ -506,8 +506,9 @@ namespace CCDCountWpf
         /// </summary>
         public void InitPlcManger()
         {
-            PlcSettingMessageBus.pLCManagement = new PLCManagementClass("127.0.0.1");
-            if(PlcSettingMessageBus.pLCManagement.IsConnect)
+            //PlcSettingMessageBus.pLCManagement = new PLCManagementClass("127.0.0.1");
+            PlcSettingMessageBus.pLCManagement = new PLCManagementClass("192.168.1.88");
+            if (PlcSettingMessageBus.pLCManagement.IsConnect)
             {
                 IsPLCShow = true;
                 const int targetMsPerFrame = 100; // 20FPS=50ms

+ 2 - 0
CCDCountWpf/WpfPage/MainPage.xaml.cs

@@ -155,6 +155,7 @@ namespace CCDCountWpf.WpfPage
             StartIdentifyBtn.Opacity = 0.5;
             StopIdentifyBtn.IsEnabled = true;
             StopIdentifyBtn.Opacity = 1;
+            PlcSettingMessageBus.pLCManagement.InitiateToTrue();
         }
 
         private void StopIdentifyBtn_Click(object sender, RoutedEventArgs e)
@@ -164,6 +165,7 @@ namespace CCDCountWpf.WpfPage
             StartIdentifyBtn.Opacity = 1;
             StopIdentifyBtn.IsEnabled = false;
             StopIdentifyBtn.Opacity = 0.5;
+            PlcSettingMessageBus.pLCManagement.StopToTrue();
         }
 
         private void BottingMaterialCylinderVibrationTableHighSpeedValueUpUpBtn_Click(object sender, RoutedEventArgs e)

+ 2 - 1
CCDCountWpf/WpfPage/PlcSettingPage.xaml.cs

@@ -586,7 +586,7 @@ namespace CCDCountWpf.WpfPage
         {
             if(float.TryParse(PlcSettingMessageBus.PlcMessageShowBindage.ReturnToZeroOffsetValue, out float value))
             {
-                if(value - 0.5 < 0) return;
+                //if(value - 0.5 < 0) return;
                 PlcSettingMessageBus.PlcMessageShowBindage.ReturnToZeroOffsetValue = (value - 0.5).ToString();
             }
         }
@@ -983,5 +983,6 @@ namespace CCDCountWpf.WpfPage
         {
             PlcSettingMessageBus.pLCManagement.SwitchValveJog(7);
         }
+
     }
 }

+ 22 - 1
TestWork.DLL/MainThreadClass.cs

@@ -597,13 +597,34 @@ namespace CCDCount.DLL
                 {
                     //单通道合格计数
                     result |= (ushort)(1 << oneActive.ChannelNO);
+                    if(oneActive.StateCode != 0)
+                    {
+                        result |= (ushort)(1 << (8 + oneActive.ChannelNO));
+                    }
                 }
                 else
                 {
                     //单通道不合格计数
-                    result |= (ushort)(1 << (8 + oneActive.ChannelNO));
                     Console.WriteLine($"通道{oneActive.ChannelNO}的激活数据有误!");
                 }
+                //新的数据发送格式,需要与新的PLC程序配合
+                //if (oneActive.StateCode == 0 && oneActive.ChannelNO != -1)
+                //{
+                //    //单通道合格计数
+                //    result |= (ushort)(1 << oneActive.ChannelNO);
+                //}
+                //else
+                //{
+                //    if(oneActive.StateCode != 7 && oneActive.ChannelNO != -1)
+                //    {
+                //        //单通道不合格计数
+                //        result |= (ushort)(1 << (8 + oneActive.ChannelNO));
+                //    }
+                //    else if(oneActive.StateCode == 7)
+                //    {
+                //        FaultLog.RecordErrorMessage("视野存在遮挡,请检查相机");
+                //    }
+                //}
             }
             LOG.log("当前待发送队列数量:" + SendQueue.Count, 6);
             if(IsSend)

+ 6 - 21
TestWork.DLL/PLCManagementClass.cs

@@ -520,7 +520,7 @@ namespace CCDCount.DLL
         /// <param name="Value"></param>
         public void WriteSpeedModeRunningSpeed(float Value)
         {
-            modbusTcpClient.WriteMultipleReals(1, 1110, new float[] { Value }, "ABCD");
+            modbusTcpClient.WriteMultipleReals(1, 1110, new float[] { Value }, "BADC");
         }
 
         /// <summary>
@@ -529,7 +529,7 @@ namespace CCDCount.DLL
         /// <param name="Value"></param>
         public void WriteJogSpeed(float Value)
         {
-            modbusTcpClient.WriteMultipleReals(1, 1114, new float[] { Value }, "ABCD");
+            modbusTcpClient.WriteMultipleReals(1, 1114, new float[] { Value }, "BADC");
         }
 
         /// <summary>
@@ -547,7 +547,7 @@ namespace CCDCount.DLL
         /// <param name="Value"></param>
         public void WriteTransferValveOpeningSpeed(float Value)
         {
-            modbusTcpClient.WriteMultipleReals(1, 1122, new float[] { Value }, "ABCD");
+            modbusTcpClient.WriteMultipleReals(1, 1122, new float[] { Value }, "BADC");
         }
 
         /// <summary>
@@ -836,27 +836,12 @@ namespace CCDCount.DLL
         /// <summary>
         /// 获取16位寄存器中的32Uint位值
         /// </summary>
-        private UInt32 GetInt32FromRegisters(ushort[] registers)
+        private UInt32 GetInt32FromRegisters(ushort[] registers,string byteOrder = "BADC")
         {
             ushort highRegister = registers[0];
             ushort lowRegister = registers[1];
 
-            // 根据字节序组合成32位值
-            byte[] bytes = new byte[4];
-            if (BitConverter.IsLittleEndian)
-            {
-                bytes[3] = (byte)((highRegister >> 8) & 0xFF);
-                bytes[2] = (byte)(highRegister & 0xFF);
-                bytes[1] = (byte)((lowRegister >> 8) & 0xFF);
-                bytes[0] = (byte)(lowRegister & 0xFF);
-            }
-            else
-            {
-                bytes[0] = (byte)((highRegister >> 8) & 0xFF);
-                bytes[1] = (byte)(highRegister & 0xFF);
-                bytes[2] = (byte)((lowRegister >> 8) & 0xFF);
-                bytes[3] = (byte)(lowRegister & 0xFF);
-            }
+            byte[] bytes = ConvertToByteArray(lowRegister, highRegister, byteOrder);
 
             // 转换为float
             return (UInt32)BitConverter.ToInt32(bytes, 0);
@@ -867,7 +852,7 @@ namespace CCDCount.DLL
         /// </summary>
         private float GetFloatFromRegisters(ushort[] registers)
         {
-            string byteOrder = "ABCD";
+            string byteOrder = "BADC";
             ushort highRegister = registers[0];
             ushort lowRegister = registers[1];
             byte[] bytes = ConvertToByteArray(lowRegister, highRegister, byteOrder);

+ 90 - 127
TestWork.DLL/ShuLiClass.cs

@@ -33,8 +33,7 @@ namespace CCDCount.DLL
         private List<int> _ChannelsRoi = new List<int>();
         private int ChannelWidth = 0;//每个区域的宽度
         private int IdentifyImageWidth = -1;
-        private static readonly object _lockObj = new object(); // 专用锁对象\
-        private static readonly object taskLock = new object(); // 异步专用锁
+        private static readonly object _lockObj = new object(); // 专用锁对象
         private int ObjectNum = 0;
         public int ImageNum { get { return IFrameDatas.Count; } }
         #endregion
@@ -126,7 +125,6 @@ namespace CCDCount.DLL
                         item.Num = ObjectNum += 1;
                         item.ChannelNO = ActiveChannel(item);
                         item.EndCheckTime = DateTime.Now;
-                        OneActive.Add(item);
                         item.MaxLength = GetActionMaxLength(item.RowsData);
                         if ((item.LastSeenLine - item.StartLine) > shuLiConfig.MAX_Idetify_Height)
                         {
@@ -179,6 +177,7 @@ namespace CCDCount.DLL
                                 Console.WriteLine("颗粒编号{0}:正常粒", item.Num);
                             }
                         }
+                        OneActive.Add(item);
                     }
 
                     if (OneActive.Count > 0)
@@ -424,14 +423,90 @@ namespace CCDCount.DLL
                 }
                 IsPrintLightOnError = false;
             }
+            lock (_lockObj)
+            {
+                foreach (var region in currentRegions)
+                {
+                    // 查找全部可合并的活跃物体(有重叠+在允许间隔内)
+                    var matcheds = activeObjects.Where(o =>
+                        IsOverlapping(o, region) &&
+                        (currentLine - o.LastSeenLine - 1) <= shuLiConfig.MAX_GAP).ToList();
+                    //当有多个可合并的活跃物体时,将多个物体合并
+                    if (matcheds.Count >= 2)
+                    {
+                        // 合并有效区域队列
+                        var CopeRowsData = new List<RowStartEndCol>();
+                        matcheds.ForEach(o => CopeRowsData = CopeRowsData.Concat(o.RowsData).ToList());
+                        // 合并有效区域并保存在新的区域中
+                        var MergeMatched = new ActiveObjectClass
+                        {
+                            MinStartCol = matcheds.Min(o => o.MinStartCol),
+                            MaxEndCol = matcheds.Max(o => o.MaxEndCol),
+                            StartLine = matcheds.Min(o => o.StartLine),
+                            LastSeenLine = matcheds.Max(o => o.LastSeenLine),
+                            LastSeenLineStartCol = matcheds.Min(o => o.LastSeenLineStartCol),
+                            LastSeenLineEndCol = matcheds.Max(o => o.LastSeenLineEndCol),
+                            StartCheckTime = matcheds.Min(o => o.StartCheckTime),
+                            EndCheckTime = matcheds.Max(o => o.EndCheckTime),
+                            Area = matcheds.Sum(o => o.Area),
+                            RowsData = CopeRowsData,
+                            ImageWidth = matcheds.FirstOrDefault().ImageWidth,
+                            //StateCode = 8
+                        };
+                        // 从活跃区域中删除被合并的区域
+                        matcheds.ForEach(o => activeObjects.Remove(o));
+                        // 保存新的区域到活跃区域中
+                        activeObjects.Add(MergeMatched);
+                    }
 
-            MergeCurrentRegions(currentRegions);
+                    // 搜获可用且可合并的活跃区域
+                    var matched = activeObjects.FirstOrDefault(o =>
+                        IsOverlapping(o, region) &&
+                        (currentLine - o.LastSeenLine - 1) <= shuLiConfig.MAX_GAP);
+                    if (matched != null)
+                    {
+                        // 合并区域:扩展物体边界并更新状态
+                        matched.MinStartCol = Math.Min(matched.MinStartCol, region.Start);
+                        matched.MaxEndCol = Math.Max(matched.MaxEndCol, region.End);
+                        matched.Area += region.End - region.Start + 1;
+                        matched.LastSeenLine = currentLine;
+                        matched.RowsData.Add(new RowStartEndCol
+                        {
+                            StartCol = region.Start,
+                            EndCol = region.End,
+                            RowsCol = currentLine,
+                        });
+                        matched.LastSeenLineStartCol = region.Start;
+                        matched.LastSeenLineEndCol = region.End;
+                    }
+                    else
+                    {
+                        // 创建新物体(首次出现的区域)
+                        activeObjects.Add(new ActiveObjectClass
+                        {
+                            MinStartCol = region.Start,
+                            MaxEndCol = region.End,
+                            StartLine = currentLine,
+                            LastSeenLine = currentLine,
+                            LastSeenLineStartCol = region.Start,
+                            LastSeenLineEndCol = region.End,
+                            StartCheckTime = DateTime.Now,
+                            Area = region.End - region.Start + 1,
+                            ImageWidth = IdentifyImageWidth,
+                            RowsData = new List<RowStartEndCol> {
+                                new RowStartEndCol {
+                                    StartCol = region.Start,
+                                    EndCol = region.End,
+                                    RowsCol = currentLine,
+                                }
+                            }
+                        });
+                    }
+                }
+            }
 
             currentRegions.Clear();
-            // 更新有效物体的最后一行的起始点
-            activeObjects.Where(o => o.LastSeenLine == currentLine).ToList().ForEach(o => o.LastSeenLineStartCol = o.RowsData.Where(p => p.RowsCol == currentLine).Min(p => p.StartCol));
-            activeObjects.Where(o => o.LastSeenLine == currentLine).ToList().ForEach(o => o.LastSeenLineEndCol = o.RowsData.Where(p => p.RowsCol == currentLine).Max(p => p.EndCol));
-
+            
             return result;
         }
 
@@ -460,7 +535,7 @@ namespace CCDCount.DLL
                         {
                             regions.Add(new ValidRegionModelClass()
                             {
-                                Start = start, 
+                                Start = start,
                                 End = (i - 1) % (int)image.Width
                             }); // 记录有效区域
                         }
@@ -481,9 +556,9 @@ namespace CCDCount.DLL
                         // 检查区域宽度是否达标
                         if (i - start >= shuLiConfig.MIN_OBJECT_WIDTH)
                         {
-                            regions.Add(new ValidRegionModelClass() 
+                            regions.Add(new ValidRegionModelClass()
                             {
-                                Start = start, 
+                                Start = start,
                                 End = (i - 1) % (int)image.Width
                             }); // 记录有效区域
                         }
@@ -496,7 +571,8 @@ namespace CCDCount.DLL
             // 处理行尾未闭合的区域
             if (start != -1 && image.Width - start >= shuLiConfig.MIN_OBJECT_WIDTH)
             {
-                regions.Add(new ValidRegionModelClass() {
+                regions.Add(new ValidRegionModelClass()
+                {
                     Start = start,
                     End = (int)image.Width - 1
                 });
@@ -510,7 +586,7 @@ namespace CCDCount.DLL
         /// <param name="obj">活跃物体</param>
         /// <param name="region">当前区域</param>
         /// <returns>是否发生重叠</returns>
-        private bool IsOverlapping(ActiveObjectClass obj,ValidRegionModelClass region)
+        private bool IsOverlapping(ActiveObjectClass obj, ValidRegionModelClass region)
         {
             // 判断区域是否不相交的逆条件
             return !(region.End < obj.LastSeenLineStartCol || region.Start > obj.LastSeenLineEndCol);
@@ -648,119 +724,6 @@ namespace CCDCount.DLL
             }
             return true;
         }
-
-        private bool MergeCurrentRegions(List<ValidRegionModelClass> validRegions)
-        {
-            bool Result = false;
-            ExecuteAsyncOperations(validRegions).GetAwaiter().GetResult();
-            return Result;
-        }
-
-        private async Task ExecuteAsyncOperations(List<ValidRegionModelClass> validRegions)
-        {
-            // 创建异步操作任务列表
-            var tasks = new List<Task<string>>();
-            for (int i = 0; i < validRegions.Count; i++)
-            {
-                tasks.Add(AsyncOperation(validRegions[i],i));
-            }
-
-            try
-            {
-                // 等待所有异步操作完成
-                var results = await Task.WhenAll(tasks);
-                Console.WriteLine($"All operations completed: [{string.Join(", ", results)}]");
-            }
-            catch (Exception ex)
-            {
-                Console.WriteLine($"One or more operations failed: {ex.Message}");
-            }
-        }
-
-        private async Task<string> AsyncOperation(ValidRegionModelClass region,int i)
-        {
-            // 模拟异步操作,比如网络请求或I/O操作
-            await Task.Run(() => {
-                lock(taskLock)
-                {
-                    // 查找全部可合并的活跃物体(有重叠+在允许间隔内)
-                    var matcheds = activeObjects.Where(o =>
-                        IsOverlapping(o, region) &&
-                        (currentLine - o.LastSeenLine - 1) <= shuLiConfig.MAX_GAP).ToList();
-                    //当有多个可合并的活跃物体时,将多个物体合并
-                    if (matcheds.Count >= 2)
-                    {
-                        // 合并有效区域队列
-                        var CopeRowsData = new List<RowStartEndCol>();
-                        matcheds.ForEach(o => CopeRowsData = CopeRowsData.Concat(o.RowsData).ToList());
-                        // 合并有效区域并保存在新的区域中
-                        var MergeMatched = new ActiveObjectClass
-                        {
-                            MinStartCol = matcheds.Min(o => o.MinStartCol),
-                            MaxEndCol = matcheds.Max(o => o.MaxEndCol),
-                            StartLine = matcheds.Min(o => o.StartLine),
-                            LastSeenLine = matcheds.Max(o => o.LastSeenLine),
-                            LastSeenLineStartCol = matcheds.Min(o => o.LastSeenLineStartCol),
-                            LastSeenLineEndCol = matcheds.Max(o => o.LastSeenLineEndCol),
-                            StartCheckTime = matcheds.Min(o => o.StartCheckTime),
-                            EndCheckTime = matcheds.Max(o => o.EndCheckTime),
-                            Area = matcheds.Sum(o => o.Area),
-                            RowsData = CopeRowsData,
-                            ImageWidth = matcheds.FirstOrDefault().ImageWidth,
-                            //StateCode = 8
-                        };
-                        // 从活跃区域中删除被合并的区域
-                        matcheds.ForEach(o => activeObjects.Remove(o));
-                        // 保存新的区域到活跃区域中
-                        activeObjects.Add(MergeMatched);
-                    }
-
-                    // 搜获可用且可合并的活跃区域
-                    var matched = activeObjects.FirstOrDefault(o =>
-                        IsOverlapping(o, region) &&
-                        (currentLine - o.LastSeenLine - 1) <= shuLiConfig.MAX_GAP);
-                    if (matched != null)
-                    {
-                        // 合并区域:扩展物体边界并更新状态
-                        matched.MinStartCol = Math.Min(matched.MinStartCol, region.Start);
-                        matched.MaxEndCol = Math.Max(matched.MaxEndCol, region.End);
-                        matched.Area += region.End - region.Start + 1;
-                        matched.LastSeenLine = currentLine;
-                        matched.RowsData.Add(new RowStartEndCol
-                        {
-                            StartCol = region.Start,
-                            EndCol = region.End,
-                            RowsCol = currentLine,
-                        });
-                    }
-                    else
-                    {
-                        // 创建新物体(首次出现的区域)
-                        activeObjects.Add(new ActiveObjectClass
-                        {
-                            MinStartCol = region.Start,
-                            MaxEndCol = region.End,
-                            StartLine = currentLine,
-                            LastSeenLine = currentLine,
-                            LastSeenLineStartCol = region.Start,
-                            LastSeenLineEndCol = region.End,
-                            StartCheckTime = DateTime.Now,
-                            Area = region.End - region.Start + 1,
-                            ImageWidth = IdentifyImageWidth,
-                            RowsData = new List<RowStartEndCol> {
-                                new RowStartEndCol {
-                                    StartCol = region.Start,
-                                    EndCol = region.End,
-                                    RowsCol = currentLine,
-                                }
-                            }
-                        });
-                    }
-                }
-            }); // 延迟
-            Console.WriteLine($"Operation {i} completed");
-            return $"Result {i}";
-        }
         #endregion
 
         #region 线程方法
@@ -776,7 +739,7 @@ namespace CCDCount.DLL
                 if (IFrameDatas.Count() > 0)
                 {
                     stopwatch.Restart();
-                    if(IFrameDatas.Count()>50)
+                    if (IFrameDatas.Count() > 50)
                         FaultLog.RecordErrorMessage($"图像数据队列中数据过多,请及时处理!当前数据数量为:{IFrameDatas.Count()}");
                     IFrameDatas.TryDequeue(out IImage IframeData);
                     //是否成功取得数据

+ 12 - 32
TestWork.DLL/Tools/ModbusClass.cs

@@ -169,7 +169,7 @@ namespace CCDCount.DLL.Tools
         /// <param name="count">REAL值的数量</param>
         /// <param name="byteOrder">字节序 (ABCD, CDAB, BADC, DCBA)</param>
         /// <returns>REAL值数组</returns>
-        public float[] ReadHoldingRegistersAsReal(byte slaveId, ushort startAddress, ushort count, string byteOrder = "ABCD")
+        public float[] ReadHoldingRegistersAsReal(byte slaveId, ushort startAddress, ushort count, string byteOrder = "BADC")
         {
             if (_modbusMaster == null) throw new InvalidOperationException("未连接到服务器");
 
@@ -205,7 +205,7 @@ namespace CCDCount.DLL.Tools
         /// <param name="startAddress">起始地址</param>
         /// <param name="count">REAL值的数量</param>
         /// <returns>REAL值数组</returns>
-        public UInt32[] ReadHoldingRegistersAsInt32(byte slaveId, ushort startAddress, ushort count)
+        public UInt32[] ReadHoldingRegistersAsInt32(byte slaveId, ushort startAddress, ushort count,string byteOrder = "BADC")
         {
             if (_modbusMaster == null) throw new InvalidOperationException("未连接到服务器");
 
@@ -221,22 +221,8 @@ namespace CCDCount.DLL.Tools
                     ushort highRegister = registers[i * 2];
                     ushort lowRegister = registers[i * 2 + 1];
 
-                    // 根据字节序组合成32位值
-                    byte[] bytes = new byte[4];
-                    if (BitConverter.IsLittleEndian)
-                    {
-                        bytes[3] = (byte)((highRegister >> 8) & 0xFF);
-                        bytes[2] = (byte)(highRegister & 0xFF);
-                        bytes[1] = (byte)((lowRegister >> 8) & 0xFF);
-                        bytes[0] = (byte)(lowRegister & 0xFF);
-                    }
-                    else
-                    {
-                        bytes[0] = (byte)((highRegister >> 8) & 0xFF);
-                        bytes[1] = (byte)(highRegister & 0xFF);
-                        bytes[2] = (byte)((lowRegister >> 8) & 0xFF);
-                        bytes[3] = (byte)(lowRegister & 0xFF);
-                    }
+
+                    byte[] bytes = ConvertToByteArray(lowRegister, highRegister, byteOrder);
 
                     // 转换为float
                     realValues[i] = (UInt32)BitConverter.ToInt32(bytes, 0);
@@ -301,7 +287,7 @@ namespace CCDCount.DLL.Tools
         /// <param name="startAddress">起始地址</param>
         /// <param name="value">REAL值</param>
         /// <param name="byteOrder">字节序 (ABCD, CDAB, BADC, DCBA)</param>
-        public void WriteSingleReal(byte slaveId, ushort startAddress, float value, string byteOrder = "ABCD")
+        public void WriteSingleReal(byte slaveId, ushort startAddress, float value, string byteOrder = "BADC")
         {
             if (_modbusMaster == null) throw new InvalidOperationException("未连接到服务器");
 
@@ -352,7 +338,7 @@ namespace CCDCount.DLL.Tools
         /// <param name="startAddress">起始地址</param>
         /// <param name="values">REAL值数组</param>
         /// <param name="byteOrder">字节序 (ABCD, CDAB, BADC, DCBA)</param>
-        public void WriteMultipleReals(byte slaveId, ushort startAddress, float[] values, string byteOrder = "ABCD")
+        public void WriteMultipleReals(byte slaveId, ushort startAddress, float[] values, string byteOrder = "BADC")
         {
             if (_modbusMaster == null)
             {
@@ -401,23 +387,17 @@ namespace CCDCount.DLL.Tools
         /// <param name="startAddress">起始地址</param>
         /// <param name="value">REAL值</param>
         /// <param name="byteOrder">字节序 (ABCD, CDAB, BADC, DCBA)</param>
-        public void WriteSingleInt32(byte slaveId, ushort startAddress, UInt32 value)
+        public void WriteSingleInt32(byte slaveId, ushort startAddress, UInt32 value, string byteOrder = "BADC")
         {
             // 将32位整数拆分为两个16位寄存器值
             byte[] bytes = BitConverter.GetBytes(value);
             ushort[] registers = new ushort[2];
 
-            // 处理字节序
-            if (BitConverter.IsLittleEndian)
-            {
-                registers[0] = (ushort)((bytes[3] << 8) | bytes[2]); // 高16位
-                registers[1] = (ushort)((bytes[1] << 8) | bytes[0]); // 低16位
-            }
-            else
-            {
-                registers[0] = (ushort)((bytes[0] << 8) | bytes[1]); // 高16位
-                registers[1] = (ushort)((bytes[2] << 8) | bytes[3]); // 低16位
-            }
+            ushort[] regPair = ConvertBytesToRegisters(bytes, byteOrder);
+
+            // 将寄存器值放入数组
+            registers[0] = regPair[0];
+            registers[1] = regPair[1];
 
             WriteMultipleRegisters(slaveId, startAddress, registers);
         }