@@ -3,7 +3,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00 | |||||
# Visual Studio Version 17 | # Visual Studio Version 17 | ||||
VisualStudioVersion = 17.9.34607.119 | VisualStudioVersion = 17.9.34607.119 | ||||
MinimumVisualStudioVersion = 10.0.40219.1 | MinimumVisualStudioVersion = 10.0.40219.1 | ||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BPA.WeimoCube", "BPA.WeimoCube\BPA.WeimoCube.csproj", "{2BB3F0FF-6FBD-45EC-9111-DA96D58DDC72}" | |||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BPA.WeimoCube", "BPA.WeimoCube\BPA.WeimoCube.csproj", "{2BB3F0FF-6FBD-45EC-9111-DA96D58DDC72}" | |||||
EndProject | |||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommcationLibray", "CommcationLibray\CommcationLibray.csproj", "{19E2F031-486A-40C2-9EC5-9158F90F74FD}" | |||||
EndProject | EndProject | ||||
Global | Global | ||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution | GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||
@@ -15,6 +17,10 @@ Global | |||||
{2BB3F0FF-6FBD-45EC-9111-DA96D58DDC72}.Debug|Any CPU.Build.0 = Debug|Any CPU | {2BB3F0FF-6FBD-45EC-9111-DA96D58DDC72}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||
{2BB3F0FF-6FBD-45EC-9111-DA96D58DDC72}.Release|Any CPU.ActiveCfg = Release|Any CPU | {2BB3F0FF-6FBD-45EC-9111-DA96D58DDC72}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||
{2BB3F0FF-6FBD-45EC-9111-DA96D58DDC72}.Release|Any CPU.Build.0 = Release|Any CPU | {2BB3F0FF-6FBD-45EC-9111-DA96D58DDC72}.Release|Any CPU.Build.0 = Release|Any CPU | ||||
{19E2F031-486A-40C2-9EC5-9158F90F74FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||||
{19E2F031-486A-40C2-9EC5-9158F90F74FD}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||||
{19E2F031-486A-40C2-9EC5-9158F90F74FD}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||||
{19E2F031-486A-40C2-9EC5-9158F90F74FD}.Release|Any CPU.Build.0 = Release|Any CPU | |||||
EndGlobalSection | EndGlobalSection | ||||
GlobalSection(SolutionProperties) = preSolution | GlobalSection(SolutionProperties) = preSolution | ||||
HideSolutionNode = FALSE | HideSolutionNode = FALSE | ||||
@@ -2,8 +2,11 @@ | |||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | ||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | ||||
xmlns:local="clr-namespace:BPA.WeimoCube" | xmlns:local="clr-namespace:BPA.WeimoCube" | ||||
StartupUri="MainWindow.xaml"> | |||||
<Application.Resources> | |||||
</Application.Resources> | |||||
xmlns:vm="clr-namespace:BPA.WeimoCube.ViewModels" | |||||
StartupUri="Views/MainWindow.xaml"> | |||||
<Application.Resources> | |||||
<!--在应用层面实例化Locator对象--> | |||||
<vm:ViewModelLocator x:Key="locator"/> | |||||
<vm:MainWindowViewModel x:Key="mvm"/> | |||||
</Application.Resources> | |||||
</Application> | </Application> |
@@ -0,0 +1,85 @@ | |||||
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> | |||||
<ControlTemplate x:Key="ComboBoxToggleButton" | |||||
TargetType="{x:Type ToggleButton}"> | |||||
<Grid> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition /> | |||||
<ColumnDefinition Width="20" /> | |||||
</Grid.ColumnDefinitions> | |||||
<Border x:Name="Border" Grid.ColumnSpan="2" CornerRadius="3" BorderThickness="1" BorderBrush="#EEE" | |||||
Background="#FFF"/> | |||||
<Path x:Name="Arrow" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center" | |||||
Data="M 0 0 L 4 4 L 8 0 Z" Fill="#888"> | |||||
</Path> | |||||
</Grid> | |||||
<ControlTemplate.Triggers> | |||||
<Trigger Property="IsMouseOver" Value="True"> | |||||
<Setter TargetName="Border" Property="Background" Value="#EEE"/> | |||||
</Trigger> | |||||
</ControlTemplate.Triggers> | |||||
</ControlTemplate> | |||||
<ControlTemplate x:Key="ComboBoxTextBox" | |||||
TargetType="{x:Type TextBox}"> | |||||
<Border x:Name="PART_ContentHost" | |||||
Focusable="False" | |||||
Background="{TemplateBinding Background}" /> | |||||
</ControlTemplate> | |||||
<Style TargetType="ComboBox" x:Key="PropComboBoxStyle"> | |||||
<Setter Property="SnapsToDevicePixels" Value="true" /> | |||||
<Setter Property="OverridesDefaultStyle" Value="true" /> | |||||
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto" /> | |||||
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto" /> | |||||
<Setter Property="ScrollViewer.CanContentScroll" Value="true" /> | |||||
<Setter Property="Template"> | |||||
<Setter.Value> | |||||
<ControlTemplate TargetType="{x:Type ComboBox}"> | |||||
<Grid> | |||||
<ToggleButton x:Name="ToggleButton" Template="{StaticResource ComboBoxToggleButton}" | |||||
Focusable="false" | |||||
ClickMode="Press" | |||||
IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, | |||||
RelativeSource={RelativeSource TemplatedParent}}"/> | |||||
<ContentPresenter x:Name="ContentSite" | |||||
IsHitTestVisible="False" | |||||
Content="{TemplateBinding SelectionBoxItem}" | |||||
ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" | |||||
ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}" | |||||
Margin="5,3" | |||||
VerticalAlignment="Center" | |||||
HorizontalAlignment="Left"> | |||||
</ContentPresenter> | |||||
<Popup x:Name="Popup" Placement="Bottom" IsOpen="{TemplateBinding IsDropDownOpen}" | |||||
AllowsTransparency="True" Focusable="False" PopupAnimation="Slide"> | |||||
<Grid x:Name="DropDown" SnapsToDevicePixels="True" MinWidth="{TemplateBinding ActualWidth}" | |||||
MaxHeight="{TemplateBinding MaxDropDownHeight}"> | |||||
<Border x:Name="DropDownBorder" BorderThickness="1" BorderBrush="#FF888888" Background="White"> | |||||
</Border> | |||||
<ScrollViewer Margin="4,6,4,6" SnapsToDevicePixels="True"> | |||||
<StackPanel IsItemsHost="True" | |||||
KeyboardNavigation.DirectionalNavigation="Contained" /> | |||||
</ScrollViewer> | |||||
</Grid> | |||||
</Popup> | |||||
</Grid> | |||||
<ControlTemplate.Triggers> | |||||
<Trigger Property="HasItems" Value="false"> | |||||
<Setter TargetName="DropDownBorder" Property="MinHeight" Value="95" /> | |||||
</Trigger> | |||||
<Trigger Property="IsGrouping" Value="true"> | |||||
<Setter Property="ScrollViewer.CanContentScroll" Value="false" /> | |||||
</Trigger> | |||||
<Trigger SourceName="Popup" Property="AllowsTransparency" Value="true"> | |||||
<Setter TargetName="DropDownBorder" Property="CornerRadius" Value="4" /> | |||||
<Setter TargetName="DropDownBorder" Property="Margin" Value="0,2,0,0" /> | |||||
</Trigger> | |||||
</ControlTemplate.Triggers> | |||||
</ControlTemplate> | |||||
</Setter.Value> | |||||
</Setter> | |||||
</Style> | |||||
</ResourceDictionary> |
@@ -6,6 +6,30 @@ | |||||
<Nullable>enable</Nullable> | <Nullable>enable</Nullable> | ||||
<ImplicitUsings>enable</ImplicitUsings> | <ImplicitUsings>enable</ImplicitUsings> | ||||
<UseWPF>true</UseWPF> | <UseWPF>true</UseWPF> | ||||
<GenerateDocumentationFile>True</GenerateDocumentationFile> | |||||
</PropertyGroup> | </PropertyGroup> | ||||
<ItemGroup> | |||||
<None Remove="Assets\Fonts\digital_display.ttf" /> | |||||
<None Remove="Assets\Fonts\iconfont.ttf" /> | |||||
<None Remove="Assets\Images\logo.png" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<PackageReference Include="CommonServiceLocator" Version="2.0.7" /> | |||||
<PackageReference Include="Microsoft.Xaml.Behaviors.Wpf" Version="1.1.77" /> | |||||
<PackageReference Include="MvvmLight" Version="5.4.1.1" /> | |||||
<PackageReference Include="MvvmLightLibs" Version="5.4.1.1" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<ProjectReference Include="..\CommcationLibray\CommcationLibray.csproj" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<Resource Include="Assets\Fonts\digital_display.ttf" /> | |||||
<Resource Include="Assets\Fonts\iconfont.ttf" /> | |||||
<Resource Include="Assets\Images\logo.png" /> | |||||
</ItemGroup> | |||||
</Project> | </Project> |
@@ -0,0 +1,38 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
using System.Windows.Input; | |||||
namespace BPA.WeimoCube.Common | |||||
{ | |||||
/// <summary> | |||||
/// 绑定事件 | |||||
/// </summary> | |||||
public class Command : ICommand | |||||
{ | |||||
public event EventHandler? CanExecuteChanged; | |||||
public bool CanExecute(object? parameter) | |||||
{ | |||||
if (DoCanExecute == null) return true; | |||||
return DoCanExecute.Invoke(parameter); | |||||
} | |||||
public void Execute(object? parameter) | |||||
{ | |||||
DoExecute?.Invoke(parameter); | |||||
} | |||||
public Action<object> DoExecute { get; set; } | |||||
public Func<object, bool> DoCanExecute { get; set; } | |||||
public Command(Action<object> doExecute,Func<object,bool> doCanExecute) { | |||||
DoExecute=doExecute; | |||||
DoCanExecute=doCanExecute; | |||||
} | |||||
public Command(Action<object> doExecute) : this(doExecute, null) { } | |||||
} | |||||
} |
@@ -0,0 +1,82 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
using System.Windows.Markup; | |||||
namespace BPA.WeimoCube.Common | |||||
{ | |||||
/// <summary> | |||||
/// 配置ip和端口实体 | |||||
/// </summary> | |||||
public class Config | |||||
{/// <summary> | |||||
/// ip地址 | |||||
/// </summary> | |||||
public string ModbusTcpIP { get; set; } | |||||
/// <summary> | |||||
/// 端口号 | |||||
/// </summary> | |||||
public int ModbusTcpPort { get; set; } | |||||
/// <summary> | |||||
/// 文件保存路径 | |||||
/// </summary> | |||||
public string LogPath { get; set; } | |||||
/// <summary> | |||||
/// 读取数据长度 | |||||
/// </summary> | |||||
public ushort ReadDataLength { get; set; } | |||||
/// <summary> | |||||
/// 写入数据长度 | |||||
/// </summary> | |||||
public int WriteDataLength { get; set; } | |||||
/// <summary> | |||||
/// 配方编号地址 | |||||
/// </summary> | |||||
public string RecipeNumberAddress { get; set; } | |||||
/// <summary> | |||||
/// 配方编号数据类型id | |||||
/// </summary> | |||||
public int RecipeDataID { get; set; } | |||||
/// <summary> | |||||
/// 配方编号数据格式Id | |||||
/// </summary> | |||||
public int DataFormulasID { get; set; } | |||||
/// <summary> | |||||
/// 显示订单编号地址 | |||||
/// </summary> | |||||
public string DisplayOrderNumberAddress { get; set; } | |||||
/// <summary> | |||||
/// 显示订单编号数据类型ID | |||||
/// </summary> | |||||
public int OrderNumberTypeID { get; set; } | |||||
/// <summary> | |||||
/// 显示订单编号数据格式ID | |||||
/// </summary> | |||||
public int OrderNumberDataFormat { get; set; } | |||||
/// <summary> | |||||
/// 写入编号地址 | |||||
/// </summary> | |||||
public string WriteNumberAddress { get; set; } | |||||
/// <summary> | |||||
/// 启动配料地址 | |||||
/// </summary> | |||||
public string StartIngredientAddress { get; set; } | |||||
/// <summary> | |||||
/// 配料完成地址 | |||||
/// </summary> | |||||
public string IngredientCompletionAddress { get; set; } | |||||
/// <summary> | |||||
/// 设备状态地址 | |||||
/// </summary> | |||||
public string DeviceStatusAddress { get; set; } | |||||
/// <summary> | |||||
/// 信息错误地址 | |||||
/// </summary> | |||||
public string InformationErrorAddress { get; set; } | |||||
} | |||||
} |
@@ -0,0 +1,114 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.IO; | |||||
using System.Linq; | |||||
using System.Runtime.CompilerServices; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace BPA.WeimoCube.Common | |||||
{ | |||||
/// <summary> | |||||
/// 日志操作类 | |||||
/// </summary> | |||||
public class LogProvider | |||||
{ | |||||
public string LogPath { get; set; } | |||||
private readonly object _lock = new object(); | |||||
StringBuilder logStr = new StringBuilder(); | |||||
int count = 0; | |||||
public LogProvider(string log_path) | |||||
{ | |||||
LogPath = log_path; | |||||
} | |||||
public void WriteLog( | |||||
string msg, | |||||
bool isRecord, | |||||
bool isError = false, | |||||
[CallerLineNumber] int line = 0, | |||||
[CallerMemberName] string methodName = "", | |||||
[CallerFilePath] string filePath = "") | |||||
{ | |||||
if (!isRecord) return; | |||||
WriteLog(new Log | |||||
{ | |||||
Time = DateTime.Now, | |||||
LogType = isError ? LogType.ERROR : LogType.LOG, | |||||
Message = msg, | |||||
ErrorFile = filePath, | |||||
ErroMethod = methodName, | |||||
ErrorLineNum = line, | |||||
}); | |||||
} | |||||
private void WriteLog(Log log) | |||||
{ | |||||
lock (_lock) | |||||
{ | |||||
count++; | |||||
logStr.Append(log.ToString()); | |||||
if (count >= 100) | |||||
{ | |||||
SaveLog(); | |||||
count = 0; | |||||
logStr.Clear(); | |||||
} | |||||
} | |||||
} | |||||
public void Dispose() | |||||
{ | |||||
SaveLog(); | |||||
} | |||||
private void SaveLog() | |||||
{ | |||||
string fileName = DateTime.Now.ToString("yyyyMMdd") + ".log"; | |||||
string filePath = Path.Combine(this.LogPath, fileName); | |||||
// 清除3天前日志 | |||||
string delFile = DateTime.Now.AddDays(-3).ToString("yyyyMMdd") + ".log"; | |||||
string delFilePath = Path.Combine(this.LogPath, fileName); | |||||
if (File.Exists(delFilePath)) | |||||
File.Delete(delFilePath); | |||||
File.AppendAllText(filePath, logStr.ToString()); | |||||
} | |||||
} | |||||
internal class Log | |||||
{ | |||||
public DateTime Time { get; set; } | |||||
public string Message { get; set; } | |||||
public LogType LogType { get; set; } | |||||
public string ErrorFile { get; set; } | |||||
public string ErroMethod { get; set; } | |||||
public int ErrorLineNum { get; set; } | |||||
public override string ToString() | |||||
{ | |||||
if (this.LogType == LogType.LOG) | |||||
return $"{Time.ToString("yyyy-MM-dd HH:mm:ss")} [{LogType.ToString()}] {Message}\r\n"; | |||||
if (this.LogType == LogType.ERROR) | |||||
return $"{Time.ToString("yyyy-MM-dd HH:mm:ss")} [{LogType.ToString()}] {Message}\r\n" + | |||||
$"\t异常文件:{ErrorFile}\r\n" + | |||||
$"\t异常位置:{ErroMethod} [Line:{ErrorLineNum}]\r\n"; | |||||
return base.ToString(); | |||||
} | |||||
} | |||||
internal enum LogType | |||||
{ | |||||
LOG, ERROR | |||||
} | |||||
} |
@@ -0,0 +1,20 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
using System.Windows; | |||||
namespace BPA.WeimoCube.Common | |||||
{ | |||||
/// <summary> | |||||
/// 公共消息弹窗类 | |||||
/// </summary> | |||||
public class MessageShow | |||||
{ | |||||
public static void GetMessage(string mes) | |||||
{ | |||||
MessageBox.Show(mes); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,34 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.ComponentModel; | |||||
using System.Linq; | |||||
using System.Runtime.CompilerServices; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace BPA.WeimoCube.Common | |||||
{ | |||||
/// <summary> | |||||
/// 双向绑定 | |||||
/// </summary> | |||||
public class NotifyBase : INotifyPropertyChanged | |||||
{ | |||||
public event PropertyChangedEventHandler? PropertyChanged; | |||||
public void RaisePropertyChanged(string propName) | |||||
{ | |||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName)); | |||||
} | |||||
#region 属性设置 | |||||
public void Set<T>(ref T field, T value, [CallerMemberName] string propName = "") | |||||
{ | |||||
if (!field.Equals(value)) | |||||
{ | |||||
field = value; | |||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName)); | |||||
} | |||||
} | |||||
#endregion | |||||
} | |||||
} |
@@ -0,0 +1,60 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Net; | |||||
using System.Text; | |||||
using System.Text.RegularExpressions; | |||||
using System.Threading.Tasks; | |||||
using System.Windows; | |||||
namespace BPA.WeimoCube.Common | |||||
{ | |||||
/// <summary> | |||||
/// 判断工具类 | |||||
/// </summary> | |||||
public class PanDuanGongJ | |||||
{ | |||||
/// <summary> | |||||
/// 判断端口号是否正确 | |||||
/// </summary> | |||||
/// <param name="port"></param> | |||||
/// <returns></returns> | |||||
public static bool IsIPPort(string port) | |||||
{ | |||||
bool isPort = false; | |||||
int portNum; | |||||
//将字符串转化为整数 | |||||
isPort = Int32.TryParse(port, out portNum); | |||||
if (isPort && portNum >= 0 && portNum <= 65535) | |||||
{ | |||||
isPort = true; | |||||
} | |||||
else | |||||
{ | |||||
isPort = false; | |||||
} | |||||
return isPort; | |||||
} | |||||
/// <summary> | |||||
/// 判断ip是否合法 | |||||
/// </summary> | |||||
/// <param name="IP"></param> | |||||
public static bool IsIPGf(string IP) | |||||
{ | |||||
bool isIp = false; | |||||
string regexStrIPV4 = (@"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"); | |||||
if (Regex.IsMatch(IP, regexStrIPV4) && IP != "0.0.0.0") | |||||
{ | |||||
isIp=true; | |||||
} | |||||
else | |||||
{ | |||||
isIp=false; | |||||
} | |||||
return isIp; | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,13 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace BPA.WeimoCube.CommunicationClassLibrary | |||||
{ | |||||
//通讯基类 | |||||
class CommunicationLibrary | |||||
{ | |||||
} | |||||
} |
@@ -1,12 +0,0 @@ | |||||
<Window x:Class="BPA.WeimoCube.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:BPA.WeimoCube" | |||||
mc:Ignorable="d" | |||||
Title="MainWindow" Height="450" Width="800"> | |||||
<Grid> | |||||
</Grid> | |||||
</Window> |
@@ -1,24 +0,0 @@ | |||||
using System.Text; | |||||
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.Navigation; | |||||
using System.Windows.Shapes; | |||||
namespace BPA.WeimoCube | |||||
{ | |||||
/// <summary> | |||||
/// Interaction logic for MainWindow.xaml | |||||
/// </summary> | |||||
public partial class MainWindow : Window | |||||
{ | |||||
public MainWindow() | |||||
{ | |||||
InitializeComponent(); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,16 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace BPA.WeimoCube.Model | |||||
{ | |||||
/// <summary> | |||||
/// 配方集合 | |||||
/// </summary> | |||||
public class FormulaAttList | |||||
{ | |||||
public List<FormulaAttachment> FormulaList { get; set; }=new List<FormulaAttachment>(); | |||||
} | |||||
} |
@@ -0,0 +1,33 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
using System.Windows.Input; | |||||
namespace BPA.WeimoCube.Model | |||||
{ | |||||
/// <summary> | |||||
/// 配方附件 | |||||
/// </summary> | |||||
public class FormulaAttachment | |||||
{ | |||||
/// <summary> | |||||
/// 配方编号 属性 | |||||
/// </summary> | |||||
public string FormulaNumber { get; set; } | |||||
/// <summary> | |||||
/// 配方名称 | |||||
/// </summary> | |||||
public string FormulaName { get; set; } | |||||
/// <summary> | |||||
/// 备用 | |||||
/// </summary> | |||||
public string spare { get; set; } | |||||
/// <summary> | |||||
/// 序号 | |||||
/// </summary> | |||||
public int SerialNumber { get; set; } | |||||
} | |||||
} |
@@ -0,0 +1,353 @@ | |||||
using GalaSoft.MvvmLight; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.ComponentModel; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace BPA.WeimoCube.Model | |||||
{ | |||||
/// <summary> | |||||
/// 主窗口实体模型 | |||||
/// </summary> | |||||
public class MainWModel : ObservableObject | |||||
{ | |||||
public event PropertyChangedEventHandler? PropertyChanged; | |||||
private string _ip; | |||||
/// <summary> | |||||
/// ip地址 | |||||
/// </summary> | |||||
public string Ip | |||||
{ | |||||
get { return _ip; } | |||||
set | |||||
{ | |||||
Set<string>(ref _ip, value); | |||||
} | |||||
} | |||||
private string _port; | |||||
/// <summary> | |||||
/// 端口 | |||||
/// </summary> | |||||
public string Port | |||||
{ | |||||
get { return _port; } | |||||
set { Set<string>(ref _port, value); } | |||||
} | |||||
private string _RecipeNumberAddress; | |||||
/// <summary> | |||||
/// 配方编号地址 | |||||
/// </summary> | |||||
public string RecipeNumberAddress { get { return _RecipeNumberAddress; } set { Set<string>(ref _RecipeNumberAddress, value); } } | |||||
private string _DisplayOrderNumberAddress; | |||||
/// <summary> | |||||
/// 显示订单编号地址 | |||||
/// </summary> | |||||
public string DisplayOrderNumberAddress { get { return _DisplayOrderNumberAddress; } set { Set<string>(ref _DisplayOrderNumberAddress, value); } } | |||||
private string _WriteNumberAddress; | |||||
/// <summary> | |||||
/// 写入编号地址 | |||||
/// </summary> | |||||
public string WriteNumberAddress { get { return _WriteNumberAddress; } set { Set<string>(ref _WriteNumberAddress, value); } } | |||||
private string _StartIngredientAddress; | |||||
/// <summary> | |||||
/// 启动配料地址 | |||||
/// </summary> | |||||
public string StartIngredientAddress { get { return _StartIngredientAddress; } set { Set<string>(ref _StartIngredientAddress, value); } } | |||||
private string _IngredientCompletionAddress; | |||||
/// <summary> | |||||
/// 配料完成地址 | |||||
/// </summary> | |||||
public string IngredientCompletionAddress { get { return _IngredientCompletionAddress; } set { Set<string>(ref _IngredientCompletionAddress, value); } } | |||||
private string _DeviceStatusAddress; | |||||
/// <summary> | |||||
/// 设备状态地址 | |||||
/// </summary> | |||||
public string DeviceStatusAddress { get { return _DeviceStatusAddress; } set { Set<string>(ref _DeviceStatusAddress, value); } } | |||||
private string _InformationErrorAddress; | |||||
/// <summary> | |||||
/// 信息错误地址 | |||||
/// </summary> | |||||
public string InformationErrorAddress { get { return _InformationErrorAddress; } set { Set<string>(ref _InformationErrorAddress, value); } } | |||||
private bool _TCPCRWIsEnabled = true; | |||||
/// <summary> | |||||
/// 连接ModbusTcp是否启用 | |||||
/// </summary> | |||||
public bool TCPCRWIsEnabled | |||||
{ | |||||
get { return _TCPCRWIsEnabled; } | |||||
set { Set<bool>(ref _TCPCRWIsEnabled, value); } | |||||
} | |||||
private bool _TCPDRWIsEnabled = false; | |||||
/// <summary> | |||||
/// 断开连接按钮是否启用 | |||||
/// </summary> | |||||
public bool TCPDRWIsEnabled | |||||
{ | |||||
get { return _TCPDRWIsEnabled; } | |||||
set { Set<bool>(ref _TCPDRWIsEnabled, value); } | |||||
} | |||||
private bool _isStart =true; | |||||
/// <summary> | |||||
/// 是否监控 | |||||
/// </summary> | |||||
public bool IsStart | |||||
{ | |||||
get { return _isStart; } | |||||
set | |||||
{ | |||||
Set<bool>(ref _isStart, value); | |||||
//PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("IsStart")); | |||||
if (!value) | |||||
{ | |||||
this.ShowMessage("监控未开始,请打开监控开关",false); | |||||
this.ConnectionStatus = value; | |||||
} | |||||
} | |||||
} | |||||
private bool _ConnectionStatus; | |||||
/// <summary> | |||||
/// 连接状态 | |||||
/// </summary> | |||||
public bool ConnectionStatus | |||||
{ | |||||
get { return _ConnectionStatus; } | |||||
set { Set<bool>(ref _ConnectionStatus, value); } | |||||
} | |||||
private int _WriteDataLength; | |||||
/// <summary> | |||||
/// 写入数据长度 | |||||
/// </summary> | |||||
public int WriteDataLength | |||||
{ | |||||
get { return _WriteDataLength; } | |||||
set {Set<int>(ref _WriteDataLength , value); } | |||||
} | |||||
private ushort _ReadDataLength; | |||||
/// <summary> | |||||
/// 读取数据长度 | |||||
/// </summary> | |||||
public ushort ReadDataLength | |||||
{ | |||||
get { return _ReadDataLength; } | |||||
set {Set<ushort>(ref _ReadDataLength , value); } | |||||
} | |||||
private object _CurrentOrderNumber; | |||||
/// <summary> | |||||
/// 当前订单编号 | |||||
/// 可以用于显示当前的订单编号 | |||||
/// </summary> | |||||
public object CurrentOrderNumber | |||||
{ | |||||
get { return _CurrentOrderNumber; } | |||||
set { Set(ref _CurrentOrderNumber, value); } | |||||
} | |||||
private object _FormulaNumber ; | |||||
/// <summary> | |||||
/// 配方编号 | |||||
/// 需要调用的配方编号(编号来源见附件) | |||||
/// </summary> | |||||
public object FormulaNumber | |||||
{ | |||||
get { return _FormulaNumber; } | |||||
set { Set(ref _FormulaNumber, value); } | |||||
} | |||||
private bool _DetermineWriteNumber; | |||||
/// <summary> | |||||
/// 确定写入编号 | |||||
/// 确认配方数据,并下发到配料机 | |||||
/// </summary> | |||||
public bool DetermineWriteNumber | |||||
{ | |||||
get { return _DetermineWriteNumber; } | |||||
set { Set(ref _DetermineWriteNumber, value); } | |||||
} | |||||
private bool _StartingIngredients; | |||||
/// <summary> | |||||
/// 启动配料 | |||||
/// 根据当前选择配方启动配料(当前模式不需要使用该功能,预留) | |||||
/// </summary> | |||||
public bool StartingIngredients | |||||
{ | |||||
get { return _StartingIngredients; } | |||||
set { Set(ref _StartingIngredients, value); } | |||||
} | |||||
private bool _IngredientsCompleted; | |||||
/// <summary> | |||||
/// 配料完成 | |||||
/// 启动配料后,待动作完成该值为True,再次执行配料请求为False | |||||
/// </summary> | |||||
public bool IngredientsCompleted | |||||
{ | |||||
get { return _IngredientsCompleted; } | |||||
set { Set(ref _IngredientsCompleted, value); } | |||||
} | |||||
private bool _DeviceStatus; | |||||
/// <summary> | |||||
/// 设备状态 | |||||
/// 上电为False,推送了订单为True | |||||
/// </summary> | |||||
public bool DeviceStatus | |||||
{ | |||||
get { return _DeviceStatus; } | |||||
set { Set(ref _DeviceStatus, value); } | |||||
} | |||||
private string _TopDianState; | |||||
/// <summary> | |||||
/// 设备上电状态显示 | |||||
/// </summary> | |||||
public string TopDianState | |||||
{ | |||||
get { return _TopDianState; } | |||||
set { Set(ref _TopDianState, value); } | |||||
} | |||||
private string _OrderPushState; | |||||
/// <summary> | |||||
/// 订单推送状态显示 | |||||
/// </summary> | |||||
public string OrderPushState | |||||
{ | |||||
get { return _OrderPushState; } | |||||
set { Set(ref _OrderPushState, value); } | |||||
} | |||||
private bool _InformationError; | |||||
/// <summary> | |||||
/// 信息错误 | |||||
/// 点击了取消配料,该标志位为True.上位机收到信息后主动置False | |||||
/// </summary> | |||||
public bool InformationError | |||||
{ | |||||
get { return _InformationError; } | |||||
set { Set(ref _InformationError, value); } | |||||
} | |||||
private bool _isLog; | |||||
/// <summary> | |||||
/// 打开日志 | |||||
/// </summary> | |||||
public bool IsLog | |||||
{ | |||||
get { return _isLog; } | |||||
set | |||||
{ | |||||
Set<bool>(ref _isLog, value); | |||||
//PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("IsLog")); | |||||
} | |||||
} | |||||
private int _blurRadius = 0; | |||||
/// <summary> | |||||
/// 主界面的 模糊半径 | |||||
/// </summary> | |||||
public int BlurRadius | |||||
{ | |||||
get { return _blurRadius; } | |||||
set | |||||
{ | |||||
Set<int>(ref _blurRadius, value); | |||||
//PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("BlurRadius")); | |||||
} | |||||
} | |||||
private DateTime _currentDate; | |||||
/// <summary> | |||||
/// 当前时间 | |||||
/// </summary> | |||||
public DateTime CurrentDate | |||||
{ | |||||
get { return _currentDate; } | |||||
set | |||||
{ | |||||
//_currentDate = value; | |||||
//PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("CurrentDate")); | |||||
Set<DateTime>(ref _currentDate, value); | |||||
} | |||||
} | |||||
private string _message; | |||||
/// <summary> | |||||
/// 错误信息 | |||||
/// </summary> | |||||
public string Message | |||||
{ | |||||
get { return _message; } | |||||
set | |||||
{ | |||||
//_message = value; | |||||
//PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Message")); | |||||
Set<string>(ref _message, value); | |||||
} | |||||
} | |||||
private string _msgColor = "#90EE90"; | |||||
/// <summary> | |||||
/// 错误信息颜色 | |||||
/// </summary> | |||||
public string MsgColor | |||||
{ | |||||
get { return _msgColor; } | |||||
set | |||||
{ | |||||
//_msgColor = value; | |||||
//PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("MsgColor")); | |||||
Set<string>(ref _msgColor, value); | |||||
} | |||||
} | |||||
private string _logPath; | |||||
/// <summary> | |||||
/// 保存日志路径 | |||||
/// </summary> | |||||
public string LogPath | |||||
{ | |||||
get { return _logPath; } | |||||
set | |||||
{ | |||||
Set<string>(ref _logPath, value); | |||||
//PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("LogPath")); | |||||
} | |||||
} | |||||
public void ShowMessage(string message, bool state = true) | |||||
{ | |||||
this.Message = message; | |||||
this.MsgColor = state ? "#90EE90" : "#FF4500"; | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,53 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace BPA.WeimoCube.Model | |||||
{ | |||||
/// <summary> | |||||
/// 配方编号数据类型 下拉框实体 | |||||
/// </summary> | |||||
public class RecipeNumberDataType | |||||
{ | |||||
/// <summary> | |||||
/// id | |||||
/// </summary> | |||||
public int ID { get; set; } | |||||
/// <summary> | |||||
/// 数据类型名称显示 | |||||
/// </summary> | |||||
public string DataName { get; set; } | |||||
} | |||||
/// <summary> | |||||
/// 数据格式 下拉框实体 | |||||
/// </summary> | |||||
public class FormulaNumberDataFormat | |||||
{ | |||||
/// <summary> | |||||
/// id | |||||
/// </summary> | |||||
public int FormatID { get; set; } | |||||
/// <summary> | |||||
/// 数据格式名称显示 | |||||
/// </summary> | |||||
public string DataFormatName { get; set; } | |||||
} | |||||
public enum DirectionType : int | |||||
{ | |||||
Byte = 0, | |||||
Int = 1, | |||||
Uint = 2, | |||||
Short = 3, | |||||
Ushort = 4, | |||||
Float = 5, | |||||
String = 6, | |||||
Bool = 7, | |||||
Double=8, | |||||
} | |||||
} |
@@ -0,0 +1,854 @@ | |||||
using BPA.Helper; | |||||
using BPA.WeimoCube.Common; | |||||
using BPA.WeimoCube.Model; | |||||
using CommcationLibray; | |||||
using GalaSoft.MvvmLight; | |||||
using GalaSoft.MvvmLight.Command; | |||||
using Microsoft.Win32; | |||||
using S7.Net.Types; | |||||
using SharpCompress.Common; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Collections.ObjectModel; | |||||
using System.Data; | |||||
using System.Diagnostics; | |||||
using System.IO; | |||||
using System.IO.Ports; | |||||
using System.Linq; | |||||
using System.Net.NetworkInformation; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
using System.Windows; | |||||
using System.Windows.Controls; | |||||
using System.Windows.Documents; | |||||
using System.Windows.Input; | |||||
using System.Windows.Media; | |||||
using ThingsGateway.Foundation.Core; | |||||
using ThingsGateway.Foundation.Extension; | |||||
namespace BPA.WeimoCube.ViewModels | |||||
{ | |||||
/// <summary> | |||||
/// 主实体视图模型 | |||||
/// </summary> | |||||
public class MainWindowViewModel : ObservableObject | |||||
{ | |||||
#region 属性 | |||||
//配方附件 | |||||
public ObservableCollection<FormulaAttachment> formulaAttachment { get; set; } = new ObservableCollection<FormulaAttachment>(); | |||||
/// <summary> | |||||
/// 数据类型 | |||||
/// </summary> | |||||
public ObservableCollection<RecipeNumberDataType> dataTypes { get; set; } = new ObservableCollection<RecipeNumberDataType>(); | |||||
/// <summary> | |||||
/// 数据格式 | |||||
/// </summary> | |||||
public ObservableCollection<FormulaNumberDataFormat> formulas { get; set; } = new ObservableCollection<FormulaNumberDataFormat>(); | |||||
private List<Task> tasks = new List<Task>(); | |||||
private CancellationTokenSource cts = new CancellationTokenSource(); | |||||
private ModbusTCP modbus = new ModbusTCP(); | |||||
/// <summary> | |||||
/// 实例主窗口实体类 | |||||
/// </summary> | |||||
public MainWModel MainWModel { get; set; } = new MainWModel(); | |||||
/// <summary> | |||||
/// 日志操作类 | |||||
/// </summary> | |||||
private LogProvider LogProvider; | |||||
/// <summary> | |||||
/// 连接ModbusTcp 事件 | |||||
/// </summary> | |||||
public RelayCommand<object> ConnectMTCPCommand { get; set; } | |||||
/// <summary> | |||||
/// 定义设置事件 | |||||
/// </summary> | |||||
public RelayCommand<object> ConfigCommand { get; set; } | |||||
/// <summary> | |||||
/// 定义关闭设置配置事件 | |||||
/// </summary> | |||||
public RelayCommand<object> ConfigCloseCommand { get; set; } | |||||
/// <summary> | |||||
/// 定义开打文件夹事件 | |||||
/// </summary> | |||||
public RelayCommand<object> LogPathSelectCommand { get; set; } | |||||
/// <summary> | |||||
/// 打开日志事件 | |||||
/// </summary> | |||||
public RelayCommand<object> OpenLogPathCommand { get; set; } | |||||
/// <summary> | |||||
/// 定义写入编号事件 | |||||
/// </summary> | |||||
public RelayCommand<object> WriteNumberCommand { get; set; } | |||||
/// <summary> | |||||
/// 定义确定写入编号事件 | |||||
/// </summary> | |||||
public RelayCommand<object> DetermineWriteNumberCommand { get; set; } | |||||
/// <summary> | |||||
/// 定义启动配料事件 | |||||
/// </summary> | |||||
public RelayCommand<object> StartingIngredientsCommand { get; set; } | |||||
/// <summary> | |||||
/// 定义打开配料附件事件 | |||||
/// </summary> | |||||
public RelayCommand<object> OpenIngredientAttachmentCommand { get; set; } | |||||
/// <summary> | |||||
/// 附件列表行点击事件 | |||||
/// </summary> | |||||
public RelayCommand<object> DoubleClickCommand { get; set; } | |||||
/// <summary> | |||||
/// 定义退出事件 | |||||
/// </summary> | |||||
public RelayCommand<object> CloseCommand { get; set; } | |||||
/// <summary> | |||||
/// 订单推送 标志位 | |||||
/// 0表示已推送 | |||||
/// 1表示已完成 | |||||
/// </summary> | |||||
private int OrderPushStatus = 0; | |||||
/// <summary> | |||||
/// 确定写入编号的记录 ,如果当前订单还没操作 不能进行第二次写入 | |||||
/// </summary> | |||||
private bool DetermineWriteStatus = false; | |||||
/// <summary> | |||||
/// 设备状态 为false 可以继续派发下一个订单 | |||||
/// </summary> | |||||
private bool DeviceStatus; | |||||
/// <summary> | |||||
/// 是否取消订单 | |||||
/// </summary> | |||||
private bool WhetherCancel; | |||||
private RecipeNumberDataType _dataType; | |||||
/// <summary> | |||||
/// 数据类型下拉值初始显示 | |||||
/// </summary> | |||||
public RecipeNumberDataType DataType | |||||
{ | |||||
get => _dataType; | |||||
set { Set<RecipeNumberDataType>(ref _dataType, value); } | |||||
} | |||||
private FormulaNumberDataFormat _dataFormulas; | |||||
/// <summary> | |||||
/// 数据格式下拉值初始显示 | |||||
/// </summary> | |||||
public FormulaNumberDataFormat DataFormulas | |||||
{ | |||||
get { return _dataFormulas; } | |||||
set { Set<FormulaNumberDataFormat>(ref _dataFormulas, value); } | |||||
} | |||||
private RecipeNumberDataType _OrderNumberType; | |||||
/// <summary> | |||||
/// 数据类型下拉值初始显示 | |||||
/// </summary> | |||||
public RecipeNumberDataType OrderNumberType | |||||
{ | |||||
get => _OrderNumberType; | |||||
set { Set<RecipeNumberDataType>(ref _OrderNumberType, value); } | |||||
} | |||||
private FormulaNumberDataFormat _OrderNumberData; | |||||
/// <summary> | |||||
/// 数据格式下拉值初始显示 | |||||
/// </summary> | |||||
public FormulaNumberDataFormat OrderNumberData | |||||
{ | |||||
get { return _OrderNumberData; } | |||||
set { Set<FormulaNumberDataFormat>(ref _OrderNumberData, value); } | |||||
} | |||||
#endregion | |||||
public MainWindowViewModel() | |||||
{ | |||||
var task = Task.Run(async () => | |||||
{ | |||||
while (!cts.IsCancellationRequested) | |||||
{ | |||||
MainWModel.CurrentDate = System.DateTime.Now; | |||||
await Task.Delay(new TimeSpan(1, 0, 0)); | |||||
} | |||||
}, cts.Token); | |||||
tasks.Add(task); | |||||
LogProvider = new LogProvider(MainWModel.LogPath); | |||||
this.RaisePropertyChanged("MainWModel"); | |||||
ConnectMTCPCommand = new RelayCommand<object>(new Action<object>(DoConnectModbusTcpCommand)); | |||||
ConfigCommand = new RelayCommand<object>(new Action<object>(Config)); | |||||
ConfigCloseCommand = new RelayCommand<object>(new Action<object>(ConfigClose)); | |||||
LogPathSelectCommand = new RelayCommand<object>(new Action<object>(LogPathSelect)); | |||||
OpenLogPathCommand = new RelayCommand<object>(new Action<object>(OpenLogFolder)); | |||||
WriteNumberCommand = new RelayCommand<object>(new Action<object>(WriteNumber)); | |||||
DetermineWriteNumberCommand = new RelayCommand<object>(new Action<object>(DetermineWriteNumber)); | |||||
StartingIngredientsCommand = new RelayCommand<object>(new Action<object>(StartingIngredients)); | |||||
OpenIngredientAttachmentCommand = new RelayCommand<object>(new Action<object>(OpenIngredientAttachment)); | |||||
DoubleClickCommand = new RelayCommand<object>(param => RowClick(param), param => true); | |||||
CloseCommand = new RelayCommand<object>(new Action<object>(Close)); | |||||
this.SetRecipeNumberTypeData(); | |||||
this.SetFormulaNumberDataFormat(); | |||||
this.ChuShiHuaConfigData(); | |||||
this.GetFormulaData(); | |||||
this.StartMointor(); | |||||
//MainWModel.IsStart = true; | |||||
} | |||||
/// <summary> | |||||
/// 附件列表行点击事件 | |||||
/// </summary> | |||||
/// <param name="parameter"></param> | |||||
private void RowClick(object parameter) | |||||
{ | |||||
var selectedItem = (FormulaAttachment)parameter; | |||||
try | |||||
{ | |||||
MainWModel.FormulaNumber = (short)Convert.ToInt32(selectedItem.FormulaNumber); | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
MessageError($"配方编号类型转换失败!!! 失败信息:{ex.Message} + {selectedItem.ToString()}"); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 初始化配置文件数据 | |||||
/// </summary> | |||||
private void ChuShiHuaConfigData() | |||||
{ | |||||
// 配置数据的初始化 | |||||
try | |||||
{ | |||||
string json = File.ReadAllText("config.json"); | |||||
Config config = System.Text.Json.JsonSerializer.Deserialize<Config>(json); | |||||
MainWModel.Ip = config.ModbusTcpIP; | |||||
MainWModel.Port = config.ModbusTcpPort.ToString(); | |||||
MainWModel.LogPath = config.LogPath; | |||||
MainWModel.RecipeNumberAddress = config.RecipeNumberAddress; | |||||
MainWModel.DisplayOrderNumberAddress = config.DisplayOrderNumberAddress; | |||||
MainWModel.WriteNumberAddress = config.WriteNumberAddress; | |||||
MainWModel.StartIngredientAddress = config.StartIngredientAddress; | |||||
MainWModel.IngredientCompletionAddress = config.IngredientCompletionAddress; | |||||
MainWModel.DeviceStatusAddress = config.DeviceStatusAddress; | |||||
MainWModel.InformationErrorAddress = config.InformationErrorAddress; | |||||
MainWModel.ReadDataLength = config.ReadDataLength; | |||||
MainWModel.WriteDataLength = config.WriteDataLength; | |||||
DataType = dataTypes.First(m => m.ID == config.RecipeDataID);//绑定到下拉框显示的值 | |||||
DataFormulas = formulas.First(m => m.FormatID == config.DataFormulasID); | |||||
OrderNumberType = dataTypes.First(m => m.ID == config.OrderNumberTypeID);//绑定到下拉框显示的值 | |||||
OrderNumberData = formulas.First(m => m.FormatID == config.OrderNumberDataFormat); | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
MainWModel.ShowMessage("初始化参数加载失败," + ex.Message, false); | |||||
//return; | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 初始数据类型 | |||||
/// </summary> | |||||
private void SetRecipeNumberTypeData() | |||||
{ | |||||
dataTypes.Clear(); | |||||
int i = 0; | |||||
foreach (DirectionType type in Enum.GetValues(typeof(DirectionType))) | |||||
{ | |||||
dataTypes.Add(new RecipeNumberDataType | |||||
{ | |||||
ID = i, | |||||
DataName = type.ToString() | |||||
}); | |||||
i++; | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 初始数据格式 | |||||
/// </summary> | |||||
private void SetFormulaNumberDataFormat() | |||||
{ | |||||
formulas.Clear(); | |||||
int i = 0; | |||||
foreach (BPADataFormat item in Enum.GetValues(typeof(BPADataFormat))) | |||||
{ | |||||
formulas.Add(new FormulaNumberDataFormat | |||||
{ | |||||
FormatID = i, | |||||
DataFormatName = item.ToString() | |||||
}); | |||||
i++; | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 初始化配方数据 | |||||
/// </summary> | |||||
private void GetFormulaData() | |||||
{ | |||||
try | |||||
{ | |||||
formulaAttachment.Clear();//先清除集合 | |||||
string jsons = File.ReadAllText("Formula.json"); | |||||
FormulaAttList configs = System.Text.Json.JsonSerializer.Deserialize<FormulaAttList>(jsons); | |||||
configs.FormulaList.ForEach(s => | |||||
{ | |||||
formulaAttachment.Add(new FormulaAttachment | |||||
{ | |||||
FormulaName = s.FormulaName, | |||||
FormulaNumber = s.FormulaNumber, | |||||
SerialNumber = s.SerialNumber, | |||||
spare = s.spare, | |||||
}); | |||||
}); | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
MainWModel.ShowMessage("初始化配方数据加载失败," + ex.Message, false); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 打开配料附件配置文件 | |||||
/// </summary> | |||||
/// <param name="text"></param> | |||||
private void OpenIngredientAttachment(object text) | |||||
{ | |||||
//D:\黑波罗科技\BPA.WeimoCube\BPA.WeimoCube\bin\Debug\net6.0-windows | |||||
string PeiLaoPath = System.IO.Directory.GetCurrentDirectory(); | |||||
if (Directory.Exists(PeiLaoPath)) | |||||
{ | |||||
Process.Start("explorer.exe", PeiLaoPath); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 打开日志文件 | |||||
/// </summary> | |||||
private void OpenLogFolder(object text) | |||||
{ | |||||
if (Directory.Exists(MainWModel.LogPath)) | |||||
{ | |||||
Process.Start("explorer.exe", MainWModel.LogPath); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 打开文件夹 | |||||
/// </summary> | |||||
/// <param name="text"></param> | |||||
private void LogPathSelect(object text) | |||||
{ | |||||
OpenFileDialog openFileDialog = new OpenFileDialog(); | |||||
//过滤文件类型 | |||||
//openFileDialog.Filter = "文档(*.txt)|*.txt|所有文件(*.*)|*.*"; | |||||
//允许多选 | |||||
openFileDialog.Multiselect = true; | |||||
if (openFileDialog.ShowDialog() == true) | |||||
{ | |||||
string paths = Path.GetDirectoryName(openFileDialog.FileName); | |||||
//FileName 完整路径:相对路径+文件名+后缀 | |||||
//文件内容读取 | |||||
MainWModel.LogPath = paths; | |||||
LogProvider.LogPath = MainWModel.LogPath; | |||||
//string[] names = openFileDialog.FileNames; | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 点击设置 | |||||
/// </summary> | |||||
/// <param name="text"></param> | |||||
private void Config(object text) | |||||
{ | |||||
//MainWModel.IsStart = false; | |||||
MainWModel.BlurRadius = 10; | |||||
} | |||||
/// <summary> | |||||
/// 隐藏设置界面 | |||||
/// </summary> | |||||
private void ConfigClose(object text) | |||||
{ | |||||
MainWModel.BlurRadius = 0; | |||||
// 数据保存的动作 | |||||
try | |||||
{ | |||||
Config config = new Config(); | |||||
config.ModbusTcpIP = MainWModel.Ip; | |||||
config.ModbusTcpPort = Convert.ToInt32(MainWModel.Port); | |||||
config.LogPath = MainWModel.LogPath; | |||||
config.RecipeNumberAddress = MainWModel.RecipeNumberAddress; | |||||
config.DisplayOrderNumberAddress = MainWModel.DisplayOrderNumberAddress; | |||||
config.WriteNumberAddress = MainWModel.WriteNumberAddress; | |||||
config.StartIngredientAddress = MainWModel.StartIngredientAddress; | |||||
config.IngredientCompletionAddress = MainWModel.IngredientCompletionAddress; | |||||
config.DeviceStatusAddress = MainWModel.DeviceStatusAddress; | |||||
config.InformationErrorAddress = MainWModel.InformationErrorAddress; | |||||
config.RecipeDataID = DataType.ID; | |||||
config.DataFormulasID = DataFormulas.FormatID; | |||||
config.OrderNumberTypeID = OrderNumberType.ID; | |||||
config.OrderNumberDataFormat = OrderNumberData.FormatID; | |||||
config.ReadDataLength = MainWModel.ReadDataLength; | |||||
config.WriteDataLength= MainWModel.WriteDataLength; | |||||
// Framework Nuget:安装 Newtonsoft.Json 库,参照472版本的程序 | |||||
var json = System.Text.Json.JsonSerializer.Serialize(config); | |||||
File.WriteAllText("config.json", json); | |||||
LogProvider.WriteLog("配置文件修改完成", MainWModel.IsLog); | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
LogProvider.WriteLog("写配置文件失败!" + ex.Message, MainWModel.IsLog, isError: true); | |||||
MainWModel.ShowMessage("写配置文件失败!" + ex.Message, false); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 实现 连接modbusTcp 按钮事件 | |||||
/// </summary> | |||||
/// <param name="text"></param> | |||||
private void DoConnectModbusTcpCommand(object text) | |||||
{ | |||||
//if (TiJiaoPanDuan()) | |||||
//{ | |||||
// modbus.ConnectModbusTcp(MainWModel.Ip, Convert.ToInt32(MainWModel.Port)); | |||||
// MainWModel.TCPDRWIsEnabled = true; | |||||
//} | |||||
} | |||||
/// <summary> | |||||
/// 开启监听 | |||||
/// </summary> | |||||
private void StartMointor() | |||||
{ | |||||
bool connctionSoss = false; | |||||
var task = Task.Factory.StartNew(async () => | |||||
{ | |||||
while (!cts.IsCancellationRequested) | |||||
{ | |||||
//Debug.WriteLine("开启监听"); | |||||
var state = new CommcationLibray.Result(); | |||||
await Task.Delay(400); | |||||
if (!MainWModel.IsStart) continue; | |||||
if (MainWModel.ConnectionStatus) continue; | |||||
if (TiJiaoPanDuan()) | |||||
{ | |||||
try | |||||
{ | |||||
if (!connctionSoss) | |||||
MainWModel.ShowMessage("连接中......."); | |||||
Application.Current.Dispatcher.Invoke(new Action(async () => | |||||
{ | |||||
state = await modbus.ConnectModbusTcp(MainWModel.Ip, Convert.ToInt32(MainWModel.Port)); | |||||
}), System.Windows.Threading.DispatcherPriority.SystemIdle, null); | |||||
await Task.Delay(500); | |||||
if (!state.State) | |||||
{ | |||||
MainWModel.ShowMessage("连接失败", false); | |||||
MainWModel.ConnectionStatus = state.State; | |||||
connctionSoss = false; | |||||
} | |||||
else | |||||
{ | |||||
connctionSoss = true; | |||||
MainWModel.ConnectionStatus = state.State; | |||||
MainWModel.ShowMessage("连接成功"); | |||||
this.GetInformationError(); | |||||
this.GetDeviceStatus(); | |||||
} | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
MessageError($"连接失败!!! 失败信息:{ex.Message}"); | |||||
} | |||||
} | |||||
} | |||||
}, cts.Token); | |||||
tasks.Add(task); | |||||
} | |||||
/// <summary> | |||||
/// 点击了取消配料,该标志位为True.上位机收到信息后主动置False | |||||
/// </summary> | |||||
private void GetInformationError() | |||||
{ | |||||
var task = Task.Factory.StartNew(async () => | |||||
{ | |||||
while (!cts.IsCancellationRequested) | |||||
{ | |||||
await Task.Delay(400); | |||||
try | |||||
{ | |||||
if (!IsState()) return; | |||||
var Result = new CommcationLibray.Result(); | |||||
Result = modbus.ReadCancelIngredients(MainWModel.InformationErrorAddress); | |||||
if (!Result.State) | |||||
{ | |||||
MessageError($"获取取消配料数据失败!!! 失败信息:{Result.Exception}"); | |||||
} | |||||
else | |||||
{ | |||||
//为1说明点击了取消配料 | |||||
if ((bool)Result.Datas) | |||||
{ | |||||
this.WhetherCancel = true; | |||||
this.WriteInformationError(); | |||||
MainWModel.OrderPushState = $"订单->{MainWModel.CurrentOrderNumber}已取消!"; | |||||
MessageBox.Show($"当前订单-> {MainWModel.CurrentOrderNumber} 已取消!"); | |||||
} | |||||
} | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
MessageError($"获取取消配料数据失败!!! 失败信息:{ex.Message}"); | |||||
} | |||||
} | |||||
}, cts.Token); | |||||
tasks.Add(task); | |||||
} | |||||
/// <summary> | |||||
/// 循环获取设备状态 | |||||
/// </summary> | |||||
private void GetDeviceStatus() | |||||
{ | |||||
var task = Task.Factory.StartNew(async () => | |||||
{ | |||||
while (!cts.IsCancellationRequested) | |||||
{ | |||||
await Task.Delay(400); | |||||
try | |||||
{ | |||||
if (!IsState()) return; | |||||
var Result = new CommcationLibray.Result(); | |||||
Result = modbus.ReadDeviceStatus(MainWModel.DeviceStatusAddress); | |||||
if (!Result.State) | |||||
{ | |||||
MessageError($"获取设备状态数据失败!!! 失败信息:{Result.Exception}"); | |||||
} | |||||
else | |||||
{ | |||||
this.DeviceStatus = (bool)Result.Datas; | |||||
this.StateFanKui((bool)Result.Datas); | |||||
} | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
MessageError($"获取设备状态数据失败!!! 失败信息:{ex.Message}"); | |||||
} | |||||
} | |||||
}, cts.Token); | |||||
tasks.Add(task); | |||||
} | |||||
/// <summary> | |||||
/// 点击取消配料时 上位机自动触发 设置值为false | |||||
/// </summary> | |||||
private void WriteInformationError() | |||||
{ | |||||
if (!IsState()) return; | |||||
var Result = new CommcationLibray.Result(); | |||||
Result = modbus.WriteCancelIngredients(MainWModel.InformationErrorAddress, false); | |||||
if (!Result.State) | |||||
{ | |||||
MessageError($"写入读取配料状态失败!!! 失败信息:{Result.Exception}"); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 封装读取操作 | |||||
/// </summary> | |||||
/// <param></param> | |||||
private void ReadCaoZuo() | |||||
{ | |||||
try | |||||
{ | |||||
switch (OrderNumberType.ID) | |||||
{ | |||||
case 0: | |||||
ReadOrders<byte>(); | |||||
break; | |||||
case 1: | |||||
ReadOrders<int>(); | |||||
break; | |||||
case 2: | |||||
ReadOrders<uint>(); | |||||
break; | |||||
case 3: | |||||
ReadOrders<short>(); | |||||
break; | |||||
case 4: | |||||
ReadOrders<ushort>(); | |||||
break; | |||||
case 5: | |||||
ReadOrders<float>(); | |||||
break; | |||||
case 6: | |||||
ReadOrders<string>(); | |||||
break; | |||||
case 7: | |||||
ReadOrders<bool>(); | |||||
break; | |||||
case 8: | |||||
ReadOrders<double>(); | |||||
break; | |||||
} | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
MessageError($"数据转换失败!!! 失败信息:{ex.Message}"); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 读取订单 | |||||
/// </summary> | |||||
private void ReadOrders<T>() | |||||
{ | |||||
var Result = new CommcationLibray.Result(); | |||||
Result = modbus.GetOrders<T>(MainWModel.DisplayOrderNumberAddress,MainWModel.ReadDataLength, (BPADataFormat)OrderNumberData.FormatID );//BPADataFormat.CDAB | |||||
if (!Result.State) | |||||
{ | |||||
MessageError($"读取订单失败!!! 失败信息:{Result.Exception}"); | |||||
} | |||||
else | |||||
{ | |||||
MainWModel.ShowMessage("读取订单成功"); | |||||
MainWModel.CurrentOrderNumber = Result.Datas ; | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 写入编号 | |||||
/// </summary> | |||||
/// <param name="test"></param> | |||||
private void WriteNumber(object test) | |||||
{ | |||||
WriteCaoZuo(0); | |||||
} | |||||
/// <summary> | |||||
/// 确定写入编号 | |||||
/// </summary> | |||||
/// <param name="test"></param> | |||||
private void DetermineWriteNumber(object test) | |||||
{ | |||||
WriteCaoZuo(1); | |||||
} | |||||
/// <summary> | |||||
/// 封装写入操作 | |||||
/// </summary> | |||||
/// <param name="type"> 0 表示写入 ,1表示确定写入</param> | |||||
private void WriteCaoZuo(int type) | |||||
{ | |||||
try | |||||
{ | |||||
if (MainWModel.FormulaNumber == null) | |||||
{ | |||||
MessageError($"请输入配方编号!!!"); | |||||
return; | |||||
} | |||||
switch (DataType.ID) | |||||
{ | |||||
case 0: | |||||
WriteCaoZuoDataType(type, Convert.ToByte(MainWModel.FormulaNumber)); | |||||
break; | |||||
case 1: | |||||
WriteCaoZuoDataType(type, Convert.ToInt32(MainWModel.FormulaNumber)); | |||||
break; | |||||
case 2: | |||||
WriteCaoZuoDataType(type, Convert.ToUInt32(MainWModel.FormulaNumber)); | |||||
break; | |||||
case 3: | |||||
WriteCaoZuoDataType(type, (short)Convert.ToInt32(MainWModel.FormulaNumber)); | |||||
break; | |||||
case 4: | |||||
WriteCaoZuoDataType(type, (ushort)Convert.ToInt32(MainWModel.FormulaNumber)); | |||||
break; | |||||
case 5: | |||||
WriteCaoZuoDataType(type, (float)Convert.ToDouble(MainWModel.FormulaNumber)); | |||||
break; | |||||
case 6: | |||||
WriteCaoZuoDataType(type, Convert.ToString(MainWModel.FormulaNumber)); | |||||
break; | |||||
case 7: | |||||
WriteCaoZuoDataType(type, Convert.ToBoolean(Convert.ToInt32(MainWModel.FormulaNumber))); | |||||
break; | |||||
case 8: | |||||
WriteCaoZuoDataType(type, Convert.ToDouble(MainWModel.FormulaNumber)); | |||||
break; | |||||
} | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
MessageError($"数据转换失败!!! 失败信息:{ex.Message}"); | |||||
} | |||||
} | |||||
private void WriteCaoZuoDataType<T>(int type, T values) | |||||
{ | |||||
if (!IsState()) return; | |||||
if (!this.DetermineWriteStatus && !this.DeviceStatus) | |||||
{ | |||||
BPADataFormat bPAData = (BPADataFormat)DataFormulas.FormatID; | |||||
var Result = new CommcationLibray.Result(); | |||||
string error = type == 0 ? "写入" : "确定写入"; | |||||
Result = type == 0 ? modbus.WriteRecipeNumber<T>(MainWModel.RecipeNumberAddress, values, MainWModel.WriteDataLength, (BPADataFormat)DataFormulas.FormatID) | |||||
: modbus.DetermineWriteNumberCommand(MainWModel.WriteNumberAddress, true); | |||||
if (!Result.State) | |||||
{ | |||||
MessageError($"{error}编号失败!!! 失败信息:{Result.Exception}"); | |||||
} | |||||
else | |||||
{ | |||||
MainWModel.ShowMessage($"{error}编号成功"); | |||||
if (type == 0) | |||||
this.ReadCaoZuo(); | |||||
else | |||||
{ | |||||
this.DetermineWriteStatus = true; | |||||
} | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
MessageBox.Show("请等待上次订单完成后再操作!!!"); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 启动配料 | |||||
/// </summary> | |||||
/// <param name="test"></param> | |||||
private void StartingIngredients(object test) | |||||
{ | |||||
} | |||||
private void StateFanKui(bool state) | |||||
{ | |||||
switch (state) | |||||
{ | |||||
case false: | |||||
MainWModel.TopDianState = "空闲中......"; | |||||
if (this.DetermineWriteStatus && !this.WhetherCancel) | |||||
{ | |||||
MainWModel.OrderPushState = "已完成"; | |||||
} | |||||
this.DetermineWriteStatus = false; | |||||
this.WhetherCancel = false; | |||||
break; | |||||
case true: | |||||
MainWModel.OrderPushState = "已推送"; | |||||
if (this.DetermineWriteStatus) | |||||
{ | |||||
MainWModel.TopDianState = "待操作"; | |||||
} | |||||
break; | |||||
default: | |||||
break; | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 错误信息 | |||||
/// </summary> | |||||
/// <param name="error"></param> | |||||
private void MessageError(string error) | |||||
{ | |||||
MainWModel.ShowMessage(error, false); | |||||
LogProvider.WriteLog(error, MainWModel.IsLog, isError: true); | |||||
} | |||||
private bool TiJiaoPanDuan() | |||||
{ | |||||
if (string.IsNullOrEmpty(MainWModel.Ip)) | |||||
{ | |||||
MainWModel.ShowMessage("请输入IP地址!!!", false); | |||||
return false; | |||||
} | |||||
if (string.IsNullOrEmpty(MainWModel.Port)) | |||||
{ | |||||
MainWModel.ShowMessage("请输入端口号!!!", false); | |||||
return false; | |||||
} | |||||
if (!PanDuanGongJ.IsIPGf(MainWModel.Ip)) | |||||
{ | |||||
MainWModel.ShowMessage("请输入合法的IP地址!!!", false); | |||||
return false; | |||||
} | |||||
if (!PanDuanGongJ.IsIPPort(MainWModel.Port)) | |||||
{ | |||||
MainWModel.ShowMessage("请输入正确的端口号!!!", false); | |||||
return false; | |||||
} | |||||
return true; | |||||
} | |||||
/// <summary> | |||||
/// 判断是否打开监听 | |||||
/// </summary> | |||||
/// <returns></returns> | |||||
private bool IsState() | |||||
{ | |||||
if (!MainWModel.IsStart || !MainWModel.ConnectionStatus) | |||||
{ | |||||
MainWModel.ShowMessage("未连接状态!!!", false); | |||||
return false; | |||||
} | |||||
else | |||||
{ | |||||
return true; | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 退出 | |||||
/// </summary> | |||||
/// <param name="text"></param> | |||||
private void Close(object text) | |||||
{ | |||||
CancelAllTasksAsync(); | |||||
} | |||||
public void CancelAllTasksAsync() | |||||
{ | |||||
cts?.Cancel(); | |||||
} | |||||
} | |||||
} | |||||
@@ -0,0 +1,26 @@ | |||||
using CommonServiceLocator; | |||||
using GalaSoft.MvvmLight.Ioc; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace BPA.WeimoCube.ViewModels | |||||
{ | |||||
public class ViewModelLocator | |||||
{ | |||||
public ViewModelLocator() | |||||
{ | |||||
// 容器的初始化 | |||||
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); | |||||
// 注册主窗体视图模型 | |||||
SimpleIoc.Default.Register<MainWindowViewModel>(); | |||||
} | |||||
public MainWindowViewModel MainViewModel { get => ServiceLocator.Current.GetInstance<MainWindowViewModel>(); } | |||||
} | |||||
} |
@@ -0,0 +1,984 @@ | |||||
<Window x:Class="BPA.WeimoCube.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:BPA.WeimoCube" | |||||
xmlns:b="http://schemas.microsoft.com/xaml/behaviors" | |||||
mc:Ignorable="d" FontFamily="Microsoft YaHei" FontSize="12" FontWeight="ExtraLight" | |||||
Title="MainWindow" Height="650" Width="1200" WindowStyle="None" AllowsTransparency="True" > | |||||
<WindowChrome.WindowChrome> | |||||
<WindowChrome GlassFrameThickness="1" CaptionHeight="50"/> | |||||
</WindowChrome.WindowChrome> | |||||
<Window.Background> | |||||
<RadialGradientBrush Center="0.5,0" GradientOrigin="0.5,-0.5" RadiusX="0.7" RadiusY="1.2"> | |||||
<GradientStop Color="#FF61BAFF" Offset="0"/> | |||||
<GradientStop Color="#FF29384E" Offset="1"/> | |||||
</RadialGradientBrush> | |||||
</Window.Background> | |||||
<Window.Resources> | |||||
<FontFamily x:Key="FF">../Assets/Fonts/#iconfont</FontFamily> | |||||
<Style TargetType="ToggleButton" x:Key="SwitchButtonStyle"> | |||||
<Setter Property="FontSize" Value="10"/> | |||||
<Setter Property="Foreground" Value="#9FFF"/> | |||||
<Setter Property="WindowChrome.IsHitTestVisibleInChrome" Value="True"/> | |||||
<Setter Property="Margin" Value="5,0"/> | |||||
<Setter Property="Width" Value="50"/> | |||||
<Setter Property="Template"> | |||||
<Setter.Value> | |||||
<ControlTemplate TargetType="ToggleButton"> | |||||
<Border Background="#1000" CornerRadius="5" Name="root"> | |||||
<Grid> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition/> | |||||
<RowDefinition Height="18"/> | |||||
</Grid.RowDefinitions> | |||||
<Border Height="17" Width="33" CornerRadius="8.5" Background="#FFF" Name="back"> | |||||
<Grid> | |||||
<TextBlock Text="开" FontFamily="9" Foreground="White" | |||||
VerticalAlignment="Center" HorizontalAlignment="Left" | |||||
Margin="5,0"/> | |||||
<TextBlock Text="关" FontFamily="9" Foreground="Gray" | |||||
VerticalAlignment="Center" HorizontalAlignment="Right" | |||||
Margin="5,0"/> | |||||
<Ellipse Width="15" Height="15" Fill="#DDD" | |||||
Margin="1,0" HorizontalAlignment="Left" Name="ellipse"/> | |||||
</Grid> | |||||
</Border> | |||||
<ContentPresenter Grid.Row="1" | |||||
VerticalAlignment="Center" HorizontalAlignment="Center"/> | |||||
</Grid> | |||||
</Border> | |||||
<ControlTemplate.Triggers> | |||||
<Trigger Property="IsMouseOver" Value="True"> | |||||
<Setter TargetName="root" Property="Background" Value="#2000"/> | |||||
</Trigger> | |||||
<Trigger Property="IsChecked" Value="True"> | |||||
<Setter TargetName="back" Property="Background" Value="Orange"/> | |||||
<Setter TargetName="ellipse" Property="HorizontalAlignment" Value="Right"/> | |||||
<Setter TargetName="ellipse" Property="Fill" Value="white"/> | |||||
</Trigger> | |||||
</ControlTemplate.Triggers> | |||||
</ControlTemplate> | |||||
</Setter.Value> | |||||
</Setter> | |||||
</Style> | |||||
<Style TargetType="Button" x:Key="ControlButtonStyle"> | |||||
<Setter Property="Width" Value="50"/> | |||||
<Setter Property="Margin" Value="5,0"/> | |||||
<Setter Property="Background" Value="#1000"/> | |||||
<Setter Property="Foreground" Value="#9FFF"/> | |||||
<Setter Property="WindowChrome.IsHitTestVisibleInChrome" Value="True"/> | |||||
<Setter Property="Template"> | |||||
<Setter.Value> | |||||
<ControlTemplate TargetType="Button"> | |||||
<Border Background="{TemplateBinding Background}" CornerRadius="5"> | |||||
<Border Background="Transparent" Name="bor" CornerRadius="5"> | |||||
<ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center"/> | |||||
</Border> | |||||
</Border> | |||||
<ControlTemplate.Triggers> | |||||
<Trigger Property="IsMouseOver" Value="True"> | |||||
<Setter TargetName="bor" Property="Background" Value="#2000"/> | |||||
</Trigger> | |||||
</ControlTemplate.Triggers> | |||||
</ControlTemplate> | |||||
</Setter.Value> | |||||
</Setter> | |||||
</Style> | |||||
</Window.Resources> | |||||
<Window.Triggers> | |||||
<EventTrigger RoutedEvent="Button.Click" SourceName="btnConfig"> | |||||
<BeginStoryboard> | |||||
<Storyboard> | |||||
<ThicknessAnimation To="0,0,0,0" Duration="0:0:0.3" | |||||
Storyboard.TargetName="bor_config" | |||||
Storyboard.TargetProperty="Margin"/> | |||||
</Storyboard> | |||||
</BeginStoryboard> | |||||
</EventTrigger> | |||||
<EventTrigger RoutedEvent="Button.Click" SourceName="btnConfigClose"> | |||||
<BeginStoryboard> | |||||
<Storyboard> | |||||
<ThicknessAnimation To="0,0,-250,0" Duration="0:0:0.3" | |||||
Storyboard.TargetName="bor_config" | |||||
Storyboard.TargetProperty="Margin"/> | |||||
</Storyboard> | |||||
</BeginStoryboard> | |||||
</EventTrigger> | |||||
</Window.Triggers> | |||||
<Grid DataContext="{Binding Source={StaticResource mvm}}"> | |||||
<Ellipse Width="120" Height="120" VerticalAlignment="Top" HorizontalAlignment="Left" | |||||
Margin="-20" Fill="#06000000"/> | |||||
<Ellipse Width="180" Height="150" VerticalAlignment="Top" HorizontalAlignment="Left" | |||||
Margin="30,-100,0,0" Fill="#08000000"/> | |||||
<Ellipse Width="50" Height="50" VerticalAlignment="Top" HorizontalAlignment="Left" | |||||
Margin="20,90,0,0" Fill="#06FFFFFF"/> | |||||
<Grid Margin="20,0"> | |||||
<Grid.Effect> | |||||
<BlurEffect Radius="{Binding MainWModel.BlurRadius}"/> | |||||
</Grid.Effect> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition Height="65"/> | |||||
<RowDefinition Height="40"/> | |||||
<RowDefinition/> | |||||
<RowDefinition Height="30"/> | |||||
</Grid.RowDefinitions> | |||||
<!--第一行信息--> | |||||
<Border Height="1" VerticalAlignment="Bottom" > | |||||
<Border.Background> | |||||
<RadialGradientBrush RadiusX="0.7"> | |||||
<GradientStop Color="White" Offset="0"/> | |||||
<GradientStop Color="#0FFFFFFF" Offset="0.3"/> | |||||
<GradientStop Color="#0FFF" Offset="1"/> | |||||
</RadialGradientBrush> | |||||
</Border.Background> | |||||
</Border> | |||||
<StackPanel Orientation="Horizontal"> | |||||
<StackPanel.Effect> | |||||
<DropShadowEffect BlurRadius="5" Color="Black" ShadowDepth="0" Opacity="0.5"/> | |||||
</StackPanel.Effect> | |||||
<Image Source="../Assets/Images/Logo.png" Width="125" Height="65"/> | |||||
<TextBlock Text="黑菠萝" Foreground="#DD87E8EC" FontSize="20" | |||||
FontWeight="Black" VerticalAlignment="Center" Margin="15,0"/> | |||||
</StackPanel> | |||||
<TextBlock Text="配料监控系统(MODBUS-TCP)" VerticalAlignment="Center" | |||||
FontWeight="Black" HorizontalAlignment="Center" FontSize="30" > | |||||
<TextBlock.Effect> | |||||
<DropShadowEffect BlurRadius="5" Color="Black" ShadowDepth="0" Opacity="0.5"/> | |||||
</TextBlock.Effect> | |||||
<TextBlock.Foreground> | |||||
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1"> | |||||
<GradientStop Color="Gold" Offset="0"/> | |||||
<GradientStop Color="Orange" Offset="1"/> | |||||
</LinearGradientBrush> | |||||
</TextBlock.Foreground> | |||||
</TextBlock> | |||||
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Right"> | |||||
<ToggleButton Content="监控" Style="{StaticResource SwitchButtonStyle}" | |||||
IsChecked="{Binding MainWModel.IsStart}"/> | |||||
<ToggleButton Content="日志" Style="{StaticResource SwitchButtonStyle}" | |||||
IsChecked="{Binding MainWModel.IsLog}"/> | |||||
<Button Style="{StaticResource ControlButtonStyle}" | |||||
Name="btnConfig" Command="{Binding ConfigCommand}"> | |||||
<StackPanel> | |||||
<TextBlock Text="" FontFamily="{StaticResource FF}" | |||||
FontSize="20" Margin="0,5,0,3"/> | |||||
<TextBlock Text="设置" FontSize="9" HorizontalAlignment="Center" Margin="0,0,0,5"/> | |||||
</StackPanel> | |||||
</Button> | |||||
<Button Style="{StaticResource ControlButtonStyle}" CommandParameter="{x:Null}" Command="{Binding CloseCommand}" x:Name="close" Click="Button_Click"> | |||||
<StackPanel> | |||||
<TextBlock Text="" FontFamily="{StaticResource FF}" | |||||
FontSize="20" Margin="0,5,0,3"/> | |||||
<TextBlock Text="退出" FontSize="9" HorizontalAlignment="Center" Margin="0,0,0,5"/> | |||||
</StackPanel> | |||||
</Button> | |||||
</StackPanel> | |||||
<!--第二行信息--> | |||||
<StackPanel Grid.Row="1" VerticalAlignment="Center" HorizontalAlignment="Left" Orientation="Horizontal"> | |||||
<TextBlock Text="" FontFamily="{StaticResource FF}" | |||||
FontSize="22" Foreground="Gold" HorizontalAlignment="Center" VerticalAlignment="Center"/> | |||||
<TextBlock Text="{Binding MainWModel.CurrentDate,StringFormat={}{0:yyyy年MM月dd日 dddd},ConverterCulture=zh-CN}" VerticalAlignment="Center" Margin="10,0" FontWeight="Black" FontSize="24" Foreground="#8FFF"/> | |||||
</StackPanel> | |||||
<StackPanel Grid.Row="1" VerticalAlignment="Center" HorizontalAlignment="Right" Orientation="Horizontal" | |||||
TextBlock.Foreground="{Binding MainWModel.MsgColor}"> | |||||
<StackPanel.Effect> | |||||
<DropShadowEffect BlurRadius="5" Color="Gray" ShadowDepth="0" Opacity="0.3"/> | |||||
</StackPanel.Effect> | |||||
<TextBlock Text="" FontFamily="{StaticResource FF}" FontSize="22" HorizontalAlignment="Center" VerticalAlignment="Center"/> | |||||
<TextBlock Text="{Binding MainWModel.Message}" FontWeight="Black" VerticalAlignment="Center" FontSize="24" Margin="10,0"/> | |||||
</StackPanel> | |||||
<!--第三行--> | |||||
<UniformGrid Columns="2" Rows="1" Grid.Row="2"> | |||||
<Border CornerRadius="5" Background="#1000" BorderThickness="0.5" Margin="10"> | |||||
<Border.BorderBrush> | |||||
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1"> | |||||
<GradientStop Color="#87E8EC" Offset="0"/> | |||||
<GradientStop Color="Transparent" Offset="0.3"/> | |||||
<GradientStop Color="Transparent" Offset="0.8"/> | |||||
<GradientStop Color="#87E8EC" Offset="1"/> | |||||
</LinearGradientBrush> | |||||
</Border.BorderBrush> | |||||
<Grid Margin="10,0"> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition Height="30"/> | |||||
<RowDefinition/> | |||||
<RowDefinition Height="40"/> | |||||
</Grid.RowDefinitions> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="160"/> | |||||
<ColumnDefinition/> | |||||
</Grid.ColumnDefinitions> | |||||
<!--从站编号--> | |||||
<TextBlock Text="{Binding SlaveId,StringFormat={}{0:00} - 号从站}" | |||||
VerticalAlignment="Center" Foreground="#9987E8EC" | |||||
FontWeight="Normal"/> | |||||
<!--配料基础信息--> | |||||
<StackPanel Orientation="Horizontal" | |||||
VerticalAlignment="Center" HorizontalAlignment="Right" | |||||
Grid.Column="1"> | |||||
<Border Width="10" Height="10" Background="Orange" Margin="5,0"/> | |||||
<TextBlock Text="配料基础信息" FontWeight="Black" Foreground="#9FFF" FontSize="20"/> | |||||
</StackPanel> | |||||
<!--附件显示区域--> | |||||
<Border CornerRadius="5" Background="#1000" Grid.Row="1" Margin="0,0,0,5"> | |||||
<Grid ClipToBounds="True"> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition Height="auto"/> | |||||
<RowDefinition/> | |||||
</Grid.RowDefinitions> | |||||
<TextBlock Text="" FontFamily="{StaticResource FF}" | |||||
Grid.RowSpan="2" FontSize="120" | |||||
Margin="-40,10,0,0" | |||||
Foreground="#09FFFFFF"/> | |||||
<Border HorizontalAlignment="Center" VerticalAlignment="Top" | |||||
Background="#BF90" | |||||
CornerRadius="0,0,5,5"> | |||||
<TextBlock Text="附件" Margin="15,3" | |||||
FontWeight="Black" FontSize="18" Foreground="White"/> | |||||
</Border> | |||||
<TextBlock Grid.Row="3" Margin="5,170" TextWrapping="Wrap" VerticalAlignment="Bottom" Foreground="#5bae23" Text="1.点击打开配料附件按钮,即可自动打开配料配置文件所在的目录。" /> | |||||
<TextBlock Grid.Row="3" Margin="5,120" TextWrapping="Wrap" VerticalAlignment="Bottom" Foreground="#5bae23" Text="2.在当前目录中找到文件名为 Formula.json 是配置文件。" /> | |||||
<TextBlock Grid.Row="3" Margin="5,85" TextWrapping="Wrap" VerticalAlignment="Bottom" Foreground="#5bae23" Text="3.打开文件可以修改里面内容数据。" /> | |||||
<TextBlock Grid.Row="3" Margin="5,65" TextWrapping="Wrap" VerticalAlignment="Bottom" Foreground="#5bae23" Text="4.修改完成后保存即可。" /> | |||||
<Grid Grid.Row="3" Margin="0,10" VerticalAlignment="Bottom"> | |||||
<Button Content="打开配料附件" Grid.Column="0" Grid.Row="0" Background="#38ada9" | |||||
Style="{StaticResource ControlButtonStyle}" | |||||
FontSize="18" FontWeight="Black" Margin="2" Width="130" Height="40" Foreground="Wheat" | |||||
Command="{Binding OpenIngredientAttachmentCommand}"/> | |||||
</Grid> | |||||
</Grid> | |||||
</Border> | |||||
<TextBlock Grid.Row="1" VerticalAlignment="Center" | |||||
HorizontalAlignment="Center" FontSize="30" | |||||
Margin="0,20,0,0" | |||||
FontFamily="../Assets/Fonts/#Digital Display" | |||||
Text="{Binding Temperature,StringFormat={}{0:0.0}}" | |||||
Foreground="White"/> | |||||
<!--附件显示区域--> | |||||
<Border CornerRadius="5" Background="#1000" Grid.Row="2" Margin="0,0,0,5"> | |||||
<Grid> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition/> | |||||
<ColumnDefinition Width="auto"/> | |||||
<ColumnDefinition/> | |||||
</Grid.ColumnDefinitions> | |||||
<TextBlock Text="" FontFamily="{StaticResource FF}" | |||||
VerticalAlignment="Center" HorizontalAlignment="Left" | |||||
Foreground="Orange" FontSize="14" Margin="10,0"/> | |||||
<TextBlock Grid.Column="1"> | |||||
<Run Text="{Binding Humidity,StringFormat={}{0:0.0}}" FontSize="18" Foreground="#AFFF" | |||||
FontWeight="Normal"/> | |||||
<Run Text="%" FontSize="11" Foreground="#7FFF"/> | |||||
</TextBlock> | |||||
<TextBlock Text="附件" Grid.Column="2" | |||||
VerticalAlignment="Center" HorizontalAlignment="Right" | |||||
Margin="10,0" Foreground="#2FFF"/> | |||||
</Grid> | |||||
</Border> | |||||
<Border CornerRadius="5" Grid.Row="1" Grid.Column="1" Grid.RowSpan="2" Background="#1000" Margin="5,0,0,5"> | |||||
<!--<GroupBox Header="附件:" Background="#1000" FontSize="20" FontWeight="Black" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,0">--> | |||||
<ListView x:Name="listviews" Background="#2001" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding formulaAttachment}" ScrollViewer.VerticalScrollBarVisibility="Disabled" ScrollViewer.HorizontalScrollBarVisibility="Disabled" Margin="5,5,5,5"> | |||||
<!--行双击事件--> | |||||
<b:Interaction.Triggers> | |||||
<b:EventTrigger EventName="MouseDoubleClick"> | |||||
<b:InvokeCommandAction Command="{Binding DoubleClickCommand}" CommandParameter="{Binding ElementName=listviews, Path=SelectedItem}"/> | |||||
</b:EventTrigger> | |||||
</b:Interaction.Triggers> | |||||
<ListView.View> | |||||
<GridView> | |||||
<GridViewColumn DisplayMemberBinding ="{Binding SerialNumber}" Width="0"/> | |||||
<GridViewColumn Width="130"> | |||||
<GridViewColumn.Header> | |||||
<TextBlock Width="130" TextAlignment="Center" FontSize="20" Foreground="#e58e26" FontWeight="Black">配方编号</TextBlock> | |||||
</GridViewColumn.Header> | |||||
<GridViewColumn.CellTemplate> | |||||
<DataTemplate > | |||||
<TextBlock TextWrapping="Wrap" Margin="30,0,0,0" FontSize="18" Foreground="#f8df72" TextAlignment="Center" Text="{Binding FormulaNumber}"></TextBlock> | |||||
</DataTemplate> | |||||
</GridViewColumn.CellTemplate> | |||||
</GridViewColumn> | |||||
<GridViewColumn Width="150"> | |||||
<GridViewColumn.Header> | |||||
<TextBlock Width="auto" FontSize="20" FontWeight="Black" Foreground="#e58e26" TextAlignment="Center">配方名称</TextBlock> | |||||
</GridViewColumn.Header> | |||||
<GridViewColumn.CellTemplate> | |||||
<DataTemplate> | |||||
<TextBlock TextWrapping="Wrap" Margin="20,0,0,0" FontSize="18" Foreground="#f8df72" TextAlignment="Center" Text="{Binding FormulaName}" ></TextBlock> | |||||
</DataTemplate> | |||||
</GridViewColumn.CellTemplate> | |||||
</GridViewColumn> | |||||
<GridViewColumn > | |||||
<GridViewColumn.Header> | |||||
<TextBlock Width="auto" FontSize="18" FontWeight="Black" Foreground="#e58e26" TextAlignment="Center">备用</TextBlock> | |||||
</GridViewColumn.Header> | |||||
<GridViewColumn.CellTemplate> | |||||
<DataTemplate> | |||||
<TextBlock TextWrapping="Wrap" Foreground="#f8df72" Text="{Binding spare}" ></TextBlock> | |||||
</DataTemplate> | |||||
</GridViewColumn.CellTemplate> | |||||
</GridViewColumn> | |||||
</GridView> | |||||
</ListView.View> | |||||
<!--隐藏列头--> | |||||
<ListView.Resources> | |||||
<Style TargetType="{x:Type GridViewColumnHeader}"> | |||||
<Setter Property="Visibility" Value="Visible"/> | |||||
</Style> | |||||
<Style x:Key="ListViewItemStyle" TargetType="ListViewItem"> | |||||
<Setter Property="Background" Value="Transparent"/> | |||||
<Style.Triggers> | |||||
<Trigger Property="IsMouseOver" Value="True"> | |||||
<Setter Property="Background" Value="LightBlue"/> | |||||
</Trigger> | |||||
<EventTrigger RoutedEvent="Mouse.MouseDown"> | |||||
<EventTrigger.Actions> | |||||
<BeginStoryboard> | |||||
<Storyboard> | |||||
<ColorAnimation Storyboard.TargetProperty="Background.Color" To="LightBlue" Duration="0:0:0.1" /> | |||||
</Storyboard> | |||||
</BeginStoryboard> | |||||
</EventTrigger.Actions> | |||||
</EventTrigger> | |||||
<EventTrigger RoutedEvent="Mouse.MouseUp"> | |||||
<EventTrigger.Actions> | |||||
<BeginStoryboard> | |||||
<Storyboard> | |||||
<ColorAnimation Storyboard.TargetProperty="Background.Color" To="Transparent" Duration="0:0:0.1" /> | |||||
</Storyboard> | |||||
</BeginStoryboard> | |||||
</EventTrigger.Actions> | |||||
</EventTrigger> | |||||
</Style.Triggers> | |||||
</Style> | |||||
</ListView.Resources> | |||||
</ListView> | |||||
<!--</GroupBox>--> | |||||
</Border> | |||||
</Grid> | |||||
</Border> | |||||
<UniformGrid Rows="2" Grid.Row="2"> | |||||
<Border CornerRadius="5" Background="#1000" BorderThickness="0.5" Margin="10"> | |||||
<Border.BorderBrush> | |||||
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1"> | |||||
<GradientStop Color="#87E8EC" Offset="0"/> | |||||
<GradientStop Color="Transparent" Offset="0.3"/> | |||||
<GradientStop Color="Transparent" Offset="0.8"/> | |||||
<GradientStop Color="#87E8EC" Offset="1"/> | |||||
</LinearGradientBrush> | |||||
</Border.BorderBrush> | |||||
<Grid Margin="10,0"> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition Height="30"/> | |||||
<RowDefinition/> | |||||
<RowDefinition Height="40"/> | |||||
</Grid.RowDefinitions> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="160"/> | |||||
<ColumnDefinition/> | |||||
</Grid.ColumnDefinitions> | |||||
<!--从站编号--> | |||||
<TextBlock Text="{Binding SlaveId,StringFormat={}{0:00} - 号从站}" | |||||
VerticalAlignment="Center" Foreground="#9987E8EC" | |||||
FontWeight="Normal"/> | |||||
<!--设备状态反馈--> | |||||
<StackPanel Orientation="Horizontal" | |||||
VerticalAlignment="Center" HorizontalAlignment="Right" | |||||
Grid.Column="1"> | |||||
<Border Width="10" Height="10" Background="Orange" Margin="5,0"/> | |||||
<TextBlock Text="订单及设备状态" Foreground="#9FFF" FontWeight="Black" FontSize="20" Margin="0,0,5,0"/> | |||||
</StackPanel> | |||||
<!--订单显示区域--> | |||||
<Border CornerRadius="5" Background="#1000" Grid.Row="1" Margin="0,0,0,5"> | |||||
<Grid ClipToBounds="True"> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition Height="auto"/> | |||||
<RowDefinition/> | |||||
</Grid.RowDefinitions> | |||||
<TextBlock Text="" FontFamily="{StaticResource FF}" | |||||
Grid.RowSpan="2" FontSize="120" | |||||
Margin="-40,10,0,0" | |||||
Foreground="#09FFFFFF"/> | |||||
<Border HorizontalAlignment="Center" VerticalAlignment="Top" | |||||
Background="#BF90" | |||||
CornerRadius="0,0,5,5"> | |||||
<TextBlock Text="订单" Margin="15,3" | |||||
FontWeight="Black" FontSize="18" Foreground="White"/> | |||||
</Border> | |||||
</Grid> | |||||
</Border> | |||||
<TextBlock Text="当前订单编号" Margin="1,50" Grid.Row="1" VerticalAlignment="Top" HorizontalAlignment="Center" | |||||
FontSize="22" FontWeight="Black" Foreground="#fad390"/> | |||||
<TextBlock Text="{Binding MainWModel.CurrentOrderNumber}" Grid.RowSpan="2" Margin="1,90" Grid.Row="1" VerticalAlignment="Top" HorizontalAlignment="Center" | |||||
FontSize="20" FontWeight="Black" Foreground="#e55039"/> | |||||
<TextBlock Grid.Row="1" VerticalAlignment="Center" | |||||
HorizontalAlignment="Center" FontSize="30" | |||||
Margin="0,20,0,0" | |||||
FontFamily="../Assets/Fonts/#Digital Display" | |||||
Text="{Binding Temperature,StringFormat={}{0:0.0}}" | |||||
Foreground="White"/> | |||||
<!--湿度显示区域--> | |||||
<Border CornerRadius="5" Background="#1000" Grid.Row="2" Margin="0,0,0,5"> | |||||
<Grid> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition/> | |||||
<ColumnDefinition Width="auto"/> | |||||
<ColumnDefinition/> | |||||
</Grid.ColumnDefinitions> | |||||
<TextBlock Text="" FontFamily="{StaticResource FF}" | |||||
VerticalAlignment="Center" HorizontalAlignment="Left" | |||||
Foreground="Orange" FontSize="14" Margin="10,0"/> | |||||
<TextBlock Grid.Column="1"> | |||||
<Run Text="{Binding Humidity,StringFormat={}{0:0.0}}" FontSize="18" Foreground="#AFFF" | |||||
FontWeight="Normal"/> | |||||
<Run Text="$" FontSize="11" Foreground="#7FFF"/> | |||||
</TextBlock> | |||||
<TextBlock Text="订单" Grid.Column="2" | |||||
VerticalAlignment="Center" HorizontalAlignment="Right" | |||||
Margin="10,0" Foreground="#2FFF"/> | |||||
</Grid> | |||||
</Border> | |||||
<Border CornerRadius="5" Background="#1000" Grid.Row="1" Grid.RowSpan="2" Grid.Column="1" Margin="5,0,0,5"> | |||||
<Grid> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition/> | |||||
<RowDefinition/> | |||||
</Grid.RowDefinitions> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition/> | |||||
<ColumnDefinition/> | |||||
</Grid.ColumnDefinitions> | |||||
<TextBlock Text="设备状态:" Margin="1,0" Grid.Row="0" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Center" | |||||
FontSize="22" FontWeight="Black" Foreground="#fad390"/> | |||||
<TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding MainWModel.TopDianState}" VerticalAlignment="Center" Margin="10,0" FontWeight="Black" FontSize="24" Foreground="#90EE90"/> | |||||
<TextBlock Text="订单状态:" Margin="1,0" Grid.Row="1" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Center" | |||||
FontSize="22" FontWeight="Black" Foreground="#fad390"/> | |||||
<TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding MainWModel.OrderPushState}" VerticalAlignment="Center" Margin="10,0" FontWeight="Black" FontSize="24" Foreground="#90EE90"/> | |||||
</Grid> | |||||
</Border> | |||||
</Grid> | |||||
</Border> | |||||
<Border CornerRadius="5" Background="#1000" BorderThickness="0.5" Margin="10"> | |||||
<Border.BorderBrush> | |||||
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1"> | |||||
<GradientStop Color="#87E8EC" Offset="0"/> | |||||
<GradientStop Color="Transparent" Offset="0.3"/> | |||||
<GradientStop Color="Transparent" Offset="0.8"/> | |||||
<GradientStop Color="#87E8EC" Offset="1"/> | |||||
</LinearGradientBrush> | |||||
</Border.BorderBrush> | |||||
<Grid Margin="10,0"> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition Height="30"/> | |||||
<RowDefinition/> | |||||
<RowDefinition Height="40"/> | |||||
</Grid.RowDefinitions> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="160"/> | |||||
<ColumnDefinition/> | |||||
</Grid.ColumnDefinitions> | |||||
<!--从站编号--> | |||||
<TextBlock Text="{Binding SlaveId,StringFormat={}{0:00} - 号从站}" | |||||
VerticalAlignment="Center" Foreground="#9987E8EC" | |||||
FontWeight="Normal"/> | |||||
<!--写入操作--> | |||||
<StackPanel Orientation="Horizontal" | |||||
VerticalAlignment="Center" HorizontalAlignment="Right" | |||||
Grid.Column="1"> | |||||
<Border Width="10" Height="10" Background="Orange" Margin="5,0"/> | |||||
<TextBlock Text="写入操作" Foreground="#9FFF" FontWeight="Black" FontSize="20" Margin="0,0,5,0"/> | |||||
</StackPanel> | |||||
<!--写入显示区域--> | |||||
<Border CornerRadius="5" Background="#1000" Grid.Row="1" Margin="0,0,0,5"> | |||||
<Grid ClipToBounds="True"> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition Height="auto"/> | |||||
<RowDefinition/> | |||||
</Grid.RowDefinitions> | |||||
<TextBlock Text="" FontFamily="{StaticResource FF}" | |||||
Grid.RowSpan="2" FontSize="120" | |||||
Margin="-40,10,0,0" | |||||
Foreground="#09FFFFFF"/> | |||||
<Border HorizontalAlignment="Center" VerticalAlignment="Top" | |||||
Background="#BF90" | |||||
CornerRadius="0,0,5,5"> | |||||
<TextBlock Text="写入" Margin="15,3" | |||||
FontWeight="Black" FontSize="18" Foreground="White"/> | |||||
</Border> | |||||
<StackPanel Orientation="Horizontal" > | |||||
<TextBlock Text="配方编号:" Margin="1,60" Grid.Row="1" VerticalAlignment="Top" HorizontalAlignment="Center" | |||||
FontSize="16" FontWeight="Black" Foreground="#fad390"/> | |||||
<Border Grid.Row="1" Margin="10,0,0,0" Background="White" BorderBrush="#EEE" BorderThickness="1" | |||||
CornerRadius="5" Height="34"> | |||||
<TextBox Height="34" Margin="0,0,0,0" VerticalContentAlignment="Center" Text="{Binding MainWModel.FormulaNumber,UpdateSourceTrigger=PropertyChanged}" BorderThickness="0" Background="#2FFF" FontSize="16" Foreground="#555" x:Name ="FormulaNumber" Width="70"> | |||||
<TextBox.InputBindings> | |||||
<KeyBinding Key="Enter" Command="{Binding QueryCommand}" CommandParameter="{Binding ElementName=FormulaNumber}"/> | |||||
</TextBox.InputBindings> | |||||
</TextBox> | |||||
</Border> | |||||
</StackPanel> | |||||
</Grid> | |||||
</Border> | |||||
<TextBlock Grid.Row="1" VerticalAlignment="Center" | |||||
HorizontalAlignment="Center" FontSize="30" | |||||
Margin="0,20,0,0" | |||||
FontFamily="../Assets/Fonts/#Digital Display" | |||||
Text="{Binding Temperature,StringFormat={}{0:0.0}}" | |||||
Foreground="White"/> | |||||
<!--写入显示区域--> | |||||
<Border CornerRadius="5" Background="#1000" Grid.Row="2" Margin="0,0,0,5"> | |||||
<Grid> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition/> | |||||
<ColumnDefinition Width="auto"/> | |||||
<ColumnDefinition/> | |||||
</Grid.ColumnDefinitions> | |||||
<TextBlock Text="" FontFamily="{StaticResource FF}" | |||||
VerticalAlignment="Center" HorizontalAlignment="Left" | |||||
Foreground="Orange" FontSize="14" Margin="10,0"/> | |||||
<TextBlock Grid.Column="1"> | |||||
<Run Text="{Binding Humidity,StringFormat={}{0:0.0}}" FontSize="18" Foreground="#AFFF" | |||||
FontWeight="Normal"/> | |||||
<Run Text="%" FontSize="11" Foreground="#7FFF"/> | |||||
</TextBlock> | |||||
<TextBlock Text="写入" Grid.Column="2" | |||||
VerticalAlignment="Center" HorizontalAlignment="Right" | |||||
Margin="10,0" Foreground="#2FFF"/> | |||||
</Grid> | |||||
</Border> | |||||
<Border CornerRadius="5" Background="#1000" Grid.Row="1" Grid.RowSpan="2" Grid.Column="1" Margin="5,0,0,5"> | |||||
<Grid> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition/> | |||||
<RowDefinition/> | |||||
<RowDefinition/> | |||||
</Grid.RowDefinitions> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition/> | |||||
<ColumnDefinition/> | |||||
</Grid.ColumnDefinitions> | |||||
<Button Content="写入编号" Grid.Column="0" Grid.Row="1" Background="#38ada9" | |||||
Style="{StaticResource ControlButtonStyle}" | |||||
FontSize="18" FontWeight="Black" Margin="2" Width="135" Foreground="Wheat" | |||||
Command="{Binding WriteNumberCommand}"/> | |||||
<Button Content="确定写入编号" Grid.Column="0" Grid.Row="2" Background="#e55039" | |||||
Style="{StaticResource ControlButtonStyle}" | |||||
FontSize="20" FontWeight="Black" Margin="2" Width="135" Foreground="Wheat" | |||||
Command="{Binding DetermineWriteNumberCommand}"/> | |||||
<Button Content="启动配料" Grid.Column="1" Grid.Row="2" Background="#f33b1f" | |||||
Style="{StaticResource ControlButtonStyle}" | |||||
FontSize="20" FontWeight="Black" Margin="2" Width="135" Foreground="Wheat" | |||||
Command="{Binding StartingIngredientsCommand}"/> | |||||
</Grid> | |||||
</Border> | |||||
</Grid> | |||||
</Border> | |||||
</UniformGrid> | |||||
</UniformGrid> | |||||
<!--第四行--> | |||||
<TextBlock Grid.Row="3" VerticalAlignment="Center" | |||||
HorizontalAlignment="Center" Foreground="#3FFF" FontSize="11"> | |||||
<Run Text="©HEIBOLUO Co,Ltd "/> | |||||
<Run Text=" "/> | |||||
<Run Text="{Binding CurrentDate,StringFormat={}{0:yyyy}}"/> | |||||
</TextBlock> | |||||
</Grid> | |||||
<!--配置信息界面--> | |||||
<Border HorizontalAlignment="Right" Width="240" | |||||
Background="#DDF7F9FA" BorderBrush="#DDD" | |||||
BorderThickness="1,0,0,0" Margin="0,0,-250,0" | |||||
Name="bor_config"> | |||||
<Grid> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition Height="70"/> | |||||
<RowDefinition Height="45"/> | |||||
<RowDefinition Height="45"/> | |||||
<RowDefinition Height="15"/> | |||||
<RowDefinition Height="395"/> | |||||
<RowDefinition Height="55"/> | |||||
<RowDefinition /> | |||||
</Grid.RowDefinitions> | |||||
<TextBlock Text="通信参数设置" VerticalAlignment="Center" HorizontalAlignment="Center" | |||||
FontSize="18"> | |||||
<TextBlock.Effect> | |||||
<DropShadowEffect BlurRadius="10" Color="Gray" ShadowDepth="0" Opacity="0.4"/> | |||||
</TextBlock.Effect> | |||||
</TextBlock> | |||||
<Button Style="{StaticResource ControlButtonStyle}" | |||||
Width="33" Height="28" | |||||
VerticalAlignment="Center" HorizontalAlignment="Left" | |||||
Background="Transparent" | |||||
Name="btnConfigClose" | |||||
Command="{Binding ConfigCloseCommand}"> | |||||
<Path Data="M0 5,10 5M4 0 ,10 5,4 10" Stroke="Gray" StrokeThickness="1"/> | |||||
</Button> | |||||
<!--ip地址--> | |||||
<Grid Grid.Row="1" Margin="10,0"> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="60"/> | |||||
<ColumnDefinition/> | |||||
</Grid.ColumnDefinitions> | |||||
<TextBlock Text="IP地址" VerticalAlignment="Center"/> | |||||
<Border Grid.Column="1" Background="White" BorderBrush="#EEE" BorderThickness="1" | |||||
CornerRadius="5" Height="35"> | |||||
<TextBox Grid.Column="1" Height="34" Margin="0,0,0,0" BorderThickness="0" Background="Transparent" VerticalContentAlignment="Center" Text="{Binding MainWModel.Ip,UpdateSourceTrigger=PropertyChanged}" FontSize="16" Foreground="#555" x:Name ="IPName" Width="155"> | |||||
<TextBox.InputBindings> | |||||
<KeyBinding Key="Enter" Command="{Binding QueryCommand}" CommandParameter="{Binding ElementName=IPName}"/> | |||||
</TextBox.InputBindings> | |||||
</TextBox> | |||||
</Border> | |||||
</Grid> | |||||
<!--端口号--> | |||||
<Grid Grid.Row="2" Margin="10,0"> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="60"/> | |||||
<ColumnDefinition/> | |||||
</Grid.ColumnDefinitions> | |||||
<TextBlock Text="端口号" VerticalAlignment="Center"/> | |||||
<Border Grid.Column="1" Background="White" BorderBrush="#EEE" BorderThickness="1" | |||||
CornerRadius="5" Height="35"> | |||||
<TextBox Grid.Column="1" Height="34" Margin="0,0,0,0" BorderThickness="0" Background="Transparent" VerticalContentAlignment="Center" Text="{Binding MainWModel.Port,UpdateSourceTrigger=PropertyChanged}" FontSize="16" Foreground="#555" x:Name ="PortName" Width="155"> | |||||
<TextBox.InputBindings> | |||||
<KeyBinding Key="Enter" Command="{Binding QueryCommand}" CommandParameter="{Binding ElementName=PortName}"/> | |||||
</TextBox.InputBindings> | |||||
</TextBox> | |||||
</Border> | |||||
</Grid> | |||||
<ScrollViewer Grid.Row="4" VerticalScrollBarVisibility="Hidden" > | |||||
<StackPanel > | |||||
<Grid Margin="10,5"> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="80"/> | |||||
<ColumnDefinition/> | |||||
</Grid.ColumnDefinitions> | |||||
<TextBlock Text="读取数据长度" VerticalAlignment="Center"/> | |||||
<Border Grid.Column="1" Background="White" BorderBrush="#EEE" BorderThickness="1" | |||||
CornerRadius="5" Height="35"> | |||||
<TextBox Grid.Column="1" Height="34" Margin="0,0,0,0" BorderThickness="0" Background="Transparent" VerticalContentAlignment="Center" Text="{Binding MainWModel.ReadDataLength,UpdateSourceTrigger=PropertyChanged}" FontSize="16" Foreground="#555" x:Name ="ReadDataLength" Width="139"> | |||||
<TextBox.InputBindings> | |||||
<KeyBinding Key="Enter" Command="{Binding QueryCommand}" CommandParameter="{Binding ElementName=ReadDataLength}"/> | |||||
</TextBox.InputBindings> | |||||
</TextBox> | |||||
</Border> | |||||
</Grid> | |||||
<Grid Margin="10,5"> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="80"/> | |||||
<ColumnDefinition/> | |||||
</Grid.ColumnDefinitions> | |||||
<TextBlock Text="写入数据长度" VerticalAlignment="Center"/> | |||||
<Border Grid.Column="1" Background="White" BorderBrush="#EEE" BorderThickness="1" | |||||
CornerRadius="5" Height="35"> | |||||
<TextBox Grid.Column="1" Height="34" Margin="0,0,0,0" BorderThickness="0" Background="Transparent" VerticalContentAlignment="Center" Text="{Binding MainWModel.WriteDataLength,UpdateSourceTrigger=PropertyChanged}" FontSize="16" Foreground="#555" x:Name ="WriteDataLength" Width="139"> | |||||
<TextBox.InputBindings> | |||||
<KeyBinding Key="Enter" Command="{Binding QueryCommand}" CommandParameter="{Binding ElementName=WriteDataLength}"/> | |||||
</TextBox.InputBindings> | |||||
</TextBox> | |||||
</Border> | |||||
</Grid> | |||||
<Grid Margin="10,5"> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="80"/> | |||||
<ColumnDefinition/> | |||||
</Grid.ColumnDefinitions> | |||||
<TextBlock Text="配方编号地址" VerticalAlignment="Center"/> | |||||
<Border Grid.Column="1" Background="White" BorderBrush="#EEE" BorderThickness="1" | |||||
CornerRadius="5" Height="35"> | |||||
<TextBox Grid.Column="1" Height="34" Margin="0,0,0,0" BorderThickness="0" Background="Transparent" VerticalContentAlignment="Center" Text="{Binding MainWModel.RecipeNumberAddress,UpdateSourceTrigger=PropertyChanged}" FontSize="16" Foreground="#555" x:Name ="RecipeNumberAddress" Width="139"> | |||||
<TextBox.InputBindings> | |||||
<KeyBinding Key="Enter" Command="{Binding QueryCommand}" CommandParameter="{Binding ElementName=PortName}"/> | |||||
</TextBox.InputBindings> | |||||
</TextBox> | |||||
</Border> | |||||
</Grid> | |||||
<Grid Margin="10,5"> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="80"/> | |||||
<ColumnDefinition/> | |||||
</Grid.ColumnDefinitions> | |||||
<TextBlock Text="配方编号类型" VerticalAlignment="Center"/> | |||||
<Border Grid.Column="1" Background="White" BorderBrush="#EEE" BorderThickness="1" | |||||
CornerRadius="5" Height="35"> | |||||
<ComboBox Height="34" Width="135" BorderThickness="0" Background="Transparent" ItemsSource="{Binding dataTypes}" VerticalContentAlignment="Center" DisplayMemberPath="{Binding DataName}" SelectedValuePath="{Binding ID}" Foreground="#555" SelectedItem="{Binding DataType}"> | |||||
<ComboBox.ItemTemplate> | |||||
<DataTemplate> | |||||
<TextBlock Text="{Binding DataName}" VerticalAlignment="Center"/> | |||||
</DataTemplate> | |||||
</ComboBox.ItemTemplate> | |||||
</ComboBox> | |||||
</Border> | |||||
</Grid> | |||||
<Grid Margin="10,5"> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="80"/> | |||||
<ColumnDefinition/> | |||||
</Grid.ColumnDefinitions> | |||||
<TextBlock Text="配方编号格式" VerticalAlignment="Center"/> | |||||
<Border Grid.Column="1" Background="White" BorderBrush="#EEE" BorderThickness="1" | |||||
CornerRadius="5" Height="35"> | |||||
<ComboBox Height="34" Width="135" BorderThickness="0" Background="Transparent" ItemsSource="{Binding formulas}" VerticalContentAlignment="Center" DisplayMemberPath="{Binding DataFormatName}" SelectedValuePath="{Binding FormatID}" Foreground="#555" SelectedItem="{Binding DataFormulas}"> | |||||
<ComboBox.ItemTemplate> | |||||
<DataTemplate> | |||||
<TextBlock Text="{Binding DataFormatName}" VerticalAlignment="Center"/> | |||||
</DataTemplate> | |||||
</ComboBox.ItemTemplate> | |||||
</ComboBox> | |||||
</Border> | |||||
</Grid> | |||||
<Grid Margin="10,5"> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="80"/> | |||||
<ColumnDefinition/> | |||||
</Grid.ColumnDefinitions> | |||||
<TextBlock Text="订单编号地址" VerticalAlignment="Center"/> | |||||
<Border Grid.Column="1" Background="White" BorderBrush="#EEE" BorderThickness="1" | |||||
CornerRadius="5" Height="35"> | |||||
<TextBox Grid.Column="1" Height="34" Margin="0,0,0,0" BorderThickness="0" Background="Transparent" VerticalContentAlignment="Center" Text="{Binding MainWModel.DisplayOrderNumberAddress,UpdateSourceTrigger=PropertyChanged}" FontSize="16" Foreground="#555" x:Name ="DisplayOrderNumberAddress" Width="139"> | |||||
<TextBox.InputBindings> | |||||
<KeyBinding Key="Enter" Command="{Binding QueryCommand}" CommandParameter="{Binding ElementName=PortName}"/> | |||||
</TextBox.InputBindings> | |||||
</TextBox> | |||||
</Border> | |||||
</Grid> | |||||
<Grid Margin="10,5"> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="80"/> | |||||
<ColumnDefinition/> | |||||
</Grid.ColumnDefinitions> | |||||
<TextBlock Text="订单编号类型" VerticalAlignment="Center"/> | |||||
<Border Grid.Column="1" Background="White" BorderBrush="#EEE" BorderThickness="1" | |||||
CornerRadius="5" Height="35"> | |||||
<ComboBox Height="34" Width="135" BorderThickness="0" Background="Transparent" ItemsSource="{Binding dataTypes}" VerticalContentAlignment="Center" DisplayMemberPath="{Binding DataName}" SelectedValuePath="{Binding ID}" Foreground="#555" SelectedItem="{Binding OrderNumberType}"> | |||||
<ComboBox.ItemTemplate> | |||||
<DataTemplate> | |||||
<TextBlock Text="{Binding DataName}" VerticalAlignment="Center"/> | |||||
</DataTemplate> | |||||
</ComboBox.ItemTemplate> | |||||
</ComboBox> | |||||
</Border> | |||||
</Grid> | |||||
<Grid Margin="10,5"> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="80"/> | |||||
<ColumnDefinition/> | |||||
</Grid.ColumnDefinitions> | |||||
<TextBlock Text="订单编号格式" VerticalAlignment="Center"/> | |||||
<Border Grid.Column="1" Background="White" BorderBrush="#EEE" BorderThickness="1" | |||||
CornerRadius="5" Height="35"> | |||||
<ComboBox Height="34" Width="135" BorderThickness="0" Background="Transparent" ItemsSource="{Binding formulas}" VerticalContentAlignment="Center" DisplayMemberPath="{Binding DataFormatName}" SelectedValuePath="{Binding FormatID}" Foreground="#555" SelectedItem="{Binding DataFormulas}"> | |||||
<ComboBox.ItemTemplate> | |||||
<DataTemplate> | |||||
<TextBlock Text="{Binding DataFormatName}" VerticalAlignment="Center"/> | |||||
</DataTemplate> | |||||
</ComboBox.ItemTemplate> | |||||
</ComboBox> | |||||
</Border> | |||||
</Grid> | |||||
<Grid Margin="10,5"> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="80"/> | |||||
<ColumnDefinition/> | |||||
</Grid.ColumnDefinitions> | |||||
<TextBlock Text="写入编号地址" VerticalAlignment="Center"/> | |||||
<Border Grid.Column="1" Background="White" BorderBrush="#EEE" BorderThickness="1" | |||||
CornerRadius="5" Height="35"> | |||||
<TextBox Grid.Column="1" Height="34" Margin="0,0,0,0" BorderThickness="0" Background="Transparent" VerticalContentAlignment="Center" Text="{Binding MainWModel.WriteNumberAddress,UpdateSourceTrigger=PropertyChanged}" FontSize="16" Foreground="#555" x:Name ="WriteNumberAddress" Width="139"> | |||||
<TextBox.InputBindings> | |||||
<KeyBinding Key="Enter" Command="{Binding QueryCommand}" CommandParameter="{Binding ElementName=PortName}"/> | |||||
</TextBox.InputBindings> | |||||
</TextBox> | |||||
</Border> | |||||
</Grid> | |||||
<Grid Margin="10,5"> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="80"/> | |||||
<ColumnDefinition/> | |||||
</Grid.ColumnDefinitions> | |||||
<TextBlock Text="启动配料地址" VerticalAlignment="Center"/> | |||||
<Border Grid.Column="1" Background="White" BorderBrush="#EEE" BorderThickness="1" | |||||
CornerRadius="5" Height="35"> | |||||
<TextBox Grid.Column="1" Height="34" Margin="0,0,0,0" BorderThickness="0" Background="Transparent" VerticalContentAlignment="Center" Text="{Binding MainWModel.StartIngredientAddress,UpdateSourceTrigger=PropertyChanged}" FontSize="16" Foreground="#555" x:Name ="StartIngredientAddress" Width="139"> | |||||
<TextBox.InputBindings> | |||||
<KeyBinding Key="Enter" Command="{Binding QueryCommand}" CommandParameter="{Binding ElementName=PortName}"/> | |||||
</TextBox.InputBindings> | |||||
</TextBox> | |||||
</Border> | |||||
</Grid> | |||||
<Grid Margin="10,5"> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="80"/> | |||||
<ColumnDefinition/> | |||||
</Grid.ColumnDefinitions> | |||||
<TextBlock Text="配料完成地址" VerticalAlignment="Center"/> | |||||
<Border Grid.Column="1" Background="White" BorderBrush="#EEE" BorderThickness="1" | |||||
CornerRadius="5" Height="35"> | |||||
<TextBox Grid.Column="1" Height="34" Margin="0,0,0,0" BorderThickness="0" Background="Transparent" VerticalContentAlignment="Center" Text="{Binding MainWModel.IngredientCompletionAddress,UpdateSourceTrigger=PropertyChanged}" FontSize="16" Foreground="#555" x:Name ="IngredientCompletionAddress" Width="139"> | |||||
<TextBox.InputBindings> | |||||
<KeyBinding Key="Enter" Command="{Binding QueryCommand}" CommandParameter="{Binding ElementName=PortName}"/> | |||||
</TextBox.InputBindings> | |||||
</TextBox> | |||||
</Border> | |||||
</Grid> | |||||
<Grid Margin="10,5"> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="80"/> | |||||
<ColumnDefinition/> | |||||
</Grid.ColumnDefinitions> | |||||
<TextBlock Text="设备状态地址" VerticalAlignment="Center"/> | |||||
<Border Grid.Column="1" Background="White" BorderBrush="#EEE" BorderThickness="1" | |||||
CornerRadius="5" Height="35"> | |||||
<TextBox Grid.Column="1" Height="34" Margin="0,0,0,0" BorderThickness="0" Background="Transparent" VerticalContentAlignment="Center" Text="{Binding MainWModel.DeviceStatusAddress,UpdateSourceTrigger=PropertyChanged}" FontSize="16" Foreground="#555" x:Name ="DeviceStatusAddress" Width="139"> | |||||
<TextBox.InputBindings> | |||||
<KeyBinding Key="Enter" Command="{Binding QueryCommand}" CommandParameter="{Binding ElementName=PortName}"/> | |||||
</TextBox.InputBindings> | |||||
</TextBox> | |||||
</Border> | |||||
</Grid> | |||||
<Grid Margin="10,5"> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="80"/> | |||||
<ColumnDefinition/> | |||||
</Grid.ColumnDefinitions> | |||||
<TextBlock Text="信息错误地址" VerticalAlignment="Center"/> | |||||
<Border Grid.Column="1" Background="White" BorderBrush="#EEE" BorderThickness="1" | |||||
CornerRadius="5" Height="35"> | |||||
<TextBox Grid.Column="1" Height="34" Margin="0,0,0,0" BorderThickness="0" Background="Transparent" VerticalContentAlignment="Center" Text="{Binding MainWModel.InformationErrorAddress,UpdateSourceTrigger=PropertyChanged}" FontSize="16" Foreground="#555" x:Name ="InformationErrorAddress" Width="139"> | |||||
<TextBox.InputBindings> | |||||
<KeyBinding Key="Enter" Command="{Binding QueryCommand}" CommandParameter="{Binding ElementName=PortName}"/> | |||||
</TextBox.InputBindings> | |||||
</TextBox> | |||||
</Border> | |||||
</Grid> | |||||
</StackPanel> | |||||
</ScrollViewer> | |||||
<!--日志路径 --> | |||||
<Grid Grid.Row="5" Margin="10,0" VerticalAlignment="Bottom"> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="60"/> | |||||
<ColumnDefinition/> | |||||
</Grid.ColumnDefinitions> | |||||
<TextBlock Text="日志路径" VerticalAlignment="Center"/> | |||||
<Border Grid.Column="1" Background="White" BorderBrush="#EEE" BorderThickness="1" | |||||
CornerRadius="5" Height="33"> | |||||
<Grid> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition/> | |||||
<ColumnDefinition Width="30"/> | |||||
</Grid.ColumnDefinitions> | |||||
<TextBox BorderThickness="0" Background="Transparent" | |||||
VerticalContentAlignment="Center" | |||||
Text="{Binding MainWModel.LogPath}"/> | |||||
<Border Width="1" HorizontalAlignment="Right" Background="#EEE" | |||||
Margin="0,4"/> | |||||
<Button Content="···" Grid.Column="1" Background="Transparent" | |||||
Style="{StaticResource ControlButtonStyle}" | |||||
FontSize="18" Margin="2" Width="26" Foreground="Gray" | |||||
Command="{Binding LogPathSelectCommand}"/> | |||||
</Grid> | |||||
</Border> | |||||
</Grid> | |||||
<!--打开日志目录--> | |||||
<TextBlock Grid.Row="6" VerticalAlignment="Top" HorizontalAlignment="Center" | |||||
Margin="0,5"> | |||||
<Hyperlink Command="{Binding OpenLogPathCommand}">打开日志目录</Hyperlink> | |||||
</TextBlock> | |||||
</Grid> | |||||
</Border> | |||||
</Grid> | |||||
</Window> |
@@ -0,0 +1,45 @@ | |||||
using System.Text; | |||||
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.Navigation; | |||||
using System.Windows.Shapes; | |||||
namespace BPA.WeimoCube | |||||
{ | |||||
/// <summary> | |||||
/// Interaction logic for MainWindow.xaml | |||||
/// </summary> | |||||
public partial class MainWindow : Window | |||||
{ | |||||
public MainWindow() | |||||
{ | |||||
InitializeComponent(); | |||||
//最大化时 页面高度为屏幕高度 | |||||
this.MaxHeight = SystemParameters.PrimaryScreenHeight; | |||||
} | |||||
private void Button_Click(object sender, RoutedEventArgs e) | |||||
{ | |||||
if (System.Windows.MessageBox.Show("是否确定退出系统?", "提示", System.Windows.MessageBoxButton.YesNo, System.Windows.MessageBoxImage.Question) == System.Windows.MessageBoxResult.Yes) | |||||
{ | |||||
Button button = sender as Button; | |||||
if (button != null && button.Command != null && button.Command.CanExecute(null)) | |||||
{ | |||||
// 首先执行绑定的Command | |||||
button.Command.Execute(null); | |||||
} | |||||
Application.Current.Shutdown();// 关闭应用程序并终止所有实例 | |||||
Environment.Exit(0); | |||||
//var w = Window.GetWindow(close); // 获取当前窗体 | |||||
//w.Close(); | |||||
} | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,17 @@ | |||||
<Project Sdk="Microsoft.NET.Sdk"> | |||||
<PropertyGroup> | |||||
<TargetFramework>net6.0</TargetFramework> | |||||
<ImplicitUsings>enable</ImplicitUsings> | |||||
<Nullable>enable</Nullable> | |||||
<GenerateDocumentationFile>True</GenerateDocumentationFile> | |||||
<GeneratePackageOnBuild>False</GeneratePackageOnBuild> | |||||
<Title>http://111.9.47.105:10243/repository/bpa/index.json</Title> | |||||
<ProduceReferenceAssembly>True</ProduceReferenceAssembly> | |||||
</PropertyGroup> | |||||
<ItemGroup> | |||||
<PackageReference Include="BPA.Communication" Version="1.0.169" /> | |||||
</ItemGroup> | |||||
</Project> |
@@ -0,0 +1,115 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Runtime.InteropServices; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace CommcationLibray | |||||
{ | |||||
/// <summary> | |||||
/// ModbusRTU / ModbusAscll / ModbusTCP | |||||
/// 通用公共抽象类 | |||||
/// </summary> | |||||
public abstract class ModbusBase | |||||
{ | |||||
/// <summary> | |||||
/// 封装公共报文区域 | |||||
/// </summary> | |||||
/// <param name="unit_id"></param> | |||||
/// <param name="func_code"></param> | |||||
/// <param name="start_addr"></param> | |||||
/// <param name="count"></param> | |||||
/// <returns></returns> | |||||
public byte[] ReadCommandBytes(byte unit_id, byte func_code, ushort start_addr, ushort count) | |||||
{ | |||||
byte[] req_bytes = new byte[] { | |||||
unit_id, | |||||
func_code, | |||||
(byte)(start_addr/256), | |||||
(byte)(start_addr%256), | |||||
(byte)(count/256), | |||||
(byte)(count%256) | |||||
}; | |||||
return req_bytes; | |||||
} | |||||
/// <summary> | |||||
/// 获取对应的数据类型 | |||||
/// </summary> | |||||
/// <typeparam name="T"></typeparam> | |||||
/// <param name="data_bytes"></param> | |||||
/// <returns></returns> | |||||
public T[] GetValues<T>(byte[] data_bytes) | |||||
{ | |||||
//GetValues<ushort> data_bytes 每两个字节转换成一个数字 float 4Bytes double 8 | |||||
//2 ushort short int16 uint16 | |||||
//4 int uint int32 uint32 float | |||||
//8 double | |||||
//16 decimal | |||||
List<T> list = new List<T>(); | |||||
try | |||||
{ | |||||
//检查类型的长度 | |||||
var type_len = Marshal.SizeOf(typeof(T)); | |||||
for (int i = 0; i < data_bytes.Length; i+= type_len) | |||||
{ | |||||
//取出对应类型字节 | |||||
var temp_bytes = data_bytes.ToList().GetRange(i, type_len); | |||||
if (BitConverter.IsLittleEndian) | |||||
{ | |||||
temp_bytes.Reverse(); | |||||
} | |||||
Type bitConverter_type = typeof(BitConverter); | |||||
var mis = bitConverter_type.GetMethods().ToList(); | |||||
var mi = mis.FirstOrDefault(mi => mi.ReturnType == typeof(T) && mi.GetParameters().Length == 2); | |||||
if (mi == null) | |||||
{ | |||||
throw new Exception("数据转换类型出错!"); | |||||
} | |||||
object value = mi.Invoke(bitConverter_type, new object[] { temp_bytes.ToArray(), 0 }); | |||||
list.Add((T)value); | |||||
} | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
throw ex; | |||||
} | |||||
return list.ToArray(); | |||||
} | |||||
public object[] GetValues(byte[] data_bytes, Type[] types) | |||||
{ | |||||
object[] values = new object[types.Length]; | |||||
int index = 0; | |||||
int i =0; | |||||
foreach (var type in types) | |||||
{ | |||||
var type_len = Marshal.SizeOf(type); | |||||
var temp_bytes = data_bytes.ToList().GetRange(index, type_len); | |||||
temp_bytes.Reverse(); | |||||
index += type_len; | |||||
Type bitConverter_type = typeof(BitConverter); | |||||
var mis = bitConverter_type.GetMethods().ToList(); | |||||
var mi = mis.FirstOrDefault(mi => mi.ReturnType == type && mi.GetParameters().Length == 2); | |||||
if (mi == null) | |||||
{ | |||||
throw new Exception("数据转换类型出错!"); | |||||
} | |||||
object value = mi.Invoke(bitConverter_type, new object[] { temp_bytes.ToArray(), 0 }); | |||||
values[i++] = value; | |||||
} | |||||
return values; | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,215 @@ | |||||
using BPA.Communication; | |||||
using BPA.Helper; | |||||
using Microsoft.AspNetCore.Http; | |||||
namespace CommcationLibray | |||||
{ | |||||
/// <summary> | |||||
/// modbusTcp连接基类 | |||||
/// </summary> | |||||
public class ModbusTCP | |||||
{ | |||||
ICommModbus commHelper; | |||||
/// <summary> | |||||
/// 连接modbusTcp | |||||
/// </summary> | |||||
/// <param name="ip">IP</param> | |||||
/// <param name="Port">端口</param> | |||||
/// <returns></returns> | |||||
public async Task<Result> ConnectModbusTcp(string ip, int Port) | |||||
{ | |||||
Result results = new Result(); | |||||
await Task.Run( new Action(() => | |||||
{ | |||||
CommHelper.CreateModbusTcp(ip, Port).OnSuccess(s => | |||||
{ | |||||
results.State = s.IsSuccess; | |||||
results.Exception = s.Message; | |||||
commHelper = s.Content; | |||||
}).OnFailure(s => | |||||
{ | |||||
results.State = s.IsSuccess; | |||||
results.Exception = s.Message; | |||||
}); | |||||
})); | |||||
return results; | |||||
} | |||||
/// <summary> | |||||
/// 获取订单号 | |||||
/// </summary> | |||||
/// <param name="address">读取保持寄存器 的地址</param> | |||||
/// <typeparam name="T">需要返回的数据类型</typeparam> | |||||
/// <param name="length">数据长度</param> | |||||
/// <param name="format">数据格式</param> | |||||
/// <returns></returns> | |||||
public Result GetOrders<T>(string address, ushort length = 1, BPADataFormat format = BPADataFormat.ABCD) | |||||
{ | |||||
Result results = new Result(); | |||||
try | |||||
{ | |||||
if (commHelper != null) | |||||
{ | |||||
var GetOrdersData = commHelper.ReadHoldRegister<T>(address, length,format); | |||||
results.State = GetOrdersData.IsSuccess; | |||||
results.Exception = GetOrdersData.Message; | |||||
results.Datas = GetOrdersData.Content; | |||||
} | |||||
else | |||||
{ | |||||
results.State = false; | |||||
results.Exception = "ICommModbus 对象为空!!!"; | |||||
} | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
results.State = false; | |||||
results.Exception = ex.Message; | |||||
} | |||||
return results; | |||||
} | |||||
/// <summary> | |||||
/// 写入配方编号 | |||||
/// </summary> | |||||
/// <typeparam name="T">写入的数据类型</typeparam> | |||||
/// <param name="address">寄存器地址</param> | |||||
/// <param name="value">写入的值</param> | |||||
/// <param name="len">地址长度</param> | |||||
/// <param name="format">数据格式</param> | |||||
/// <returns></returns> | |||||
public Result WriteRecipeNumber<T>(string address, T value, int len = 0, BPADataFormat format = BPADataFormat.ABCD) | |||||
{ | |||||
Result results = new Result(); | |||||
try | |||||
{ | |||||
if (commHelper != null) | |||||
{ | |||||
var WriteState = commHelper.WriteHoldRegister<T>(address, value, len, format); | |||||
results.State = WriteState.IsSuccess; | |||||
results.Exception = WriteState.Message; | |||||
} | |||||
else | |||||
{ | |||||
results.State = false; | |||||
results.Exception = "ICommModbus 对象为空!!!"; | |||||
} | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
results.State = false; | |||||
results.Exception = ex.Message; | |||||
} | |||||
return results; | |||||
} | |||||
/// <summary> | |||||
/// 确定写入编号 | |||||
/// </summary> | |||||
/// <param name="address">线圈地址</param> | |||||
/// <param name="value">写入的值</param> | |||||
/// <returns></returns> | |||||
public Result DetermineWriteNumberCommand(string address, bool value) | |||||
{ | |||||
return WriteCoilData(address, value); | |||||
} | |||||
/// <summary> | |||||
/// 写入取消配料的点位 | |||||
/// </summary> | |||||
/// <param name="address">线圈地址</param> | |||||
/// <param name="value">写入线圈的值</param> | |||||
/// <returns></returns> | |||||
public Result WriteCancelIngredients(string address, bool value) | |||||
{ | |||||
return WriteCoilData(address,value); | |||||
} | |||||
/// <summary> | |||||
/// 读取取消配料的点位 | |||||
/// </summary> | |||||
/// <param name="address">读取线圈的地址</param> | |||||
/// <returns></returns> | |||||
public Result ReadCancelIngredients(string address) | |||||
{ | |||||
return ReadCoilData(address); | |||||
} | |||||
/// <summary> | |||||
/// 获取设备状态 | |||||
/// </summary> | |||||
/// <param name="address">读取线圈的地址</param> | |||||
/// <returns></returns> | |||||
public Result ReadDeviceStatus(string address) | |||||
{ | |||||
return ReadCoilData(address); | |||||
} | |||||
/// <summary> | |||||
/// 读取线圈数据 | |||||
/// </summary> | |||||
/// <param name="address">读取线圈的地址</param> | |||||
/// <returns></returns> | |||||
private Result ReadCoilData(string address) | |||||
{ | |||||
Result results = new Result(); | |||||
try | |||||
{ | |||||
if (commHelper != null) | |||||
{ | |||||
var readState = commHelper.ReadCoil(address); | |||||
results.State = readState.IsSuccess; | |||||
results.Datas = readState.Content; | |||||
results.Exception = readState.Message; | |||||
} | |||||
else | |||||
{ | |||||
results.State = false; | |||||
results.Exception = "ICommModbus 对象为空!!!"; | |||||
} | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
results.State = false; | |||||
results.Exception = ex.Message; | |||||
} | |||||
return results; | |||||
} | |||||
/// <summary> | |||||
/// 写入线圈数据 | |||||
/// </summary> | |||||
/// <param name="address"></param> | |||||
/// <param name="value">写入线圈的值</param> | |||||
/// <returns></returns> | |||||
private Result WriteCoilData(string address,bool value) | |||||
{ | |||||
Result results = new Result(); | |||||
try | |||||
{ | |||||
if (commHelper != null) | |||||
{ | |||||
var WriteState = commHelper.WriteCoil(address, value); | |||||
results.State = WriteState.IsSuccess; | |||||
results.Exception = WriteState.Message; | |||||
} | |||||
else | |||||
{ | |||||
results.State = false; | |||||
results.Exception = "ICommModbus 对象为空!!!"; | |||||
} | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
results.State = false; | |||||
results.Exception = ex.Message; | |||||
} | |||||
return results; | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,28 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace CommcationLibray | |||||
{ | |||||
/// <summary> | |||||
/// 包装返回结果 | |||||
/// </summary> | |||||
public class Result | |||||
{ | |||||
/// <summary> | |||||
/// 状态 | |||||
/// </summary> | |||||
public bool State { set; get; } | |||||
/// <summary> | |||||
/// 错误信息 | |||||
/// </summary> | |||||
public string Exception { get; set; } | |||||
/// <summary> | |||||
/// 转成对应的数据 ushort int float | |||||
/// </summary> | |||||
public object Datas { get; set; } | |||||
} | |||||
} |