瀏覽代碼

更新

JXJAgvReake
Mr_z 1 年之前
父節點
當前提交
a418a36a31
共有 26 個文件被更改,包括 1225 次插入330 次删除
  1. +1
    -1
      BPASmartClient.JXJFoodBigStation/Properties/Settings.Designer.cs
  2. +5
    -1
      BPASmartClient.JXJFoodBigStation/View/HardwareStatusView.xaml
  3. +1
    -1
      BPASmartClient.Model/柔性味魔方/RawMaterialModel.cs
  4. +28
    -16
      DosingSystem/App.xaml.cs
  5. +115
    -0
      DosingSystem/ExcuteControl.cs
  6. +16
    -0
      DosingSystem/Model/ConveryType.cs
  7. +5
    -3
      DosingSystem/Model/DeviceInquire.cs
  8. +9
    -9
      DosingSystem/Model/Expand.cs
  9. +33
    -0
      DosingSystem/Model/par/BasePar.cs
  10. +1
    -1
      DosingSystem/Service/SiemensDevice.cs
  11. +210
    -0
      DosingSystem/View/CommParSetView.xaml
  12. +2
    -1
      DosingSystem/View/ConveyerBeltManualView.xaml
  13. +42
    -26
      DosingSystem/View/HardwareStatusView.xaml
  14. +3
    -0
      DosingSystem/View/ManualControlView.xaml
  15. +396
    -0
      DosingSystem/View/UHardwareStatusView.xaml
  16. +28
    -0
      DosingSystem/View/UHardwareStatusView.xaml.cs
  17. +2
    -0
      DosingSystem/ViewModel/CommparSetViewModel.cs
  18. +1
    -1
      DosingSystem/ViewModel/ConveyerBeltManualViewModel.cs
  19. +17
    -5
      DosingSystem/ViewModel/DeviceListViewModel.cs
  20. +53
    -6
      DosingSystem/ViewModel/HardwareStatusViewModel.cs
  21. +2
    -1
      DosingSystem/ViewModel/ManualControlViewModel.cs
  22. +43
    -258
      DosingSystem/ViewModel/RecipeControlViewModel.cs
  23. +170
    -0
      DosingSystem/ViewModel/UHardwareStatusViewModel.cs
  24. +22
    -0
      SmartClient.sln
  25. +10
    -0
      阿里云IOT平台测试/Program.cs
  26. +10
    -0
      阿里云IOT平台测试/阿里云IOT平台测试.csproj

+ 1
- 1
BPASmartClient.JXJFoodBigStation/Properties/Settings.Designer.cs 查看文件

@@ -12,7 +12,7 @@ namespace BPASmartClient.JXJFoodBigStation.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.3.0.0")]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.4.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));


+ 5
- 1
BPASmartClient.JXJFoodBigStation/View/HardwareStatusView.xaml 查看文件

@@ -563,10 +563,12 @@
</Grid>

<!--#region 底部料仓-->
<Grid Grid.Row="2">
<Grid Grid.Row="2" x:Name="bottomGrid">
<ListView
x:Name="buttonListView"
VerticalAlignment="Top"
Height="{Binding ElementName=bottomGrid, Path=ActualHeight}"
Background="Transparent"
BorderThickness="0"
ItemsSource="{Binding BottomDeviceCurrentStatuses}"
@@ -577,6 +579,7 @@
<UniformGrid
HorizontalAlignment="Left"
VerticalAlignment="Top"
FlowDirection="LeftToRight"
Columns="7"
Rows="1" />
</ItemsPanelTemplate>
@@ -717,6 +720,7 @@
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
<!--#endregion-->



+ 1
- 1
BPASmartClient.Model/柔性味魔方/RawMaterialModel.cs 查看文件

@@ -25,7 +25,7 @@ namespace BPASmartClient.Model
public string DeviceIp { get; set; }

/// <summary>
/// 料筒位置
/// 桶号
/// </summary>
public int Loc { get { return _mLoc; } set { _mLoc = value; OnPropertyChanged(); } }
private int _mLoc;


+ 28
- 16
DosingSystem/App.xaml.cs 查看文件

@@ -59,8 +59,8 @@ namespace BPASmartClient.DosingSystem
}
base.OnStartup(e);
SystemHelper.GetInstance.CreateDesktopShortcut();
MenuInit();
DataInit();
MenuInit();
//SiemensTest.GetInstance.Init();
DeviceInquire.GetInstance.Init();//配料机设备上线监听,设备列表初始化
MainView mv = new MainView();
@@ -194,13 +194,13 @@ namespace BPASmartClient.DosingSystem
ToggleWindowPath = "View.ConveyerBeltManualView"
});

ManualControl.Add(new SubMenumodel()
{
SubMenuName = "配料输送带控制",
SubMenuPermission = new Permission[] { Permission.管理员, Permission.操作员, Permission.观察员, Permission.技术员 },
AssemblyName = "BPASmartClient.DosingSystem",
ToggleWindowPath = "View.TempManageControlView"
});
//ManualControl.Add(new SubMenumodel()
//{
// SubMenuName = "配料输送带控制",
// SubMenuPermission = new Permission[] { Permission.管理员, Permission.操作员, Permission.观察员, Permission.技术员 },
// AssemblyName = "BPASmartClient.DosingSystem",
// ToggleWindowPath = "View.TempManageControlView"
//});

//ManualControl.Add(new SubMenumodel()
//{
@@ -280,15 +280,27 @@ namespace BPASmartClient.DosingSystem
AssemblyName = "BPASmartClient.DosingSystem",
ToggleWindowPath = "View.DeviceListView"
});
DeviceMonitor.Add(new SubMenumodel()
//2023/6/29修改
if ((ConveryType)Enum.Parse(typeof(ConveryType), Json<DevicePar>.Data.BaseParModel.ConveryType) == ConveryType.U型)
{
SubMenuName = "设备状态",
SubMenuPermission = new Permission[] { Permission.管理员, Permission.操作员, Permission.观察员, Permission.技术员 },
AssemblyName = "BPASmartClient.DosingSystem",
ToggleWindowPath = "View.HardwareStatusView"
});

DeviceMonitor.Add(new SubMenumodel()
{
SubMenuName = "设备状态",
SubMenuPermission = new Permission[] { Permission.管理员, Permission.操作员, Permission.观察员, Permission.技术员 },
AssemblyName = "BPASmartClient.DosingSystem",
ToggleWindowPath = "View.UHardwareStatusView"
});
}
else
{
DeviceMonitor.Add(new SubMenumodel()
{
SubMenuName = "设备状态",
SubMenuPermission = new Permission[] { Permission.管理员, Permission.操作员, Permission.观察员, Permission.技术员 },
AssemblyName = "BPASmartClient.DosingSystem",
ToggleWindowPath = "View.HardwareStatusView"
});
}
MenuManage.GetInstance.menuModels.Add(new MenuModel()
{
MainMenuIcon = "&#xe603;",


+ 115
- 0
DosingSystem/ExcuteControl.cs 查看文件

@@ -0,0 +1,115 @@
using BPA.Helper;
using BPASmartClient.CustomResource.Pages.Model;
using BPASmartClient.DosingSystem.ViewModel;
using BPASmartClient.Model;
using S7.Net.Types;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace BPASmartClient.DosingSystem
{
/// <summary>
/// 业务逻辑执行类
/// </summary>
public class ExcuteControl
{
private static ExcuteControl Instance;
public static ExcuteControl GetInstance => Instance ??= new ExcuteControl();
/// <summary>
/// 配料完成计数
/// </summary>
int Comcount = 0;
public ExcuteControl() { }
/// <summary>
/// 配料逻辑
/// </summary>
/// <param name="recipeModel">当前执行的配方</param>
public void BusinessExcute(RecipeModel recipeModel)
{
ThreadManage.GetInstance.StartLong(new Action(() => {
#region 直线双仓型
//拿到当前配方
for (int j = 0; j < GlobalDevice.PlcData.IsAllowIngredients.Length; j++)//遍历允许配料的料桶
{

if (GlobalDevice.PlcData.IsAllowIngredients[j])
{
int barrelNum = j + 1;//桶号
int stockLoc = GlobalDevice.PlcData.LocationFeedback[j];//允许配料的料仓位置 0~6 双仓情况下返回的位置是否一样,料仓ip设置顺序怎样的
if (stockLoc >= 1 && stockLoc <= Json<DevicePar>.Data.BaseParModel.StockCount)
{
int index = Array.FindIndex(DeviceInquire.GetInstance.devices.ToArray(), p => p.DeviceNum == stockLoc);
if (index >= 0)
{
//查出到配料位置的原料
int result = Array.FindIndex(recipeModel.RawMaterials.ToArray(), p => (p.Loc == barrelNum && p.DeviceIp == DeviceInquire.GetInstance.devices.ElementAt(index).IpAddress));//待定
if (result != -1 && DeviceInquire.GetInstance.GetDevice(recipeModel.RawMaterials[result].DeviceIp).deviceStatus.RunStatus == 1 && RecipeControlViewModel.recipeProcesses.ElementAt(0).RawMaterials[result].Status == Status.等待配料)
{
var weight = recipeModel.RawMaterials[result].RawMaterialWeight;
DeviceInquire.GetInstance.GetDevice(recipeModel.RawMaterials.ElementAt(index).DeviceIp).Start(weight);//所有参数下发并启动配料
MessageNotify.GetInstance.ShowRunLog($"{recipeModel.RawMaterials[result].DeviceIp}:正在配料");
RecipeControlViewModel.recipeProcesses.ElementAt(0).RawMaterials[result].Status = Status.正在配料;
}
}
}
else
{
continue;
}
}

}
//配料完成后逻辑
for (int k = 0; k < recipeModel.RawMaterials.Count; k++)
{
if (DeviceInquire.GetInstance.GetDevice(recipeModel.RawMaterials.ElementAt(k).DeviceIp).deviceStatus.RunStatus == 3 && RecipeControlViewModel.recipeProcesses.ElementAt(0).RawMaterials[k].Status != Status.配料完成)//配料完成
{
int DeviceNum = DeviceInquire.GetInstance.GetDevice(recipeModel.RawMaterials.ElementAt(k).DeviceIp).deviceStatus.DeviceNum;
Comcount++;
DeviceInquire.GetInstance.GetDevice(recipeModel.RawMaterials.ElementAt(k).DeviceIp).StatusReset();//料仓复位
SiemensDevice.GetInstance.MySiemens.Write($"DB4.DBX130.{DeviceNum - 1}", true);
Task.Run(() =>
{
int cout = DeviceNum - 1;
while (!SiemensDevice.GetInstance.MySiemens.Read<bool>($"DB3.DBX148.{cout}").Content) //DB3.DBX148.0-31 148.0-148.5代表6个料仓位置
{
SiemensDevice.GetInstance.MySiemens.Write($"DB4.DBX130.{cout}", true);
Thread.Sleep(200);
}
while (SiemensDevice.GetInstance.MySiemens.Read<bool>($"DB3.DBX148.{cout}").Content)
{
SiemensDevice.GetInstance.MySiemens.Write($"DB4.DBX130.{cout}", false);
}
MessageNotify.GetInstance.ShowRunLog($"{cout}号气缸复位信号写入成功!");
});
RecipeControlViewModel.recipeProcesses.ElementAt(0).RawMaterials[k].Status = Status.配料完成;
if (Comcount >= recipeModel.RawMaterials.Count) //配方配料完成 StockStatus.Count >= Recipes.ElementAt(i).RawMaterials.Count &&
{
Comcount = 0;
App.Current.Dispatcher.Invoke(new Action(() => { RecipeControlViewModel.recipeProcesses.Clear(); }));
MessageNotify.GetInstance.ShowUserLog($"配方:{recipeModel.RecipeName},配料完成");

SiemensDevice.GetInstance.MySiemens.Write("DB4.DBX202.0", true);//配料完成
MessageNotify.GetInstance.ShowRunLog($"配方:{recipeModel.RecipeName},配料完成");

recipeModel.Are.Set();//待定
Thread.Sleep(100);
}
}
}
#endregion

Thread.Sleep(10);
}),"配料业务逻辑");
}

}
}

+ 16
- 0
DosingSystem/Model/ConveryType.cs 查看文件

@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BPASmartClient.DosingSystem.Model
{
public enum ConveryType
{
U型,
直线型,
}
}

+ 5
- 3
DosingSystem/Model/DeviceInquire.cs 查看文件

@@ -20,6 +20,7 @@ namespace BPASmartClient.DosingSystem
{
public class DeviceInquire
{
int stockCount;//料仓数
private volatile static DeviceInquire _Instance;
public static DeviceInquire GetInstance => _Instance ?? (_Instance = new DeviceInquire());
private DeviceInquire() { }
@@ -203,7 +204,8 @@ namespace BPASmartClient.DosingSystem
}
}
}*/
for (int i = 0; i < 6; i++)
stockCount = Json<DevicePar>.Data.BaseParModel.StockCount;
for (int i = 0; i < stockCount; i++)
{
IPLists.Add($"{IPSegment}{(i + 1) * 10}");
}
@@ -239,8 +241,8 @@ namespace BPASmartClient.DosingSystem
App.Current.Dispatcher.Invoke(new Action(() =>
{
devices.Add(new Devices() { DeviceName = DeviceName, IpAddress = ip });
if (TopDeviceCurrentStatuses.Count <= 7)
//2023/7/3调整
if (stockCount<=8||(stockCount>8&&TopDeviceCurrentStatuses.Count <= stockCount / 2 + 1 &&int.TryParse( ip.Split('.')[3],out int res)&&res<= (stockCount / 2 + 1)*10))
TopDeviceCurrentStatuses.Add(new DeviceCurrentStatus() { DeviceName = DeviceName });
else
BottomDeviceCurrentStatuses.Add(new DeviceCurrentStatus() { DeviceName = DeviceName });


+ 9
- 9
DosingSystem/Model/Expand.cs 查看文件

@@ -97,35 +97,35 @@ namespace BPASmartClient.DosingSystem.Model
try
{
//D1001
string head = (Convert.ToInt32(address.Substring(1, 1))).ToString();
int num = Convert.ToInt32(address.Substring(2, 3));
string head = (System.Convert.ToInt32(address.Substring(1, 1))).ToString();
int num = System.Convert.ToInt32(address.Substring(2, 3));
int len = num.ToString().Length;
string tail = string.Empty;
switch (len)
{

case 1:
if ((Convert.ToInt32(address.Substring(4, 1))).ToString().Length > 1)
if ((System.Convert.ToInt32(address.Substring(4, 1))).ToString().Length > 1)
{
tail = "0" + (Convert.ToInt32(address.Substring(4, 1))).ToString();
tail = "0" + (System.Convert.ToInt32(address.Substring(4, 1))).ToString();
}
else
{
tail = "00" + (Convert.ToInt32(address.Substring(4, 1))).ToString();
tail = "00" + (System.Convert.ToInt32(address.Substring(4, 1))).ToString();
}
break;
case 2:
if ((Convert.ToInt32(address.Substring(3, 2))).ToString().Length > 2)
if ((System.Convert.ToInt32(address.Substring(3, 2))).ToString().Length > 2)
{
tail = (Convert.ToInt32(address.Substring(3, 2))).ToString();
tail = (System.Convert.ToInt32(address.Substring(3, 2))).ToString();
}
else
{
tail = "0" + (Convert.ToInt32(address.Substring(3, 2))).ToString();
tail = "0" + (System.Convert.ToInt32(address.Substring(3, 2))).ToString();
}
break;
case 3:
tail = (Convert.ToInt32(address.Substring(2, 3))).ToString();
tail = (System.Convert.ToInt32(address.Substring(2, 3))).ToString();
break;
}



+ 33
- 0
DosingSystem/Model/par/BasePar.cs 查看文件

@@ -26,6 +26,37 @@ namespace BPASmartClient.DosingSystem
public string DeviceAddress { get { return _mDeviceAddress; } set { _mDeviceAddress = value; OnPropertyChanged(); } }
private string _mDeviceAddress = "192.168.0.15";


/// <summary>
/// 料仓数量
/// </summary>
public int StockCount { get { return _stockCount; } set { _stockCount = value; OnPropertyChanged(); } }
private int _stockCount = 0;


/// <summary>
/// 当前使用的输送线类型
/// </summary>
public string ConveryType { get { return _converyType; } set { _converyType = value; OnPropertyChanged(); } }
private string _converyType;
/// <summary>
/// 输送线类型集合
/// </summary>
private List<string> _converyTypeList=new List<string> ();
public List<string> ConveryTypeList {
get { return _converyTypeList; }
set {
foreach (var item in value)
{
if (_converyTypeList.Contains(item))
{
continue;
}
_converyTypeList.Add(item);
}
OnPropertyChanged(); } }
/// <summary>
/// 输送带数量
/// </summary>
@@ -54,6 +85,8 @@ namespace BPASmartClient.DosingSystem
}
private int _mConveyerBeltCount = 0;



/// <summary>
/// 升降气缸数量
/// </summary>


+ 1
- 1
DosingSystem/Service/SiemensDevice.cs 查看文件

@@ -38,7 +38,7 @@ namespace BPASmartClient.DosingSystem
TaskManage.GetInstance.StartLong(new Action(() =>
{
GlobalDevice.PlcData = MySiemens.Read<PlcToComputer>(3).Content;//获取PLC到上位机的数据
//var tt = MySiemens.Read<PlcToComputer>(3);//获取PLC到上位机的数据
//var tt = MySiemens.Read<PlcToComputer>(3);//获取PLC到上位机的数据
var res = MySiemens.Read<ushort[]>("DB4.DBW134", 32).Content;
if (res != null && res is ushort[] ushorts && ushorts.Length == 32)
{


+ 210
- 0
DosingSystem/View/CommParSetView.xaml 查看文件

@@ -6,6 +6,7 @@
xmlns:local="clr-namespace:BPASmartClient.DosingSystem.View"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="clr-namespace:BPASmartClient.DosingSystem.ViewModel"
xmlns:Themes1="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Classic"
d:DesignHeight="450"
d:DesignWidth="800"
mc:Ignorable="d">
@@ -13,7 +14,159 @@
<UserControl.DataContext>
<vm:CommparSetViewModel />
</UserControl.DataContext>
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/BPASmartClient.CustomResource;component/Themes/GenricStyle.xaml" />
<ResourceDictionary Source="/BPASmartClient.CustomResource;component/Themes/MyStyle.xaml" />

<ResourceDictionary>
<SolidColorBrush x:Key="foreground" Color="#009DFF" />
<SolidColorBrush x:Key="borderBrush" Color="#009DFF" />
<Style x:Key="ComboBoxStyle1" TargetType="{x:Type ComboBox}">
<Setter Property="FocusVisualStyle" Value="{StaticResource ComboBoxFocusVisual}" />
<Setter Property="Foreground" Value="{DynamicResource foreground}" />
<Setter Property="Background" Value="Transparent" />
<Setter Property="BorderBrush" Value="{DynamicResource borderBrush}" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="Margin" Value="0,0,0,0" />
<Setter Property="Padding" Value="0" />
<Setter Property="Height" Value="24" />
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto" />
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto" />
<Setter Property="ScrollViewer.CanContentScroll" Value="true" />
<Setter Property="ScrollViewer.PanningMode" Value="Both" />
<Setter Property="Stylus.IsFlicksEnabled" Value="False" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="IsTextSearchCaseSensitive" Value="true" />
<Setter Property="IsEditable" Value="true" />
<Setter Property="StaysOpenOnEdit" Value="true" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ComboBox}">
<Border
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
SnapsToDevicePixels="true">
<Grid>
<Themes1:ClassicBorderDecorator
x:Name="Border"
BorderBrush="{x:Static Themes1:ClassicBorderDecorator.ClassicBorderBrush}"
BorderStyle="None"
BorderThickness="2">
<Popup
x:Name="PART_Popup"
AllowsTransparency="true"
Focusable="False"
IsOpen="{TemplateBinding IsDropDownOpen}"
Placement="Bottom"
PopupAnimation="{DynamicResource {x:Static SystemParameters.ComboBoxPopupAnimationKey}}">
<Themes1:SystemDropShadowChrome
x:Name="Shdw"
MinWidth="{Binding ActualWidth, ElementName=Border}"
MaxHeight="{TemplateBinding MaxDropDownHeight}"
Color="Transparent">
<Border
x:Name="DropDownBorder"
BorderBrush="{DynamicResource {x:Static SystemColors.WindowFrameBrushKey}}"
BorderThickness="1">
<Border.Background>
<SolidColorBrush Color="#264c73" />
</Border.Background>
<ScrollViewer x:Name="DropDownScrollViewer">
<Grid RenderOptions.ClearTypeHint="Enabled">
<Canvas
Width="0"
Height="0"
HorizontalAlignment="Left"
VerticalAlignment="Top">
<Rectangle
x:Name="OpaqueRect"
Width="{Binding ActualWidth, ElementName=DropDownBorder}"
Height="{Binding ActualHeight, ElementName=DropDownBorder}"
Fill="{Binding Background, ElementName=DropDownBorder}" />
</Canvas>
<ItemsPresenter
x:Name="ItemsPresenter"
KeyboardNavigation.DirectionalNavigation="Contained"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
</Grid>
</ScrollViewer>
</Border>
</Themes1:SystemDropShadowChrome>
</Popup>
</Themes1:ClassicBorderDecorator>
<DockPanel Margin="2">
<FrameworkElement Width="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}" DockPanel.Dock="Right" />
<Border x:Name="SelectedItemBorder" Margin="{TemplateBinding Padding}">
<ContentPresenter
Margin="1,1,1,1"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
Content="{TemplateBinding SelectionBoxItem}"
ContentStringFormat="{TemplateBinding SelectionBoxItemStringFormat}"
ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}"
ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
</Border>
</DockPanel>
<ToggleButton
Width="Auto"
MinWidth="0"
MinHeight="0"
Margin="2"
ClickMode="Press"
Focusable="false"
IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
Style="{StaticResource ComboBoxTransparentButtonStyle}" />
</Grid>
</Border>
<ControlTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsDropDownOpen" Value="false" />
</MultiTrigger.Conditions>
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}" />
</MultiTrigger>
<Trigger Property="HasItems" Value="false">
<Setter TargetName="DropDownBorder" Property="MinHeight" Value="95" />
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
<Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsGrouping" Value="true" />
<Condition Property="VirtualizingPanel.IsVirtualizingWhenGrouping" Value="false" />
</MultiTrigger.Conditions>
<Setter Property="ScrollViewer.CanContentScroll" Value="false" />
</MultiTrigger>
<Trigger SourceName="PART_Popup" Property="HasDropShadow" Value="true">
<Setter TargetName="Shdw" Property="Margin" Value="0,0,5,5" />
<Setter TargetName="Shdw" Property="Color" Value="#71000000" />
</Trigger>
<Trigger SourceName="DropDownScrollViewer" Property="ScrollViewer.CanContentScroll" Value="false">
<Setter TargetName="OpaqueRect" Property="Canvas.Top" Value="{Binding VerticalOffset, ElementName=DropDownScrollViewer}" />
<Setter TargetName="OpaqueRect" Property="Canvas.Left" Value="{Binding HorizontalOffset, ElementName=DropDownScrollViewer}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsEditable" Value="true">
<Setter Property="IsTabStop" Value="false" />
<Setter Property="Padding" Value="1" />
<Setter Property="Template" Value="{StaticResource ComboBoxEditableTemplate}" />
</Trigger>
</Style.Triggers>
</Style>
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<Grid>

<Grid.RowDefinitions>
@@ -82,7 +235,64 @@
Style="{StaticResource TextBoxStyle}"
Text="{Binding CommBaseParModel.DeviceAddress, UpdateSourceTrigger=PropertyChanged}" />
</Grid>
<Grid Width="350" Margin="5">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBlock
Margin="0,0,2,0"
HorizontalAlignment="Right"
Style="{StaticResource TextBlockStyle}"
Text="输送线类型:" />
<ComboBox
Grid.Column="1"
Width="170"
Height="35"
HorizontalAlignment="Right"
FontSize="20"
Text="{Binding CommBaseParModel.ConveryType,UpdateSourceTrigger=PropertyChanged}"
ItemsSource="{Binding CommBaseParModel.ConveryTypeList,UpdateSourceTrigger=PropertyChanged}">
<ComboBox.ItemContainerStyle>
<Style TargetType="{x:Type ComboBoxItem}">
<Setter Property="Background" Value="Transparent" />
<Setter Property="Foreground" Value="#009DFF" />


</Style>
</ComboBox.ItemContainerStyle>
</ComboBox>


<!--<TextBox
Grid.Column="1"
Width="170"
Height="35"
HorizontalAlignment="Right"
FontSize="20"
Style="{StaticResource TextBoxStyle}"
Text="{Binding CommBaseParModel.StockCount, UpdateSourceTrigger=PropertyChanged}" />-->
</Grid>
<Grid Width="350" Margin="5">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBlock
Margin="0,0,2,0"
HorizontalAlignment="Right"
Style="{StaticResource TextBlockStyle}"
Text="料仓数量:" />

<TextBox
Grid.Column="1"
Width="170"
Height="35"
HorizontalAlignment="Right"
FontSize="20"
Style="{StaticResource TextBoxStyle}"
Text="{Binding CommBaseParModel.StockCount, UpdateSourceTrigger=PropertyChanged}" />
</Grid>
<Grid Width="350" Margin="5">
<Grid.ColumnDefinitions>
<ColumnDefinition />


+ 2
- 1
DosingSystem/View/ConveyerBeltManualView.xaml 查看文件

@@ -99,13 +99,14 @@
VerticalAlignment="Center"
FontSize="20"
Foreground="#00c2f4"
Text="输送带控制" />
Text="输送带状态" />

<ToggleButton
Width="80"
Height="30"
Margin="5,0,5,0"
Background="Transparent"
IsEnabled="False"
FontSize="20"
IsChecked="{Binding ConveyerBeltWork}"
Style="{StaticResource SwitchToggleButtonStyle}" />


+ 42
- 26
DosingSystem/View/HardwareStatusView.xaml 查看文件

@@ -35,17 +35,19 @@
ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<!--<WrapPanel Orientation="Horizontal" IsItemsHost="True"/>-->
<UniformGrid
HorizontalAlignment="Left"
VerticalAlignment="Top"
Columns="8"
Columns="{Binding StockNum}"
Rows="1" />

</ItemsPanelTemplate>
</ListView.ItemsPanel>

<ListView.ItemTemplate>
<DataTemplate>

<Border Margin="5" Background="Transparent">
<Grid Background="Transparent">
<Grid.RowDefinitions>
@@ -105,6 +107,8 @@
</Grid.ColumnDefinitions>

<StackPanel Background="Transparent">


<Ellipse
Width="30"
Height="30"
@@ -129,9 +133,13 @@
FontSize="16"
Foreground="#00c2f4"
Text="到位检测" />


</StackPanel>

<StackPanel Name="skp" Grid.Column="1">


<ToggleButton
Width="80"
Height="30"
@@ -150,6 +158,7 @@
FontSize="16"
Foreground="#00c2f4"
Text="出料控制" />

</StackPanel>

</Grid>
@@ -191,6 +200,7 @@
</Grid>
</Grid>
</Border>

</DataTemplate>
</ListView.ItemTemplate>
</ListView>
@@ -332,7 +342,7 @@
<UniformGrid
HorizontalAlignment="Left"
VerticalAlignment="Top"
Columns="8"
Columns="{Binding StockNum}"
Rows="1" />
</ItemsPanelTemplate>
</ListView.ItemsPanel>
@@ -391,57 +401,63 @@

</StackPanel>

<StackPanel Grid.Row="2" Orientation="Horizontal">
<StackPanel Background="Transparent">
<Ellipse

<!--<StackPanel Grid.Row="2" Orientation="Horizontal">-->
<Grid Grid.Row="2">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<StackPanel Background="Transparent">
<Ellipse
Width="30"
Height="30"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Fill="{Binding BucketFlagbit, Converter={StaticResource BoolToFillColorConverter}}"
RenderTransformOrigin="0.5,0.5">
<Ellipse.OpacityMask>
<RadialGradientBrush>
<GradientStop Offset="0" Color="Transparent" />
<GradientStop Offset="1" Color="#00c2f4" />
</RadialGradientBrush>
</Ellipse.OpacityMask>
<!--<Ellipse.RenderTransform>
<Ellipse.OpacityMask>
<RadialGradientBrush>
<GradientStop Offset="0" Color="Transparent" />
<GradientStop Offset="1" Color="#00c2f4" />
</RadialGradientBrush>
</Ellipse.OpacityMask>
<!--<Ellipse.RenderTransform>
<ScaleTransform x:Name="Scale" />
</Ellipse.RenderTransform>-->
</Ellipse>
</Ellipse>

<TextBlock
<TextBlock
Margin="0,5,0,0"
HorizontalAlignment="Center"
FontSize="16"
Foreground="#00c2f4"
Text="到位检测" />
</StackPanel>
</StackPanel>


<StackPanel>
<ToggleButton
<StackPanel Grid.Column="1">
<ToggleButton
Width="80"
Height="30"
Margin="5,0,5,0"
HorizontalAlignment="Center"
HorizontalAlignment="Right"
VerticalAlignment="Center"
Background="Transparent"
FontSize="20"
IsChecked="{Binding BaitingControl}"
Style="{StaticResource SwitchToggleButtonStyle}" />
<TextBlock
<TextBlock
Margin="0,5,0,0"
HorizontalAlignment="Center"
HorizontalAlignment="Right"
FontSize="16"
Foreground="#00c2f4"
Text="出料控制" />
</StackPanel>
</StackPanel>
<Image
</StackPanel>
<!--</StackPanel>-->
</Grid>
<Image
Margin="20,30,20,0"
Source="/BPASmartClient.CustomResource;component/Image/荧光/矩形发光.png"
Stretch="Fill"


+ 3
- 0
DosingSystem/View/ManualControlView.xaml 查看文件

@@ -7,6 +7,7 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:pry="clr-namespace:BPASmartClient.CustomResource.UserControls;assembly=BPASmartClient.CustomResource"
xmlns:vm="clr-namespace:BPASmartClient.DosingSystem.ViewModel"
d:DesignHeight="450"
d:DesignWidth="800"
mc:Ignorable="d">
@@ -47,12 +48,14 @@
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>

<UserControl.DataContext>
<vm:ManualControlViewModel />
</UserControl.DataContext>


<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="40" />


+ 396
- 0
DosingSystem/View/UHardwareStatusView.xaml 查看文件

@@ -0,0 +1,396 @@
<UserControl x:Class="BPASmartClient.DosingSystem.View.UHardwareStatusView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:BPASmartClient.DosingSystem.View"
xmlns:vm="clr-namespace:BPASmartClient.DosingSystem.ViewModel"
xmlns:pry="clr-namespace:BPASmartClient.CustomResource.UserControls;assembly=BPASmartClient.CustomResource"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<UserControl.DataContext>
<vm:UHardwareStatusViewModel/>
</UserControl.DataContext>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="0.8*" />
<RowDefinition />
<RowDefinition Height="0.8*" />
</Grid.RowDefinitions>

<!--#region 顶部料仓-->
<Grid Name="TopGrid">
<ListView
Height="{Binding ElementName=TopGrid, Path=ActualHeight}"
VerticalAlignment="Center"
Background="Transparent"
BorderThickness="0"
ItemsSource="{Binding TopDeviceCurrentStatuses}"
ScrollViewer.VerticalScrollBarVisibility="Disabled"
ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ListView.ItemsPanel>
<ItemsPanelTemplate>

<UniformGrid
HorizontalAlignment="Left"
VerticalAlignment="Top"
Columns="{Binding StockNum}"
Rows="1" />

</ItemsPanelTemplate>
</ListView.ItemsPanel>

<ListView.ItemTemplate>
<DataTemplate>

<Border Margin="5" Background="Transparent">
<Grid Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
<RowDefinition Height="0.6*" />
</Grid.RowDefinitions>

<StackPanel Grid.Row="1">
<StackPanel
Grid.Row="1"
Margin="0,2,0,0"
HorizontalAlignment="Center"
Orientation="Horizontal">
<TextBlock
FontSize="20"
Foreground="#FF0084FF"
Text="{Binding Weight}" />

<TextBlock
FontSize="20"
Foreground="#FF0084FF"
Text=" kg" />
</StackPanel>

<StackPanel
Grid.Row="1"
Margin="0,2,0,0"
HorizontalAlignment="Center"
Orientation="Horizontal">
<TextBlock
FontSize="20"
Foreground="#FF0084FF"
Text="{Binding DeviceNum}" />

<TextBlock
FontSize="20"
Foreground="#FF0084FF"
Text=" 号仓" />
</StackPanel>

<TextBlock
Grid.Row="1"
Margin="0,2,0,0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontSize="20"
Foreground="#FF0084FF"
Text="{Binding DeviceName}" />

</StackPanel>

<Grid Grid.Row="2">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>

<StackPanel Background="Transparent">


<Ellipse
Width="30"
Height="30"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Fill="{Binding BucketFlagbit, Converter={StaticResource BoolToFillColorConverter}}"
RenderTransformOrigin="0.5,0.5">
<Ellipse.OpacityMask>
<RadialGradientBrush>
<GradientStop Offset="0" Color="Transparent" />
<GradientStop Offset="1" Color="#00c2f4" />
</RadialGradientBrush>
</Ellipse.OpacityMask>
<!--<Ellipse.RenderTransform>
<ScaleTransform x:Name="Scale" />
</Ellipse.RenderTransform>-->
</Ellipse>

<TextBlock
Margin="0,5,0,0"
HorizontalAlignment="Center"
FontSize="16"
Foreground="#00c2f4"
Text="到位检测" />


</StackPanel>

<StackPanel Name="skp" Grid.Column="1">


<ToggleButton
Width="80"
Height="30"
Margin="5,0,5,0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Background="Transparent"
Command="{Binding DataContext.RecipeControlCommand, RelativeSource={RelativeSource AncestorType=ListView, Mode=FindAncestor}}"
CommandParameter="{Binding}"
FontSize="20"
IsChecked="{Binding BaitingControl}"
Style="{StaticResource SwitchToggleButtonStyle}" />
<TextBlock
Margin="0,5,0,0"
HorizontalAlignment="Center"
FontSize="16"
Foreground="#00c2f4"
Text="出料控制" />

</StackPanel>

</Grid>

<Image
Margin="20,30,20,0"
Source="/BPASmartClient.CustomResource;component/Image/荧光/矩形发光.png"
Stretch="Fill"
Visibility="{Binding IsOpen, Converter={StaticResource BoolToVisibilityConvert}}" />

<Image Source="/BPASmartClient.CustomResource;component/Image/荧光/29.png" Visibility="{Binding BaitingControl, Converter={StaticResource BoolToVisibilityConvert}}" />

<Image
Grid.RowSpan="2"
Source="/BPASmartClient.CustomResource;component/Image/光柱.png"
Stretch="Fill" />

<Grid
Name="WeightGr"
Height="45"
Margin="20,-30,20,0">
<Grid.Background>
<ImageBrush ImageSource="/BPASmartClient.CustomResource;component/Image/荧光/蓝色提示框.png" />
</Grid.Background>
<TextBox
Name="outName"
Width="{Binding ElementName=WeightGr, Path=ActualWidth}"
Height="{Binding ElementName=WeightGr, Path=ActualHeight}"
Margin="0,-2,0,0"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
Background="Transparent"
BorderThickness="0"
CaretBrush="#009dff"
FontSize="20"
Foreground="#009dff"
Text="{Binding SetWeight}" />

</Grid>
</Grid>
</Border>

</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
<!--#endregion-->

<!--#region 输送带-->
<Grid
x:Name="gr"
Grid.Row="1"
Margin="0,10,0,0">
<pry:ConveyorBelt
Grid.Row="1"
Width="{Binding ElementName=gr, Path=ActualWidth}"
Height="{Binding ElementName=gr, Path=ActualHeight}"
Margin="10,0,30,0"
ConveyorBeltWidth="70"
Direction="{Binding ConveyerBeltStatus}"
StrokeBrush="#00BEFA"
StrokeDashArray="1.5 1.5"
StrokeFillBrush="#00BEFA"
StrokeThickness="2" />
</Grid>

<!--#endregion-->

<!--#region 底部料仓-->
<Grid Grid.Row="2">
<ListView
VerticalAlignment="Center"
Background="Transparent"
BorderThickness="0"
ItemsSource="{Binding BottomDeviceCurrentStatuses}"
ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid
HorizontalAlignment="Left"
VerticalAlignment="Top"
Columns="{Binding StockNum}"
Rows="1" />
</ItemsPanelTemplate>
</ListView.ItemsPanel>

<ListView.ItemTemplate>
<DataTemplate>
<Border Margin="5" Background="Transparent">
<Grid Height="270" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
<RowDefinition Height="0.6*" />
</Grid.RowDefinitions>

<StackPanel Grid.Row="1">
<StackPanel
Grid.Row="1"
Margin="0,2,0,0"
HorizontalAlignment="Center"
Orientation="Horizontal">
<TextBlock
FontSize="20"
Foreground="#FF0084FF"
Text="{Binding Weight}" />

<TextBlock
FontSize="20"
Foreground="#FF0084FF"
Text=" kg" />
</StackPanel>

<StackPanel
Grid.Row="1"
Margin="0,2,0,0"
HorizontalAlignment="Center"
Orientation="Horizontal">
<TextBlock
FontSize="20"
Foreground="#FF0084FF"
Text="{Binding DeviceNum}" />

<TextBlock
FontSize="20"
Foreground="#FF0084FF"
Text=" 号仓" />
</StackPanel>

<TextBlock
Grid.Row="1"
Margin="0,2,0,0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontSize="20"
Foreground="#FF0084FF"
Text="{Binding DeviceName}" />

</StackPanel>

<!--<StackPanel Grid.Row="2" Orientation="Horizontal">-->
<Grid Grid.Row="2">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<StackPanel Background="Transparent">
<Ellipse
Width="30"
Height="30"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Fill="{Binding BucketFlagbit, Converter={StaticResource BoolToFillColorConverter}}"
RenderTransformOrigin="0.5,0.5">
<Ellipse.OpacityMask>
<RadialGradientBrush>
<GradientStop Offset="0" Color="Transparent" />
<GradientStop Offset="1" Color="#00c2f4" />
</RadialGradientBrush>
</Ellipse.OpacityMask>
<!--<Ellipse.RenderTransform>
<ScaleTransform x:Name="Scale" />
</Ellipse.RenderTransform>-->
</Ellipse>

<TextBlock
Margin="0,5,0,0"
HorizontalAlignment="Center"
FontSize="16"
Foreground="#00c2f4"
Text="到位检测" />
</StackPanel>


<StackPanel Grid.Column="1">
<ToggleButton
Width="80"
Height="30"
Margin="5,0,5,0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Background="Transparent"
FontSize="20"
IsChecked="{Binding BaitingControl}"
Style="{StaticResource SwitchToggleButtonStyle}" />
<TextBlock
Margin="0,5,0,0"
HorizontalAlignment="Center"
FontSize="16"
Foreground="#00c2f4"
Text="出料控制" />
</StackPanel>

<!--</StackPanel>-->
</Grid>
<Image
Margin="20,30,20,0"
Source="/BPASmartClient.CustomResource;component/Image/荧光/矩形发光.png"
Stretch="Fill"
Visibility="{Binding IsOpen, Converter={StaticResource BoolToVisibilityConvert}}" />

<Image Source="/BPASmartClient.CustomResource;component/Image/荧光/29.png" Visibility="{Binding BaitingControl, Converter={StaticResource BoolToVisibilityConvert}}" />

<Image
Grid.RowSpan="2"
Source="/BPASmartClient.CustomResource;component/Image/光柱.png"
Stretch="Fill" />

<Grid
Name="WeightGr"
Height="45"
Margin="20,-30,20,0">
<Grid.Background>
<ImageBrush ImageSource="/BPASmartClient.CustomResource;component/Image/荧光/蓝色提示框.png" />
</Grid.Background>
<TextBox
Name="outName"
Width="{Binding ElementName=WeightGr, Path=ActualWidth}"
Height="{Binding ElementName=WeightGr, Path=ActualHeight}"
Margin="0,-2,0,0"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
Background="Transparent"
BorderThickness="0"
CaretBrush="#009dff"
FontSize="20"
Foreground="#009dff"
Text="{Binding SetWeight}" />

</Grid>
</Grid>
</Border>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
<!--#endregion-->

</Grid>
</UserControl>

+ 28
- 0
DosingSystem/View/UHardwareStatusView.xaml.cs 查看文件

@@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace BPASmartClient.DosingSystem.View
{
/// <summary>
/// UHardwareStatusView.xaml 的交互逻辑
/// </summary>
public partial class UHardwareStatusView : UserControl
{
public UHardwareStatusView()
{
InitializeComponent();
}
}
}

+ 2
- 0
DosingSystem/ViewModel/CommparSetViewModel.cs 查看文件

@@ -37,6 +37,8 @@ namespace BPASmartClient.DosingSystem.ViewModel
public BasePar CommBaseParModel { get { return Json<DevicePar>.Data.BaseParModel; } set { Json<DevicePar>.Data.BaseParModel = value; OnPropertyChanged(); } }
//private BasePar _mCommBaseParModel;


public BPARelayCommand SaveCommand { get; set; }

}


+ 1
- 1
DosingSystem/ViewModel/ConveyerBeltManualViewModel.cs 查看文件

@@ -20,7 +20,7 @@ namespace BPASmartClient.DosingSystem.ViewModel
Num = i + 1,
Speed = GlobalDevice.MotorSpeed[i],
ConveyerBeltWork = GlobalDevice.MotorControl.GetBitValue((byte)(i + 1))
});
}) ;
}
}
public ObservableCollection<ConveyerBeltModel> ConveyerBeltModels { get; set; } = new ObservableCollection<ConveyerBeltModel>();


+ 17
- 5
DosingSystem/ViewModel/DeviceListViewModel.cs 查看文件

@@ -8,7 +8,7 @@ using System.Collections.Concurrent;
using System.Collections.ObjectModel;
using System.Windows;
using BPASmartClient.DosingSystem.View;
using System.Windows.Data;

namespace BPASmartClient.DosingSystem.ViewModel
{
@@ -16,6 +16,7 @@ namespace BPASmartClient.DosingSystem.ViewModel
{
public DeviceListViewModel()
{
DetailsCommand = new BPARelayCommand<object>((o) =>
{
if (o != null && o is string str)
@@ -25,13 +26,24 @@ namespace BPASmartClient.DosingSystem.ViewModel
cdn.ShowDialog();
}
});
devices = DeviceInquire.GetInstance.devices;
//devices = DeviceInquire.GetInstance.devices;
//2023/6/29新加 改为升序排列显示
devices = ConvertToObservableCollention(DeviceInquire.GetInstance.devices.OrderByDescending(p => p.IpAddress.Split(".")[3]).Reverse());
}

//public BPARelayCommand<object> ChangeNameCommand { get; set; }

//public static ObservableCollection<Devices> devices { get; set; } = new ObservableCollection<Devices>();
public ObservableCollection<Devices> devices { get; set; }

public ObservableCollection<T> ConvertToObservableCollention<T>(IEnumerable<T> array)
{
ObservableCollection<T> collec =new ObservableCollection<T>();
foreach (var item in array)
{
collec.Add(item);
}
return collec;
}

}

public class Devices : NotifyBase


+ 53
- 6
DosingSystem/ViewModel/HardwareStatusViewModel.cs 查看文件

@@ -8,6 +8,7 @@ using System.Collections.Concurrent;
using System.Collections.ObjectModel;
using System.Windows;
using System.Threading;
using BPASmartClient.DosingSystem.Model;

namespace BPASmartClient.DosingSystem.ViewModel
{
@@ -15,9 +16,14 @@ namespace BPASmartClient.DosingSystem.ViewModel
{
public HardwareStatusViewModel()
{
TopDeviceCurrentStatuses = DeviceInquire.GetInstance.TopDeviceCurrentStatuses;
BottomDeviceCurrentStatuses = DeviceInquire.GetInstance.BottomDeviceCurrentStatuses;


//TopDeviceCurrentStatuses = DeviceInquire.GetInstance.TopDeviceCurrentStatuses;
//BottomDeviceCurrentStatuses = DeviceInquire.GetInstance.BottomDeviceCurrentStatuses;
//2023/7/3调整
TopDeviceCurrentStatuses = ConvertToObservableCollention(DeviceInquire.GetInstance.TopDeviceCurrentStatuses.OrderByDescending(p => p.DeviceNum).Reverse());
BottomDeviceCurrentStatuses = ConvertToObservableCollention(DeviceInquire.GetInstance.BottomDeviceCurrentStatuses.OrderByDescending(p => p.DeviceNum).Reverse());
UnifordColumNum();
//for (int i = 0; i < Json<DevicePar>.Data.BaseParModel.ConveyerBeltCount; i++)
//{
// ConveyerBeltModels.Add(new ConveyerBeltModel() { Name = $"输送带{i}", Num = i++ });
@@ -60,7 +66,7 @@ namespace BPASmartClient.DosingSystem.ViewModel
UnderDetection = GlobalDevice.PlcData.UnderDetection;
ConveyerBeltStatus = GlobalDevice.MotorControlFeedback > 0;
Thread.Sleep(100);
}), "输送带料仓状态监控",true);
}), "输送带料仓状态监控", true);

RecipeControlCommand = new BPARelayCommand<object>((o) =>
{
@@ -74,7 +80,21 @@ namespace BPASmartClient.DosingSystem.ViewModel
}
});
}

/// <summary>
/// 数组集合转换
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="array"></param>
/// <returns></returns>
public ObservableCollection<T> ConvertToObservableCollention<T>(IEnumerable<T> array)
{
ObservableCollection<T> collec = new ObservableCollection<T>();
foreach (var item in array)
{
collec.Add(item);
}
return collec;
}
private void StatusUpdate(ObservableCollection<DeviceCurrentStatus> devices)
{
if (devices == null) return;
@@ -102,7 +122,30 @@ namespace BPASmartClient.DosingSystem.ViewModel
}
}
}
/// <summary>
/// 根据料仓数来进行uniform列划分
/// </summary>
private void UnifordColumNum()
{
StockNum = TopDeviceCurrentStatuses.Count >= BottomDeviceCurrentStatuses.Count ? TopDeviceCurrentStatuses.Count : BottomDeviceCurrentStatuses.Count;
//switch ((ConveryType)System.Enum.Parse(typeof(ConveryType), Json<DevicePar>.Data.BaseParModel.ConveryType))
//{
// case ConveryType.直线型: StockNum = Json<DevicePar>.Data.BaseParModel.StockCount; break;
// //case ConveryType.直线型:
// // if (Json<DevicePar>.Data.BaseParModel.StockCount > 0 && Json<DevicePar>.Data.BaseParModel.StockCount % 2 == 0)
// // {
// // StockNum = Json<DevicePar>.Data.BaseParModel.StockCount / 2;
// // }
// // else
// // {
// // StockNum = 8;//默认值
// // }
// // break;
//}



}
public ObservableCollection<DeviceCurrentStatus> TopDeviceCurrentStatuses { get; set; }

public ObservableCollection<DeviceCurrentStatus> BottomDeviceCurrentStatuses { get; set; }
@@ -112,7 +155,11 @@ namespace BPASmartClient.DosingSystem.ViewModel
public BPARelayCommand<object> ConveyerBeltControlCommand { get; set; }

public BPARelayCommand<object> RecipeControlCommand { get; set; }

/// <summary>
/// Uniford根据料仓数量来划分列数量
/// </summary>
private int _stockNum;
public int StockNum { get { return _stockNum; } set { _stockNum = value; OnPropertyChanged(); } }
/// <summary>
/// 输送带状态
/// </summary>


+ 2
- 1
DosingSystem/ViewModel/ManualControlViewModel.cs 查看文件

@@ -135,6 +135,7 @@ namespace BPASmartClient.DosingSystem.ViewModel
SystemStatus = GlobalDevice.PlcData.SystemStartOrStop ? "启动" : "停止";
SystemMode = GlobalDevice.PlcData.HandOrAuto ? "自动" : "手动";


Thread.Sleep(100);
}), "手动气缸状态监控", true);
}
@@ -147,7 +148,7 @@ namespace BPASmartClient.DosingSystem.ViewModel

var res1 = SiemensDevice.GetInstance.MySiemens.Read<bool>("M10.1").Content;
ModelSwitchText = res1 ? "自动" : "手动";
SystemStatus = res ? "自动" : "手动";
SystemStatus = res1 ? "自动" : "手动";
}

/// <summary>


+ 43
- 258
DosingSystem/ViewModel/RecipeControlViewModel.cs 查看文件

@@ -134,6 +134,7 @@ namespace BPASmartClient.DosingSystem.ViewModel
//配方数据写入到输送机
var res = Json<LocalRecipe>.Data.Recipes.FirstOrDefault(p => p.RecipeName == CurrentRecipeName);
List<int> BarrelNum = new List<int>();
ConcurrentDictionary<string, int[]> values = new ();
if (res != null)
{
var tInfo = res.RawMaterials.GroupBy(p => p.Loc);//获取桶号信息
@@ -151,20 +152,28 @@ namespace BPASmartClient.DosingSystem.ViewModel
/*data = data.SetBitValue((byte)tempDevice.DeviceNum, true);*/
if (tempDevice.DeviceNum > 0)
{
//int a = data.SetBitValue((byte)tInfo.ElementAt(i).ElementAt(m).Loc, true);
//byte[] test1 = a.ToBytes(BPA.Helper.DataFormat.BADC);
//int item = test1.ToInt();
// //int a = data.SetBitValue((byte)tInfo.ElementAt(i).ElementAt(m).Loc, true);
// //byte[] test1 = a.ToBytes(BPA.Helper.DataFormat.BADC);
// //int item = test1.ToInt();
// int item = data.SetBitValue((byte)tInfo.ElementAt(i).ElementAt(m).Loc, true).ToBytes(BPA.Helper.DataFormat.BADC).ToInt();
// int item1 = SiemensDevice.GetInstance.MySiemens.Read<int>($"DB4.DBD{2 + (tempDevice.DeviceNum - 1) * 4}").Content;
////prop1:
// var RE = SiemensDevice.GetInstance.MySiemens.Write($"DB4.DBD{2 + (tempDevice.DeviceNum - 1) * 4}", item + item1);
// //var values = SiemensDevice.GetInstance.MySiemens.Read<int>($"DB4.DBD{2 + (tempDevice.DeviceNum - 1) * 4}");
// //if ((values != null && values.ToString() != (item + item1).ToString()) || values == null)
// // goto prop1;
// if (RE.IsSuccess)
// MessageNotify.GetInstance.ShowRunLog($"下发配方DB4.DBD{2 + (tempDevice.DeviceNum - 1) * 4} :{(byte)tInfo.ElementAt(i).ElementAt(m).Loc}-{item + item1}-{(item + item1).ToBinString()}");
// else
// MessageNotify.GetInstance.ShowRunLog($"下发配方DB4.DBD{2 + (tempDevice.DeviceNum - 1) * 4} 失败");


int item = data.SetBitValue((byte)tInfo.ElementAt(i).ElementAt(m).Loc, true).ToBytes(BPA.Helper.DataFormat.BADC).ToInt();
int item1 = SiemensDevice.GetInstance.MySiemens.Read<int>($"DB4.DBD{2 + (tempDevice.DeviceNum - 1) * 4}").Content;
prop1:
var RE = SiemensDevice.GetInstance.MySiemens.Write($"DB4.DBD{2 + (tempDevice.DeviceNum - 1) * 4}", item + item1);
var values = SiemensDevice.GetInstance.MySiemens.Read<int>($"DB4.DBD{2 + (tempDevice.DeviceNum - 1) * 4}").Content;
if ((values != null && values.ToString() != (item + item1).ToString()) || values == null)
goto prop1;
if (RE.IsSuccess)
MessageNotify.GetInstance.ShowRunLog($"下发配方DB4.DBD{2 + (tempDevice.DeviceNum - 1) * 4} :{(byte)tInfo.ElementAt(i).ElementAt(m).Loc}-{item + item1}-{(item + item1).ToBinString()}");
else
MessageNotify.GetInstance.ShowRunLog($"下发配方DB4.DBD{2 + (tempDevice.DeviceNum - 1) * 4} 失败");
string tempAdd = $"DB4.DBD{2 + (tempDevice.DeviceNum - 1) * 4}";
if (!values.ContainsKey(tempAdd)) values.TryAdd(tempAdd, new int[2] { 0,0});
values[tempAdd][0] = values[tempAdd][0] + item;
values[tempAdd][1] = tInfo.ElementAt(i).ElementAt(m).Loc;
}
}
if (tInfo.ElementAt(i).ElementAt(m).Loc > 0)
@@ -175,29 +184,24 @@ namespace BPASmartClient.DosingSystem.ViewModel
}
}
}
/*recipeData.Add(data);*/

}
}
}
SiemensDevice.GetInstance.MySiemens.Write("DB4.DBD198", BarrelNum.Count);//配方使用桶数写入
/*if (recipeData.Count <= 0)
{
MessageNotify.GetInstance.ShowRunLog("配方数据解析失败");
return;
}*/
/*int offset = 2;
//写入配方数据
MessageNotify.GetInstance.ShowRunLog("开始写入配方数据");
recipeData.ForEach(item =>

values?.ToList().ForEach(x =>
{
byte[] test1 = item.ToBytes(BPA.Helper.DataFormat.ABCD);
item = test1.ToInt();
SiemensDevice.GetInstance.MySiemens.Write($"DB4.DBD{offset}", item);
MessageNotify.GetInstance.ShowRunLog($"下发配方DB4.DBD{offset} :{item.ToBinString()}");
offset = offset += 4;
});*/
/*SiemensDevice.GetInstance.MySiemens.Write("DB4.DBD198", recipeData.Count);//配方使用桶数写入*/
SiemensDevice.GetInstance.MySiemens.Write(x.Key, x.Value[0]).OnSuccess(() =>
{
MessageNotify.GetInstance.ShowRunLog($"下发配方-{x.Key} :桶数:[{x.Value[1]}]-{x.Value[0].ToBinString()}");
}).OnFail(s =>
{
MessageNotify.GetInstance.ShowRunLog($"下发配方-{x.Key} 失败");
});
});


SiemensDevice.GetInstance.MySiemens.Write("DB4.DBD198", BarrelNum.Count);//配方使用桶数写入
SiemensDevice.GetInstance.MySiemens.Write("DB4.DBX0.1", true);//配方执行启动
Stopwatch sw = new Stopwatch();
var recipe = Recipes.ElementAt(index);
@@ -721,7 +725,7 @@ namespace BPASmartClient.DosingSystem.ViewModel
//}
#endregion

#region 测试
#region 正式
for (int i = 0; i < Recipes.Count; i++)
{
for (int m = 0; m < Recipes.ElementAt(i).RawMaterials.Count; m++)
@@ -738,19 +742,15 @@ namespace BPASmartClient.DosingSystem.ViewModel

if (index >= 0 && index < recipeProcesses.ElementAt(recIndex).RawMaterials.Count)
{

//测试使用
recipeProcesses.ElementAt(recIndex).RawMaterials.ElementAt(index).RecipeStatus = RunStatus;



}
for (int j = 0; j < GlobalDevice.PlcData.IsAllowIngredients.Length; j++)
{
if (GlobalDevice.PlcData.IsAllowIngredients[j])
{
int barrel = j + 1;//桶号
int cnt = GlobalDevice.PlcData.LocationFeedback[j];//允许配料的位置 0~6
int cnt = GlobalDevice.PlcData.LocationFeedback[j];//允许配料的位置 1~6
if (RTrig.GetInstance($"a{j}").Start(GlobalDevice.PlcData.IsAllowIngredients[j]))
{
MessageNotify.GetInstance.ShowRunLog($"桶号:{barrel},位置:{cnt},允许配料");
@@ -771,10 +771,8 @@ namespace BPASmartClient.DosingSystem.ViewModel
{
Location1 = Array.FindIndex(Recipes.ElementAt(i).RawMaterials.ToArray(), p => p.RawMaterialName == DeviceInquire.GetInstance.devices.ElementAt(a1).DeviceName && p.Loc == barrel);
}
//Location2 = Location1;
}


}
if (Location1 >= 0)
{
@@ -789,7 +787,7 @@ namespace BPASmartClient.DosingSystem.ViewModel
if (loc >= 0 && RawName != null && weight >= 0)
{
int St_index = Array.FindIndex(StockStatus.ToArray(), p => p.MaterialName == RawName);
// int materialCount = recipeProcesses.ElementAt(recIndex).RawMaterials.Where(p => p.RawMaterialName == RawName).Count();
if (St_index < 0) //|| (StockStatus.Count < materialCount && St_index > 0)
{
StockStatus.Add(new StockStatusModel()
@@ -800,8 +798,6 @@ namespace BPASmartClient.DosingSystem.ViewModel
});
}
St_index = Array.FindIndex(StockStatus.ToArray(), p => p.MaterialName == RawName);//&& p.IssueStatus == 0)

// int St_index1 = Array.FindIndex(StockStatus.ToArray(), p => (p.MaterialName == RawName && p.IssueStatus == 1));
if (St_index >= 0)
{

@@ -857,228 +853,18 @@ namespace BPASmartClient.DosingSystem.ViewModel
var res = recipeProcesses.ElementAt(recIndex).RawMaterials.FirstOrDefault(p => p.Status != Status.配料完成 && p.RawMaterialName == tempRawMaterialName && p.Loc == j + 1);
if (res != null)
res.Status = Status.配料完成;
//var values = SiemensDevice.GetInstance.MySiemens.Read<int>("DB4.DBD130").Content;
//if ((values != null && values.ToString() != item.ToString()) || values == null)
// goto prop1;


//SiemensDevice.GetInstance.MySiemens.Write("DB4.DBD130", true).OnSuccess(() =>
//{
// MessageNotify.GetInstance.ShowRunLog($"设备完成信号写入成功!");
//}).OnFail(s =>
//{
// MessageNotify.GetInstance.ShowRunLog($"设备完成信号写入失败!{s}");
//});

MessageNotify.GetInstance.ShowRunLog($"设备完成执行状态:{rrr}");
MessageNotify.GetInstance.ShowRunLog($"柔性味魔方{Recipes.ElementAt(i).RawMaterials.ElementAt(loc).DeviceIp},出料完成,状态复位");

}

//测试
//if (recipeProcesses.ElementAt(recIndex).RawMaterials.ElementAt(loc).RecipeStatus == 3 && StockStatus.ElementAt(St_index1).IssueStatus == 1)
//{
// //GlobalDevice.PlcData.IsAllowIngredients[j] = false;//测试使用
// StockStatus.ElementAt(St_index1).IssueStatus = 2;
// DeviceInquire.GetInstance.GetDevice(Recipes.ElementAt(i).RawMaterials.ElementAt(loc).DeviceIp).StatusReset();
// int a = 0.SetBitValue((byte)(DeviceNum), true);
// byte[] test1 = a.ToBytes(BPA.Helper.DataFormat.BADC);
// int item = test1.ToInt();
// SiemensDevice.GetInstance.MySiemens.Write("DB4.DBD130", item);
// //MessageNotify.GetInstance.ShowRunLog($"{res}");
// MessageNotify.GetInstance.ShowRunLog($"DB4.DBD130:{item.ToBinString()}");
// MessageNotify.GetInstance.ShowRunLog($"柔性味魔方{Recipes.ElementAt(i).RawMaterials.ElementAt(loc).DeviceIp},出料完成,状态复位");
//}
}
}
}
}

//调试
//if (Location1 >= 0)
//{
// string RawName = Recipes.ElementAt(i).RawMaterials.ElementAt(Location1).RawMaterialName;
// int abc = Array.FindIndex(DeviceInquire.GetInstance.devices.ToArray(), p => p.DeviceName == RawName);
// int DeviceNum = DeviceInquire.GetInstance.devices.ElementAt(abc).DeviceNum;
// if (DeviceNum > 0)
// {
// float weight = Recipes.ElementAt(i).RawMaterials.ElementAt(Location1).RawMaterialWeight;
// //测试
// // int loc = Array.FindIndex(Recipes.ElementAt(i).RawMaterials.ToArray(), p => (p.RawMaterialName == RawName));
// if (Location1 >= 0 && RawName != null && weight >= 0)
// {
// int St_index = Array.FindIndex(StockStatus.ToArray(), p => p.MaterialName == RawName);
// int materialCount = recipeProcesses.ElementAt(recIndex).RawMaterials.Where(p => p.RawMaterialName == RawName).Count();
// if (St_index < 0 || (StockStatus.Count < materialCount && St_index > 0))
// {
// StockStatus.Add(new StockStatusModel()
// {
// MaterialName = RawName,
// IssueWeight = weight,
// IssueStatus = 0,
// });
// }
// St_index = Array.FindIndex(StockStatus.ToArray(), p => (p.MaterialName == RawName && p.IssueStatus == 0));

// int St_index1 = Array.FindIndex(StockStatus.ToArray(), p => (p.MaterialName == RawName && p.IssueStatus == 1));
// if (St_index >= 0)
// {
// if ((recipeProcesses.ElementAt(recIndex).RawMaterials.ElementAt(Location1).RecipeStatus == 1 && StockStatus.ElementAt(St_index).IssueStatus == 0))//
// {
// StockStatus.ElementAt(St_index).IssueStatus = 1;
// DeviceInquire.GetInstance.GetDevice(Recipes.ElementAt(i).RawMaterials.ElementAt(Location1).DeviceIp).Start(weight);
// MessageNotify.GetInstance.ShowRunLog($"柔性味魔方{Recipes.ElementAt(i).RawMaterials.ElementAt(Location1).DeviceIp},开始出料");
// }
// //if (recipeProcesses.ElementAt(recIndex).RawMaterials.ElementAt(loc).RecipeStatus == 3 && StockStatus.ElementAt(St_index).IssueStatus == 1)
// //{
// // //GlobalDevice.PlcData.IsAllowIngredients[j] = false;//测试使用
// // StockStatus.ElementAt(St_index).IssueStatus = 2;
// // DeviceInquire.GetInstance.GetDevice(Recipes.ElementAt(i).RawMaterials.ElementAt(loc).DeviceIp).StatusReset();
// // int a = 0.SetBitValue((byte)(DeviceNum), true);
// // byte[] test1 = a.ToBytes(BPA.Helper.DataFormat.BADC);
// // int item = test1.ToInt();
// // SiemensDevice.GetInstance.MySiemens.Write("DB4.DBD130", item);
// // //MessageNotify.GetInstance.ShowRunLog($"{res}");
// // MessageNotify.GetInstance.ShowRunLog($"DB4.DBD130:{item.ToBinString()}");
// // MessageNotify.GetInstance.ShowRunLog($"柔性味魔方{Recipes.ElementAt(i).RawMaterials.ElementAt(loc).DeviceIp},出料完成,状态复位");
// //}

// //测试
// if (recipeProcesses.ElementAt(recIndex).RawMaterials.ElementAt(Location1).RecipeStatus == 3 && StockStatus.ElementAt(St_index1).IssueStatus == 1)
// {
// //GlobalDevice.PlcData.IsAllowIngredients[j] = false;//测试使用
// StockStatus.ElementAt(St_index1).IssueStatus = 2;
// DeviceInquire.GetInstance.GetDevice(Recipes.ElementAt(i).RawMaterials.ElementAt(Location1).DeviceIp).StatusReset();
// int a = 0.SetBitValue((byte)(DeviceNum), true);
// byte[] test1 = a.ToBytes(BPA.Helper.DataFormat.BADC);
// int item = test1.ToInt();
// SiemensDevice.GetInstance.MySiemens.Write("DB4.DBD130", item);
// //MessageNotify.GetInstance.ShowRunLog($"{res}");
// MessageNotify.GetInstance.ShowRunLog($"DB4.DBD130:{item.ToBinString()}");
// MessageNotify.GetInstance.ShowRunLog($"柔性味魔方{Recipes.ElementAt(i).RawMaterials.ElementAt(Location1).DeviceIp},出料完成,状态复位");
// }
// }
// }
// }
//}




//if (Location1 >= 0)
//{

// string RawName111 = Recipes.ElementAt(i).RawMaterials.ElementAt(Location1).RawMaterialName;
// int St_index111 = Array.FindIndex(StockStatus.ToArray(), p => p.MaterialName == RawName111);
// if (Location2 >= 0 && ((Location1 >= 0 && StockStatus.ElementAt(St_index111).IssueStatus == 2)))
// {
// string RawName = Recipes.ElementAt(i).RawMaterials.ElementAt(Location2).RawMaterialName;
// int abc = Array.FindIndex(DeviceInquire.GetInstance.devices.ToArray(), p => p.DeviceName == RawName);
// int DeviceNum = DeviceInquire.GetInstance.devices.ElementAt(abc).DeviceNum;
// if (DeviceNum > 0)
// {
// float weight = Recipes.ElementAt(i).RawMaterials.ElementAt(Location2).RawMaterialWeight;
// int loc = Array.FindIndex(Recipes.ElementAt(i).RawMaterials.ToArray(), p => p.RawMaterialName == RawName);
// if (loc >= 0 && RawName != null && weight >= 0)
// {
// int St_index = Array.FindIndex(StockStatus.ToArray(), p => p.MaterialName == RawName);
// if (St_index < 0)
// {
// StockStatus.Add(new StockStatusModel()
// {
// MaterialName = RawName,
// IssueWeight = weight,
// IssueStatus = 0,
// });
// }
// St_index = Array.FindIndex(StockStatus.ToArray(), p => p.MaterialName == RawName);

// if (St_index >= 0)
// {
// if (RTrig.GetInstance($"ac{j}").Start(GlobalDevice.PlcData.IsAllowIngredients[j]))
// {
// if (StockStatus.ElementAt(St_index).IssueStatus == 2)
// StockStatus.ElementAt(St_index).IssueStatus = 0;
// }
// var rrr = DeviceInquire.GetInstance.GetDevice(Recipes.ElementAt(i).RawMaterials.ElementAt(loc).DeviceIp).deviceStatus.RunStatus;
// if (recipeProcesses.ElementAt(recIndex).RawMaterials.ElementAt(loc).RecipeStatus == 1 && StockStatus.ElementAt(St_index).IssueStatus == 0)
// {
// StockStatus.ElementAt(St_index).IssueStatus = 1;
// DeviceInquire.GetInstance.GetDevice(Recipes.ElementAt(i).RawMaterials.ElementAt(loc).DeviceIp).Start(weight);
// MessageNotify.GetInstance.ShowRunLog($"设备执行状态:{rrr}");
// MessageNotify.GetInstance.ShowRunLog($"柔性味魔方{Recipes.ElementAt(i).RawMaterials.ElementAt(loc).DeviceIp},开始出料");
// }
// if (recipeProcesses.ElementAt(recIndex).RawMaterials.ElementAt(loc).RecipeStatus == 3 && StockStatus.ElementAt(St_index).IssueStatus == 1)
// {
// //GlobalDevice.PlcData.IsAllowIngredients[j] = false;//测试使用
// StockStatus.ElementAt(St_index).IssueStatus = 2;
// DeviceInquire.GetInstance.GetDevice(Recipes.ElementAt(i).RawMaterials.ElementAt(loc).DeviceIp).StatusReset();
// int a = 0.SetBitValue((byte)(DeviceNum), true);
// byte[] test1 = a.ToBytes(BPA.Helper.DataFormat.BADC);
// int item = test1.ToInt();
// SiemensDevice.GetInstance.MySiemens.Write("DB4.DBD130", item);
// //MessageNotify.GetInstance.ShowRunLog($"{res}");
// //MessageNotify.GetInstance.ShowRunLog($"DB4.DBD130:{item.ToBinString()}");
// MessageNotify.GetInstance.ShowRunLog($"设备wancheng执行状态:{rrr}");
// MessageNotify.GetInstance.ShowRunLog($"DB4.DBD130:{item}");
// MessageNotify.GetInstance.ShowRunLog($"柔性味魔方{Recipes.ElementAt(i).RawMaterials.ElementAt(loc).DeviceIp},出料完成,状态复位");
// }
// }
// }
// }
// }
//}
//else
//{
// if (Location2 >= 0)
// {
// string RawName = Recipes.ElementAt(i).RawMaterials.ElementAt(Location2).RawMaterialName;
// int abc = Array.FindIndex(DeviceInquire.GetInstance.devices.ToArray(), p => p.DeviceName == RawName);
// int DeviceNum = DeviceInquire.GetInstance.devices.ElementAt(abc).DeviceNum;
// if (DeviceNum >= 0)
// {
// float weight = Recipes.ElementAt(i).RawMaterials.ElementAt(Location2).RawMaterialWeight;
// int loc = Array.FindIndex(Recipes.ElementAt(i).RawMaterials.ToArray(), p => p.RawMaterialName == RawName);
// if (cnt > 0 && loc >= 0 && RawName != null && weight >= 0)
// {
// int St_index = Array.FindIndex(StockStatus.ToArray(), p => p.MaterialName == RawName);
// if (St_index < 0)
// {
// StockStatus.Add(new StockStatusModel()
// {
// MaterialName = RawName,
// IssueWeight = weight,
// IssueStatus = 0,
// });
// }
// St_index = Array.FindIndex(StockStatus.ToArray(), p => p.MaterialName == RawName);
// if (St_index >= 0)
// {
// if (recipeProcesses.ElementAt(recIndex).RawMaterials.ElementAt(loc).RecipeStatus == 1 && StockStatus.ElementAt(St_index).IssueStatus == 0)
// {
// StockStatus.ElementAt(St_index).IssueStatus = 1;
// DeviceInquire.GetInstance.GetDevice(Recipes.ElementAt(i).RawMaterials.ElementAt(loc).DeviceIp).Start(weight);
// MessageNotify.GetInstance.ShowRunLog($"柔性味魔方{Recipes.ElementAt(i).RawMaterials.ElementAt(loc).DeviceIp},开始出料");
// }
// if (recipeProcesses.ElementAt(recIndex).RawMaterials.ElementAt(loc).RecipeStatus == 3 && StockStatus.ElementAt(St_index).IssueStatus == 1)
// {
// //GlobalDevice.PlcData.IsAllowIngredients[j] = false;//测试使用
// StockStatus.ElementAt(St_index).IssueStatus = 2;
// DeviceInquire.GetInstance.GetDevice(Recipes.ElementAt(i).RawMaterials.ElementAt(loc).DeviceIp).StatusReset();
// int a = 0.SetBitValue((byte)(DeviceNum), true);
// byte[] test1 = a.ToBytes(BPA.Helper.DataFormat.BADC);
// int item = test1.ToInt();
// SiemensDevice.GetInstance.MySiemens.Write("DB4.DBD130", item);
// recipeProcesses.ElementAt(recIndex).RawMaterials.ElementAt(loc).UpLimtWeightFeedback = DeviceInquire.GetInstance.GetDevice(Recipes.ElementAt(i).RawMaterials.ElementAt(loc).DeviceIp).deviceStatus.NowWeightFeedback;
// //MessageNotify.GetInstance.ShowRunLog($"{res}");
// MessageNotify.GetInstance.ShowRunLog($"DB4.DBD130:{item.ToBinString()}");
// MessageNotify.GetInstance.ShowRunLog($"柔性味魔方{Recipes.ElementAt(i).RawMaterials.ElementAt(loc).DeviceIp},出料完成,状态复位");
// }
// }
// }
// }
// }
//}
}
//508配料项目代码
//if (GlobalDevice.PlcData.IsAllowIngredients[j])
@@ -1164,8 +950,7 @@ namespace BPASmartClient.DosingSystem.ViewModel
// }
//}
}
//int Finish_Count = StockStatus.Where(s => s.IssueStatus == 2).Count();
//int Finish_Count = recipeProcesses.ElementAt(recIndex).RawMaterials.Where(p => p.RecipeStatus == 3).Count();
if (ComCount >= Recipes.ElementAt(i).RawMaterials.Count) //配方配料完成 StockStatus.Count >= Recipes.ElementAt(i).RawMaterials.Count &&
{
int cc = recipeProcesses.ElementAt(recIndex).RawMaterials.OrderBy(p => p.RawMaterialName).Count();


+ 170
- 0
DosingSystem/ViewModel/UHardwareStatusViewModel.cs 查看文件

@@ -0,0 +1,170 @@
using BPA.Helper;
using BPASmartClient.DosingSystem.Model;
using BPASmartClient.DosingSystem;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace BPASmartClient.DosingSystem.ViewModel
{
public class UHardwareStatusViewModel : NotifyBase
{
public UHardwareStatusViewModel()
{

//TopDeviceCurrentStatuses = new ObservableCollection<DeviceCurrentStatus>();
//TopDeviceCurrentStatuses.Add(new DeviceCurrentStatus { DeviceNum = 1 }) ;
//TopDeviceCurrentStatuses.Add(new DeviceCurrentStatus { DeviceNum = 1 });
//TopDeviceCurrentStatuses.Add(new DeviceCurrentStatus { DeviceNum = 1 });
//TopDeviceCurrentStatuses.Add(new DeviceCurrentStatus { DeviceNum = 1 });

//TopDeviceCurrentStatuses.Add(new DeviceCurrentStatus { DeviceNum = 1 });
//TopDeviceCurrentStatuses.Add(new DeviceCurrentStatus { DeviceNum = 1 });



//BottomDeviceCurrentStatuses = new ObservableCollection<DeviceCurrentStatus>();
//BottomDeviceCurrentStatuses.Add(new DeviceCurrentStatus { DeviceNum = 1 });
//BottomDeviceCurrentStatuses.Add(new DeviceCurrentStatus { DeviceNum = 1 });
//BottomDeviceCurrentStatuses.Add(new DeviceCurrentStatus { DeviceNum = 1 });
//BottomDeviceCurrentStatuses.Add(new DeviceCurrentStatus { DeviceNum = 1 });
//BottomDeviceCurrentStatuses.Add(new DeviceCurrentStatus { DeviceNum = 1 });
//BottomDeviceCurrentStatuses.Add(new DeviceCurrentStatus { DeviceNum = 1 });
//TopDeviceCurrentStatuses = DeviceInquire.GetInstance.TopDeviceCurrentStatuses;
//BottomDeviceCurrentStatuses = DeviceInquire.GetInstance.BottomDeviceCurrentStatuses;
//2023/7/3调整
TopDeviceCurrentStatuses= ConvertToObservableCollention(DeviceInquire.GetInstance.TopDeviceCurrentStatuses.OrderByDescending(p => p.DeviceNum).Reverse());
BottomDeviceCurrentStatuses = ConvertToObservableCollention(DeviceInquire.GetInstance.BottomDeviceCurrentStatuses.OrderByDescending(p => p.DeviceNum).Reverse());
UnifordColumNum();
TaskManage.GetInstance.StartLong(new Action(() =>
{
for (int i = 0; i < Json<DevicePar>.Data.OutletInfoModels.Count; i++)
{
int count = Json<DevicePar>.Data.OutletInfoModels.ElementAt(i).SiloInfos.Count;
if (count >= 1)
{
for (int m = 0; m < count; m++)
{
var deviceName = Json<DevicePar>.Data.OutletInfoModels.ElementAt(i).SiloInfos.ElementAt(m);
int topIndex = TopDeviceCurrentStatuses.ToList().FindIndex(p => p.DeviceName == deviceName);
int bottomIndex = BottomDeviceCurrentStatuses.ToList().FindIndex(p => p.DeviceName == deviceName);
if (topIndex >= 0 && topIndex < TopDeviceCurrentStatuses.Count)
TopDeviceCurrentStatuses.ElementAt(i).BucketFlagbit = GlobalDevice.PlcData.StationDetection[i];
if (bottomIndex >= 0 && bottomIndex < BottomDeviceCurrentStatuses.Count)
BottomDeviceCurrentStatuses.ElementAt(i).BucketFlagbit = GlobalDevice.PlcData.StationDetection[i];
}
}
}
StatusUpdate(TopDeviceCurrentStatuses);
StatusUpdate(BottomDeviceCurrentStatuses);
OnDetection = GlobalDevice.PlcData.OnDetection;
UnderDetection = GlobalDevice.PlcData.UnderDetection;
ConveyerBeltStatus = GlobalDevice.MotorControlFeedback>0?2: GlobalDevice.MotorControlFeedback;
Thread.Sleep(100);
}), "输送带料仓状态监控", true);

RecipeControlCommand = new BPARelayCommand<object>((o) =>
{
if (o != null && o is DeviceCurrentStatus currentStatus)
{
var res = DeviceInquire.GetInstance.devices.FirstOrDefault(p => p.DeviceName == currentStatus.DeviceName);
if (res != null)
{
DeviceInquire.GetInstance.GetDevice(res.IpAddress).Start(currentStatus.SetWeight);
}
}
});
}

private void StatusUpdate(ObservableCollection<DeviceCurrentStatus> devices)
{
if (devices == null) return;
for (int i = 0; i < devices.Count; i++)
{
if (devices.ElementAt(i).BaitingControl)
{
var res = DeviceInquire.GetInstance.devices.FirstOrDefault(p => p.DeviceName == devices.ElementAt(i).DeviceName);
if (res != null)
{
var runStatus = DeviceInquire.GetInstance.GetDevice(res.IpAddress).deviceStatus.RunStatus;
if (runStatus == 3)
{
if (TopDeviceCurrentStatuses.FirstOrDefault(p => p.DeviceName == devices.ElementAt(i).DeviceName) != null)
{
TopDeviceCurrentStatuses.ElementAt(i).BaitingControl = false;
}
else if (BottomDeviceCurrentStatuses.FirstOrDefault(p => p.DeviceName == devices.ElementAt(i).DeviceName) != null)
{
BottomDeviceCurrentStatuses.ElementAt(i).BaitingControl = false;
}
DeviceInquire.GetInstance.GetDevice(res.IpAddress).StatusReset();
}
}
}
}
}
/// <summary>
/// 根据料仓数来进行uniform列划分
/// </summary>
private void UnifordColumNum()
{
//StockNum = Json<DevicePar>.Data.BaseParModel.StockCount;

StockNum=TopDeviceCurrentStatuses.Count >= BottomDeviceCurrentStatuses.Count ? TopDeviceCurrentStatuses.Count : BottomDeviceCurrentStatuses.Count;


}
/// <summary>
/// 数组集合转换
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="array"></param>
/// <returns></returns>
public ObservableCollection<T> ConvertToObservableCollention<T>(IEnumerable<T> array)
{
ObservableCollection<T> collec = new ObservableCollection<T>();
foreach (var item in array)
{
collec.Add(item);
}
return collec;
}
public ObservableCollection<DeviceCurrentStatus> TopDeviceCurrentStatuses { get; set; }

public ObservableCollection<DeviceCurrentStatus> BottomDeviceCurrentStatuses { get; set; }

public ObservableCollection<ConveyerBeltModel> ConveyerBeltModels { get; set; } = new ObservableCollection<ConveyerBeltModel>();

public BPARelayCommand<object> ConveyerBeltControlCommand { get; set; }

public BPARelayCommand<object> RecipeControlCommand { get; set; }
/// <summary>
/// Uniford根据料仓数量来划分列数量
/// </summary>
private int _stockNum;
public int StockNum { get { return _stockNum; } set { _stockNum = value; OnPropertyChanged(); } }
/// <summary>
/// 输送带状态
/// </summary>
public uint ConveyerBeltStatus { get { return _mConveyerBeltStatus; } set { _mConveyerBeltStatus = value; OnPropertyChanged(); } }
private uint _mConveyerBeltStatus;

/// <summary>
/// 上桶工位检测
/// </summary>
public bool OnDetection { get { return _mOnDetection; } set { _mOnDetection = value; OnPropertyChanged(); } }
private bool _mOnDetection;

/// <summary>
/// 下桶工位检测
/// </summary>
public bool UnderDetection { get { return _mUnderDetection; } set { _mUnderDetection = value; OnPropertyChanged(); } }
private bool _mUnderDetection;
}
}


+ 22
- 0
SmartClient.sln 查看文件

@@ -164,6 +164,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BPASmartClient.FoodStationT
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BPASmartClient.MorkCL", "BPASmartClient.MorkCL\BPASmartClient.MorkCL.csproj", "{918B73A6-B6FF-46FE-8C96-8474A5BD648B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "阿里云IOT平台测试", "阿里云IOT平台测试\阿里云IOT平台测试.csproj", "{774286FD-0C88-4592-972C-101239F75954}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -1538,6 +1540,26 @@ Global
{918B73A6-B6FF-46FE-8C96-8474A5BD648B}.Release|x64.Build.0 = Release|Any CPU
{918B73A6-B6FF-46FE-8C96-8474A5BD648B}.Release|x86.ActiveCfg = Release|Any CPU
{918B73A6-B6FF-46FE-8C96-8474A5BD648B}.Release|x86.Build.0 = Release|Any CPU
{774286FD-0C88-4592-972C-101239F75954}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{774286FD-0C88-4592-972C-101239F75954}.Debug|Any CPU.Build.0 = Debug|Any CPU
{774286FD-0C88-4592-972C-101239F75954}.Debug|ARM.ActiveCfg = Debug|Any CPU
{774286FD-0C88-4592-972C-101239F75954}.Debug|ARM.Build.0 = Debug|Any CPU
{774286FD-0C88-4592-972C-101239F75954}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{774286FD-0C88-4592-972C-101239F75954}.Debug|ARM64.Build.0 = Debug|Any CPU
{774286FD-0C88-4592-972C-101239F75954}.Debug|x64.ActiveCfg = Debug|Any CPU
{774286FD-0C88-4592-972C-101239F75954}.Debug|x64.Build.0 = Debug|Any CPU
{774286FD-0C88-4592-972C-101239F75954}.Debug|x86.ActiveCfg = Debug|Any CPU
{774286FD-0C88-4592-972C-101239F75954}.Debug|x86.Build.0 = Debug|Any CPU
{774286FD-0C88-4592-972C-101239F75954}.Release|Any CPU.ActiveCfg = Release|Any CPU
{774286FD-0C88-4592-972C-101239F75954}.Release|Any CPU.Build.0 = Release|Any CPU
{774286FD-0C88-4592-972C-101239F75954}.Release|ARM.ActiveCfg = Release|Any CPU
{774286FD-0C88-4592-972C-101239F75954}.Release|ARM.Build.0 = Release|Any CPU
{774286FD-0C88-4592-972C-101239F75954}.Release|ARM64.ActiveCfg = Release|Any CPU
{774286FD-0C88-4592-972C-101239F75954}.Release|ARM64.Build.0 = Release|Any CPU
{774286FD-0C88-4592-972C-101239F75954}.Release|x64.ActiveCfg = Release|Any CPU
{774286FD-0C88-4592-972C-101239F75954}.Release|x64.Build.0 = Release|Any CPU
{774286FD-0C88-4592-972C-101239F75954}.Release|x86.ActiveCfg = Release|Any CPU
{774286FD-0C88-4592-972C-101239F75954}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE


+ 10
- 0
阿里云IOT平台测试/Program.cs 查看文件

@@ -0,0 +1,10 @@
namespace 阿里云IOT平台测试
{
internal class Program
{
static void Main(string[] args)
{
}
}
}

+ 10
- 0
阿里云IOT平台测试/阿里云IOT平台测试.csproj 查看文件

@@ -0,0 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

</Project>

Loading…
取消
儲存