245 lines
9.2 KiB
C#
245 lines
9.2 KiB
C#
using CowainHmi.Properties;
|
||
using PCHMI;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.ComponentModel;
|
||
using System.Data;
|
||
using System.Drawing;
|
||
using System.IO;
|
||
using System.Linq;
|
||
using System.Resources;
|
||
using System.Runtime.InteropServices.ComTypes;
|
||
using System.Security.Cryptography;
|
||
using System.Text;
|
||
using System.Threading.Tasks;
|
||
using System.Windows.Forms;
|
||
using System.Xml.Linq;
|
||
using static System.Net.Mime.MediaTypeNames;
|
||
|
||
namespace CowainHmi
|
||
{
|
||
|
||
public partial class DlgAxisPosData : Form
|
||
{
|
||
private class PosData : INotifyPropertyChanged
|
||
{
|
||
private string setPos;
|
||
private string setVel;
|
||
private bool inPos;
|
||
private bool safe;
|
||
private bool safeLock;
|
||
|
||
public string PosName { get; set; }
|
||
public string SetPos
|
||
{
|
||
get => setPos;
|
||
set
|
||
{
|
||
setPos = value;
|
||
OnPropertyChanged("SetPos");
|
||
}
|
||
}
|
||
public string SetVel
|
||
{
|
||
get => setVel;
|
||
set
|
||
{
|
||
setVel = value;
|
||
OnPropertyChanged("SetVel");
|
||
}
|
||
}
|
||
public bool InPos
|
||
{
|
||
get => inPos;
|
||
set
|
||
{
|
||
inPos = value;
|
||
OnPropertyChanged("InPos");
|
||
}
|
||
}
|
||
|
||
public bool Safe
|
||
{
|
||
get => safe;
|
||
set
|
||
{
|
||
safe = value;
|
||
OnPropertyChanged("Safe");
|
||
}
|
||
}
|
||
|
||
public bool SafeLock
|
||
{
|
||
get => safeLock;
|
||
set
|
||
{
|
||
safeLock = value;
|
||
OnPropertyChanged("SafeLock");
|
||
}
|
||
}
|
||
|
||
public event PropertyChangedEventHandler PropertyChanged;
|
||
|
||
protected virtual void OnPropertyChanged(string propertyName)
|
||
{
|
||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
||
}
|
||
}
|
||
|
||
private enum UnitType
|
||
{
|
||
mm,
|
||
cm,
|
||
m,
|
||
deg,
|
||
rad
|
||
}
|
||
private BindingList<PosData> list = new BindingList<PosData>();
|
||
private int id;
|
||
private int unit;
|
||
private string posAddr;
|
||
private string dataAddr;
|
||
private List<string> posNames;
|
||
public DlgAxisPosData(List<string> posNames, string posAddr, string dataAddr, int id, int unit)
|
||
{
|
||
InitializeComponent();
|
||
this.id = id;
|
||
this.posAddr = posAddr;
|
||
this.dataAddr = dataAddr;
|
||
this.posNames = posNames;
|
||
this.unit = unit;
|
||
for (int i = 0; i < posNames.Count; i++)
|
||
{
|
||
PosData data = new PosData { PosName = posNames[i] };
|
||
list.Add(data);
|
||
}
|
||
this.dgvAxisPos.AutoGenerateColumns = false;
|
||
this.dgvAxisPos.DataSource = list;
|
||
|
||
}
|
||
|
||
private async void DlgAxisPosData_Load(object sender, EventArgs e)
|
||
{
|
||
await GetPosData();
|
||
}
|
||
|
||
private async Task GetPosData()
|
||
{
|
||
for (int i = 0; i < list.Count; i++)
|
||
{
|
||
var pos = PCHMI.VL.GET_INT32(0, $"{posAddr}.{id * 384 + i * 12}");
|
||
var vel = PCHMI.VL.GET_INT32(0, $"{posAddr}.{id * 384 + i * 12 + 8}");
|
||
var inPos = PCHMI.VL.GET_BIT(0, $"{dataAddr}.{id * 60 + 56 + i / 8}.{i % 8}");
|
||
var safe = PCHMI.VL.GET_BIT(0, $"{dataAddr}.{id * 60 + 10 + i / 8}.{i % 8}");
|
||
var safeLock = PCHMI.VL.GET_BIT(0, $"{dataAddr}.{id * 60 + 6 + i / 8}.{i % 8}");
|
||
}
|
||
await Task.Delay(300);
|
||
for (int i = 0; i < list.Count; i++)
|
||
{
|
||
var pos = PCHMI.VL.GET_INT32(0, $"{posAddr}.{id * 384 + i * 12}");
|
||
var vel = PCHMI.VL.GET_INT32(0, $"{posAddr}.{id * 384 + i * 12 + 8}");
|
||
var inPos = PCHMI.VL.GET_BIT(0, $"{dataAddr}.{id * 60 + 56 + i / 8}.{i % 8}");
|
||
var safe = PCHMI.VL.GET_BIT(0, $"{dataAddr}.{id * 60 + 10 + i / 8}.{i % 8}");
|
||
var safeLock = PCHMI.VL.GET_BIT(0, $"{dataAddr}.{id * 60 + 6 + i / 8}.{i % 8}");
|
||
list[i].SetPos = $"{((double)pos / 100.0).ToString("F2")} {(UnitType)unit}";
|
||
list[i].SetVel = $"{vel} {(UnitType)unit}/s";
|
||
list[i].InPos = inPos > 0 ? true : false;
|
||
list[i].Safe = safe > 0 ? true : false;
|
||
list[i].SafeLock = safeLock > 0 ? true : false;
|
||
}
|
||
}
|
||
|
||
|
||
private async void dgvAxisPos_CellClick(object sender, DataGridViewCellEventArgs e)
|
||
{
|
||
if ((e.ColumnIndex == this.dgvAxisPos.Columns["Edit"].Index || e.ColumnIndex == this.dgvAxisPos.Columns["SetPos"].Index || e.ColumnIndex == this.dgvAxisPos.Columns["SetVel"].Index) && e.RowIndex >= 0)
|
||
{
|
||
DlgPosEdit dlg = new DlgPosEdit(posNames[e.RowIndex], posAddr, id, e.RowIndex, unit);
|
||
var result = dlg.ShowDialog();
|
||
if (result == DialogResult.OK)
|
||
{
|
||
await GetPosData();
|
||
}
|
||
}
|
||
else if (e.ColumnIndex == this.dgvAxisPos.Columns["Teach"].Index && e.RowIndex >= 0)
|
||
{
|
||
//按下示教按钮,将轴当前位置设置为目标位置
|
||
var actPos = PCHMI.VL.GET_INT32(0, $"{dataAddr}.{id * 60 + 24}");
|
||
PCHMI.RT.SEND_INT32(0, $"{posAddr}.{id * 384 + e.RowIndex * 12}", actPos);
|
||
PCHMI.OPTLOG.WLOG($"手动按下了点位示教按钮,Axis{id},点位号:{e.RowIndex},原位置:{list[e.RowIndex].SetPos},新位置:{actPos}");
|
||
await GetPosData();
|
||
}
|
||
else if (e.ColumnIndex == this.dgvAxisPos.Columns["Goto"].Index && e.RowIndex >= 0)
|
||
{
|
||
//按下Goto按钮
|
||
PCHMI.RT.SEND_INT16(0, $"{dataAddr}.{id * 60 + 4}", 0);
|
||
await Task.Delay(200);
|
||
var actPos = PCHMI.VL.GET_INT32(0, $"{dataAddr}.{id * 60 + 24}");
|
||
PCHMI.RT.SEND_INT16(0, $"{dataAddr}.{id * 60 + 4}", (short)(100 + e.RowIndex));
|
||
PCHMI.OPTLOG.WLOG($"手动触发了定位按钮,Axis{id},点位号:{e.RowIndex},定位前位置:{actPos},目标位置:{list[e.RowIndex].SetPos}");
|
||
}
|
||
else if (e.ColumnIndex == this.dgvAxisPos.Columns["Safe"].Index && e.RowIndex >= 0)
|
||
{
|
||
//按下解锁按钮
|
||
bool isChecked = PCHMI.VL.GET_BIT(0, $"{dataAddr}.{id * 60 + 10 + e.RowIndex / 8}.{e.RowIndex % 8}") > 0 ? true : false;
|
||
//DataGridViewCheckBoxCell chkBoxCell = (DataGridViewCheckBoxCell)dgvAxisPos.Rows[e.RowIndex].Cells[e.ColumnIndex];
|
||
//bool isChecked = (bool)chkBoxCell.Value;
|
||
if (isChecked)
|
||
{
|
||
PCHMI.RT.SEND_BIT(0, $"{dataAddr}.{id * 60 + 10 + e.RowIndex / 8}.{e.RowIndex % 8}", 0);
|
||
}
|
||
else
|
||
{
|
||
PCHMI.OPTLOG.WLOG($"手动触发解除安全,Axis{id},点位{e.RowIndex}");
|
||
PCHMI.RT.SEND_BIT(0, $"{dataAddr}.{id * 60 + 10 + e.RowIndex / 8}.{e.RowIndex % 8}", 1);
|
||
}
|
||
await GetPosData();
|
||
|
||
}
|
||
}
|
||
|
||
private void dgvAxisPos_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
|
||
{
|
||
new DataGridViewStyle().DgvRowPostPaint(dgvAxisPos, e);
|
||
}
|
||
|
||
private void dgvAxisPos_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
|
||
{
|
||
if (e.ColumnIndex == this.dgvAxisPos.Columns["InPos"].Index && e.Value != null)
|
||
{
|
||
bool inPos = (bool)e.Value;
|
||
if (inPos) // 根据条件判断
|
||
{
|
||
e.CellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
|
||
e.Value = global::CowainHmi.Properties.Resources.有效;
|
||
e.FormattingApplied = true;
|
||
}
|
||
else
|
||
{
|
||
e.CellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
|
||
e.Value = global::CowainHmi.Properties.Resources.无效;
|
||
e.FormattingApplied = true;
|
||
}
|
||
}
|
||
else if (e.ColumnIndex == this.dgvAxisPos.Columns["SafeLock"].Index && e.Value != null)
|
||
{
|
||
bool safeLock = (bool)e.Value;
|
||
if (safeLock) // 根据条件判断
|
||
{
|
||
e.CellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
|
||
e.Value = global::CowainHmi.Properties.Resources.无效;
|
||
e.FormattingApplied = true;
|
||
}
|
||
else
|
||
{
|
||
e.CellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
|
||
e.Value = global::CowainHmi.Properties.Resources.有效;
|
||
e.FormattingApplied = true;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
}
|
||
}
|