Commit 858f23f9 authored by 潘栩锋's avatar 潘栩锋 🚴

添加 FlyADIODefine 添加 服务代理,WdIOTip界面可以看到服务器中IO定义。flyad7.HardwareVersion…

添加 FlyADIODefine 添加 服务代理,WdIOTip界面可以看到服务器中IO定义。flyad7.HardwareVersion 不同,IO定义会变化。 WdIOTip界面 还能显示当前IO的状态。 以后 只需要1个WdIOTip界面
parent b6508682
......@@ -60,15 +60,9 @@ namespace FLY.Thick.Base.UI
private void button_iotip_click(object sender, RoutedEventArgs e)
{
Window w;
if (container.IsRegistered<Window>("wdIOTip"))
{
w = container.Resolve<Window>("wdIOTip");
}
else
{
w = new WdIOTip();
}
var w = new WdIOTip();
container.BuildUp(w);
w.Owner = FLY.ControlLibrary.COMMON.GetWindow(this);
w.ShowDialog();
}
......
......@@ -5,85 +5,81 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
Title="Window_IOTip" >
xmlns:local="clr-namespace:FLY.Thick.Base.UI"
Title="AD盒IO口定义" Height="537" Width="484" >
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/FLY.ControlLibrary;component/Themes/Dictionary_MyStyle.xaml"/>
</ResourceDictionary.MergedDictionaries>
<Style x:Key="IOStyle" TargetType="Rectangle" >
<Setter Property="Width" Value="10" />
<Setter Property="Height" Value="20" />
<Setter Property="Margin" Value="1" />
<Setter Property="Fill" Value="{StaticResource Brushes.Static}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsOn}" Value="True">
<Setter Property="Fill" Value="{StaticResource Brushes.Activity}"/>
</DataTrigger>
</Style.Triggers>
</Style>
<Style x:Key="IOTextStyle" TargetType="TextBlock" BasedOn="{StaticResource Styles.Text.FieldContent}">
<Setter Property="FontSize" Value="20"/>
<Setter Property="Width" Value="30" />
<Setter Property="Margin" Value="3" />
</Style>
<local:WdIoTipVmUt x:Key="viewModel"/>
</ResourceDictionary>
</Window.Resources>
<Grid TextBlock.FontSize="24" TextBlock.FontStyle="Normal" >
<Grid Grid.Column="1" Margin="5">
<Grid.RowDefinitions>
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="260" />
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="260" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.Resources>
<Style BasedOn="{StaticResource TextBlockStyle_FieldHeader}" TargetType="TextBlock" x:Key="TextBlockStyle_FieldHeader1">
<Setter Property="FontFamily" Value="Arial"/>
</Style>
<Style BasedOn="{StaticResource TextBlockStyle_FieldContent}" TargetType="TextBlock" x:Key="TextBlockStyle_FieldContent1">
<Setter Property="FontSize" Value="24" />
</Style>
</Grid.Resources>
<TextBlock Grid.Row="0" Style="{StaticResource TextBlockStyle_FieldHeader1}" Text="I1" />
<TextBlock Grid.Row="1" Style="{StaticResource TextBlockStyle_FieldHeader1}" Text="I2" />
<TextBlock Grid.Row="2" Style="{StaticResource TextBlockStyle_FieldHeader1}" Text="I3" />
<TextBlock Grid.Row="3" Style="{StaticResource TextBlockStyle_FieldHeader1}" Text="I4" />
<TextBlock Grid.Row="4" Style="{StaticResource TextBlockStyle_FieldHeader1}" Text="I5" />
<TextBlock Grid.Row="5" Style="{StaticResource TextBlockStyle_FieldHeader1}" Text="I6" />
<TextBlock Grid.Row="6" Style="{StaticResource TextBlockStyle_FieldHeader1}" Text="I7" />
<TextBlock Grid.Row="7" Style="{StaticResource TextBlockStyle_FieldHeader1}" Text="I8" />
<TextBlock Grid.Row="8" Style="{StaticResource TextBlockStyle_FieldHeader1}" Text="I9" />
<TextBlock Grid.Row="9" Style="{StaticResource TextBlockStyle_FieldHeader1}" Text="I10" />
<TextBlock Grid.Row="10" Style="{StaticResource TextBlockStyle_FieldHeader1}" Text="I11" />
<TextBlock Grid.Row="11" Style="{StaticResource TextBlockStyle_FieldHeader1}" Text="I12" />
<TextBlock Grid.Row="0" Grid.Column="1" Style="{StaticResource TextBlockStyle_FieldContent1}" Text="" />
<TextBlock Grid.Row="1" Grid.Column="1" Style="{StaticResource TextBlockStyle_FieldContent1}" Text="归原点" />
<TextBlock Grid.Row="2" Grid.Column="1" Style="{StaticResource TextBlockStyle_FieldContent1}" Text="正限位" />
<TextBlock Grid.Row="3" Grid.Column="1" Style="{StaticResource TextBlockStyle_FieldContent1}" Text="负限位" />
<TextBlock Grid.Row="4" Grid.Column="1" Style="{StaticResource TextBlockStyle_FieldContent1}" Text="" />
<TextBlock Grid.Row="5" Grid.Column="1" Style="{StaticResource TextBlockStyle_FieldContent1}" Text="控制启停/EPC启动" FontSize="18" />
<TextBlock Grid.Row="6" Grid.Column="1" Style="{StaticResource TextBlockStyle_FieldContent1}" Text="手动正转" />
<TextBlock Grid.Row="7" Grid.Column="1" Style="{StaticResource TextBlockStyle_FieldContent1}" Text="手动反转" />
<TextBlock Grid.Row="8" Grid.Column="1" Style="{StaticResource TextBlockStyle_FieldContent1}" Text="旋转架.转向0" />
<TextBlock Grid.Row="9" Grid.Column="1" Style="{StaticResource TextBlockStyle_FieldContent1}" Text="旋转架.转向1" />
<TextBlock Grid.Row="10" Grid.Column="1" Style="{StaticResource TextBlockStyle_FieldContent1}" Text="线速度" />
<TextBlock Grid.Row="11" Grid.Column="1" Style="{StaticResource TextBlockStyle_FieldContent1}" Text="纵向边界/EPC-A10 警报" FontSize="18" />
<TextBlock Grid.Row="0" Grid.Column="2" Style="{StaticResource TextBlockStyle_FieldHeader1}" Text="O1" />
<TextBlock Grid.Row="1" Grid.Column="2" Style="{StaticResource TextBlockStyle_FieldHeader1}" Text="O2" />
<TextBlock Grid.Row="2" Grid.Column="2" Style="{StaticResource TextBlockStyle_FieldHeader1}" Text="O3" />
<TextBlock Grid.Row="3" Grid.Column="2" Style="{StaticResource TextBlockStyle_FieldHeader1}" Text="O4" />
<TextBlock Grid.Row="0" Grid.Column="3" Style="{StaticResource TextBlockStyle_FieldContent1}" Text="变频器.正转/EPC启动状态" FontSize="18" />
<TextBlock Grid.Row="1" Grid.Column="3" Style="{StaticResource TextBlockStyle_FieldContent1}" Text="变频器.反转/EPC-A10到样品点" FontSize="18" />
<TextBlock Grid.Row="2" Grid.Column="3" Style="{StaticResource TextBlockStyle_FieldContent1}" Text="变频器.段速" />
<TextBlock Grid.Row="3" Grid.Column="3" Style="{StaticResource TextBlockStyle_FieldContent1}" Text="报警灯" />
</Grid>
<Grid TextBlock.FontSize="24" TextBlock.FontStyle="Normal" d:DataContext="{StaticResource viewModel}">
<StackPanel>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ItemsControl ItemsSource="{Binding IStatus}" Margin="10">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Margin="2"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Rectangle Style="{StaticResource IOStyle}"/>
<TextBlock Style="{StaticResource IOTextStyle}"
Text="{Binding Number}"/>
<TextBlock Style="{StaticResource IOTextStyle}" Width="auto" MinWidth="180"
Text="{Binding Desp}"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<ItemsControl ItemsSource="{Binding OStatus}" Margin="10" Grid.Column="1">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Rectangle Style="{StaticResource IOStyle}"/>
<TextBlock Style="{StaticResource IOTextStyle}"
Text="{Binding Number}"/>
<TextBlock Style="{StaticResource IOTextStyle}" Width="auto" MinWidth="180"
Text="{Binding Desp}"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
</StackPanel>
</Grid>
</flyctrllib:WindowBigClose>
using System;
using FLY.Thick.Base.IService;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Windows;
......@@ -10,6 +13,7 @@ using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using Unity;
namespace FLY.Thick.Base.UI
{
......@@ -18,9 +22,216 @@ namespace FLY.Thick.Base.UI
/// </summary>
public partial class WdIOTip : FLY.ControlLibrary.WindowBigClose
{
WdIoTipVm viewModel;
public WdIOTip()
{
InitializeComponent();
}
[InjectionMethod]
public void Init(IFlyAdIoDefineService iODefineService, ITDGageService gageService) {
viewModel = new WdIoTipVm();
viewModel.Init(iODefineService, gageService);
this.DataContext = viewModel;
}
}
public class WdIoTipVm : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
IFlyAdIoDefineService iODefineService;
Base.Common.DynArea dynArea;
public ObservableCollection<FlyAdIoStatus> IStatus { get; } = new ObservableCollection<FlyAdIoStatus>();
public ObservableCollection<FlyAdIoStatus> OStatus { get; } = new ObservableCollection<FlyAdIoStatus>();
public WdIoTipVm() {
}
public void Init(IFlyAdIoDefineService iODefineService, ITDGageService gageService)
{
this.dynArea = gageService.DynArea;
this.iODefineService = iODefineService;
for (int i = 0; i < 16; i++) {
IStatus.Add(new FlyAdIoStatus()
{
Number = $"i{i+1}"
});
};
for (int i = 0; i < 8; i++)
{
OStatus.Add(new FlyAdIoStatus()
{
Number = $"o{i+1}"
});
};
if (this.iODefineService is FObjBase.FObjServiceClient)
{
var client = this.iODefineService as FObjBase.FObjServiceClient;
if (client.IsConnected)
{
update();
}
client.PropertyChanged += Client_PropertyChanged;
}
else
{
update();
}
Misc.BindingOperations.SetBinding(dynArea, nameof(dynArea.IStatus), () =>
{
for (int i = 0; i < IStatus.Count(); i++) {
IStatus[i].IsOn = !Misc.MyBase.CHECKBIT(dynArea.IStatus, i);
}
});
Misc.BindingOperations.SetBinding(dynArea, nameof(dynArea.OStatus), () =>
{
for (int i = 0; i < OStatus.Count(); i++)
{
OStatus[i].IsOn = !Misc.MyBase.CHECKBIT(dynArea.OStatus, i);
}
});
}
private void Client_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
var client = this.iODefineService as FObjBase.FObjServiceClient;
if (e.PropertyName == nameof(FObjBase.FObjServiceClient.IsConnected))
{
if (client.IsConnected)
{
update();
}
}
}
void update()
{
iODefineService.GetIODefine((asyncContext, retData) => {
var reponse = retData as List<IODefine>;
if (reponse == null || reponse.Count() == 0)
return;
string[] istatus_desps = new string[IStatus.Count()];
string[] ostatus_desps = new string[OStatus.Count()];
for (int i = 0; i < reponse.Count(); i++) {
var ioDefine = reponse[i];
if (ioDefine.IoType == IODefine.IOTYPE.Input)
{
if (ioDefine.Index < istatus_desps.Count()) {
istatus_desps[ioDefine.Index] = ioDefine.Description;
}
}
else {
if (ioDefine.Index < ostatus_desps.Count())
{
ostatus_desps[ioDefine.Index] = ioDefine.Description;
}
}
}
for (int i = 0; i < istatus_desps.Count(); i++) {
if (string.IsNullOrEmpty(istatus_desps[i]))
{
IStatus[i].Desp = "";
}
else
{
IStatus[i].Desp = istatus_desps[i];
}
}
for (int i = 0; i < ostatus_desps.Count(); i++)
{
if (string.IsNullOrEmpty(ostatus_desps[i]))
{
OStatus[i].Desp = "";
}
else
{
OStatus[i].Desp = ostatus_desps[i];
}
}
}, this);
}
}
public class FlyAdIoStatus : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
/// <summary>
/// 编号
/// </summary>
public string Number { get; set; }
/// <summary>
/// 描述
/// </summary>
public string Desp { get; set; }
/// <summary>
/// 状态
/// </summary>
public bool IsOn { get; set; }
}
public class WdIoTipVmUt : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public ObservableCollection<FlyAdIoStatus> IStatus { get; } = new ObservableCollection<FlyAdIoStatus>();
public ObservableCollection<FlyAdIoStatus> OStatus { get; } = new ObservableCollection<FlyAdIoStatus>();
public WdIoTipVmUt()
{
for (int i = 0; i < 16; i++)
{
IStatus.Add(new FlyAdIoStatus()
{
Number = $"i{i + 1}"
});
};
for (int i = 0; i < 8; i++)
{
OStatus.Add(new FlyAdIoStatus()
{
Number = $"o{i + 1}"
});
};
IStatus[2-1].IsOn = true;
IStatus[4-1].IsOn = true;
IStatus[11 - 1].IsOn = true;
OStatus[4 - 1].IsOn = true;
IStatus[2 - 1].Desp = "归零信号";
IStatus[3 - 1].Desp = "正向限位";
IStatus[4 - 1].Desp = "反向限位";
IStatus[7 - 1].Desp = "急停 & 手动正转";
IStatus[8 - 1].Desp = "急停 & 手动反转";
OStatus[4 - 1].Desp = "报警信号";
}
}
}
using FLY.Thick.Base.IService;
using FObjBase;
using FObjBase.Reflect;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FLY.Thick.Base.Client
{
/// <summary>
/// AD盒输入输出口描述服务
/// </summary>
public class FlyAdIoDefineServiceClient : FObjBase.Reflect.Reflect_SeviceClient, IFlyAdIoDefineService
{
protected override Type InterfaceType => typeof(IFlyAdIoDefineService);
/// <summary>
/// 边界查找服务 构造
/// </summary>
/// <param name="id"></param>
public FlyAdIoDefineServiceClient(UInt32 id) : base(id) { }
/// <summary>
/// 边界查找服务 构造
/// </summary>
/// <param name="serviceId">服务id</param>
/// <param name="connName">连接器</param>
public FlyAdIoDefineServiceClient(UInt32 serviceId, string connName) : base(serviceId, connName) { }
/// <summary>
/// 获取输入输出口描述列表
/// </summary>
/// <param name="asyncDelegate"></param>
/// <param name="asyncContext"></param>
[Call(typeof(List<IODefine>))]
public void GetIODefine(AsyncCBHandler asyncDelegate, object asyncContext) {
Call(nameof(GetIODefine), null, asyncDelegate, asyncContext);
}
}
/// <summary>
/// 输入输出口描述
/// </summary>
public class IODefine
{
/// <summary>
/// 输入口?输出口?
/// </summary>
public enum IOTYPE {
/// <summary>
/// 输入口
/// </summary>
Input,
/// <summary>
/// 输出口
/// </summary>
Output
};
/// <summary>
/// 输入口?输出口?
/// </summary>
public IOTYPE IoType;
/// <summary>
/// 序号,从0开始排列
/// </summary>
public int Index;
/// <summary>
/// 功能表述
/// </summary>
public string Description;
}
}
using System.ComponentModel;
using FLY.Thick.Base.IService;
using FObjBase;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
namespace FLY.Thick.Base.Common
{
/// <summary>
/// AD盒IO定义,避免忘记IO口的定义,出现功能重复
/// </summary>
public class FlyADIODefine
public class FlyADIODefine: IFlyAdIoDefineService
{
public static FlyADIODefine Instance { get; } = new FlyADIODefine();
......@@ -109,18 +114,128 @@ namespace FLY.Thick.Base.Common
#endregion
public virtual void Changed(int version)
/// <summary>
/// 根据AD盒的版本,设置
/// </summary>
/// <param name="version"></param>
public virtual void SerVersion(int version)
{
if (version == 2)
if (version == 3)
{
InNo_Manual_Forw = 13 - 1;
InNo_Manual_Backw = 14 - 1;
InNo_Org = 13 - 1;
InNo_Limit_Forw = 14 - 1;
InNo_Limit_Backw = 16 - 1;
InNo_Roll = 15 - 1;
}
else
{
InNo_Manual_Forw = 3 - 1;
InNo_Manual_Backw = 4 - 1;
InNo_Org = 2 - 1;
InNo_Limit_Forw = 3 - 1;
InNo_Limit_Backw = 4 - 1;
InNo_Roll = 11 - 1;
}
}
/// <summary>
/// 获取输入口 属性名
/// </summary>
/// <returns></returns>
protected virtual List<string> GetInputPropertyNames()
{
List<string> reponse = new List<string>();
Type t = this.GetType();
var properties = t.GetProperties();
foreach (var property in properties)
{
if (property.Name.StartsWith("InNo_"))
{
//输入
reponse.Add(property.Name);
}
}
return reponse;
}
/// <summary>
/// 获取输出口 属性名
/// </summary>
/// <returns></returns>
protected virtual List<string> GetOutputPropertyNames()
{
List<string> reponse = new List<string>();
Type t = this.GetType();
var properties = t.GetProperties();
foreach (var property in properties)
{
if (property.Name.StartsWith("OutNo_"))
{
//输入
reponse.Add(property.Name);
}
}
return reponse;
}
public void GetIODefine(AsyncCBHandler asyncDelegate, object asyncContext)
{
//获取全部带 Description 的属性,且名字 InNo_XXX 或 OutNo_XXX
List<IODefine> reponse = new List<IODefine>();
var inputPropertyNames = GetInputPropertyNames();
var outputPropertyNames = GetOutputPropertyNames();
Type t = this.GetType();
foreach (var propertyName in inputPropertyNames)
{
var property = t.GetProperty(propertyName);
var attrs = property.GetCustomAttributes(typeof(DescriptionAttribute), false);
if (attrs.Count() == 0)
{
throw new Exception($"{propertyName} 没有写 [Description]");
}
var attr = attrs.First() as DescriptionAttribute;
string desp = attr.Description;
var index = (int)property.GetValue(this);
var iodefine = new IODefine()
{
IoType = IODefine.IOTYPE.Input,
Index = index,
Description = desp
};
reponse.Add(iodefine);
}
foreach (var propertyName in outputPropertyNames)
{
var property = t.GetProperty(propertyName);
var attrs = property.GetCustomAttributes(typeof(DescriptionAttribute), false);
if (attrs.Count() == 0)
{
throw new Exception($"{propertyName} 没有写 [Description]");
}
var attr = attrs.First() as DescriptionAttribute;
string desp = attr.Description;
var index = (int)property.GetValue(this);
var iodefine = new IODefine()
{
IoType = IODefine.IOTYPE.Output,
Index = index,
Description = desp
};
reponse.Add(iodefine);
}
asyncDelegate?.Invoke(asyncContext, reponse);
}
}
}
using FObjBase;
using FObjBase.Reflect;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FLY.Thick.Base.IService
{
/// <summary>
/// AD盒输入输出口描述服务
/// </summary>
public interface IFlyAdIoDefineService
{
/// <summary>
/// 获取输入输出口描述列表
/// </summary>
/// <param name="asyncDelegate"></param>
/// <param name="asyncContext"></param>
[Call(typeof(List<IODefine>))]
void GetIODefine(AsyncCBHandler asyncDelegate, object asyncContext);
}
/// <summary>
/// 输入输出口描述
/// </summary>
public class IODefine
{
/// <summary>
/// 输入口?输出口?
/// </summary>
public enum IOTYPE {
/// <summary>
/// 输入口
/// </summary>
Input,
/// <summary>
/// 输出口
/// </summary>
Output
};
/// <summary>
/// 输入口?输出口?
/// </summary>
public IOTYPE IoType;
/// <summary>
/// 序号,从0开始排列
/// </summary>
public int Index;
/// <summary>
/// 功能表述
/// </summary>
public string Description;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment