Bläddra i källkod

修正了部分bug

luo 11 månader sedan
förälder
incheckning
f3ebbb07bf

+ 3 - 1
PLCControl.ModBus/Control.cs

@@ -35,7 +35,9 @@ namespace PLCControl.ModBus
             try
             {
                 var modbusFactory = new NModbus.ModbusFactory();
-                tcpClient = new System.Net.Sockets.TcpClient(IPAddress, Port);
+                tcpClient = new System.Net.Sockets.TcpClient();
+                var result = tcpClient.ConnectAsync(IPAddress, Port).Wait(500);
+                if (!result) return false;
                 modbus = modbusFactory.CreateMaster(tcpClient);
                 InvokeConnectionChanged(true);
                 return true;

+ 6 - 3
ShakerControl/MainWindow.xaml

@@ -224,7 +224,7 @@
                                 <Style.Triggers>
                                     <DataTrigger Binding="{Binding Path=MangerIsOnLine}" Value="True">
                                         <Setter Property="Data" Value="{StaticResource OnlineGeometry}" />
-                                        <Setter Property="Fill" Value="White" />
+                                        <Setter Property="Fill" Value="Green" />
                                         <Setter Property="ToolTip" Value="管理端在线" />
                                     </DataTrigger>
                                     <DataTrigger Binding="{Binding Path=MangerIsOnLine}" Value="False">
@@ -453,8 +453,11 @@
                     Margin="0,0,10,4"
                     HorizontalAlignment="Right"
                     VerticalAlignment="Bottom"
-                    Orientation="Horizontal">
-                    <TextBlock Foreground="White" Text="{Binding MainPage.ShakerControl.AnalogNames[0], StringFormat={}{0}:}" />
+                    Orientation="Vertical">
+                    <Ellipse
+                        Width="24"
+                        Height="24"
+                        Fill="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=StackPanel}, Path=Children[1].Foreground}" />
                     <TextBlock Text="{Binding MainPage.ShakerControl.OperatingStatus, Converter={StaticResource EnumToDescription}}">
                         <TextBlock.Style>
                             <Style TargetType="TextBlock">

+ 9 - 10
ShakerControl/View/IOPage/IOPageView.xaml

@@ -66,31 +66,30 @@
                                         Foreground="{StaticResource ContentTextBrush}"
                                         Text="{Binding Name}"
                                         TextWrapping="Wrap" />
-                                    <Border
+                                    <Ellipse
                                         Grid.Column="1"
                                         Width="36"
                                         Height="36"
                                         HorizontalAlignment="Left"
-                                        VerticalAlignment="Center"
-                                        CornerRadius="18">
-                                        <Border.Style>
-                                            <Style TargetType="Border">
+                                        VerticalAlignment="Center">
+                                        <Ellipse.Style>
+                                            <Style TargetType="Ellipse">
                                                 <Style.Triggers>
                                                     <DataTrigger Binding="{Binding Value}" Value="True">
-                                                        <Setter Property="Background" Value="Red" />
+                                                        <Setter Property="Fill" Value="Red" />
                                                         <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Border}, Path=DataContext.Name, StringFormat='{}{0}故障'}" />
                                                     </DataTrigger>
                                                     <DataTrigger Binding="{Binding Value}" Value="False">
-                                                        <Setter Property="Background" Value="Green" />
+                                                        <Setter Property="Fill" Value="Green" />
                                                         <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Border}, Path=DataContext.Name, StringFormat='{}{0}正常'}" />
                                                     </DataTrigger>
                                                     <DataTrigger Binding="{Binding Source={StaticResource MainViewModel}, Path=Data.MainPage.ShakerControl.IsConnected}" Value="False">
-                                                        <Setter Property="Background" Value="Gray" />
+                                                        <Setter Property="Fill" Value="Gray" />
                                                     </DataTrigger>
                                                 </Style.Triggers>
                                             </Style>
-                                        </Border.Style>
-                                    </Border>
+                                        </Ellipse.Style>
+                                    </Ellipse>
                                 </Grid>
                             </DataTemplate>
                         </Setter.Value>

+ 8 - 9
ShakerControl/View/ShakerConfig/ShakerConfigView.xaml

@@ -77,26 +77,25 @@
                         FontSize="{StaticResource TextFontSize}"
                         Foreground="{StaticResource ContentTextBrush}"
                         Text="振动台连接状态:" />
-                    <Border
+                    <Ellipse
                         Width="32"
                         Height="32"
-                        Margin="4,0,0,0"
-                        CornerRadius="16">
-                        <Border.Style>
-                            <Style TargetType="Border">
+                        Margin="4,0,0,0">
+                        <Ellipse.Style>
+                            <Style TargetType="Ellipse">
                                 <Style.Triggers>
                                     <DataTrigger Binding="{Binding ShakerControl.IsConnected}" Value="True">
-                                        <Setter Property="Background" Value="Green" />
+                                        <Setter Property="Fill" Value="Green" />
                                         <Setter Property="ToolTip" Value="已连接" />
                                     </DataTrigger>
                                     <DataTrigger Binding="{Binding ShakerControl.IsConnected}" Value="False">
-                                        <Setter Property="Background" Value="Red" />
+                                        <Setter Property="Fill" Value="Red" />
                                         <Setter Property="ToolTip" Value="未连接" />
                                     </DataTrigger>
                                 </Style.Triggers>
                             </Style>
-                        </Border.Style>
-                    </Border>
+                        </Ellipse.Style>
+                    </Ellipse>
                     <Button
                         Height="32"
                         Margin="10,0,0,0"

+ 1 - 0
ShakerManger/App.xaml

@@ -43,6 +43,7 @@
                 </Setter>
             </Style>
             <vm:MainViewModelBindingProxy x:Key="MainViewModel" />
+            <convert:MultiBoolConverter x:Key="MultiBoolConverter" />
             <convert:UserAllowClientIDConverter x:Key="UserAllowClientIDConverter" />
             <convert:Type2ViewConverter x:Key="Type2ViewConverter" />
             <convert:EnumToCollectionConverter x:Key="EnumToCollectionConverter" />

+ 32 - 0
ShakerManger/Convert/MultiBoolConverter.cs

@@ -0,0 +1,32 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Data;
+
+namespace ShakerManger.Convert
+{
+    public class MultiBoolConverter : IMultiValueConverter
+    {
+        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
+        {
+            if (values == null || values.Length == 0) return false;
+            try
+            {
+                if (parameter != null) return values.Cast<bool>().Any(x => !x);
+                return !values.Cast<bool>().Any(x => !x);
+            }
+            catch
+            {
+                return false;
+            }
+        }
+
+        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
+        {
+            throw new NotImplementedException();
+        }
+    }
+}

+ 39 - 3
ShakerManger/MainWindow.xaml

@@ -198,6 +198,7 @@
                             Padding="0"
                             hc:IconElement.Geometry="{StaticResource StartGeometry}"
                             Command="{Binding StartAllCommand}"
+                            IsEnabled="{Binding Source={StaticResource MainViewModel}, Path=Data.Login.IsAnonymous, Converter={StaticResource Boolean2BooleanReConverter}}"
                             Style="{StaticResource ImageButton}"
                             ToolTip="全部开始" />
                         <Button
@@ -206,6 +207,7 @@
                             Padding="0"
                             hc:IconElement.Geometry="{StaticResource StopGeometry}"
                             Command="{Binding StopAllCommand}"
+                            IsEnabled="{Binding Source={StaticResource MainViewModel}, Path=Data.Login.IsAnonymous, Converter={StaticResource Boolean2BooleanReConverter}}"
                             Style="{StaticResource ImageButton}"
                             ToolTip="全部停止" />
                     </UniformGrid>
@@ -220,9 +222,43 @@
                                 Height="42"
                                 hc:IconElement.Geometry="m63.94311,0l668.44444,0c32.99556,0 60.13156,24.91733 63.71556,56.94578l0.34133,6.99733l0,668.55822c0,32.99556 -24.91733,60.07467 -56.94578,63.54489l-6.99733,0.39822l-668.55822,0c-32.99556,0 -60.07467,-24.91733 -63.54489,-56.94578l-0.39822,-6.99733l0,-668.55822c0,-32.99556 24.91733,-60.07467 56.94578,-63.54489l6.99733,-0.39822l668.44444,0l-668.44444,0zm107.06489,56.88889l-114.11911,0l0,682.66666l682.66666,0l0,-682.66666l-114.11911,0l0.22756,3.47022l0.11378,3.584l0,213.44711c0,32.99556 -21.33334,60.07467 -48.81067,63.54489l-5.97333,0.39822l-345.54312,0c-28.27377,0 -51.48444,-24.91733 -54.44266,-56.94578l-0.34134,-6.99733l0,-213.44711c0,-2.38933 0.11378,-4.72178 0.34134,-7.05422zm397.88089,0l-341.33334,0l0,227.55555l341.33334,0l0,-227.55555zm-85.33334,56.88889a28.44444,28.44444 0 0 1 28.44445,28.44444l0,56.88889a28.44444,28.44444 0 1 1 -56.88889,0l0,-56.88889a28.44444,28.44444 0 0 1 28.44444,-28.44444z"
                                 Command="{Binding SaveDataCommand}"
-                                Cursor="Hand"
-                                IsEnabled="{Binding IsEnabled}"
-                                Style="{StaticResource ImageButton}" />
+                                Cursor="Hand">
+                                <Button.Style>
+                                    <Style TargetType="Button" BasedOn="{StaticResource ImageButton}">
+                                        <Style.Triggers>
+                                            <MultiDataTrigger>
+                                                <MultiDataTrigger.Conditions>
+                                                    <Condition Binding="{Binding IsEnabled}" Value="True" />
+                                                    <Condition Binding="{Binding Source={StaticResource MainViewModel}, Path=Data.Login.IsAnonymous}" Value="False" />
+                                                </MultiDataTrigger.Conditions>
+                                                <Setter Property="IsEnabled" Value="True" />
+                                            </MultiDataTrigger>
+
+                                            <MultiDataTrigger>
+                                                <MultiDataTrigger.Conditions>
+                                                    <Condition Binding="{Binding IsEnabled}" Value="False" />
+                                                    <Condition Binding="{Binding Source={StaticResource MainViewModel}, Path=Data.Login.IsAnonymous}" Value="False" />
+                                                </MultiDataTrigger.Conditions>
+                                                <Setter Property="IsEnabled" Value="False" />
+                                            </MultiDataTrigger>
+                                            <MultiDataTrigger>
+                                                <MultiDataTrigger.Conditions>
+                                                    <Condition Binding="{Binding IsEnabled}" Value="False" />
+                                                    <Condition Binding="{Binding Source={StaticResource MainViewModel}, Path=Data.Login.IsAnonymous}" Value="True" />
+                                                </MultiDataTrigger.Conditions>
+                                                <Setter Property="IsEnabled" Value="False" />
+                                            </MultiDataTrigger>
+                                            <MultiDataTrigger>
+                                                <MultiDataTrigger.Conditions>
+                                                    <Condition Binding="{Binding IsEnabled}" Value="True" />
+                                                    <Condition Binding="{Binding Source={StaticResource MainViewModel}, Path=Data.Login.IsAnonymous}" Value="True" />
+                                                </MultiDataTrigger.Conditions>
+                                                <Setter Property="IsEnabled" Value="False" />
+                                            </MultiDataTrigger>
+                                        </Style.Triggers>
+                                    </Style>
+                                </Button.Style>
+                            </Button>
                             <Viewbox
                                 Width="20"
                                 Height="20"

+ 68 - 40
ShakerManger/View/ShakerView.xaml

@@ -54,7 +54,7 @@
                                         <Style.Triggers>
                                             <DataTrigger Binding="{Binding Path=IsOnline}" Value="True">
                                                 <Setter Property="Data" Value="{StaticResource OnlineGeometry}" />
-                                                <Setter Property="Fill" Value="White" />
+                                                <Setter Property="Fill" Value="Green" />
                                                 <Setter Property="ToolTip" Value="控制终端在线" />
                                             </DataTrigger>
                                             <DataTrigger Binding="{Binding Path=IsOnline}" Value="False">
@@ -67,7 +67,10 @@
                                 </Path.Style>
                             </Path>
                         </Viewbox>
-                        <Viewbox Height="18" Margin="4,0,0,0">
+                        <Viewbox
+                            Height="18"
+                            Margin="4,0,0,0"
+                            Visibility="{Binding IsOnline, Converter={StaticResource Boolean2VisibilityConverter}}">
                             <Path Fill="White">
                                 <Path.Style>
                                     <Style TargetType="Path">
@@ -114,11 +117,25 @@
                         hc:IconElement.Width="{StaticResource buttonwidth}"
                         Command="{Binding RequestPermissionsCommand}"
                         Cursor="Hand"
-                        IsEnabled="{Binding IsOnline}"
                         RenderTransformOrigin="0.5,0.5"
-                        Style="{StaticResource ImageButton}"
                         ToolTip="申请控制权限"
-                        Visibility="{Binding IsRemoteControl, Converter={StaticResource Boolean2VisibilityReConverter}}" />
+                        Visibility="{Binding IsRemoteControl, Converter={StaticResource Boolean2VisibilityReConverter}}">
+                        <Button.Style>
+                            <Style TargetType="Button" BasedOn="{StaticResource ImageButton}">
+                                <Setter Property="IsEnabled">
+                                    <Setter.Value>
+                                        <MultiBinding Converter="{StaticResource MultiBoolConverter}">
+                                            <Binding Path="IsOnline" />
+                                            <Binding
+                                                Converter="{StaticResource Boolean2BooleanReConverter}"
+                                                Path="Data.Login.IsAnonymous"
+                                                Source="{StaticResource MainViewModel}" />
+                                        </MultiBinding>
+                                    </Setter.Value>
+                                </Setter>
+                            </Style>
+                        </Button.Style>
+                    </Button>
                     <Button
                         Grid.Column="3"
                         Width="{StaticResource buttonwidth}"
@@ -127,11 +144,25 @@
                         hc:IconElement.Width="{StaticResource buttonwidth}"
                         Command="{Binding DisConnectCommand}"
                         Cursor="Hand"
-                        IsEnabled="{Binding IsRemoteControl}"
                         RenderTransformOrigin="0.5,0.5"
-                        Style="{StaticResource ImageButton}"
                         ToolTip="断开连接"
-                        Visibility="{Binding IsConnected, Converter={StaticResource Boolean2VisibilityConverter}}" />
+                        Visibility="{Binding IsConnected, Converter={StaticResource Boolean2VisibilityConverter}}">
+                        <Button.Style>
+                            <Style TargetType="Button" BasedOn="{StaticResource ImageButton}">
+                                <Setter Property="IsEnabled">
+                                    <Setter.Value>
+                                        <MultiBinding Converter="{StaticResource MultiBoolConverter}">
+                                            <Binding Path="IsRemoteControl" />
+                                            <Binding
+                                                Converter="{StaticResource Boolean2BooleanReConverter}"
+                                                Path="Data.Login.IsAnonymous"
+                                                Source="{StaticResource MainViewModel}" />
+                                        </MultiBinding>
+                                    </Setter.Value>
+                                </Setter>
+                            </Style>
+                        </Button.Style>
+                    </Button>
                     <Button
                         Grid.Column="4"
                         Width="{StaticResource buttonwidth}"
@@ -177,36 +208,18 @@
                         Cursor="Hand">
                         <Button.Style>
                             <Style TargetType="Button" BasedOn="{StaticResource ImageButton}">
-                                <Style.Triggers>
-                                    <MultiDataTrigger>
-                                        <MultiDataTrigger.Conditions>
-                                            <Condition Binding="{Binding IsConnected}" Value="True" />
-                                            <Condition Binding="{Binding IsRemoteControl}" Value="True" />
-                                        </MultiDataTrigger.Conditions>
-                                        <Setter Property="IsEnabled" Value="True" />
-                                    </MultiDataTrigger>
-                                    <MultiDataTrigger>
-                                        <MultiDataTrigger.Conditions>
-                                            <Condition Binding="{Binding IsConnected}" Value="False" />
-                                            <Condition Binding="{Binding IsRemoteControl}" Value="True" />
-                                        </MultiDataTrigger.Conditions>
-                                        <Setter Property="IsEnabled" Value="False" />
-                                    </MultiDataTrigger>
-                                    <MultiDataTrigger>
-                                        <MultiDataTrigger.Conditions>
-                                            <Condition Binding="{Binding IsConnected}" Value="True" />
-                                            <Condition Binding="{Binding IsRemoteControl}" Value="False" />
-                                        </MultiDataTrigger.Conditions>
-                                        <Setter Property="IsEnabled" Value="False" />
-                                    </MultiDataTrigger>
-                                    <MultiDataTrigger>
-                                        <MultiDataTrigger.Conditions>
-                                            <Condition Binding="{Binding IsConnected}" Value="False" />
-                                            <Condition Binding="{Binding IsRemoteControl}" Value="False" />
-                                        </MultiDataTrigger.Conditions>
-                                        <Setter Property="IsEnabled" Value="False" />
-                                    </MultiDataTrigger>
-                                </Style.Triggers>
+                                <Setter Property="IsEnabled">
+                                    <Setter.Value>
+                                        <MultiBinding Converter="{StaticResource MultiBoolConverter}">
+                                            <Binding Path="IsConnected" />
+                                            <Binding Path="IsRemoteControl" />
+                                            <Binding
+                                                Converter="{StaticResource Boolean2BooleanReConverter}"
+                                                Path="Data.Login.IsAnonymous"
+                                                Source="{StaticResource MainViewModel}" />
+                                        </MultiBinding>
+                                    </Setter.Value>
+                                </Setter>
                             </Style>
                         </Button.Style>
                         <hc:Interaction.Triggers>
@@ -293,8 +306,23 @@
                         Margin="0,10,0,0"
                         Command="{Binding ConnectCommand}"
                         Content="连接功放"
-                        FontSize="14"
-                        IsEnabled="{Binding IsOnline}" />
+                        FontSize="14">
+                        <Button.Style>
+                            <Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
+                                <Setter Property="IsEnabled">
+                                    <Setter.Value>
+                                        <MultiBinding Converter="{StaticResource MultiBoolConverter}">
+                                            <Binding Path="IsOnline" />
+                                            <Binding
+                                                Converter="{StaticResource Boolean2BooleanReConverter}"
+                                                Path="Data.Login.IsAnonymous"
+                                                Source="{StaticResource MainViewModel}" />
+                                        </MultiBinding>
+                                    </Setter.Value>
+                                </Setter>
+                            </Style>
+                        </Button.Style>
+                    </Button>
                 </StackPanel>
             </Grid>
             <Popup

+ 2 - 1
ShakerManger/ViewModel/LoginViewModel.cs

@@ -16,6 +16,7 @@ namespace ShakerManger.ViewModel
         private string passWord = string.Empty;
         private string message = string.Empty;
         private bool isLoggedIn = false;
+        private bool isAnonymous = false;
 
         public string UserName 
         { 
@@ -77,7 +78,7 @@ namespace ShakerManger.ViewModel
                 }
             }
         }
-        public bool IsAnonymous { get; set; } = false;
+        public bool IsAnonymous { get => isAnonymous; set =>UpdateProperty(ref isAnonymous , value); }
         public bool IsLoggedIn { get => isLoggedIn; set =>UpdateProperty(ref isLoggedIn, value); }
         public string Message { get => message; set =>UpdateProperty(ref message, value); }
         public override Type View { get; } = typeof(View.LoginView);