Files
6150-HMI/CowainHmi/Axis/DlgAxisPosData.cs

245 lines
9.2 KiB
C#
Raw Normal View History

2026-01-15 15:06:36 +08:00
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;
}
}
}
}
}