1.前后端增加复位功能
2.tcpclient心跳设置 3.优化后端启动速度 4.增加后端出库日志
This commit is contained in:
@ -9,531 +9,43 @@ using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Input;
|
||||
using WCS.Model;
|
||||
using WCS.Model.ApiModel.Home;
|
||||
using 货架标准上位机.Api;
|
||||
|
||||
namespace 货架标准上位机.ViewModel
|
||||
{
|
||||
public class DeviceViewModel : BindableBase
|
||||
{
|
||||
//循环间隙时间
|
||||
int whileSleep = 1500;
|
||||
public ICommand ResetAllShelfCommand { get => new DelegateCommand(ResetAllShelf); }
|
||||
/// <summary>
|
||||
/// 是否繁忙。繁忙状态下不在进行定时刷新操作。
|
||||
/// 打开用户
|
||||
/// </summary>
|
||||
public bool IsBusy { get; set; } = false;
|
||||
//public IIoTBase plc;
|
||||
|
||||
#region 属性
|
||||
/// <summary>
|
||||
/// 监听
|
||||
/// </summary>
|
||||
public IEnumerable<DeviceReadModel> DataReads { get; set; }
|
||||
/// <summary>
|
||||
/// 控制
|
||||
/// </summary>
|
||||
public IEnumerable<DeviceWriteModel> DataWrites { get; set; }
|
||||
/// <summary>
|
||||
/// 气缸
|
||||
/// </summary>
|
||||
public IEnumerable<DeviceUrnModel> DataUrns { get; set; }
|
||||
/// <summary>
|
||||
/// 伺服
|
||||
/// </summary>
|
||||
public IEnumerable<DeviceServoModel> DataServos { get; set; }
|
||||
|
||||
private bool IsVis_ = false;
|
||||
/// <summary>
|
||||
/// 当前页面是否显示
|
||||
/// </summary>
|
||||
public bool IsVis { get => IsVis_; set { SetProperty(ref IsVis_, value); } }
|
||||
|
||||
#region 是否展示
|
||||
private bool IsVisRead_ = true;
|
||||
public bool IsVisRead { get => IsVisRead_; set { SetProperty(ref IsVisRead_, value); } }
|
||||
|
||||
private bool IsVisWrite_ = true;
|
||||
public bool IsVisWrite { get => IsVisWrite_; set { SetProperty(ref IsVisWrite_, value); } }
|
||||
|
||||
private bool IsVisUrn_ = true;
|
||||
public bool IsVisUrn { get => IsVisUrn_; set { SetProperty(ref IsVisUrn_, value); } }
|
||||
|
||||
private bool IsVisServo_ = true;
|
||||
public bool IsVisServo { get => IsVisServo_; set { SetProperty(ref IsVisServo_, value); } }
|
||||
#endregion
|
||||
|
||||
#region 是否折叠
|
||||
private bool IsVisExpRead_ = true;
|
||||
public bool IsVisExpRead { get => IsVisExpRead_; set { SetProperty(ref IsVisExpRead_, value); } }
|
||||
|
||||
private bool IsVisExpWrite_ = true;
|
||||
public bool IsVisExpWrite { get => IsVisExpWrite_; set { SetProperty(ref IsVisExpWrite_, value); } }
|
||||
|
||||
private bool IsVisExpUrn_ = false;
|
||||
public bool IsVisExpUrn { get => IsVisExpUrn_; set { SetProperty(ref IsVisExpUrn_, value); } }
|
||||
|
||||
private bool IsVisExpServo_ = false;
|
||||
public bool IsVisExpServo { get => IsVisExpServo_; set { SetProperty(ref IsVisExpServo_, value); } }
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// 循环读取数据
|
||||
/// </summary>
|
||||
public async void WhileRead()
|
||||
public void ResetAllShelf()
|
||||
{
|
||||
while (true)
|
||||
#region 调用接口 请求重置所有货架的状态
|
||||
var body = new ResetShelfStatusRequest()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!IsVis || IsBusy)
|
||||
{
|
||||
await Task.Delay(whileSleep);
|
||||
continue;
|
||||
}
|
||||
|
||||
////监控
|
||||
if (DataReads != null && IsVisExpRead)
|
||||
{
|
||||
foreach (var item in DataReads)
|
||||
{
|
||||
if (!item.IsExpanded)
|
||||
continue;
|
||||
|
||||
var plcAdd = item.ExcelTag;
|
||||
if (string.IsNullOrWhiteSpace(plcAdd.地址))
|
||||
continue;
|
||||
|
||||
var ts = plcAdd.类型.Trim().ToLower();
|
||||
switch (ts)
|
||||
{
|
||||
case "bool":
|
||||
//var datab = plc?.Read<bool>(plcAdd.地址);
|
||||
//item.Value = datab?.IsSucceed == true ? datab.Value : false;
|
||||
break;
|
||||
case "byte":
|
||||
//var datay = plc?.Read<byte>(plcAdd.地址);
|
||||
//item.Value = datay?.IsSucceed == true ? datay.Value : "-";
|
||||
break;
|
||||
case "int16":
|
||||
//var datai16 = plc?.Read<Int16>(plcAdd.地址);
|
||||
//item.Value = datai16?.IsSucceed == true ? datai16.Value : "-";
|
||||
break;
|
||||
case "int32":
|
||||
//var datai32 = plc?.Read<int>(plcAdd.地址);
|
||||
//item.Value = datai32?.IsSucceed == true ? datai32.Value : "-";
|
||||
break;
|
||||
case "uint16":
|
||||
//var dataui16 = plc?.Read<UInt16>(plcAdd.地址);
|
||||
//item.Value = dataui16?.IsSucceed == true ? dataui16.Value : "-";
|
||||
break;
|
||||
case "uint32":
|
||||
//var dataui32 = plc?.Read<UInt32>(plcAdd.地址);
|
||||
//item.Value = dataui32?.IsSucceed == true ? dataui32.Value : "-";
|
||||
break;
|
||||
case "float":
|
||||
case "single":
|
||||
//var datas = plc?.Read<float>(plcAdd.地址);
|
||||
//item.Value = datas?.IsSucceed == true ? datas.Value : "-";
|
||||
break;
|
||||
case "double":
|
||||
//var datad = plc?.Read<double>(plcAdd.地址);
|
||||
//item.Value = datad?.IsSucceed == true ? datad.Value : "-";
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
////控制
|
||||
if (DataWrites != null && IsVisExpWrite)
|
||||
{
|
||||
foreach (var item in DataWrites)
|
||||
{
|
||||
if (!item.IsExpanded)
|
||||
continue;
|
||||
|
||||
var plcAdd = item.ExcelTag;
|
||||
if (string.IsNullOrWhiteSpace(plcAdd.读地址))
|
||||
continue;
|
||||
|
||||
var ts = plcAdd.类型.Trim().ToLower();
|
||||
switch (ts)
|
||||
{
|
||||
case "bool":
|
||||
//var datab = plc?.Read<bool>(plcAdd.读地址);
|
||||
//item.Value = datab?.IsSucceed == true ? datab.Value : false;
|
||||
break;
|
||||
case "byte":
|
||||
//var datay = plc?.Read<byte>(plcAdd.读地址);
|
||||
//item.Value = datay?.IsSucceed == true ? datay.Value : "-";
|
||||
break;
|
||||
case "int16":
|
||||
//var datai16 = plc?.Read<Int16>(plcAdd.读地址);
|
||||
//item.Value = datai16?.IsSucceed == true ? datai16.Value : "-";
|
||||
break;
|
||||
case "int32":
|
||||
//var datai32 = plc?.Read<int>(plcAdd.读地址);
|
||||
//item.Value = datai32?.IsSucceed == true ? datai32.Value : "-";
|
||||
break;
|
||||
case "uint16":
|
||||
//var dataui16 = plc?.Read<UInt16>(plcAdd.读地址);
|
||||
//item.Value = dataui16?.IsSucceed == true ? dataui16.Value : "-";
|
||||
break;
|
||||
case "uint32":
|
||||
//var dataui32 = plc?.Read<UInt32>(plcAdd.读地址);
|
||||
//item.Value = dataui32?.IsSucceed == true ? dataui32.Value : "-";
|
||||
break;
|
||||
case "float":
|
||||
case "single":
|
||||
//var datas = plc?.Read<float>(plcAdd.读地址);
|
||||
//item.Value = datas?.IsSucceed == true ? datas.Value : "-";
|
||||
break;
|
||||
case "double":
|
||||
//var datad = plc?.Read<double>(plcAdd.读地址);
|
||||
//item.Value = datad?.IsSucceed == true ? datad.Value : "-";
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
////气缸
|
||||
if (DataUrns != null && IsVisExpUrn)
|
||||
{
|
||||
foreach (var item in DataUrns)
|
||||
{
|
||||
if (!item.IsExpanded)
|
||||
continue;
|
||||
|
||||
var plcAdd = item.ExcelTag;
|
||||
if (!string.IsNullOrWhiteSpace(plcAdd.推到位地址))
|
||||
{
|
||||
//var data1 = plc?.Read<bool>(plcAdd.推到位地址);
|
||||
//item.IsGoTo = data1?.IsSucceed == true ? data1.Value : false;
|
||||
}
|
||||
if (!string.IsNullOrWhiteSpace(plcAdd.回到位地址))
|
||||
{
|
||||
//var data2 = plc?.Read<bool>(plcAdd.回到位地址);
|
||||
//item.IsRetTo = data2?.IsSucceed == true ? data2.Value : false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
////伺服
|
||||
if (DataServos != null && IsVisExpServo)
|
||||
{
|
||||
foreach (var item in DataServos)
|
||||
{
|
||||
if (!item.IsExpanded)
|
||||
continue;
|
||||
|
||||
////读取地址信息
|
||||
var plcAdd = item.ExcelTag;
|
||||
if (!string.IsNullOrWhiteSpace(plcAdd.当前位置获取))
|
||||
{
|
||||
//var data1 = plc?.Read<float>(plcAdd.当前位置获取);
|
||||
//item.Location = data1?.IsSucceed == true ? data1.Value : 0;
|
||||
}
|
||||
if (!string.IsNullOrWhiteSpace(plcAdd.手动速度获取) && (item.IsJog || !item.IsFold))
|
||||
{
|
||||
//var data2 = plc?.Read<Int16>(plcAdd.手动速度获取);
|
||||
//item.JogSpeed = data2?.IsSucceed == true ? data2.Value : 0;
|
||||
}
|
||||
if (!string.IsNullOrWhiteSpace(plcAdd.自动速度设置) && (!item.IsJog || !item.IsFold))
|
||||
{
|
||||
//var data3 = plc?.Read<Int16>(plcAdd.自动速度设置);
|
||||
//item.AutoSpeed = data3?.IsSucceed == true ? data3.Value : 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
await Task.Delay(whileSleep);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
|
||||
}
|
||||
IsResetAll = true,
|
||||
GroupNames = LocalFile.Config.GroupName,
|
||||
UserName = LocalStatic.CurrentUser,
|
||||
DeviceType = LocalFile.Config.DeviceType,
|
||||
};
|
||||
var Result = ApiHelp.GetDataFromHttp<ResponseBase>(LocalFile.Config.ApiIpHost + "home/resetShelfStatus", body, "POST");
|
||||
if (Result != null && Result.Code == 200)
|
||||
{
|
||||
Growl.Warning("复位成功!");
|
||||
}
|
||||
}
|
||||
|
||||
/*一起选中【操作控制】【操作气缸】【操作伺服】可以快速解开全部注释*/
|
||||
|
||||
#region 操作控制
|
||||
////单击
|
||||
public void WriteClick(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var data = (DeviceWriteModel)((FrameworkElement)sender).DataContext;
|
||||
var dataExcel = data.ExcelTag;
|
||||
var mode = dataExcel.点动切换?.Trim() ?? "";
|
||||
|
||||
if (dataExcel.类型.Trim().ToLower() == "bool" && mode.StartsWith("切换"))
|
||||
else if (Result != null)
|
||||
{
|
||||
Task.Run(() =>
|
||||
{
|
||||
var boolval = data.Value is true;
|
||||
//plc?.Write(dataExcel.写地址, !boolval);
|
||||
data.Value = !boolval;
|
||||
IotDevice.UserChange?.Invoke(new IotDevice() { Name = data.Name, Type = "控制", Funct = string.Empty, Val = data.Value, Mode = mode });
|
||||
});
|
||||
Growl.Warning(Result.Message);
|
||||
}
|
||||
else
|
||||
{
|
||||
var ts = dataExcel.类型.Trim().ToLower();
|
||||
switch (ts)
|
||||
{
|
||||
case "byte":
|
||||
WriteClickDialog<byte>(data);
|
||||
break;
|
||||
case "int16":
|
||||
WriteClickDialog<Int16>(data);
|
||||
break;
|
||||
case "int32":
|
||||
WriteClickDialog<Int32>(data);
|
||||
break;
|
||||
case "uint16":
|
||||
WriteClickDialog<UInt16>(data);
|
||||
break;
|
||||
case "uint32":
|
||||
WriteClickDialog<UInt32>(data);
|
||||
break;
|
||||
case "float":
|
||||
case "single":
|
||||
WriteClickDialog<float>(data);
|
||||
break;
|
||||
case "double":
|
||||
WriteClickDialog<double>(data);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
Growl.Warning("调用接口失败!");
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
////单击弹框
|
||||
void WriteClickDialog<T>(DeviceWriteModel data) where T : struct
|
||||
{
|
||||
var dataExcel = data.ExcelTag;
|
||||
var val = TipInputView.Show<T>($"请输入新的[{dataExcel.名称}]值:", "修改值", "请输入值");
|
||||
if (!val.HasValue)
|
||||
return;
|
||||
|
||||
//plc?.Write<T>(dataExcel.写地址, val.Value);
|
||||
IotDevice.UserChange?.Invoke(new IotDevice() { Name = data.Name, Type = "控制", Funct = string.Empty, Val = val.Value, Mode = "" });
|
||||
}
|
||||
|
||||
////按下左键
|
||||
public void LeftDown(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
var data = (DeviceWriteModel)((FrameworkElement)sender).DataContext;
|
||||
var dataExcel = data.ExcelTag;
|
||||
var mode = dataExcel.点动切换?.Trim() ?? "";
|
||||
|
||||
if (dataExcel.类型.Trim().ToLower() == "bool" && mode.StartsWith("点动"))
|
||||
{
|
||||
Task.Run(() =>
|
||||
{
|
||||
//plc?.Write(dataExcel.写地址, true);
|
||||
data.Value = true;
|
||||
IotDevice.UserChange?.Invoke(new IotDevice() { Name = data.Name, Type = "控制", Funct = string.Empty, Val = data.Value, Mode = mode });
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
////放开左键
|
||||
public void LeftUp(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
var data = (DeviceWriteModel)((FrameworkElement)sender).DataContext;
|
||||
var dataExcel = data.ExcelTag;
|
||||
var mode = dataExcel.点动切换?.Trim() ?? "";
|
||||
|
||||
if (dataExcel.类型.Trim().ToLower() == "bool" && mode.StartsWith("点动"))
|
||||
{
|
||||
Task.Run(() =>
|
||||
{
|
||||
//plc?.Write(dataExcel.写地址, false);
|
||||
data.Value = false;
|
||||
IotDevice.UserChange?.Invoke(new IotDevice() { Name = data.Name, Type = "控制", Funct = string.Empty, Val = data.Value, Mode = mode });
|
||||
});
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 操作气缸
|
||||
////按钮1单击
|
||||
public void Button1_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var data = (DeviceUrnModel)((FrameworkElement)sender).DataContext;
|
||||
var dataExcel = data.ExcelTag;
|
||||
var mode = dataExcel.点动切换?.Trim() ?? "";
|
||||
|
||||
if (mode.StartsWith("切换"))
|
||||
{
|
||||
Task.Run(() =>
|
||||
{
|
||||
//plc?.Write(dataExcel.推地址, true);
|
||||
//plc?.Write(dataExcel.回地址, false);
|
||||
IotDevice.UserChange?.Invoke(new IotDevice() { Name = data.Name, Type = "气缸", Funct = "推", Val = true, Mode = mode });
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
////按钮1按下
|
||||
public void But1ClickDown(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var data = (DeviceUrnModel)((FrameworkElement)sender).DataContext;
|
||||
var dataExcel = data.ExcelTag;
|
||||
var mode = dataExcel.点动切换?.Trim() ?? "";
|
||||
|
||||
if (mode.StartsWith("点动"))
|
||||
{
|
||||
Task.Run(() =>
|
||||
{
|
||||
//plc?.Write(dataExcel.推地址, true);
|
||||
data.IsGoTo = true;
|
||||
IotDevice.UserChange?.Invoke(new IotDevice() { Name = data.Name, Type = "气缸", Funct = "推", Val = true, Mode = mode });
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
////按钮1松开
|
||||
public void But1ClickUp(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var data = (DeviceUrnModel)((FrameworkElement)sender).DataContext;
|
||||
var dataExcel = data.ExcelTag;
|
||||
var mode = dataExcel.点动切换?.Trim() ?? "";
|
||||
|
||||
if (mode.StartsWith("点动"))
|
||||
{
|
||||
Task.Run(() =>
|
||||
{
|
||||
//plc?.Write(dataExcel.推地址, false);
|
||||
data.IsGoTo = false;
|
||||
IotDevice.UserChange?.Invoke(new IotDevice() { Name = data.Name, Type = "气缸", Funct = "推", Val = false, Mode = mode });
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
////按钮2单击
|
||||
public void Button2_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var data = (DeviceUrnModel)((FrameworkElement)sender).DataContext;
|
||||
var dataExcel = data.ExcelTag;
|
||||
var mode = dataExcel.点动切换?.Trim() ?? "";
|
||||
|
||||
if (mode.StartsWith("切换"))
|
||||
{
|
||||
Task.Run(() =>
|
||||
{
|
||||
//plc?.Write(dataExcel.推地址, false);
|
||||
//plc?.Write(dataExcel.回地址, true);
|
||||
IotDevice.UserChange?.Invoke(new IotDevice() { Name = data.Name, Type = "气缸", Funct = "回", Val = true, Mode = mode });
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
////按钮2按下
|
||||
public void But2ClickDown(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var data = (DeviceUrnModel)((FrameworkElement)sender).DataContext;
|
||||
var dataExcel = data.ExcelTag;
|
||||
var mode = dataExcel.点动切换?.Trim() ?? "";
|
||||
|
||||
if (mode.StartsWith("点动"))
|
||||
{
|
||||
Task.Run(() =>
|
||||
{
|
||||
//plc?.Write(dataExcel.回地址, true);
|
||||
data.IsRetTo = true;
|
||||
IotDevice.UserChange?.Invoke(new IotDevice() { Name = data.Name, Type = "气缸", Funct = "回", Val = true, Mode = mode });
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
////按钮2松开
|
||||
public void But2ClickUp(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var data = (DeviceUrnModel)((FrameworkElement)sender).DataContext;
|
||||
var dataExcel = data.ExcelTag;
|
||||
var mode = dataExcel.点动切换?.Trim() ?? "";
|
||||
|
||||
if (mode.StartsWith("点动"))
|
||||
{
|
||||
Task.Run(() =>
|
||||
{
|
||||
//plc?.Write(dataExcel.回地址, false);
|
||||
data.IsRetTo = false;
|
||||
IotDevice.UserChange?.Invoke(new IotDevice() { Name = data.Name, Type = "气缸", Funct = "回", Val = false, Mode = mode });
|
||||
});
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 操作伺服
|
||||
////尝试改变伺服的位置时
|
||||
public void LocationChange(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var data = (DeviceServoModel)((FrameworkElement)sender).DataContext;
|
||||
var dataExcel = data.ExcelTag;
|
||||
var mode = string.Empty;
|
||||
|
||||
////运动方式
|
||||
if (e.OriginalSource is ServoClickType servoClickType)
|
||||
{
|
||||
if (servoClickType == ServoClickType.StartDotAdd)
|
||||
{
|
||||
//plc?.Write(dataExcel.位置点动加, true);
|
||||
IotDevice.UserChange?.Invoke(new IotDevice() { Name = data.Name, Type = "伺服", Funct = "开始点动加", Val = true, Mode = mode });
|
||||
}
|
||||
else if (servoClickType == ServoClickType.EndDotAdd)
|
||||
{
|
||||
//plc?.Write(dataExcel.位置点动加, false);
|
||||
IotDevice.UserChange?.Invoke(new IotDevice() { Name = data.Name, Type = "伺服", Funct = "结束点动加", Val = false, Mode = mode });
|
||||
}
|
||||
else if (servoClickType == ServoClickType.StartDotSub)
|
||||
{
|
||||
//plc?.Write(dataExcel.位置点动减, true);
|
||||
IotDevice.UserChange?.Invoke(new IotDevice() { Name = data.Name, Type = "伺服", Funct = "开始点动减", Val = true, Mode = mode });
|
||||
}
|
||||
else if (servoClickType == ServoClickType.EndDotSub)
|
||||
{
|
||||
//plc?.Write(dataExcel.位置点动减, false);
|
||||
IotDevice.UserChange?.Invoke(new IotDevice() { Name = data.Name, Type = "伺服", Funct = "结束点动减", Val = false, Mode = mode });
|
||||
}
|
||||
}
|
||||
////运动到指定位置
|
||||
else if (e.OriginalSource is double val)
|
||||
{
|
||||
//plc?.Write(dataExcel.位置移动, Convert.ToSingle(val));
|
||||
data.Location = val;
|
||||
IotDevice.UserChange?.Invoke(new IotDevice() { Name = data.Name, Type = "伺服", Funct = "位置移动", Val = val, Mode = mode });
|
||||
}
|
||||
}
|
||||
|
||||
////尝试改变伺服的速度时
|
||||
public void SpeedChange(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var data = (DeviceServoModel)((FrameworkElement)sender).DataContext;
|
||||
var dataExcel = data.ExcelTag;
|
||||
var mode = string.Empty;
|
||||
|
||||
var data2 = (ServoSpeed)e.OriginalSource;
|
||||
if (data2.Name.StartsWith("手动"))
|
||||
{
|
||||
//plc?.Write(dataExcel.手动速度设置, Convert.ToSingle(data2.Speed));
|
||||
data.JogSpeed = data2.Speed;
|
||||
IotDevice.UserChange?.Invoke(new IotDevice() { Name = data.Name, Type = "伺服", Funct = "手动速度设置", Val = data2.Speed, Mode = mode });
|
||||
}
|
||||
else
|
||||
{
|
||||
//plc?.Write(dataExcel.自动速度设置, Convert.ToSingle(data2.Speed));
|
||||
data.AutoSpeed = data2.Speed;
|
||||
IotDevice.UserChange?.Invoke(new IotDevice() { Name = data.Name, Type = "伺服", Funct = "自动速度设置", Val = data2.Speed, Mode = mode });
|
||||
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
public class DeviceReadModel : BindableBase
|
||||
|
@ -13,126 +13,14 @@
|
||||
<RowDefinition Height="auto"></RowDefinition>
|
||||
<RowDefinition Height="*"></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<GroupBox Header="模式选择" Margin="3" Style="{StaticResource GroupBoxTab}">
|
||||
<GroupBox Header="调试功能" Margin="3" Style="{StaticResource GroupBoxTab}">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Button Margin="5,3" Padding="30,0" Content="初始化"></Button>
|
||||
<Button Margin="5,3" Padding="30,0" Name="resetShelf" Content="货架状态初始化" Command="{Binding ResetAllShelfCommand}"></Button>
|
||||
</StackPanel>
|
||||
</GroupBox>
|
||||
|
||||
<hc:ScrollViewer Grid.Row="1" Margin="3,3" IsInertiaEnabled="True" hc:ScrollViewerAttach.AutoHide="True">
|
||||
<StackPanel Margin="0" Orientation="Vertical">
|
||||
<!--监听-->
|
||||
<Border Style="{StaticResource BorderRegion}" Effect="{StaticResource EffectShadow1}" Visibility="{Binding IsVisRead,Converter={StaticResource Boolean2VisibilityConverter}}">
|
||||
<Expander Style="{StaticResource BaseStyle}" Margin="0" Header="监听" IsExpanded="{Binding IsVisExpRead}">
|
||||
<hc:TransitioningContentControl TransitionMode="Top2BottomWithFade">
|
||||
<!--<local:IotReadListView Margin="0,10,0,0" Data="{Binding DataRead}"/>-->
|
||||
<StackPanel x:Name="stackPanel1">
|
||||
<StackPanel.Resources>
|
||||
<ResourceDictionary>
|
||||
<Style TargetType="pi:IotStateInfo" BasedOn="{StaticResource IotStateInfoStyle}">
|
||||
<Setter Property="Width" Value="150"></Setter>
|
||||
<Setter Property="Margin" Value="3,1"></Setter>
|
||||
<!--<Setter Property="BorderThickness" Value="1"></Setter>-->
|
||||
<Setter Property="Opacity" Value="0.8"></Setter>
|
||||
<Setter Property="OkBrush" Value="DarkTurquoise"></Setter>
|
||||
</Style>
|
||||
</ResourceDictionary>
|
||||
</StackPanel.Resources>
|
||||
<WrapPanel>
|
||||
<pi:IotStateInfo Header="传感器1" Value="false"></pi:IotStateInfo>
|
||||
<pi:IotStateInfo Header="传感器2" Value="True"></pi:IotStateInfo>
|
||||
</WrapPanel>
|
||||
<Expander Header="分组1" IsExpanded="True" BorderThickness="0" Background="{StaticResource DefaultBrush}">
|
||||
<WrapPanel>
|
||||
<pi:IotStateInfo Header="温度1" Value="1.23"></pi:IotStateInfo>
|
||||
</WrapPanel>
|
||||
</Expander>
|
||||
</StackPanel>
|
||||
</hc:TransitioningContentControl>
|
||||
</Expander>
|
||||
</Border>
|
||||
<!--控制-->
|
||||
<Border Margin="0,10,0,0" Style="{StaticResource BorderRegion}" Effect="{StaticResource EffectShadow1}" Visibility="{Binding IsVisWrite,Converter={StaticResource Boolean2VisibilityConverter}}">
|
||||
<Expander Style="{StaticResource BaseStyle}" Margin="0" Header="控制" IsExpanded="{Binding IsVisExpWrite}">
|
||||
<hc:TransitioningContentControl TransitionMode="Top2BottomWithFade">
|
||||
<!--<local:IotWriteListView Margin="0,10,0,0" Data="{Binding DataWrite}"/>-->
|
||||
<StackPanel x:Name="stackPanel2">
|
||||
<StackPanel.Resources>
|
||||
<ResourceDictionary>
|
||||
<Style TargetType="pi:IotStateInfo" BasedOn="{StaticResource IotStateInfoStyle}">
|
||||
<Setter Property="Width" Value="150"></Setter>
|
||||
<Setter Property="Margin" Value="3,1"></Setter>
|
||||
</Style>
|
||||
</ResourceDictionary>
|
||||
</StackPanel.Resources>
|
||||
<WrapPanel>
|
||||
<pi:IotStateInfo Header="传感器1" Value="false"></pi:IotStateInfo>
|
||||
<pi:IotStateInfo Header="传感器2" Value="True"></pi:IotStateInfo>
|
||||
</WrapPanel>
|
||||
<Expander Header="分组1" IsExpanded="True" BorderThickness="0" Background="{StaticResource DefaultBrush}">
|
||||
<WrapPanel>
|
||||
<pi:IotStateInfo Header="温度1" Value="1.23"></pi:IotStateInfo>
|
||||
</WrapPanel>
|
||||
</Expander>
|
||||
</StackPanel>
|
||||
</hc:TransitioningContentControl>
|
||||
</Expander>
|
||||
</Border>
|
||||
<!--气缸-->
|
||||
<Border Margin="0,10,0,0" Style="{StaticResource BorderRegion}" Effect="{StaticResource EffectShadow1}" Visibility="{Binding IsVisUrn,Converter={StaticResource Boolean2VisibilityConverter}}">
|
||||
<Expander Style="{StaticResource BaseStyle}" Margin="0" Header="气缸" IsExpanded="{Binding IsVisExpUrn}">
|
||||
<hc:TransitioningContentControl TransitionMode="Top2BottomWithFade">
|
||||
<!--<local:IotUrnListView Margin="0,10,0,0" Data="{Binding DataUrn}"/>-->
|
||||
<StackPanel x:Name="stackPanel3">
|
||||
<StackPanel.Resources>
|
||||
<ResourceDictionary>
|
||||
<Style TargetType="pi:IotUrnMode" BasedOn="{StaticResource IotUrnModeStyle}">
|
||||
<Setter Property="Margin" Value="3,1"></Setter>
|
||||
</Style>
|
||||
</ResourceDictionary>
|
||||
</StackPanel.Resources>
|
||||
<WrapPanel>
|
||||
<pi:IotUrnMode Text="气缸1"></pi:IotUrnMode>
|
||||
<pi:IotUrnMode Text="气缸1" IsButBadge1="True"></pi:IotUrnMode>
|
||||
</WrapPanel>
|
||||
<Expander Header="分组1" IsExpanded="True" BorderThickness="0" Background="{StaticResource DefaultBrush}">
|
||||
<WrapPanel>
|
||||
<pi:IotUrnMode Text="气缸1"></pi:IotUrnMode>
|
||||
</WrapPanel>
|
||||
</Expander>
|
||||
</StackPanel>
|
||||
</hc:TransitioningContentControl>
|
||||
</Expander>
|
||||
</Border>
|
||||
<!--伺服-->
|
||||
<Border Margin="0,10,0,0" Style="{StaticResource BorderRegion}" Effect="{StaticResource EffectShadow1}" Visibility="{Binding IsVisServo,Converter={StaticResource Boolean2VisibilityConverter}}">
|
||||
<Expander Style="{StaticResource BaseStyle}" Margin="0" Header="伺服" IsExpanded="{Binding IsVisExpServo}">
|
||||
<hc:TransitioningContentControl TransitionMode="Top2BottomWithFade">
|
||||
<!--<local:IotServoListView Margin="0,10,0,0" Data="{Binding DataServo}"/>-->
|
||||
<StackPanel x:Name="stackPanel4">
|
||||
<StackPanel.Resources>
|
||||
<ResourceDictionary>
|
||||
<Style TargetType="pi:IotServoMode" BasedOn="{StaticResource IotServoModeStyle}">
|
||||
<Setter Property="Margin" Value="3,1"></Setter>
|
||||
<Setter Property="VerticalAlignment" Value="Top"></Setter>
|
||||
</Style>
|
||||
</ResourceDictionary>
|
||||
</StackPanel.Resources>
|
||||
<WrapPanel>
|
||||
<pi:IotServoMode Text="伺服1"/>
|
||||
<pi:IotServoMode Text="伺服1"/>
|
||||
</WrapPanel>
|
||||
<Expander Header="分组1" IsExpanded="True" BorderThickness="0" Background="{StaticResource DefaultBrush}">
|
||||
<WrapPanel>
|
||||
<pi:IotServoMode Text="伺服1"/>
|
||||
<pi:IotServoMode Text="伺服1"/>
|
||||
</WrapPanel>
|
||||
</Expander>
|
||||
</StackPanel>
|
||||
</hc:TransitioningContentControl>
|
||||
</Expander>
|
||||
</Border>
|
||||
</StackPanel>
|
||||
|
||||
</hc:ScrollViewer>
|
||||
</Grid>
|
||||
</pi:UserControlBase>
|
||||
|
@ -29,362 +29,19 @@ namespace 货架标准上位机
|
||||
public DeviceView()
|
||||
{
|
||||
InitializeComponent();
|
||||
//viewModel.plc = LocalStatic.Plc;
|
||||
this.DataContext = viewModel;
|
||||
}
|
||||
|
||||
//第一次显示,渲染Ui
|
||||
private void visfir(object sender, EventArgs e)
|
||||
{
|
||||
if (IsInDesignMode)
|
||||
return;
|
||||
|
||||
if (!System.IO.File.Exists(LocalFile.PlcDotPath))
|
||||
{
|
||||
Growl.Info($"没有找到文档[{LocalFile.PlcDotPath}],请联系管理员。");
|
||||
return;
|
||||
}
|
||||
|
||||
//读Excel
|
||||
viewModel.DataReads = ExcelDeviceReadModel.GetDatas();
|
||||
viewModel.DataWrites = ExcelDeviceWriteModel.GetDatas();
|
||||
viewModel.DataUrns = ExcelDeviceUrnModel.GetDatas();
|
||||
viewModel.DataServos = ExcelDeviceServoModel.GetDatas();
|
||||
|
||||
//加载页面
|
||||
ReadUi(viewModel.DataReads);
|
||||
WriteUi(viewModel.DataWrites);
|
||||
UrnUi(viewModel.DataUrns);
|
||||
ServoUi(viewModel.DataServos);
|
||||
|
||||
//展示限制
|
||||
viewModel.IsVisRead = viewModel.DataReads.Any();
|
||||
viewModel.IsVisWrite = viewModel.DataWrites.Any();
|
||||
viewModel.IsVisUrn = viewModel.DataUrns.Any();
|
||||
viewModel.IsVisServo = viewModel.DataServos.Any();
|
||||
|
||||
Task.Run(viewModel.WhileRead);
|
||||
}
|
||||
|
||||
private void vis(object sender, DependencyPropertyChangedEventArgs e)
|
||||
{
|
||||
if (IsInDesignMode)
|
||||
return;
|
||||
|
||||
viewModel.IsVis = (bool)e.NewValue;
|
||||
}
|
||||
|
||||
#region 渲染页面
|
||||
void ReadUi(IEnumerable<DeviceReadModel> data)
|
||||
{
|
||||
stackPanel1.Children.Clear();
|
||||
if (data == null || !data.Any())
|
||||
return;
|
||||
|
||||
var moren = data.Where(o => string.IsNullOrWhiteSpace(o.ExcelTag.组名));
|
||||
var group = data.Where(o => !string.IsNullOrWhiteSpace(o.ExcelTag.组名)).GroupBy(o => o.ExcelTag.组名);
|
||||
|
||||
if (moren.Any())
|
||||
{
|
||||
WrapPanel wrapPanel = new WrapPanel();
|
||||
foreach (var item in moren)
|
||||
{
|
||||
item.Value = item.ExcelTag.类型.Trim().ToLower() == "bool" ? false : "-";
|
||||
item.IsExpanded = true;
|
||||
|
||||
IotStateInfo iotState = new IotStateInfo();
|
||||
iotState.DataContext = item;
|
||||
iotState.SetBinding(IotStateInfo.HeaderProperty, nameof(item.Name));
|
||||
iotState.SetBinding(IotStateInfo.ValueProperty, nameof(item.Value));
|
||||
iotState.SetBinding(IotStateInfo.PostfixProperty, $"{nameof(item.ExcelTag)}.{nameof(item.ExcelTag.单位)}");
|
||||
|
||||
wrapPanel.Children.Add(iotState);
|
||||
}
|
||||
stackPanel1.Children.Add(wrapPanel);
|
||||
}
|
||||
if (group.Any())
|
||||
{
|
||||
foreach (var item in group)
|
||||
{
|
||||
Expander expander = new Expander();
|
||||
expander.Header = item.Key;
|
||||
expander.Tag = item;
|
||||
expander.Expanded += (s, e) =>
|
||||
{
|
||||
var c = (IGrouping<string, DeviceReadModel>)((Expander)s).Tag;
|
||||
foreach (var item in c)
|
||||
{
|
||||
item.IsExpanded = true;
|
||||
}
|
||||
};
|
||||
expander.Collapsed += (s, e) =>
|
||||
{
|
||||
var c = (IGrouping<string, DeviceReadModel>)((Expander)s).Tag;
|
||||
foreach (var item in c)
|
||||
{
|
||||
item.IsExpanded = false;
|
||||
}
|
||||
};
|
||||
|
||||
WrapPanel wrapPanel = new WrapPanel();
|
||||
foreach (var item2 in item)
|
||||
{
|
||||
item2.Value = item2.ExcelTag.类型.Trim().ToLower() == "bool" ? false : "-";
|
||||
|
||||
IotStateInfo iotState = new IotStateInfo();
|
||||
iotState.DataContext = item2;
|
||||
iotState.SetBinding(IotStateInfo.HeaderProperty, nameof(item2.Name));
|
||||
iotState.SetBinding(IotStateInfo.ValueProperty, nameof(item2.Value));
|
||||
iotState.SetBinding(IotStateInfo.PostfixProperty, $"{nameof(item2.ExcelTag)}.{nameof(item2.ExcelTag.单位)}");
|
||||
|
||||
wrapPanel.Children.Add(iotState);
|
||||
}
|
||||
expander.Content = wrapPanel;
|
||||
stackPanel1.Children.Add(expander);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void WriteUi(IEnumerable<DeviceWriteModel> data)
|
||||
{
|
||||
if (true)
|
||||
{
|
||||
stackPanel2.Children.Clear();
|
||||
if (data == null || !data.Any())
|
||||
return;
|
||||
|
||||
var moren = data.Where(o => string.IsNullOrWhiteSpace(o.ExcelTag.组名));
|
||||
var group = data.Where(o => !string.IsNullOrWhiteSpace(o.ExcelTag.组名)).GroupBy(o => o.ExcelTag.组名);
|
||||
|
||||
if (moren.Any())
|
||||
{
|
||||
WrapPanel wrapPanel = new WrapPanel();
|
||||
foreach (var item in moren)
|
||||
{
|
||||
item.Value = item.ExcelTag.类型.Trim().ToLower() == "bool" ? false : "-";
|
||||
item.IsExpanded = true;
|
||||
|
||||
IotStateInfo iotState = new IotStateInfo();
|
||||
iotState.DataContext = item;
|
||||
iotState.Click += viewModel.WriteClick;
|
||||
iotState.PreviewMouseLeftButtonDown += viewModel.LeftDown;
|
||||
iotState.PreviewMouseLeftButtonUp += viewModel.LeftUp;
|
||||
iotState.SetBinding(IotStateInfo.HeaderProperty, nameof(item.Name));
|
||||
iotState.SetBinding(IotStateInfo.ValueProperty, nameof(item.Value));
|
||||
iotState.SetBinding(IotStateInfo.PostfixProperty, $"{nameof(item.ExcelTag)}.{nameof(item.ExcelTag.单位)}");
|
||||
|
||||
wrapPanel.Children.Add(iotState);
|
||||
}
|
||||
stackPanel2.Children.Add(wrapPanel);
|
||||
}
|
||||
if (group.Any())
|
||||
{
|
||||
foreach (var item in group)
|
||||
{
|
||||
Expander expander = new Expander();
|
||||
expander.Header = item.Key;
|
||||
expander.Tag = item;
|
||||
expander.Expanded += (s, e) =>
|
||||
{
|
||||
var c = (IGrouping<string, DeviceWriteModel>)((Expander)s).Tag;
|
||||
foreach (var item in c)
|
||||
{
|
||||
item.IsExpanded = true;
|
||||
}
|
||||
};
|
||||
expander.Collapsed += (s, e) =>
|
||||
{
|
||||
var c = (IGrouping<string, DeviceWriteModel>)((Expander)s).Tag;
|
||||
foreach (var item in c)
|
||||
{
|
||||
item.IsExpanded = false;
|
||||
}
|
||||
};
|
||||
|
||||
WrapPanel wrapPanel = new WrapPanel();
|
||||
foreach (var item2 in item)
|
||||
{
|
||||
item2.Value = item2.ExcelTag.类型.Trim().ToLower() == "bool" ? false : "-";
|
||||
|
||||
IotStateInfo iotState = new IotStateInfo();
|
||||
iotState.DataContext = item2;
|
||||
iotState.Click += viewModel.WriteClick;
|
||||
iotState.PreviewMouseLeftButtonDown += viewModel.LeftDown;
|
||||
iotState.PreviewMouseLeftButtonUp += viewModel.LeftUp;
|
||||
iotState.SetBinding(IotStateInfo.HeaderProperty, nameof(item2.Name));
|
||||
iotState.SetBinding(IotStateInfo.ValueProperty, nameof(item2.Value));
|
||||
iotState.SetBinding(IotStateInfo.PostfixProperty, $"{nameof(item2.ExcelTag)}.{nameof(item2.ExcelTag.单位)}");
|
||||
|
||||
wrapPanel.Children.Add(iotState);
|
||||
}
|
||||
expander.Content = wrapPanel;
|
||||
stackPanel2.Children.Add(expander);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UrnUi(IEnumerable<DeviceUrnModel> data)
|
||||
{
|
||||
if (true)
|
||||
{
|
||||
stackPanel3.Children.Clear();
|
||||
if (data == null || !data.Any())
|
||||
return;
|
||||
|
||||
var moren = data.Where(o => string.IsNullOrWhiteSpace(o.ExcelTag.组名));
|
||||
var group = data.Where(o => !string.IsNullOrWhiteSpace(o.ExcelTag.组名)).GroupBy(o => o.ExcelTag.组名);
|
||||
|
||||
if (moren.Any())
|
||||
{
|
||||
WrapPanel wrapPanel = new WrapPanel();
|
||||
foreach (var item in moren)
|
||||
{
|
||||
item.IsExpanded = true;
|
||||
|
||||
IotUrnMode iotUrn = new IotUrnMode();
|
||||
iotUrn.DataContext = item;
|
||||
iotUrn.SetBinding(IotUrnMode.TextProperty, nameof(item.Name));
|
||||
iotUrn.SetBinding(IotUrnMode.IsButBadge1Property, nameof(item.IsGoTo));
|
||||
iotUrn.SetBinding(IotUrnMode.IsButBadge2Property, nameof(item.IsRetTo));
|
||||
iotUrn.Button1.Click += viewModel.Button1_Click;
|
||||
iotUrn.Button1.PreviewMouseLeftButtonDown += viewModel.But1ClickDown;
|
||||
iotUrn.Button1.PreviewMouseLeftButtonUp += viewModel.But1ClickUp;
|
||||
iotUrn.Button2.Click += viewModel.Button2_Click;
|
||||
iotUrn.Button2.PreviewMouseLeftButtonDown += viewModel.But2ClickDown;
|
||||
iotUrn.Button2.PreviewMouseLeftButtonUp += viewModel.But2ClickUp;
|
||||
|
||||
wrapPanel.Children.Add(iotUrn);
|
||||
}
|
||||
stackPanel3.Children.Add(wrapPanel);
|
||||
}
|
||||
if (group.Any())
|
||||
{
|
||||
foreach (var item in group)
|
||||
{
|
||||
Expander expander = new Expander();
|
||||
expander.Header = item.Key;
|
||||
expander.Tag = item;
|
||||
expander.Expanded += (s, e) =>
|
||||
{
|
||||
var c = (IGrouping<string, DeviceUrnModel>)((Expander)s).Tag;
|
||||
foreach (var item in c)
|
||||
{
|
||||
item.IsExpanded = true;
|
||||
}
|
||||
};
|
||||
expander.Collapsed += (s, e) =>
|
||||
{
|
||||
var c = (IGrouping<string, DeviceUrnModel>)((Expander)s).Tag;
|
||||
foreach (var item in c)
|
||||
{
|
||||
item.IsExpanded = false;
|
||||
}
|
||||
};
|
||||
|
||||
WrapPanel wrapPanel = new WrapPanel();
|
||||
foreach (var item2 in item)
|
||||
{
|
||||
IotUrnMode iotUrn = new IotUrnMode();
|
||||
iotUrn.DataContext = item2;
|
||||
iotUrn.SetBinding(IotUrnMode.TextProperty, nameof(item2.Name));
|
||||
iotUrn.SetBinding(IotUrnMode.IsButBadge1Property, nameof(item2.IsGoTo));
|
||||
iotUrn.SetBinding(IotUrnMode.IsButBadge2Property, nameof(item2.IsRetTo));
|
||||
iotUrn.Button1.Click += viewModel.Button1_Click;
|
||||
iotUrn.Button1.PreviewMouseLeftButtonDown += viewModel.But1ClickDown;
|
||||
iotUrn.Button1.PreviewMouseLeftButtonUp += viewModel.But1ClickUp;
|
||||
iotUrn.Button2.Click += viewModel.Button2_Click;
|
||||
iotUrn.Button2.PreviewMouseLeftButtonDown += viewModel.But2ClickDown;
|
||||
iotUrn.Button2.PreviewMouseLeftButtonUp += viewModel.But2ClickUp;
|
||||
|
||||
wrapPanel.Children.Add(iotUrn);
|
||||
}
|
||||
expander.Content = wrapPanel;
|
||||
stackPanel3.Children.Add(expander);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ServoUi(IEnumerable<DeviceServoModel> data)
|
||||
{
|
||||
if (true)
|
||||
{
|
||||
stackPanel4.Children.Clear();
|
||||
if (data == null || !data.Any())
|
||||
return;
|
||||
|
||||
var moren = data.Where(o => string.IsNullOrWhiteSpace(o.ExcelTag.组名));
|
||||
var group = data.Where(o => !string.IsNullOrWhiteSpace(o.ExcelTag.组名)).GroupBy(o => o.ExcelTag.组名);
|
||||
|
||||
if (moren.Any())
|
||||
{
|
||||
WrapPanel wrapPanel = new WrapPanel();
|
||||
foreach (var item in moren)
|
||||
{
|
||||
item.IsExpanded = true;
|
||||
|
||||
IotServoMode iotServo = new IotServoMode();
|
||||
iotServo.DataContext = item;
|
||||
iotServo.SetBinding(IotServoMode.TextProperty, nameof(item.Name));
|
||||
iotServo.SetBinding(IotServoMode.Speed1Property, nameof(item.JogSpeed));
|
||||
iotServo.SetBinding(IotServoMode.Speed2Property, nameof(item.AutoSpeed));
|
||||
iotServo.SetBinding(IotServoMode.LocationProperty, nameof(item.Location));
|
||||
iotServo.SetBinding(IotServoMode.IsVis1Property, new Binding(nameof(item.IsJog)) { Mode = BindingMode.TwoWay });
|
||||
iotServo.SetBinding(IotServoMode.IsFoldProperty, new Binding(nameof(item.IsFold)) { Mode = BindingMode.TwoWay });
|
||||
iotServo.LocationChange += viewModel.LocationChange;
|
||||
iotServo.SpeedChange += viewModel.SpeedChange;
|
||||
|
||||
wrapPanel.Children.Add(iotServo);
|
||||
}
|
||||
stackPanel4.Children.Add(wrapPanel);
|
||||
}
|
||||
if (group.Any())
|
||||
{
|
||||
foreach (var item in group)
|
||||
{
|
||||
Expander expander = new Expander();
|
||||
expander.Header = item.Key;
|
||||
expander.Tag = item;
|
||||
expander.Expanded += (s, e) =>
|
||||
{
|
||||
var c = (IGrouping<string, DeviceServoModel>)((Expander)s).Tag;
|
||||
foreach (var item in c)
|
||||
{
|
||||
item.IsExpanded = true;
|
||||
}
|
||||
};
|
||||
expander.Collapsed += (s, e) =>
|
||||
{
|
||||
var c = (IGrouping<string, DeviceServoModel>)((Expander)s).Tag;
|
||||
foreach (var item in c)
|
||||
{
|
||||
item.IsExpanded = false;
|
||||
}
|
||||
};
|
||||
|
||||
WrapPanel wrapPanel = new WrapPanel();
|
||||
foreach (var item2 in item)
|
||||
{
|
||||
IotServoMode iotServo = new IotServoMode();
|
||||
iotServo.DataContext = item2;
|
||||
iotServo.SetBinding(IotServoMode.TextProperty, nameof(item2.Name));
|
||||
iotServo.SetBinding(IotServoMode.Speed1Property, nameof(item2.JogSpeed));
|
||||
iotServo.SetBinding(IotServoMode.Speed2Property, nameof(item2.AutoSpeed));
|
||||
iotServo.SetBinding(IotServoMode.LocationProperty, nameof(item2.Location));
|
||||
iotServo.SetBinding(IotServoMode.IsVis1Property, new Binding(nameof(item2.IsJog)) { Mode = BindingMode.TwoWay });
|
||||
iotServo.SetBinding(IotServoMode.IsFoldProperty, new Binding(nameof(item2.IsFold)) { Mode = BindingMode.TwoWay });
|
||||
iotServo.LocationChange += viewModel.LocationChange;
|
||||
iotServo.SpeedChange += viewModel.SpeedChange;
|
||||
|
||||
wrapPanel.Children.Add(iotServo);
|
||||
}
|
||||
expander.Content = wrapPanel;
|
||||
stackPanel4.Children.Add(expander);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
@ -267,11 +267,6 @@
|
||||
<View:DeviceView Margin="0,5"/>
|
||||
</hc:TransitioningContentControl>
|
||||
</TabItem>
|
||||
<TabItem Header="扫码枪">
|
||||
<hc:TransitioningContentControl TransitionMode="Fade">
|
||||
<pi:TextBoxScanner Style="{StaticResource TextBoxExtend.Multi}" hc:InfoElement.Placeholder="鼠标点击此处激活" hc:InfoElement.Title="码信息" hc:InfoElement.TitlePlacement="Top" AutoClear="NextClear" IsAutoFocus="True"></pi:TextBoxScanner>
|
||||
</hc:TransitioningContentControl>
|
||||
</TabItem>
|
||||
</TabControl>
|
||||
</TabItem>
|
||||
|
||||
|
@ -41,7 +41,7 @@
|
||||
<TextBox Grid.Column="3"
|
||||
VerticalAlignment="Center" HorizontalAlignment="Stretch"
|
||||
FontSize="18" MinWidth="90" Text="{Binding ModuleCode}"></TextBox>
|
||||
|
||||
|
||||
<Button Style="{StaticResource ButtonSuccess}" hc:BorderElement.CornerRadius="15"
|
||||
Grid.Column="9" MinHeight="40" FontSize="18" Content=" 搜索" FontFamily="{StaticResource IconFont}"
|
||||
Command="{Binding BtnSearchCommand}">
|
||||
@ -61,26 +61,20 @@
|
||||
<RowDefinition Height="0.8*"></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<DataGrid Grid.Row="1"
|
||||
SelectedItem="{Binding SelectedataGridItem}"
|
||||
Name="dataGrid"
|
||||
ItemsSource="{Binding DataGridItemSource}"
|
||||
SelectionChanged="dataGrid_SelectionChanged"
|
||||
RowHeight="39"
|
||||
AutoGenerateColumns="False" FontSize="13">
|
||||
<DataGrid
|
||||
Grid.Row="1"
|
||||
SelectedItem="{Binding SelectedataGridItem}"
|
||||
Name="dataGrid"
|
||||
ItemsSource="{Binding DataGridItemSource}"
|
||||
SelectionChanged="dataGrid_SelectionChanged"
|
||||
RowHeight="39"
|
||||
AutoGenerateColumns="False" FontSize="13">
|
||||
<DataGrid.ContextMenu>
|
||||
<ContextMenu Name="dgmenu1" StaysOpen="true">
|
||||
<MenuItem Header="查询当前标定值/电压值" Click="MenuItem_Click"/>
|
||||
</ContextMenu>
|
||||
</DataGrid.ContextMenu>
|
||||
<DataGrid.Columns>
|
||||
<!--<DataGridTemplateColumn CanUserResize="False">
|
||||
<DataGridTemplateColumn.CellTemplate>
|
||||
<DataTemplate>
|
||||
<CheckBox Width="30" Height="30" IsHitTestVisible="False" IsChecked="{Binding IsSelected}"/>
|
||||
</DataTemplate>
|
||||
</DataGridTemplateColumn.CellTemplate>
|
||||
<DataGridTemplateColumn.HeaderTemplate>
|
||||
<DataTemplate>
|
||||
<CheckBox Width="30" Height="30" Unchecked="allChecked_Unchecked" Checked="allChecked_Checked" Name="allChecked"/>
|
||||
</DataTemplate>
|
||||
</DataGridTemplateColumn.HeaderTemplate>
|
||||
</DataGridTemplateColumn>-->
|
||||
<DataGridTextColumn IsReadOnly="True" Header="序号" Binding="{Binding RowNumber}"></DataGridTextColumn>
|
||||
<DataGridTextColumn IsReadOnly="True" Header="货架编码" Binding="{Binding ShelfCode}"></DataGridTextColumn>
|
||||
<DataGridTextColumn IsReadOnly="True" Header="模组编码" Binding="{Binding ModuleCode}"></DataGridTextColumn>
|
||||
|
@ -86,5 +86,14 @@ namespace 货架标准上位机
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
private void MenuItem_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
//先获取选中的模组
|
||||
var module = viewModel.SelectedataGridItem;
|
||||
#region 调用接口 发送指令获取
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -94,7 +94,7 @@
|
||||
<ComboBox ItemsSource="{Binding LogTimeData}" SelectedValue="{Binding SaveLogDay}" SelectedValuePath="Key" DisplayMemberPath="Value" hc:InfoElement.Placeholder="日志缓存保存时间" hc:InfoElement.Title=""/>
|
||||
</StackPanel>
|
||||
</GroupBox>
|
||||
<GroupBox Header="其他列子" Margin="5" Padding="5" Style="{StaticResource GroupBoxTab}" Background="{x:Null}">
|
||||
<!--<GroupBox Header="其他列子" Margin="5" Padding="5" Style="{StaticResource GroupBoxTab}" Background="{x:Null}">
|
||||
<StackPanel>
|
||||
<TextBlock>文本框</TextBlock>
|
||||
<TextBox hc:InfoElement.Placeholder="请输入值" hc:InfoElement.Title="" hc:InfoElement.TitlePlacement="Left"></TextBox>
|
||||
@ -110,7 +110,7 @@
|
||||
<TextBox hc:InfoElement.Placeholder="请输入值" hc:InfoElement.TitlePlacement="Left" hc:InfoElement.Title="-" Margin="-5,5,0,5"></TextBox>
|
||||
</UniformGrid>
|
||||
</StackPanel>
|
||||
</GroupBox>
|
||||
</GroupBox>-->
|
||||
</hc:WaterfallPanel>
|
||||
</hc:ScrollViewer>
|
||||
<Button Grid.Row="1" Margin="3" Content="保存" FontSize="16" Height="36" Padding="0" hc:IconElement.Geometry="{StaticResource SaveGeometry}" hc:IconElement.Height="16" Command="{Binding SaveCommand}" Style="{StaticResource ButtonPrimary}" HorizontalAlignment="Stretch"/>
|
||||
|
@ -2,9 +2,9 @@
|
||||
//连接不上加:SslMode=none;
|
||||
"MySql": "server=localhost;Database=db1;Uid=root;Pwd=123456;Convert Zero Datetime=True",
|
||||
//货架服务器的IP和端口号
|
||||
"ApiIpHost": "http://127.0.0.1:8888/",
|
||||
"ApiIpHost": "http://192.168.9.183:8888/",
|
||||
//WebSocket的地址
|
||||
"WebSocketUrl": "ws://127.0.0.1:7789/ws",
|
||||
"WebSocketUrl": "ws://192.168.9.183:7789/ws",
|
||||
//货架分区
|
||||
"GroupName": [ "C0"],
|
||||
//设备类型 可以配置为每个电脑不一样
|
||||
|
Reference in New Issue
Block a user