1155 lines
40 KiB
C#
1155 lines
40 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
using System.Drawing;
|
|
using System.Globalization;
|
|
using System.Linq;
|
|
using System.Security.Cryptography.X509Certificates;
|
|
using System.Text;
|
|
using System.Windows.Forms;
|
|
using System.Windows.Forms.VisualStyles;
|
|
using static AGVEmulator.DevAGV;
|
|
|
|
namespace AGVEmulator
|
|
{
|
|
public partial class Form1 : Form
|
|
{
|
|
arUtil.Log logPLC, logAGV, logBMS, logCAL;
|
|
DevBMS BMS;
|
|
DevAGV AGV;
|
|
DevPLC PLC;
|
|
DevCAL CAL;
|
|
|
|
|
|
float BMS_MaxA = 80f;
|
|
float BMS_Remain = 79f;
|
|
float BMS_CurA = 70f;
|
|
float BMS_Volt = 25.4f;
|
|
|
|
UInt16[] cellvolt = new UInt16[] { 0, 0, 0, 0, 0, 0, 0, 0 };
|
|
|
|
|
|
public Form1()
|
|
{
|
|
InitializeComponent();
|
|
logPLC = new arUtil.Log();
|
|
logAGV = new arUtil.Log();
|
|
logBMS = new arUtil.Log();
|
|
logCAL = new arUtil.Log();
|
|
|
|
logPLC.FileNameFormat = "{yyyyMMdd}_PLC";
|
|
logAGV.FileNameFormat = "{yyyyMMdd}_AGV";
|
|
logBMS.FileNameFormat = "{yyyyMMdd}_BMS";
|
|
logCAL.FileNameFormat = "{yyyyMMdd}_CAL";
|
|
|
|
logPLC.RaiseMsg += (s1, e1, d1) => { this.rtPLC.AddMsg(s1, e1, d1); };
|
|
logAGV.RaiseMsg += (s1, e1, d1) =>
|
|
{
|
|
if (d1.StartsWith("Tx"))
|
|
this.rtAGV.AddMsg(s1, e1, d1);
|
|
else
|
|
this.rtAGVPro.AddMsg(s1, e1, d1);
|
|
};
|
|
logBMS.RaiseMsg += (s1, e1, d1) => { this.rtBMS.AddMsg(s1, e1, d1); };
|
|
logCAL.RaiseMsg += (s1, e1, d1) => { this.rtCAL.AddMsg(s1, e1, d1); };
|
|
|
|
|
|
var logcolor = new arCtl.sLogMessageColor[] {
|
|
new arCtl.sLogMessageColor("NORM", Color.White),
|
|
new arCtl.sLogMessageColor("INF", Color.SkyBlue),
|
|
new arCtl.sLogMessageColor("WARN", Color.Tomato),
|
|
new arCtl.sLogMessageColor("ERR", Color.Red),
|
|
new arCtl.sLogMessageColor("RX", Color.Lime),
|
|
new arCtl.sLogMessageColor("TX", Color.Orange),
|
|
};
|
|
|
|
rtPLC.ColorList = logcolor;
|
|
rtAGV.ColorList = logcolor;
|
|
rtBMS.ColorList = logcolor;
|
|
rtCAL.ColorList = logcolor;
|
|
rtAGVPro.ColorList = logcolor;
|
|
|
|
this.FormClosed += Form1_FormClosed;
|
|
|
|
BMS = new DevBMS();
|
|
AGV = new DevAGV();
|
|
PLC = new DevPLC();
|
|
CAL = new DevCAL();
|
|
this.serAGV.dev = AGV;
|
|
this.serPLC.dev = PLC;
|
|
this.serBMS.dev = BMS;
|
|
this.serCAL.dev = CAL;
|
|
|
|
BMS.Message += Bms_Message;
|
|
AGV.Message += Bms_Message;
|
|
PLC.Message += Bms_Message;
|
|
CAL.Message += Bms_Message;
|
|
|
|
BMS.RequestBatteryData += Bms_RequestBatteryData;
|
|
BMS.RequestVoltageData += BMS_RequestVoltageData;
|
|
PLC.RequestData += Plc_RequestData;
|
|
PLC.ValueChanged += Plc_ValueChanged;
|
|
AGV.RequestStatusData += Agv_RequestStatusData;
|
|
AGV.ValueChanged += Agv_ValueChanged;
|
|
AGV.StsValueChanged += Agv_StsValueChanged;
|
|
AGV.Command += Agv_Command;
|
|
|
|
}
|
|
|
|
|
|
|
|
Random rnd;
|
|
private void Form1_Load(object sender, EventArgs e)
|
|
{
|
|
rnd = new Random(3000);
|
|
|
|
serAGV.BaudRate = 57600;
|
|
serPLC.BaudRate = 57600;
|
|
trackBar1_Scroll(null, null);
|
|
timer1.Start();
|
|
|
|
//plc inout 이름 설정
|
|
List<string> titles = new List<string>();
|
|
List<bool> values = new List<bool>();
|
|
for (int i = 0; i < 16; i++)
|
|
{
|
|
var pin = (DevPLC.DIName)i;
|
|
titles.Add(pin.ToString());
|
|
values.Add(false);
|
|
}
|
|
for (int i = 0; i < 8; i++)
|
|
{
|
|
var pin = (DevPLC.DOName)i;
|
|
titles.Add(pin.ToString());
|
|
values.Add(false);
|
|
}
|
|
this.gvdPLCInOut.setTitle(titles.ToArray());
|
|
this.gvdPLCInOut.setValue(values.ToArray());
|
|
|
|
|
|
titles.Clear();
|
|
values.Clear();
|
|
for (int i = 0; i < 32; i++)
|
|
{
|
|
titles.Add(i.ToString());
|
|
values.Add(false);
|
|
}
|
|
this.gvdPLCFlag.setTitle(titles.ToArray());
|
|
this.gvdPLCFlag.setValue(values.ToArray());
|
|
this.gvdPLCInOut.ItemClick += GvdPLCInOut_ItemClick;
|
|
this.gvdPLCFlag.ItemClick += GvdPLCFlag_ItemClick;
|
|
this.gvdPLCFlag.ColorList = new arFrame.Control.ColorListItem[] {
|
|
new arFrame.Control.ColorListItem(){ BackColor1 = Color.DimGray, BackColor2 = Color.Gray },
|
|
new arFrame.Control.ColorListItem(){ BackColor1 = Color.Green, BackColor2 = Color.Lime },
|
|
new arFrame.Control.ColorListItem(){ BackColor1 = Color.Red, BackColor2 = Color.Tomato },
|
|
};
|
|
this.gvdPLCInOut.ColorList = this.gvdPLCFlag.ColorList;
|
|
|
|
var arrs = Enum.GetNames(typeof(DevAGV.esystemflag0));
|
|
foreach (var item in arrs)
|
|
{
|
|
var data = (DevAGV.esystemflag0)Enum.Parse(typeof(DevAGV.esystemflag0), item);
|
|
|
|
var chk = new CheckBox();
|
|
chk.Text = $"[{(int)data:00}] {item}";
|
|
chk.AutoSize = true;
|
|
chk.Visible = true;
|
|
chk.Tag = (int)data;
|
|
chk.Dock = DockStyle.Top;
|
|
chk.CheckedChanged += Chk_CheckedChanged;
|
|
this.panel6.Controls.Add(chk);
|
|
chk.Checked = true; //기본값 rue
|
|
}
|
|
arrs = Enum.GetNames(typeof(DevAGV.esystemflag1));
|
|
foreach (var item in arrs)
|
|
{
|
|
var data = (DevAGV.esystemflag1)Enum.Parse(typeof(DevAGV.esystemflag1), item);
|
|
|
|
var chk = new CheckBox();
|
|
chk.Text = $"[{(int)data:00}] {item}";
|
|
chk.AutoSize = true;
|
|
chk.Visible = true;
|
|
chk.Tag = (int)data;
|
|
chk.Dock = DockStyle.Top;
|
|
chk.CheckedChanged += Chk_CheckedChanged;
|
|
this.panel7.Controls.Add(chk);
|
|
}
|
|
arrs = Enum.GetNames(typeof(DevAGV.esignal));
|
|
foreach (var item in arrs)
|
|
{
|
|
var data = (DevAGV.esignal)Enum.Parse(typeof(DevAGV.esignal), item);
|
|
|
|
var chk = new CheckBox();
|
|
chk.Text = $"[{(int)data:00}] {item}";
|
|
chk.AutoSize = true;
|
|
chk.Visible = true;
|
|
chk.Tag = (int)data;
|
|
chk.Dock = DockStyle.Top;
|
|
chk.CheckedChanged += Chk_CheckedChanged;
|
|
this.panel8.Controls.Add(chk);
|
|
}
|
|
arrs = Enum.GetNames(typeof(DevAGV.eerror));
|
|
foreach (var item in arrs)
|
|
{
|
|
var data = (DevAGV.eerror)Enum.Parse(typeof(DevAGV.eerror), item);
|
|
|
|
var chk = new CheckBox();
|
|
chk.Text = $"[{(int)data:00}] {item}";
|
|
chk.AutoSize = true;
|
|
chk.Visible = true;
|
|
chk.Tag = (int)data;
|
|
chk.Dock = DockStyle.Top;
|
|
chk.CheckedChanged += Chk_CheckedChanged;
|
|
this.panel9.Controls.Add(chk);
|
|
}
|
|
|
|
//기본 중지상태로 변환
|
|
AGV.SetAGV(DevAGV.esystemflag1.agv_stop, true);
|
|
|
|
foreach (RadioButton rad in groupBox5.Controls)
|
|
{
|
|
rad.CheckedChanged += (s1, e1) =>
|
|
{
|
|
if (rad.Checked)
|
|
{
|
|
AGV.sts_dir = rad.Text[0];
|
|
}
|
|
};
|
|
}
|
|
foreach (RadioButton rad in groupBox2.Controls)
|
|
{
|
|
rad.CheckedChanged += (s1, e1) =>
|
|
{
|
|
if (rad.Checked)
|
|
{
|
|
AGV.sts_bunki = rad.Text[0];
|
|
}
|
|
};
|
|
}
|
|
foreach (RadioButton rad in groupBox4.Controls)
|
|
{
|
|
rad.CheckedChanged += (s1, e1) =>
|
|
{
|
|
if (rad.Checked)
|
|
{
|
|
AGV.sts_speed = rad.Text[0];
|
|
}
|
|
};
|
|
}
|
|
foreach (RadioButton rad in groupBox8.Controls)
|
|
{
|
|
rad.CheckedChanged += (s1, e1) =>
|
|
{
|
|
if (rad.Checked)
|
|
{
|
|
AGV.sts_sensor = rad.Text[0];
|
|
}
|
|
};
|
|
}
|
|
|
|
MakeViewer();
|
|
|
|
|
|
agvViewer1.TagTouched += AgvViewer1_TagTouched;
|
|
agvViewer1.MarkTouched += AgvViewer1_MarkTouched;
|
|
agvViewer1.Command += AgvViewer1_Command;
|
|
}
|
|
private void Agv_Command(object sender, commandargs e)
|
|
{
|
|
switch (e.Command.ToLower())
|
|
{
|
|
case "stopmark":
|
|
agvViewer1.StopbyMark = true;
|
|
break;
|
|
}
|
|
}
|
|
void MakeViewer()
|
|
{
|
|
//태그목록
|
|
List<UC.AgvViewer.ptdata> listTAG = new List<UC.AgvViewer.ptdata>();
|
|
//var strtag = new string[] {
|
|
// "9000", "9001", //not
|
|
// "9010", "9011",
|
|
// //"9020", "9021",
|
|
// "9030", "9031",
|
|
// // "9040", "9041",
|
|
// "9050", "9051",
|
|
// // "9060", "9061",
|
|
// "9070", "9071",
|
|
// "9080", "9081",
|
|
// "9090", "9091"};
|
|
|
|
//foreach(var tag in strtag)
|
|
//{
|
|
// listTAG.Add(new UC.AgvViewer.ptdata {
|
|
// active=false,
|
|
// data = tag,
|
|
// pos =
|
|
// });
|
|
//}
|
|
//agvViewer1.listTAG = listTAG.ToArray();
|
|
|
|
//마크지점
|
|
List<UC.AgvViewer.ptdata> listMRK = new List<UC.AgvViewer.ptdata>();
|
|
var strmark = new string[] { "NOT", "QC", "CHG", "{0}", "#1", "{1}", "#2", "{2}", "#3", "{3}", "#4", "POT" };
|
|
var pos = 50;
|
|
var tagstart = 9000;
|
|
foreach (var item in strmark)
|
|
{
|
|
listMRK.Add(new UC.AgvViewer.ptdata
|
|
{
|
|
pos = pos,
|
|
data = item,
|
|
});
|
|
|
|
|
|
if (item.Equals("CHG"))
|
|
{
|
|
pos += 100;
|
|
continue;
|
|
}
|
|
else if (item.Equals("{0}")) tagstart = 9350;
|
|
else if (item.Equals("{1}")) tagstart = 9450;
|
|
else if (item.Equals("{2}")) tagstart = 9550;
|
|
else if (item.Equals("{3}")) tagstart = 9650;
|
|
else if (item.Equals("#1")) tagstart = 9400;
|
|
else if (item.Equals("#2")) tagstart = 9500;
|
|
else if (item.Equals("#3")) tagstart = 9600;
|
|
else if (item.Equals("#4")) tagstart = 9700;
|
|
|
|
|
|
//지정위치 좌우에 태그를 심는다
|
|
listTAG.Add(new UC.AgvViewer.ptdata
|
|
{
|
|
pos = pos - 20,
|
|
data = tagstart.ToString(),
|
|
});
|
|
|
|
if (item.Equals("NOT") == false && item.Equals("POT") == false && item.StartsWith("{") == false)
|
|
tagstart += 1;
|
|
|
|
|
|
listTAG.Add(new UC.AgvViewer.ptdata
|
|
{
|
|
pos = pos + 20,
|
|
data = tagstart.ToString(),
|
|
});
|
|
|
|
|
|
pos += 100;
|
|
|
|
if (item.Equals("NOT") == false && item.Equals("POT") == false && item.StartsWith("{") == false)
|
|
tagstart += 99;
|
|
else
|
|
tagstart += 100;
|
|
|
|
|
|
if (item.Equals("NOT"))
|
|
tagstart = 9300;
|
|
|
|
//else
|
|
//{
|
|
// pos += 100;
|
|
// tagstart += 10;
|
|
//}
|
|
|
|
}
|
|
agvViewer1.listMRK = listMRK.ToArray();
|
|
agvViewer1.listTAG = listTAG.ToArray();
|
|
agvViewer1.Invalidate();
|
|
|
|
}
|
|
private void AgvViewer1_Command(object sender, UC.AgvViewer.TagArgs e)
|
|
{
|
|
if (e.Data == "stop")
|
|
{
|
|
AGV.SetAGV(esystemflag1.agv_run, false);
|
|
AGV.SetAGV(esystemflag1.agv_stop, true);
|
|
logAGV.Add("시뮬로부터 자동 중지");
|
|
}
|
|
}
|
|
|
|
private void AgvViewer1_MarkTouched(object sender, UC.AgvViewer.TagArgs e)
|
|
{
|
|
// throw new NotImplementedException();
|
|
AGV.SetAGV(esignal.mark_sensor_1, e.Active);
|
|
logAGV.Add($"mark {e.Data} touch:{e.Active}");
|
|
}
|
|
|
|
private void AgvViewer1_TagTouched(object sender, UC.AgvViewer.TagArgs e)
|
|
{
|
|
logAGV.Add($"tag touch:{e.Data}");
|
|
numericUpDown1.Value = decimal.Parse(e.Data);
|
|
button18.PerformClick();
|
|
}
|
|
|
|
private void Agv_StsValueChanged(object sender, DevAGV.StsValueChangedArgs e)
|
|
{
|
|
Console.WriteLine($"STS [{e.vtype}] VAL={e.Value}");
|
|
if (this.InvokeRequired)
|
|
{
|
|
this.BeginInvoke(new EventHandler<StsValueChangedArgs>(Agv_StsValueChanged), sender, e);
|
|
return;
|
|
}
|
|
switch (e.vtype)
|
|
{
|
|
case DevAGV.estsvaluetype.direction:
|
|
foreach (RadioButton c in this.groupBox5.Controls)
|
|
{
|
|
if (c.Text[0].Equals(e.Value))
|
|
{
|
|
c.Checked = true;
|
|
|
|
}
|
|
else
|
|
{
|
|
c.Checked = false;
|
|
}
|
|
c.Refresh();
|
|
}
|
|
groupBox5.Refresh();
|
|
break;
|
|
case DevAGV.estsvaluetype.bunki:
|
|
foreach (RadioButton c in this.groupBox2.Controls)
|
|
{
|
|
if (c.Text[0].Equals(e.Value))
|
|
{
|
|
c.Checked = true;
|
|
c.Refresh();
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
case DevAGV.estsvaluetype.speed:
|
|
foreach (RadioButton c in this.groupBox4.Controls)
|
|
{
|
|
if (c.Text[0].Equals(e.Value))
|
|
{
|
|
c.Checked = true;
|
|
c.Refresh();
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
case DevAGV.estsvaluetype.sensor:
|
|
foreach (RadioButton c in this.groupBox8.Controls)
|
|
{
|
|
if (c.Text.Equals(e.Value))
|
|
{
|
|
c.Checked = true;
|
|
c.Refresh();
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
private void Agv_ValueChanged(object sender, DevAGV.ValueChangedArgs e)
|
|
{
|
|
if (this.InvokeRequired)
|
|
{
|
|
this.Invoke(new EventHandler<ValueChangedArgs>(Agv_ValueChanged), sender, e);
|
|
return;
|
|
}
|
|
|
|
//내부값이 바뀌었다면 컨트롤을 변경해준다.
|
|
switch (e.vtype)
|
|
{
|
|
|
|
case DevAGV.evaluetype.system0:
|
|
foreach (CheckBox c in panel6.Controls)
|
|
{
|
|
var idx = int.Parse(c.Tag.ToString());
|
|
if (idx == e.Idx)
|
|
{
|
|
c.Checked = e.Value;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
case DevAGV.evaluetype.system1:
|
|
|
|
var v = (DevAGV.esystemflag1)e.Idx;
|
|
if (e.Value)
|
|
{
|
|
if (v == esystemflag1.agv_run)
|
|
{
|
|
agvViewer1.wat.Restart();
|
|
}
|
|
if (v == esystemflag1.agv_stop)
|
|
{
|
|
agvViewer1.wat.Stop();
|
|
}
|
|
}
|
|
|
|
|
|
foreach (CheckBox c in panel7.Controls)
|
|
{
|
|
var idx = int.Parse(c.Tag.ToString());
|
|
if (idx == e.Idx)
|
|
{
|
|
c.Checked = e.Value;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
case DevAGV.evaluetype.error:
|
|
foreach (CheckBox c in panel9.Controls)
|
|
{
|
|
var idx = int.Parse(c.Tag.ToString());
|
|
if (idx == e.Idx)
|
|
{
|
|
c.Checked = e.Value;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
case DevAGV.evaluetype.signal:
|
|
foreach (CheckBox c in panel8.Controls)
|
|
{
|
|
var idx = int.Parse(c.Tag.ToString());
|
|
if (idx == e.Idx)
|
|
{
|
|
c.Checked = e.Value;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
|
|
|
|
}
|
|
}
|
|
|
|
char GetGroupItemCheckbox(GroupBox grp)
|
|
{
|
|
foreach (var ctl in grp.Controls)
|
|
{
|
|
if (ctl is RadioButton)
|
|
{
|
|
var rad = ctl as RadioButton;
|
|
if (rad.Checked) return rad.Text[0];
|
|
}
|
|
}
|
|
return '0';
|
|
}
|
|
|
|
|
|
|
|
|
|
int PLC_LeftPosition = 0;
|
|
int PLC_RightPosition = 0;
|
|
int PLC_LeftDir = 0;
|
|
int PLC_RightDir = 0;
|
|
|
|
private void Plc_ValueChanged(object sender, DevPLC.ValueChangedArgs e)
|
|
{
|
|
if (e.IsOut)
|
|
{
|
|
this.gvdPLCInOut.setValue(e.Idx + 16, e.Value);
|
|
var doname = (DevPLC.DOName)e.Idx;
|
|
|
|
switch (doname)
|
|
{
|
|
case DevPLC.DOName.PINO_GUIDEMOTOR_RRUN:
|
|
break;
|
|
case DevPLC.DOName.PINO_GUIDEMOTOR_LRUN:
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
this.gvdPLCInOut.setValue(e.Idx, e.Value);
|
|
|
|
}
|
|
this.gvdPLCInOut.Invalidate();
|
|
}
|
|
|
|
private void Plc_RequestData(object sender, DevPLC.RequestBatteryDataArgs e)
|
|
{
|
|
var idx = 0;
|
|
UInt32 val = 0;
|
|
foreach (var data in gvdPLCInOut.Values)
|
|
{
|
|
SetBit(ref val, idx++, (data > 0));
|
|
}
|
|
e.IOValue = val;
|
|
idx = 0;
|
|
val = 0;
|
|
foreach (var data in gvdPLCFlag.Values)
|
|
{
|
|
SetBit(ref val, idx++, (data > 0));
|
|
}
|
|
e.FGValue = val;
|
|
}
|
|
|
|
public void SetBit(ref UInt32 _value, int idx, Boolean value)
|
|
{
|
|
if (value)
|
|
{
|
|
var offset = (UInt32)(1 << idx);
|
|
_value = _value | offset;
|
|
}
|
|
else
|
|
{
|
|
var offset = (UInt32)(~(1 << idx));
|
|
_value = _value & offset;
|
|
}
|
|
}
|
|
public void SetBit(ref UInt16 _value, int idx, Boolean value)
|
|
{
|
|
if (value)
|
|
{
|
|
var offset = (UInt16)(1 << idx);
|
|
_value = (UInt16)(_value | offset);
|
|
}
|
|
else
|
|
{
|
|
var offset = (UInt16)(~(1 << idx));
|
|
_value = (UInt16)(_value & offset);
|
|
}
|
|
}
|
|
public void SetBit(ref byte _value, int idx, Boolean value)
|
|
{
|
|
if (value)
|
|
{
|
|
var offset = (byte)(1 << idx);
|
|
_value = (byte)(_value | offset);
|
|
}
|
|
else
|
|
{
|
|
var offset = (byte)(~(1 << idx));
|
|
_value = (byte)(_value & offset);
|
|
}
|
|
}
|
|
|
|
void aaplycheckboxbit(ref UInt16 v, Panel p)
|
|
{
|
|
foreach (CheckBox chk in p.Controls)
|
|
{
|
|
var idx = int.Parse(chk.Tag.ToString());
|
|
SetBit(ref v, idx, chk.Checked);
|
|
}
|
|
}
|
|
void aaplycheckboxbit(ref byte v, Panel p)
|
|
{
|
|
foreach (CheckBox chk in p.Controls)
|
|
{
|
|
var idx = int.Parse(chk.Tag.ToString());
|
|
SetBit(ref v, idx, chk.Checked);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private void Agv_RequestStatusData(object sender, DevAGV.RequestStatusDataArgs e)
|
|
{
|
|
//UInt16 system0 = 0xFFFF;
|
|
//UInt16 system1 = 0xFFFF;
|
|
//UInt16 error = 0xFFFF;
|
|
//byte signal = 0xFF;
|
|
|
|
aaplycheckboxbit(ref AGV.system0, panel6);
|
|
aaplycheckboxbit(ref AGV.system1, panel7);
|
|
aaplycheckboxbit(ref AGV.error, panel9);
|
|
aaplycheckboxbit(ref AGV.signal, panel8);
|
|
|
|
if (this.agvViewer1.StopbyMark) AGV.sts_speed = 'S';
|
|
else AGV.sts_speed = GetGroupItemCheckbox(groupBox4);
|
|
AGV.sts_bunki = GetGroupItemCheckbox(groupBox2);
|
|
AGV.sts_dir = GetGroupItemCheckbox(groupBox5);
|
|
AGV.sts_sensor = GetGroupItemCheckbox(groupBox8);
|
|
|
|
//this.Invoke(new Action(() =>
|
|
//{
|
|
// e.system0 = system0;
|
|
// e.system1 = system1;
|
|
// e.error = error;
|
|
// e.signal = signal;
|
|
// e.speed = GetGroupItemCheckbox(groupBox4);
|
|
// e.bunki = GetGroupItemCheckbox(groupBox2);
|
|
// e.direction = GetGroupItemCheckbox(groupBox5);
|
|
// e.sensor = GetGroupItemCheckbox(groupBox8);
|
|
|
|
// e.volt = 23.4f;
|
|
//}));
|
|
}
|
|
private void BMS_RequestVoltageData(object sender, DevBMS.RequestVoltageDataArgs e)
|
|
{
|
|
|
|
//cell전압값추가
|
|
for (int i = 0; i < cellvolt.Length; i++)
|
|
{
|
|
this.cellvolt[i] = (UInt16)rnd.Next(3300, 3350);
|
|
}
|
|
Array.Copy(this.cellvolt, 0, e.cellVolt, 0, 8);
|
|
this.btc1.Invoke(new Action(() => {
|
|
var idx = 0;
|
|
btc1.Text = (this.cellvolt[idx++] / 1000f).ToString();
|
|
btc2.Text = (this.cellvolt[idx++] / 1000f).ToString();
|
|
btc3.Text = (this.cellvolt[idx++] / 1000f).ToString();
|
|
btc4.Text = (this.cellvolt[idx++] / 1000f).ToString();
|
|
btc5.Text = (this.cellvolt[idx++] / 1000f).ToString();
|
|
btc6.Text = (this.cellvolt[idx++] / 1000f).ToString();
|
|
btc7.Text = (this.cellvolt[idx++] / 1000f).ToString();
|
|
btc8.Text = (this.cellvolt[idx++] / 1000f).ToString();
|
|
}));
|
|
|
|
}
|
|
private void Bms_RequestBatteryData(object sender, DevBMS.RequestBatteryDataArgs e)
|
|
{
|
|
if (checkBox1.Checked)
|
|
this.trackBar1.Invoke(new Action(() =>
|
|
{
|
|
this.trackBar1.Value -= 1;
|
|
trackBar1_Scroll(null, null);
|
|
}));
|
|
|
|
e.CurA = (int)BMS_CurA;
|
|
e.MaxA = (int)BMS_MaxA;
|
|
e.Remain = BMS_Remain;
|
|
e.Volt = BMS_Volt;
|
|
|
|
}
|
|
|
|
private void button5_Click(object sender, EventArgs e)
|
|
{
|
|
AGV.WriteData("ACK");
|
|
}
|
|
|
|
private void button4_Click(object sender, EventArgs e)
|
|
{
|
|
AGV.WriteData("NAK");
|
|
}
|
|
|
|
private void button7_Click(object sender, EventArgs e)
|
|
{
|
|
var pinL = DevPLC.DOName.PINO_GUIDEMOTOR_LRUN;
|
|
var pinR = DevPLC.DOName.PINO_GUIDEMOTOR_RRUN;
|
|
var pinDL = DevPLC.DOName.PINO_GUIDEMOTOR_LDIR;
|
|
var pinDR = DevPLC.DOName.PINO_GUIDEMOTOR_RDIR;
|
|
|
|
this.gvdPLCInOut.setValue((int)pinDL + 16, true);
|
|
this.gvdPLCInOut.setValue((int)pinDR + 16, true);
|
|
this.gvdPLCInOut.setValue((int)pinL + 16, true);
|
|
this.gvdPLCInOut.setValue((int)pinR + 16, true);
|
|
this.gvdPLCInOut.Invalidate();
|
|
}
|
|
|
|
private void button6_Click(object sender, EventArgs e)
|
|
{
|
|
var pinL = DevPLC.DOName.PINO_GUIDEMOTOR_LRUN;
|
|
var pinR = DevPLC.DOName.PINO_GUIDEMOTOR_RRUN;
|
|
var cur = gvdPLCInOut.Values[(int)pinL + 16];
|
|
this.gvdPLCInOut.setValue((int)pinL + 16, false);
|
|
this.gvdPLCInOut.setValue((int)pinR + 16, false);
|
|
this.gvdPLCInOut.Invalidate();
|
|
}
|
|
|
|
private void button8_Click(object sender, EventArgs e)
|
|
{
|
|
var pinL = DevPLC.DOName.PINO_GUIDEMOTOR_LRUN;
|
|
var pinR = DevPLC.DOName.PINO_GUIDEMOTOR_RRUN;
|
|
var pinDL = DevPLC.DOName.PINO_GUIDEMOTOR_LDIR;
|
|
var pinDR = DevPLC.DOName.PINO_GUIDEMOTOR_RDIR;
|
|
|
|
this.gvdPLCInOut.setValue((int)pinDL + 16, false);
|
|
this.gvdPLCInOut.setValue((int)pinDR + 16, false);
|
|
this.gvdPLCInOut.setValue((int)pinL + 16, true);
|
|
this.gvdPLCInOut.setValue((int)pinR + 16, true);
|
|
this.gvdPLCInOut.Invalidate();
|
|
}
|
|
|
|
private void trackBar1_Scroll(object sender, EventArgs e)
|
|
{
|
|
BMS_MaxA = float.Parse(label4.Text);
|
|
BMS_CurA = (float)(trackBar1.Value / 100f);
|
|
BMS_Remain = 100f * (BMS_CurA / BMS_MaxA);// (trackBar1.Value / 10f);
|
|
var minvolt = 20.2f;
|
|
var maxvolt = 26.8f;
|
|
// BMS_CurA = (BMS_MaxA * (BMS_Remain / 100f));
|
|
label3.Text = BMS_CurA.ToString("N0"); //curr amp
|
|
label5.Text = $"{BMS_Remain:N2}%";
|
|
BMS_Volt = minvolt + ((maxvolt - minvolt) * (BMS_CurA / BMS_MaxA));
|
|
label6.Text = $"{BMS_Volt:N2}v";
|
|
}
|
|
|
|
private void timer1_Tick(object sender, EventArgs e)
|
|
{
|
|
timer1.Stop();
|
|
sbAGV.ForeColor = AGV.IsOpen ? Color.ForestGreen : Color.Red;
|
|
sbPLC.ForeColor = PLC.IsOpen ? Color.ForestGreen : Color.Red;
|
|
sbBMS.ForeColor = BMS.IsOpen ? Color.ForestGreen : Color.Red;
|
|
sbCAL.ForeColor = CAL.IsOpen ? Color.ForestGreen : Color.Red;
|
|
|
|
if (checkBox2.Checked && PLC != null && PLC.IsOpen) PLC.AutoSendData(); //자동전송해야함
|
|
if (checkBox3.Checked && AGV != null && AGV.IsOpen) AGV.AutoSendData(); //자동전송해야함
|
|
if (BMS != null && BMS.IsOpen) BMS.AutoSendData(); //자동전송해야함
|
|
if (CAL != null && CAL.IsOpen) CAL.AutoSendData(); //자동전송해야함
|
|
|
|
if (chkSimulation.Checked && AGV.GetAGV(esystemflag1.agv_run))
|
|
{
|
|
if (radioButton15.Checked)
|
|
{
|
|
agvViewer1.dir = 1;
|
|
}
|
|
else
|
|
{
|
|
agvViewer1.dir = -1;
|
|
}
|
|
if (radioButton12.Checked) agvViewer1.mspd = 7;
|
|
else if (radioButton11.Checked) agvViewer1.mspd = 20;
|
|
else agvViewer1.mspd = 40;
|
|
agvViewer1.Invalidate();
|
|
}
|
|
|
|
UpdatePLC();
|
|
label7.Text = $"I/O L({PLC_LeftPosition}),R({PLC_RightPosition})";
|
|
|
|
timer1.Start();
|
|
}
|
|
|
|
void UpdatePLC()
|
|
{
|
|
//plc값을 업데이트해준다.
|
|
var LRun = gvdPLCInOut.getValue((int)DevPLC.DOName.PINO_GUIDEMOTOR_LRUN + 16) == 1;
|
|
var RRun = gvdPLCInOut.getValue((int)DevPLC.DOName.PINO_GUIDEMOTOR_RRUN + 16) == 1;
|
|
var LDir = gvdPLCInOut.getValue((int)DevPLC.DOName.PINO_GUIDEMOTOR_LDIR + 16) == 1;
|
|
var RDir = gvdPLCInOut.getValue((int)DevPLC.DOName.PINO_GUIDEMOTOR_RDIR + 16) == 1;
|
|
|
|
if (LRun == false) this.PLC_LeftDir = 0;
|
|
else if (LDir == true) this.PLC_LeftDir = 1;
|
|
else this.PLC_LeftDir = -1;
|
|
|
|
if (RRun == false) this.PLC_RightDir = 0;
|
|
else if (RDir == true) this.PLC_RightDir = 1;
|
|
else this.PLC_RightDir = -1;
|
|
|
|
this.PLC_LeftPosition += this.PLC_LeftDir;
|
|
this.PLC_RightPosition += this.PLC_RightDir;
|
|
|
|
var maxvalue = 20;
|
|
if (PLC_LeftPosition >= maxvalue)
|
|
{
|
|
PLC_LeftPosition = maxvalue;
|
|
PLC_LeftDir = 0;//멈춤
|
|
var idx = (int)DevPLC.DOName.PINO_GUIDEMOTOR_LRUN;
|
|
gvdPLCInOut.setValue(idx + 16, false);
|
|
idx = (int)DevPLC.DIName.PINI_LIMIT_LD;
|
|
gvdPLCInOut.setValue(idx, false);
|
|
idx = (int)DevPLC.DIName.PINI_LIMIT_LU;
|
|
gvdPLCInOut.setValue(idx, true);
|
|
}
|
|
else if (PLC_LeftPosition <= 0)
|
|
{
|
|
PLC_LeftPosition = 0;
|
|
PLC_LeftDir = 0;
|
|
var idx = (int)DevPLC.DOName.PINO_GUIDEMOTOR_LRUN;
|
|
gvdPLCInOut.setValue(idx + 16, false);
|
|
idx = (int)DevPLC.DIName.PINI_LIMIT_LU;
|
|
gvdPLCInOut.setValue(idx, false);
|
|
idx = (int)DevPLC.DIName.PINI_LIMIT_LD;
|
|
gvdPLCInOut.setValue(idx, true);
|
|
}
|
|
else if (PLC_LeftPosition > 5 && PLC_LeftPosition < maxvalue - 5)
|
|
{
|
|
if (gvdPLCInOut.getValue((int)DevPLC.DIName.PINI_LIMIT_LD) > 0)
|
|
gvdPLCInOut.setValue((int)DevPLC.DIName.PINI_LIMIT_LD, false);
|
|
if (gvdPLCInOut.getValue((int)DevPLC.DIName.PINI_LIMIT_LU) > 0)
|
|
gvdPLCInOut.setValue((int)DevPLC.DIName.PINI_LIMIT_LU, false);
|
|
}
|
|
|
|
if (PLC_RightPosition >= maxvalue)
|
|
{
|
|
PLC_RightPosition = maxvalue;
|
|
PLC_RightDir = 0;//멈춤
|
|
var idx = (int)DevPLC.DOName.PINO_GUIDEMOTOR_RRUN;
|
|
gvdPLCInOut.setValue(idx + 16, false);
|
|
idx = (int)DevPLC.DIName.PINI_LIMIT_RD;
|
|
gvdPLCInOut.setValue(idx, false);
|
|
idx = (int)DevPLC.DIName.PINI_LIMIT_RU;
|
|
gvdPLCInOut.setValue(idx, true);
|
|
}
|
|
else if (PLC_RightPosition <= 0)
|
|
{
|
|
PLC_RightPosition = 0;
|
|
PLC_RightDir = 0;
|
|
var idx = (int)DevPLC.DOName.PINO_GUIDEMOTOR_RRUN;
|
|
gvdPLCInOut.setValue(idx + 16, false);
|
|
idx = (int)DevPLC.DIName.PINI_LIMIT_RU;
|
|
gvdPLCInOut.setValue(idx, false);
|
|
idx = (int)DevPLC.DIName.PINI_LIMIT_RD;
|
|
gvdPLCInOut.setValue(idx, true);
|
|
}
|
|
else if (PLC_RightPosition > 5 && PLC_RightPosition < maxvalue - 5)
|
|
{
|
|
if (gvdPLCInOut.getValue((int)DevPLC.DIName.PINI_LIMIT_RD) > 0)
|
|
gvdPLCInOut.setValue((int)DevPLC.DIName.PINI_LIMIT_RD, false);
|
|
if (gvdPLCInOut.getValue((int)DevPLC.DIName.PINI_LIMIT_RU) > 0)
|
|
gvdPLCInOut.setValue((int)DevPLC.DIName.PINI_LIMIT_RU, false);
|
|
}
|
|
}
|
|
|
|
|
|
private void Bms_Message(object sender, AR.Dev.RS232.MessageEventArgs e)
|
|
{
|
|
var dev = sender as AR.Dev.RS232;
|
|
if (dev is DevBMS)
|
|
{
|
|
logBMS.Add(e.Message);
|
|
}
|
|
else if (dev is DevAGV)
|
|
{
|
|
logAGV.Add(e.Message);
|
|
}
|
|
else if (dev is DevPLC)
|
|
{
|
|
logPLC.Add(e.Message);
|
|
}
|
|
else if (dev is DevCAL)
|
|
{
|
|
if (e.MsgType == AR.Dev.RS232.MessageType.Send)
|
|
logCAL.Add(">> " + e.Data.HexString());
|
|
else if (e.MsgType == AR.Dev.RS232.MessageType.Recv)
|
|
logCAL.Add("<< " + e.Data.HexString());
|
|
else logCAL.Add(e.Message);
|
|
}
|
|
}
|
|
|
|
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
|
|
{
|
|
timer1.Stop();
|
|
logPLC.Flush();
|
|
logAGV.Flush();
|
|
logBMS.Flush();
|
|
logCAL.Flush();
|
|
}
|
|
|
|
private void btPLCemg_Click(object sender, EventArgs e)
|
|
{
|
|
var pin = DevPLC.DIName.PINI_EMG;
|
|
var cur = gvdPLCInOut.Values[(int)pin];
|
|
this.gvdPLCInOut.setValue((int)pin, cur == 0);
|
|
this.gvdPLCInOut.Invalidate();
|
|
}
|
|
|
|
private void button9_Click(object sender, EventArgs e)
|
|
{
|
|
var pinL = DevPLC.DIName.PINI_LIMIT_LU;
|
|
var pinR = DevPLC.DIName.PINI_LIMIT_RU;
|
|
var cur = gvdPLCInOut.Values[(int)pinL];
|
|
this.gvdPLCInOut.setValue((int)pinL, cur == 0);
|
|
this.gvdPLCInOut.setValue((int)pinR, cur == 0);
|
|
|
|
pinL = DevPLC.DIName.PINI_LIMIT_LD;
|
|
pinR = DevPLC.DIName.PINI_LIMIT_RD;
|
|
this.gvdPLCInOut.setValue((int)pinL, false);
|
|
this.gvdPLCInOut.setValue((int)pinR, false);
|
|
this.gvdPLCInOut.Invalidate();
|
|
}
|
|
|
|
private void button10_Click(object sender, EventArgs e)
|
|
{
|
|
var pinL = DevPLC.DIName.PINI_LIMIT_LD;
|
|
var pinR = DevPLC.DIName.PINI_LIMIT_RD;
|
|
var cur = gvdPLCInOut.Values[(int)pinL];
|
|
this.gvdPLCInOut.setValue((int)pinL, cur == 0);
|
|
this.gvdPLCInOut.setValue((int)pinR, cur == 0);
|
|
|
|
|
|
pinL = DevPLC.DIName.PINI_LIMIT_LU;
|
|
pinR = DevPLC.DIName.PINI_LIMIT_RU;
|
|
this.gvdPLCInOut.setValue((int)pinL, false);
|
|
this.gvdPLCInOut.setValue((int)pinR, false);
|
|
|
|
|
|
this.gvdPLCInOut.Invalidate();
|
|
}
|
|
|
|
private void button13_Click(object sender, EventArgs e)
|
|
{
|
|
var pinL = DevPLC.DIName.PINI_BTN_1;
|
|
var cur = gvdPLCInOut.Values[(int)pinL];
|
|
this.gvdPLCInOut.setValue((int)pinL, cur == 0);
|
|
this.gvdPLCInOut.Invalidate();
|
|
}
|
|
|
|
private void button12_Click(object sender, EventArgs e)
|
|
{
|
|
var pinL = DevPLC.DIName.PINI_BTN_2;
|
|
var cur = gvdPLCInOut.Values[(int)pinL];
|
|
this.gvdPLCInOut.setValue((int)pinL, cur == 0);
|
|
this.gvdPLCInOut.Invalidate();
|
|
}
|
|
|
|
private void button11_Click(object sender, EventArgs e)
|
|
{
|
|
var pinL = DevPLC.DIName.PINI_BTN_3;
|
|
var cur = gvdPLCInOut.Values[(int)pinL];
|
|
this.gvdPLCInOut.setValue((int)pinL, cur == 0);
|
|
this.gvdPLCInOut.Invalidate();
|
|
}
|
|
|
|
private void panel4_Paint(object sender, PaintEventArgs e)
|
|
{
|
|
|
|
}
|
|
|
|
private void groupBox9_Enter(object sender, EventArgs e)
|
|
{
|
|
|
|
}
|
|
|
|
private void button14_Click(object sender, EventArgs e)
|
|
{
|
|
//agv 정지
|
|
//비상정지 에러 플래그
|
|
AGV.SetAGV(DevAGV.eerror.Emergency, true);
|
|
AGV.SetAGV(DevAGV.esystemflag1.agv_run, false);
|
|
AGV.SetAGV(DevAGV.esystemflag1.agv_stop, true);
|
|
}
|
|
|
|
|
|
|
|
private void button16_Click(object sender, EventArgs e)
|
|
{
|
|
AGV.SetAGV(DevAGV.esystemflag1.stop_by_front_detect, true);
|
|
}
|
|
|
|
private void button15_Click(object sender, EventArgs e)
|
|
{
|
|
AGV.SetAGV(DevAGV.esystemflag1.stop_by_front_detect, false);
|
|
}
|
|
|
|
private void button17_Click(object sender, EventArgs e)
|
|
{
|
|
//agv 정지
|
|
//비상정지 에러 플래그
|
|
AGV.SetAGV(DevAGV.eerror.Emergency, false);
|
|
AGV.SetAGV(DevAGV.eerror.line_out_error, false);
|
|
AGV.SetAGV(DevAGV.eerror.Overcurrent, false);
|
|
AGV.SetAGV(DevAGV.esystemflag1.agv_run, false);
|
|
AGV.SetAGV(DevAGV.esystemflag1.agv_stop, true);
|
|
}
|
|
|
|
|
|
|
|
private void Chk_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
var chk = sender as CheckBox;
|
|
var idx = int.Parse(chk.Tag.ToString());
|
|
|
|
switch (chk.Parent.Tag.ToString().ToLower())
|
|
{
|
|
case "s0":
|
|
var v0 = (DevAGV.esystemflag0)idx;
|
|
AGV.SetAGV(v0, chk.Checked);
|
|
break;
|
|
case "s1":
|
|
var v1 = (DevAGV.esystemflag1)idx;
|
|
AGV.SetAGV(v1, chk.Checked);
|
|
break;
|
|
case "er":
|
|
var v2 = (DevAGV.eerror)idx;
|
|
AGV.SetAGV(v2, chk.Checked);
|
|
break;
|
|
case "sg":
|
|
var v3 = (DevAGV.esignal)idx;
|
|
AGV.SetAGV(v3, chk.Checked);
|
|
break;
|
|
}
|
|
|
|
chk.BackColor = chk.Checked ? Color.Lime : SystemColors.Window;
|
|
}
|
|
|
|
private void button18_Click(object sender, EventArgs e)
|
|
{
|
|
AGV.SendTag(numericUpDown1.Value.ToString());
|
|
}
|
|
|
|
private void button1_Click(object sender, EventArgs e)
|
|
{
|
|
var bt = sender as Button;
|
|
var kitno = nudBMSKitNo.Value.ToString()[0];
|
|
var value = bt.Tag.ToString()[0];
|
|
var barr = new List<byte>();
|
|
barr.Add(0x02);
|
|
barr.Add((byte)kitno);
|
|
barr.Add((byte)value);
|
|
barr.Add(0x03);
|
|
CAL.WriteData(barr.ToArray());
|
|
}
|
|
|
|
private void serAGV_Load(object sender, EventArgs e)
|
|
{
|
|
|
|
}
|
|
|
|
private void agvViewer1_Click(object sender, EventArgs e)
|
|
{
|
|
|
|
}
|
|
|
|
private void agvViewer1_MouseDown(object sender, MouseEventArgs e)
|
|
{
|
|
if (e.Button == MouseButtons.Left)
|
|
{
|
|
agvViewer1.StopbyMark = !agvViewer1.StopbyMark;
|
|
}
|
|
else if (e.Button == MouseButtons.Right)
|
|
{
|
|
MakeViewer();
|
|
}
|
|
}
|
|
|
|
private void radioButton20_Click(object sender, EventArgs e)
|
|
{
|
|
var rad = sender as RadioButton;
|
|
var kitno = int.Parse(rad.Text);
|
|
nudBMSKitNo.Value = (decimal)kitno;
|
|
}
|
|
|
|
private void toolStripButton1_Click(object sender, EventArgs e)
|
|
{
|
|
serAGV.Connect();
|
|
serPLC.Connect();
|
|
serBMS.Connect();
|
|
serCAL.Connect();
|
|
}
|
|
|
|
private void toolStripButton2_Click(object sender, EventArgs e)
|
|
{
|
|
serAGV.Disconnect();
|
|
serPLC.Disconnect();
|
|
serBMS.Disconnect();
|
|
serCAL.Disconnect();
|
|
}
|
|
|
|
private void serBMS_Load(object sender, EventArgs e)
|
|
{
|
|
|
|
}
|
|
|
|
void checkboxevent()
|
|
{
|
|
|
|
}
|
|
|
|
private void GvdPLCFlag_ItemClick(object sender, arFrame.Control.GridView.ItemClickEventArgs e)
|
|
{
|
|
var newvalue = gvdPLCFlag.Values[e.idx];
|
|
this.gvdPLCFlag.setValue(e.idx, (ushort)(newvalue == 0 ? 1 : 0));
|
|
this.gvdPLCFlag.Invalidate();
|
|
}
|
|
|
|
private void GvdPLCInOut_ItemClick(object sender, arFrame.Control.GridView.ItemClickEventArgs e)
|
|
{
|
|
var newvalue = gvdPLCInOut.Values[e.idx];
|
|
this.gvdPLCInOut.setValue(e.idx, (ushort)(newvalue == 0 ? 1 : 0));
|
|
this.gvdPLCInOut.Invalidate();
|
|
}
|
|
}
|
|
}
|