基于WPF技术的换热站智能监控系统16--动态数据绑定

1、实现思路

1)实时读取到的数据绑定到前台UI控件上,这个通过MVVM模式实现,同时注意实时读取必须通过任务task异步方式,这就需要读取PLC数据。

2)UI控件的动作,如开或关水泵,必定能够将值写入PLC,这就需要写入PLC数据,此时当上面1的任务执行时,又获取到了新的实时数据,从而改变UI控件

注意:

默认启动程序后,就主动读取PLC数据,启动成功后,可以关闭某个水泵

2、开搞

1、完善数据块中的变量

每个水泵有3个数据,即状态,温度,压力,所以有9个变量

2、完善监控变量

 

3、完善逻辑代码

  private void ReadmyPLC(){tasks.Add(Task.Run(async () =>{ plc.Open();while (!cts.IsCancellationRequested){await Task.Delay(5000);//读取float,从左到右参数依次是:数据块类型,数据块号,启始地址,变量类型,读取数量var result = plc.Read(S7.Net.DataType.DataBlock, 1, 2, S7.Net.VarType.Real, 6);float[] values = (float[])result; //水泵1数据MainData.MomentDataList1[0].Value = values[0]; MainData.MomentDataList1[1].Value = values[1];//水泵2数据MainData.MomentDataList2[0].Value = values[2];MainData.MomentDataList2[1].Value = values[3];//水泵3数据MainData.MomentDataList3[0].Value = values[4];MainData.MomentDataList3[1].Value = values[5];//读取bool,DB1.DBX0.0是变量的具体地址var result2 = plc.Read(pumpaddr1);   //水泵1状态 Pump1State = bool.Parse(result2.ToString());if (!Pump1State){WaterDirection1 = "NONE";//停止流动}else{WaterDirection1 = "EW";//开始流动}result2 = plc.Read(pumpaddr2);//水泵2状态 Pump2State = bool.Parse(result2.ToString());if (!Pump3State){WaterDirection2 = "NONE";}else{WaterDirection2 = "EW";}result2 = plc.Read(pumpaddr3); //水泵3状态 Pump3State = bool.Parse(result2.ToString());if (!Pump3State){WaterDirection3 = "NONE";WaterDirection32 = "NONE";}else{WaterDirection3 = "EW";WaterDirection32 = "WE";}}}, cts.Token));} 

4、完善控件数据绑定

<Window x:Class="West.HeatExchange.Views.MainWindow"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:West.HeatExchange.Views"mc:Ignorable="d"xmlns:c="clr-namespace:West.HeatExchange.Controls"xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"WindowStyle="None" AllowsTransparency="True" WindowStartupLocation="CenterScreen" ResizeMode="CanResizeWithGrip"Background="#F7F9FA" FontFamily="Microsoft YaHei" Foreground="#333"Title="MainWindow" Height="650" Width="1200"  ><!--窗体资源--><Window.Resources><!--手动模式/自动模式单选控件样式--><Style TargetType="RadioButton" x:Key="ModeButtonStyle"><Setter Property="Background" Value="#FFF0F4F8"/><Setter Property="Foreground" Value="Gray"/><Setter Property="FontSize" Value="12"/><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="RadioButton"><Border Background="{TemplateBinding Background}" Name="bor"><ContentPresenter Margin="30,5"/></Border></ControlTemplate></Setter.Value></Setter><!--触发器--><Style.Triggers><Trigger Property="IsChecked" Value="True"><Setter Property="Background" Value="#FF3BBAFF"/><Setter Property="Foreground" Value="White"/></Trigger></Style.Triggers></Style><!--水泵开样式--><Style TargetType="RadioButton" x:Key="LeftSwitchButtonStyle"><Setter Property="Background" Value="#FFF0F4F8"/><Setter Property="Foreground" Value="Gray"/><Setter Property="HorizontalAlignment" Value="Center"/><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="RadioButton"><Grid><!--绘制下划线--><Border BorderBrush="Transparent" BorderThickness="0,0,0,1" Height="30" Margin="5,0" Name="bor" Width="20" HorizontalAlignment="Left"/><!--绘制曲线--><Path Data="M3 0 45 0 48 3 28 20 3 20 0 17 0 3z" Stroke="#DDD" StrokeThickness="1" Fill="{TemplateBinding Background}" Margin="0,0,2,0" VerticalAlignment="Center"/><TextBlock Text="开" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="10" Margin="0,0,15,0"/></Grid><!--触发器--><ControlTemplate.Triggers><Trigger Property="IsChecked" Value="True"><Setter TargetName="bor" Property="Visibility" Value="Visible"/><Setter TargetName="bor" Property="BorderBrush" Value="#FF3BBAFF"/></Trigger></ControlTemplate.Triggers></ControlTemplate></Setter.Value></Setter><Style.Triggers><Trigger Property="IsChecked" Value="True"><Setter Property="Background" Value="#FF3BBAFF"/><Setter Property="Foreground" Value="White"/></Trigger></Style.Triggers></Style><!--水泵关样式--><Style TargetType="RadioButton" x:Key="RightSwitchButtonStyle"><Setter Property="Background" Value="#FFF0F4F8"/><Setter Property="Foreground" Value="Gray"/><Setter Property="HorizontalAlignment" Value="Center"/><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="RadioButton"><Grid><Border BorderBrush="Transparent" BorderThickness="0,0,0,1" Height="30" Margin="8,0" Name="bor" Width="20" HorizontalAlignment="Right"/><Path Data="M0 17 20 0 45 0 48 3 48 17 45 20 3 20z" Stroke="#DDD" StrokeThickness="1" Fill="{TemplateBinding Background}" Margin="0,0,2,0" VerticalAlignment="Center"/><TextBlock Text="关" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="10" Margin="10,0,0,0"/></Grid><ControlTemplate.Triggers><Trigger Property="IsChecked" Value="True"><Setter TargetName="bor" Property="Visibility" Value="Visible"/><Setter TargetName="bor" Property="BorderBrush" Value="#FF3BBAFF"/></Trigger></ControlTemplate.Triggers></ControlTemplate></Setter.Value></Setter><Style.Triggers><Trigger Property="IsChecked" Value="True"><Setter Property="Background" Value="#FF3BBAFF"/><Setter Property="Foreground" Value="White"/></Trigger></Style.Triggers></Style><!--故障样式--><Style TargetType="CheckBox" x:Key="WarningButtonStyle"><Setter Property="FontSize" Value="11"/><Setter Property="Foreground" Value="White"/><Setter Property="Opacity" Value="0.2"/><Setter Property="Margin" Value="0,2"/><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="CheckBox"><Grid><Border BorderBrush="Red" BorderThickness="1" Padding="1" Name="root"><Border.Background><DrawingBrush TileMode="Tile" Viewport="0,0,0.1,0.2" ><!--画笔填充--><DrawingBrush.Drawing><GeometryDrawing><GeometryDrawing.Pen><Pen Brush="blue" Thickness="10" x:Name="pen"/></GeometryDrawing.Pen><GeometryDrawing.Geometry><LineGeometry StartPoint="50,0" EndPoint="0,50"/></GeometryDrawing.Geometry></GeometryDrawing></DrawingBrush.Drawing></DrawingBrush></Border.Background><Border Background="Red" Margin="0,6,0,0" BorderBrush="White" BorderThickness="1" Height="20"><ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center" Margin="15,0"/></Border></Border></Grid></ControlTemplate></Setter.Value></Setter><Style.Triggers><Trigger Property="IsChecked" Value="True"><Setter Property="Opacity" Value="1"/></Trigger></Style.Triggers></Style></Window.Resources><DockPanel><!--顶部区域,分5列--><Grid DockPanel.Dock="Top"  ><Grid.ColumnDefinitions><ColumnDefinition Width="48"/><ColumnDefinition Width="Auto"/><ColumnDefinition/><ColumnDefinition Width="Auto"/><ColumnDefinition Width="50"/></Grid.ColumnDefinitions><!--图标--><Border Width="45" Grid.Column="0" Background="#3BBAFF" BorderBrush="#EEE"  BorderThickness="1" HorizontalAlignment="Left"><Image Source="../Assets/Images/Logo_white.png" Margin="8"/></Border><!--背景--><Border Grid.ColumnSpan="4"  Grid.Column="1"   Background="#5E7593"  MouseLeftButtonDown="Border_MouseLeftButtonDown"/><!--文字--><TextBlock Text="换热站远程监控系统" VerticalAlignment="Center" Foreground="White" FontSize="19" Margin="10,0" Grid.Column="1"/><!--时间--><TextBlock  Text="{Binding NowTime, StringFormat={}{0:yyyy年MM月dd日HH时mm分ss秒}}" VerticalAlignment="Center"  Foreground="White" FontSize="19"  Margin="20,0" Grid.Column="3"/><!--退出按钮--><Button   Grid.Column="4" Width="25" Height="25"  Click="Button_Click"><Button.Background><ImageBrush ImageSource="../Assets/Images/closewin.png"/></Button.Background></Button></Grid><!--左侧区域,分5行--><Border DockPanel.Dock="Left" Width="280" Background="White" CornerRadius="3" Margin="30,10,10,10" ><Border.Effect><DropShadowEffect BlurRadius="10" ShadowDepth="0" Color="LightGray" Opacity="0.3"/></Border.Effect><Grid Margin="20,10"><Grid.RowDefinitions><RowDefinition Height="50"/><RowDefinition/><RowDefinition/><RowDefinition Height="1.2*"/><RowDefinition Height="1.2*"/></Grid.RowDefinitions><!--第1行,文字栏--><Border Grid.Row="0" Background="#3BBAFF" CornerRadius="3" Margin="0,8"><StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center"><c:RunLoading Width="23" Height="23" Margin="10,0"/><TextBlock Text="换热站综合信息详情" Foreground="White" FontSize="12" VerticalAlignment="Center"/></StackPanel></Border><!--第2行,历史曲线--><Grid Grid.Row="1" Background="#FFF0F4F8" Margin="0,5"><Border Height="16" VerticalAlignment="Bottom" Background="#FF0E3A52" CornerRadius="8"/><!--livechart图表配置,Values绑定序列数据--><lvc:CartesianChart DisableAnimations="True"><lvc:CartesianChart.Series><lvc:LineSeries Values="29,225,380,97,440,129,532" LineSmoothness="0"  Fill="Transparent"/></lvc:CartesianChart.Series><!--X轴配置--><lvc:CartesianChart.AxisX><lvc:Axis Labels="周一,周二,周三,周四,周五,周六,周日" FontSize="8" Foreground="White"><lvc:Axis.Separator><lvc:Separator StrokeThickness="0" Step="1"/></lvc:Axis.Separator></lvc:Axis></lvc:CartesianChart.AxisX><!--Y轴配置--><lvc:CartesianChart.AxisY><lvc:Axis MinValue="0" MaxValue="600" Foreground="Transparent"></lvc:Axis></lvc:CartesianChart.AxisY></lvc:CartesianChart><Border Background="#3BBAFF" VerticalAlignment="Top" HorizontalAlignment="Left"><TextBlock Text="历史曲线" Foreground="White" FontSize="10" Margin="5,1"/></Border></Grid><!--第3行,能耗排名--><Grid Grid.Row="2" Background="#FFF0F4F8" Margin="0,5"><UniformGrid Columns="1"><!--文字部分--><StackPanel Orientation="Horizontal" VerticalAlignment="Top"><Border Background="#FF3BBAFF"><TextBlock Text="能耗排名" Foreground="White" FontSize="10" Margin="5,1"/></Border><TextBlock FontSize="10" VerticalAlignment="Center" Margin="5,0"><Run Text="耗水" Foreground="#666"/><Run Text="&#xe92e;" FontFamily="../Assets/Fonts/#iconfont"/></TextBlock><TextBlock FontSize="10" VerticalAlignment="Center"><Run Text="耗电" Foreground="#666"/><Run Text="&#xe8b6;" FontFamily="../Assets/Fonts/#iconfont"/></TextBlock><TextBlock  FontSize="10" VerticalAlignment="Center" Margin="5,0"><Run Text="耗热" Foreground="#666"/><Run Text="&#xe60e;" FontFamily="../Assets/Fonts/#iconfont"/></TextBlock></StackPanel><!--耗水--><Grid Margin="0,0,10,0"><Grid.ColumnDefinitions><ColumnDefinition Width="20"/><ColumnDefinition/></Grid.ColumnDefinitions><TextBlock Text="&#xe92e;" FontFamily="../Assets/Fonts/#iconfont" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="#FF3BBAFF"/><ProgressBar Grid.Column="1" Minimum="0" Maximum="200" Value="182" Background="LightGray" Foreground="Orange" Height="4"/></Grid><!--耗电--><Grid Margin="0,0,10,0"><Grid.ColumnDefinitions><ColumnDefinition Width="20"/><ColumnDefinition/></Grid.ColumnDefinitions><TextBlock Text="&#xe8b6;" FontFamily="../Assets/Fonts/#iconfont" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="#FF3BBAFF"/><ProgressBar Grid.Column="1" Minimum="0" Maximum="200" Value="156" Background="LightGray" Foreground="Orange" Height="4"/></Grid><!--耗热--><Grid Margin="0,0,10,0"><Grid.ColumnDefinitions><ColumnDefinition Width="20"/><ColumnDefinition/></Grid.ColumnDefinitions><TextBlock Text="&#xe60e;" FontFamily="../Assets/Fonts/#iconfont" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="#FF3BBAFF"/><ProgressBar Grid.Column="1" Minimum="0" Maximum="200" Value="116" Background="LightGray" Foreground="Orange" Height="4"/></Grid><!--装饰--><Border Height="5" Margin="10,0"><Border.Background><!--线性渐变--><LinearGradientBrush StartPoint="0,0" EndPoint="1,0"><GradientStop Color="#FF3BBAFF" Offset="0"/><GradientStop Color="#113BBAFF" Offset="1"/></LinearGradientBrush></Border.Background></Border></UniformGrid></Grid><!--第4行,故障统计--><Grid Grid.Row="3" Background="#FFF0F4F8" Margin="0,5"><Border Height="16" VerticalAlignment="Bottom" Background="#FF0E3A52" CornerRadius="8"/><lvc:CartesianChart DisableAnimations="True"><lvc:CartesianChart.Series><lvc:ColumnSeries Values="319,223,63,257,335,440,178,223,53,117" MaxColumnWidth="6"/></lvc:CartesianChart.Series><lvc:CartesianChart.AxisX><lvc:Axis Labels="设备1,设备2,设备3,设备4,设备5,设备6,设备7,设备8,设备9,设备10" FontFamily="Microsoft YaHei" FontSize="6" Foreground="White"><lvc:Axis.Separator><lvc:Separator Step="1" StrokeThickness="0"/></lvc:Axis.Separator></lvc:Axis></lvc:CartesianChart.AxisX><lvc:CartesianChart.AxisY><lvc:Axis MinValue="0" MaxValue="600" Foreground="Transparent"><lvc:Axis.Separator><lvc:Separator StrokeThickness="1" Stroke="#DDD" Step="760"/></lvc:Axis.Separator></lvc:Axis></lvc:CartesianChart.AxisY></lvc:CartesianChart><Border Background="#FF3BBAFF" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="2"><TextBlock Text="故障统计" Foreground="White" FontSize="10" Margin="5,1"/></Border></Grid><!--第5行,数据报表--><Grid Grid.Row="4" Background="#FFF0F4F8" Margin="0,5"><lvc:PieChart  InnerRadius="40" Width="110" Height="110"  DisableAnimations="True" StartingRotationAngle="0" HoverPushOut="0"  ><!--以下是静态显示--><lvc:PieChart.Series><lvc:PieSeries  Values="23"  Fill="#2BBF6E" StrokeThickness="2" DataLabels="True" Foreground="Black" FontSize="11" LabelPosition="OutsideSlice" Title="锻烧车间"></lvc:PieSeries><lvc:PieSeries  Values="37" Fill="#3DDFEE" StrokeThickness="2" DataLabels="True" Foreground="Black" FontSize="11" LabelPosition="OutsideSlice" Title="模具车间"></lvc:PieSeries><lvc:PieSeries  Values="80" Fill="Red" StrokeThickness="2" DataLabels="True" Foreground="Black" FontSize="11" LabelPosition="OutsideSlice" Title="电噴车间"></lvc:PieSeries><lvc:PieSeries  Values="60" Fill="Blue" StrokeThickness="2" DataLabels="True" Foreground="Black" FontSize="11" LabelPosition="OutsideSlice" Title="组装车间"></lvc:PieSeries></lvc:PieChart.Series></lvc:PieChart><Border Background="#FF3BBAFF" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="2"><TextBlock Text="数据报表" Foreground="White" FontSize="10" Margin="5,1"/></Border></Grid></Grid></Border><!--右上区域,控制模式--><Border Height="80" DockPanel.Dock="Top" Background="White" Margin="0,10,20,0" CornerRadius="3"><Border.Effect><DropShadowEffect BlurRadius="10" ShadowDepth="0" Color="LightGray" Opacity="0.3"/></Border.Effect><UniformGrid Rows="1"><!--<Button Content="连接PLC" Width="60" Height="40" Click="Button_Click_1" ></Button>--><StackPanel VerticalAlignment="Center" HorizontalAlignment="Center"><RadioButton Content="手动模式" IsChecked="True" Style="{StaticResource ModeButtonStyle}"/><RadioButton Content="自动模式" Style="{StaticResource ModeButtonStyle}"/></StackPanel><!--补水泵1--><Grid Background="#88F0F4F8" VerticalAlignment="Center" HorizontalAlignment="Center"><Grid.RowDefinitions><RowDefinition/><RowDefinition/></Grid.RowDefinitions><TextBlock Text="No.1 补水泵" Margin="20,3" HorizontalAlignment="Center"/><Grid Grid.Row="1" Margin="10,0"><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition Width="15"/><ColumnDefinition/></Grid.ColumnDefinitions><RadioButton Grid.Column="0" IsChecked="True"  Command="{Binding StartCommand}" CommandParameter="1" Grid.ColumnSpan="2"  Style="{StaticResource LeftSwitchButtonStyle}" Name="rb"/><RadioButton Grid.Column="1" Grid.ColumnSpan="2" Command="{Binding StopCommand}"  CommandParameter="1" Style="{StaticResource RightSwitchButtonStyle}"/></Grid></Grid><!--补水泵2--><Grid Background="#88F0F4F8" VerticalAlignment="Center" HorizontalAlignment="Center"><Grid.RowDefinitions><RowDefinition/><RowDefinition/></Grid.RowDefinitions><TextBlock Text="No.2 补水泵" Margin="20,3" HorizontalAlignment="Center"/><Grid Grid.Row="1" Margin="10,0"><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition Width="15"/><ColumnDefinition/></Grid.ColumnDefinitions><RadioButton IsChecked="True" Grid.ColumnSpan="2" Command="{Binding StartCommand}" CommandParameter="2" Style="{StaticResource LeftSwitchButtonStyle}"/><RadioButton Grid.Column="1" Grid.ColumnSpan="2" Command="{Binding StopCommand}"  CommandParameter="2" Style="{StaticResource RightSwitchButtonStyle}"/></Grid></Grid><!--补水泵3--><Grid Background="#88F0F4F8" VerticalAlignment="Center" HorizontalAlignment="Center"><Grid.RowDefinitions><RowDefinition/><RowDefinition/></Grid.RowDefinitions><TextBlock Text="No.3 补水泵" Margin="20,3" HorizontalAlignment="Center"/><Grid Grid.Row="1" Margin="10,0"><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition Width="15"/><ColumnDefinition/></Grid.ColumnDefinitions><RadioButton IsChecked="True" Grid.ColumnSpan="2" Command="{Binding StartCommand}" CommandParameter="3" Style="{StaticResource LeftSwitchButtonStyle}"/><RadioButton Grid.Column="1" Grid.ColumnSpan="2" Command="{Binding StopCommand}"  CommandParameter="3" Style="{StaticResource RightSwitchButtonStyle}"/></Grid></Grid><!--故障切换--> <Grid Background="#88F0F4F8" VerticalAlignment="Center" HorizontalAlignment="Center"><Grid.RowDefinitions><RowDefinition/><RowDefinition/></Grid.RowDefinitions><CheckBox Content="循环变频故障" Grid.Row="0" Style="{StaticResource WarningButtonStyle}" IsChecked="True"/><CheckBox Content="补水变频故障" Grid.Row="1" Style="{StaticResource WarningButtonStyle}"/></Grid></UniformGrid></Border><!--右中区域,系统运行--><Border Background="White" Margin="0,10,20,10" CornerRadius="3" ><Border.Effect><DropShadowEffect BlurRadius="10" ShadowDepth="0" Color="LightGray" Opacity="0.3"/></Border.Effect><Canvas><!--管道--> <c:PipeLine Height="7" Width="839" Direction="EW" HorizontalAlignment="Left" VerticalAlignment="Center" Canvas.Left="10" Canvas.Top="44"/><c:PipeLine x:Name="middle" Panel.ZIndex="3" Canvas.Left="234" Canvas.Top="49"   Direction="EW"   Height="7" Width="182" CapRadius="3"><c:PipeLine.RenderTransform><TransformGroup><RotateTransform Angle="90" ></RotateTransform></TransformGroup></c:PipeLine.RenderTransform></c:PipeLine><c:PipeLine Height="7" Width="619" Direction="EW" HorizontalAlignment="Left" VerticalAlignment="Center" Canvas.Left="230" Canvas.Top="224"/><c:PipeLine x:Name="middle2" Panel.ZIndex="3" Canvas.Left="164" Canvas.Top="139.5"   Direction="{Binding WaterDirection2}"   Height="7" Width="185" CapRadius="3"><c:PipeLine.RenderTransform><TransformGroup><RotateTransform Angle="90" ></RotateTransform></TransformGroup></c:PipeLine.RenderTransform></c:PipeLine><c:PipeLine Height="7" Width="399" Direction="{Binding WaterDirection2}" HorizontalAlignment="Left" VerticalAlignment="Center" Canvas.Left="450" Canvas.Top="296"  /><c:PipeLine x:Name="right" Panel.ZIndex="3" Margin="0" Canvas.Left="223" Canvas.Top="302" Width="131" Direction="{Binding WaterDirection32}"  Height="7" CapRadius="1"><c:PipeLine.RenderTransform><TransformGroup><TranslateTransform X="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Canvas}, Path=ActualHeight}" Y="0"></TranslateTransform><RotateTransform Angle="90" CenterX="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Canvas}, Path=ActualHeight}" CenterY="0"></RotateTransform></TransformGroup></c:PipeLine.RenderTransform></c:PipeLine><c:PipeLine Height="7" Width="79" Direction="{Binding WaterDirection3}" HorizontalAlignment="Left" VerticalAlignment="Center" Canvas.Left="640" Canvas.Top="426"  /><c:PipeLine Height="7" Width="79" Direction="{Binding WaterDirection3}" HorizontalAlignment="Left" VerticalAlignment="Center" Canvas.Left="540" Canvas.Top="447"  /><c:PipeLine Height="7.5"  Width="409" Direction="{Binding WaterDirection1}"  HorizontalAlignment="Left" VerticalAlignment="Center" Canvas.Left="10" Canvas.Top="137"/><c:PipeLine Height="7.5"  Width="259" Direction="{Binding WaterDirection2}" HorizontalAlignment="Left" VerticalAlignment="Center" Canvas.Left="158" Canvas.Top="317"/><c:PipeLine Height="7.5"  Width="459" Direction="{Binding WaterDirection3}" HorizontalAlignment="Left" VerticalAlignment="Center" Canvas.Left="10" Canvas.Top="447"/><c:PipeLine Height="7.5" Width="399" Direction="{Binding WaterDirection1}" HorizontalAlignment="Left" VerticalAlignment="Center" Canvas.Left="450" Canvas.Top="116"/><!--图片--><Image Source="../Assets/Images/d1.jpg" Canvas.Left="35" Canvas.Top="29" Height="39" Width="61" HorizontalAlignment="Center" VerticalAlignment="Top"/><Image Source="../Assets/Images/d1.jpg" Canvas.Left="755" Canvas.Top="29" Height="39" Width="61" HorizontalAlignment="Center" VerticalAlignment="Top"/><Image Source="../Assets/Images/d1.jpg" Canvas.Left="755" Canvas.Top="279" Height="39" Width="61" HorizontalAlignment="Center" VerticalAlignment="Top"/><Image Source="../Assets/Images/d1.jpg" Panel.ZIndex="3" Canvas.Left="95" Canvas.Top="429" Height="39" Width="61" HorizontalAlignment="Center" VerticalAlignment="Top"/><Image Source="../Assets/Images/heat_exchange.jpg" Panel.ZIndex="2" Canvas.Left="264" Canvas.Top="20" Height="156" Width="80" HorizontalAlignment="Center" VerticalAlignment="Top"/><Image Source="../Assets/Images/heat_exchange.jpg" Panel.ZIndex="2" Canvas.Left="264" Canvas.Top="200" Height="156" Width="80" HorizontalAlignment="Center" VerticalAlignment="Top"/><Image Source="../Assets/Images/i2.jpg" Canvas.Left="164" Canvas.Top="13" Height="31" Width="25" HorizontalAlignment="Left" VerticalAlignment="Top"/><Image Source="../Assets/Images/i2.jpg" Canvas.Left="424" Canvas.Top="13" Height="31" Width="25" HorizontalAlignment="Left" VerticalAlignment="Top"/><Image Source="../Assets/Images/i2.jpg" Canvas.Left="524" Canvas.Top="85" Height="31" Width="25" HorizontalAlignment="Left" VerticalAlignment="Top"/><Image Source="../Assets/Images/i2.jpg" Canvas.Left="684" Canvas.Top="193" Height="31" Width="25" HorizontalAlignment="Left" VerticalAlignment="Top"/><Image Source="../Assets/Images/i2.jpg" Canvas.Left="584" Canvas.Top="265" Height="31" Width="25" HorizontalAlignment="Left" VerticalAlignment="Top"/><Image Source="../Assets/Images/f2.jpg" Panel.ZIndex="2" Canvas.Left="64" Canvas.Top="115" Height="33" Width="34" HorizontalAlignment="Left" VerticalAlignment="Top"/><Image Source="../Assets/Images/f2.jpg" Panel.ZIndex="2" Canvas.Left="224" Canvas.Top="425" Height="33" Width="34" HorizontalAlignment="Left" VerticalAlignment="Top"/><!--3个水泵--><c:Pump Width="42" Height="38" IsRunning="{Binding Pump1State}" Canvas.Left="411" Canvas.Top="111" HorizontalAlignment="Center" VerticalAlignment="Top"/><c:Pump Width="42" Height="38" IsRunning="{Binding Pump2State}" Canvas.Left="411" Canvas.Top="291" HorizontalAlignment="Center" VerticalAlignment="Top"/><c:Pump Width="42" Height="38" IsRunning="{Binding Pump3State}" Canvas.Left="611" Canvas.Top="421" HorizontalAlignment="Center" VerticalAlignment="Top"/><!--数据看板--><c:DataBoard Width="75" Height="40" Canvas.Left="30" Canvas.Top="71" ItemsSource="{Binding MainData.MomentDataList1}"/><c:DataBoard Width="75" Height="40" Canvas.Left="135" Canvas.Top="56" ItemsSource="{Binding MainData.MomentDataList1}"/><c:DataBoard Width="75" Height="40" Canvas.Left="545" Canvas.Top="71" ItemsSource="{Binding MainData.MomentDataList1}"/><c:DataBoard Width="75" Height="40" Canvas.Left="495" Canvas.Top="252" ItemsSource="{Binding MainData.MomentDataList2}"/> <c:DataBoard Width="75" Height="40" Canvas.Left="595" Canvas.Top="178" ItemsSource="{Binding MainData.MomentDataList2}"/> <c:DataBoard Width="75" Height="40" Canvas.Left="90" Canvas.Top="383" ItemsSource="{Binding MainData.MomentDataList3}"/><c:CoolingTower  RunningState="Normal" Width="140" Height="150"  Canvas.Left="415" Canvas.Top="347"></c:CoolingTower></Canvas></Border></DockPanel></Window>

 5、运行效果

程序启动后,暂时没有数据

5秒后,数据实时显示,温度压力状态数据与监控表中的数据一致的 

关闭水泵1,观察管道和风扇情况及监控表数值

 

 

开启水泵1,管道流动了,风扇转动了 ,PLC数据改变了

 至此,PLC与系统完美对接,实现了全场监控管理。

走过路过不要错过,点赞关注收藏又圈粉,共同致富,为财务自由作出贡献

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/355357.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python | Leetcode Python题解之第169题多数元素

题目&#xff1a; 题解&#xff1a; class Solution:def majorityElement(self, nums: List[int]) -> int:count 0candidate Nonefor num in nums:if count 0:candidate numcount (1 if num candidate else -1)return candidate

Java | Leetcode Java题解之第171题Excel表列序号

题目&#xff1a; 题解&#xff1a; class Solution {public int titleToNumber(String columnTitle) {int number 0;int multiple 1;for (int i columnTitle.length() - 1; i > 0; i--) {int k columnTitle.charAt(i) - A 1;number k * multiple;multiple * 26;}ret…

《Windows API每日一练》5.2 按键消息

上一节中我们得知&#xff0c;Windows系统的按键消息有很多类型&#xff0c;大部分按键消息都是由Windows系统的默认窗口过程处理的&#xff0c;我们自己只需要处理少数几个按键消息。这一节我们将详细讲述Windows系统的所有按键消息及其处理方式。 本节必须掌握的知识点&…

wsl2平台鸿蒙全仓docker编译环境快速创建方法

文章目录 1 文章适用范围&#xff1a;2 WSL环境安装3 镜像迁移非C盘4 Docker环境准备4.1 docker用户组和用户创建4.2 Docker环境配置4.2.1 Ubuntu下安装docker工具4.2.2 鸿蒙Docker环境安装4.2.3 鸿蒙全仓代码拉取编译 5 鸿蒙全仓代码的更新策略6 参考文献7 FAQ7.1 缺头文件xcr…

每天写java到期末考试(6.21)--集合4--练习--6.20

练习1&#xff1a; 正常写集合 bool类 代码&#xff1a; import QM_Fx.Student;import java.util.ArrayList;public class test {public static void main(String[] args) {ArrayList<Student> listnew ArrayList<>();//2.创建学生对象Student s1new Student(&quo…

【面试干货】throw 和 throws 的区别

【面试干货】throw 和 throws 的区别 1、throw1.1 示例 2、throws2.1 示例 3、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java中&#xff0c;throw和throws都与异常处理紧密相关&#xff0c;但它们在使用和含义上有明显的区别。…

【Linux】关于在华为云中开放了端口后仍然无法访问的问题

已在安全组中添加规则: 通过指令: netstat -nltp | head -2 && netstat -nltp | grep 8080 运行结果: 可以看到服务器确实处于监听状态了. 通过指令 telnet 公网ip port 也提示: "正在连接xxx.xx.xx.xxx...无法打开到主机的连接。 在端口 8080: 连接失败"…

[C++][数据结构][B-树][上]详细讲解

目录 0.常见的搜索结构1.B树概念2.B-树的插入分析1.流程分析2.插入过程总结 0.常见的搜索结构 种类数据格式时间复杂度顺序查找无要求 O ( N ) O(N) O(N)二分查找有序 O ( l o g 2 N ) O(log_2 N) O(log2​N)二叉搜索树无要求 O ( N ) O(N) O(N)二叉平衡树无要求 O ( l o g 2 …

Nvidia Isaac Sim搭建仿真环境 入门教程 2024(4)

Nvidia Isaac Sim 入门教程 2024 版权信息 Copyright 2023-2024 Herman YeAuromix. All rights reserved.This course and all of its associated content, including but not limited to text, images, videos, and any other materials, are protected by copyright law. …

怎么添加网页到桌面快捷方式?

推荐用过最棒的学习网站&#xff01;https://offernow.cn 添加网页到桌面快捷方式&#xff1f; 很简单&#xff0c;仅需要两步&#xff0c;接下来以chrome浏览器为例。 第一步 在想要保存的网页右上角点击设置。 第二步 保存并分享-创建快捷方式&#xff0c;保存到桌面即可…

【Unity】AssetBundle打包策略

【Unity】AssetBundle打包策略 在游戏开发过程中&#xff0c;AssetBundle(AB)打包策略的重要性不容忽视。游戏开发者往往手动设置游戏资源包名进行管理&#xff0c;难免会造成资源确实或导致冗余&#xff0c;因此对于AB包的打包流程来说&#xff0c;进行策略管理显得十分重要。…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] API集群访问频次统计(100分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

IOS逆向分析—终极详细(三)

IOS逆向分析—终极详细&#xff08;三&#xff09; 前言一、逆向分析是什么&#xff1f;二、IDA分析1.下载并安装IDA2.安装插件3.加载二进制4.代码分析5.其它 总结 前言 本文是个人完成对IOS上APP分析的整个过程&#xff0c;当然对于不同的机型还会遇到不同的情况&#xff0c;谨…

RabbitMQ 开发指南

连接RabbitMQ 连接方式一&#xff1a; 也可以选择使用URI的方式来实现 连接方式二&#xff1a; Connection接口被用来创建一个Channel&#xff0c;在创建之后&#xff0c;Channel可以用来发送或者接收消息。 Channel channel conn.createChannel();使用交换器和队列 声明…

android在线阅读代码网站

android在线阅读代码社区&#xff1a; Android 1.6 到 Android 10 的源码&#xff1a; Android OS 在线源代码 - https://www.androidos.net.cn10.0.0_r6 - Android社区 - https://www.androidos.net.cn/ AndroidXRef https://cs.android.com/ https://cs.android.com/android…

《梦醒蝶飞:释放Excel函数与公式的力量》4.1if函数

第4章&#xff1a;逻辑与条件函数 第一节4.1 if函数 在Excel中&#xff0c;逻辑函数用于处理基于特定条件的真假判断&#xff0c;它们是构建复杂公式和进行高级数据分析的基础。本章将深入探讨逻辑函数的使用方法&#xff0c;特别是IF函数&#xff0c;这是Excel中最为常用的条…

win10免安装配置MySQL8.4.0

注&#xff1a;此教程基于win10 22H2 版本 1、下载最新版本MySQL压缩包 下载链接&#xff1a;MySQL官网下载地址 点击第二行的 ZIP Archive 后面的Download&#xff08;当前时间2024-06-19最新版本是8.4.0&#xff09; 2、解压并添加配置文件 下载完毕后&#xff0c;解压缩…

修复 pprof ---node_exproter访问漏洞(go-pprof-leak)

前言&#xff1a; ** 在Go语言中&#xff0c;pprof和debug包是用来检测和避免goroutine泄漏&#xff0c;避免导致goroutine泄漏&#xff0c;进而消耗大量系统资源。不过对于安全而言确又存在一定风险&#xff0c;** 风险&#xff1a; 通过node_exporter web发现 190.168.46.1…

数据结构之“算法的时间复杂度和空间复杂度”

&#x1f339;个人主页&#x1f339;&#xff1a;喜欢草莓熊的bear &#x1f339;专栏&#x1f339;&#xff1a;数据结构 目录 前言 一、算法效率 1.1算法的复杂度概念 1.2复杂度的重要性 二、时间复杂度 2.1时间复杂度的概念 2.2大O的渐进表示法 2.3常见的时间复杂度…

【人机交互 复习】第1章 人机交互概述

人机交互的知识点碎&#xff0c;而且都是文字&#xff0c;过一遍脑子里什么都留不下&#xff0c;但是背时间已经来不及了&#xff0c;最好还是找题要题感吧&#xff0c;加深印象才是做对文科的关键 一、概念 1.人机交互&#xff08;Human-Computer Interaction,HCI)&#xff1…