262 lines
9.2 KiB
C#
262 lines
9.2 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Windows.Forms;
|
|
|
|
namespace UIControl
|
|
{
|
|
public partial class CtlCylinder : CtlBase
|
|
{
|
|
// string text_;
|
|
Font font_ = new Font("Malgun Gothic", 10);
|
|
public enum eSensorType
|
|
{
|
|
SingleAction = 0,
|
|
DoubleAction,
|
|
}
|
|
private eSensorType _arsensortype = eSensorType.SingleAction;
|
|
public eSensorType arSensorType
|
|
{
|
|
get
|
|
{
|
|
return _arsensortype;
|
|
}
|
|
set
|
|
{
|
|
_arsensortype = value;
|
|
this.Invalidate();
|
|
}
|
|
}
|
|
[Browsable(true)]
|
|
public new Font Font { get { return font_; } set { font_ = value; this.Invalidate(); } }
|
|
|
|
public CtlCylinder()
|
|
{
|
|
InitializeComponent();
|
|
|
|
SetPinCount(4); //입력2개 출력2개
|
|
|
|
arOutputMax.ValueDirection = eValueDirection.output;
|
|
arOutputMin.ValueDirection = eValueDirection.output;
|
|
|
|
if (arVel == 0) arVel = 50;
|
|
|
|
//실린더 가동핀은 변경되면 시작시간을 업데이트해줘야 한다
|
|
PinList[0].ValueChanged += (s1, e1) => { RunStartTimeMax = DateTime.Now; };
|
|
PinList[1].ValueChanged += (s1, e1) => { RunStartTimeMin = DateTime.Now; };
|
|
}
|
|
public override void MakeRect()
|
|
{
|
|
|
|
}
|
|
|
|
public int arLength = 100;
|
|
public int arVel { get; set; }
|
|
public DateTime RunStartTimeMin = DateTime.Now;
|
|
public DateTime RunStartTimeMax = DateTime.Now;
|
|
// public TimeSpan arRunSec = new TimeSpan(0);
|
|
private double arRunLen = 0;
|
|
public double arProgress
|
|
{
|
|
get
|
|
{
|
|
var val = (arRunLen / (arLength * 1.0) * 100.0);
|
|
if (val > 100.0) val = 100;
|
|
return val;
|
|
}
|
|
}
|
|
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
|
|
public PinInfo arOutputMax { get { return PinList[2]; } set { PinList[2] = value; } }
|
|
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
|
|
public PinInfo arOutputMin { get { return PinList[3]; } set { PinList[3] = value; } }
|
|
|
|
//Boolean aron1_ = false;
|
|
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
|
|
public PinInfo arInput1
|
|
{
|
|
get
|
|
{
|
|
return PinList[0];
|
|
}
|
|
set
|
|
{
|
|
//if (value != aron1_) RunStartTimeMax = DateTime.Now;
|
|
PinList[0] = value;
|
|
}
|
|
}
|
|
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
|
|
public PinInfo arInput2
|
|
{
|
|
get
|
|
{
|
|
return PinList[1];
|
|
}
|
|
set
|
|
{
|
|
// if (value != aron2_) RunStartTimeMin = DateTime.Now;
|
|
PinList[1] = value;
|
|
this.Invalidate();
|
|
}
|
|
}
|
|
|
|
|
|
public Rectangle arRectProgress { get; set; }
|
|
|
|
public override void UpdateValue()
|
|
{
|
|
//둘다 켜져잇거나 거져잇다면 작동하지 않는다
|
|
if (arInput1 != arInput2)
|
|
{
|
|
if (arSensorType == eSensorType.SingleAction)
|
|
{
|
|
var ts = DateTime.Now - RunStartTimeMax;
|
|
//단동은 1번 센서의 on/off 로 처리한다
|
|
if (arInput1.Value)
|
|
{
|
|
//경과시간만큼 MAX로 이동한다
|
|
arRunLen += ts.TotalSeconds * arVel;
|
|
}
|
|
else
|
|
{
|
|
//경과시간만큼 MIN으로 이동한다
|
|
arRunLen -= ts.TotalSeconds * arVel;
|
|
}
|
|
RunStartTimeMax = DateTime.Now;
|
|
}
|
|
else
|
|
{
|
|
//복동은 1번센서는 Max로 2번센서는 Min으로 이동시킨다
|
|
if (arInput1.Value)
|
|
{
|
|
var ts = DateTime.Now - RunStartTimeMax;
|
|
arRunLen += ts.TotalSeconds * arVel;
|
|
RunStartTimeMax = DateTime.Now;
|
|
}
|
|
else if (arInput2.Value)
|
|
{
|
|
var ts = DateTime.Now - RunStartTimeMin;
|
|
arRunLen -= ts.TotalSeconds * arVel;
|
|
RunStartTimeMin = DateTime.Now;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (arRunLen > arLength) arRunLen = arLength;
|
|
if (arRunLen < 1) arRunLen = 0;
|
|
|
|
arOutputMax.Raw = arProgress >= 99.9;
|
|
arOutputMin.Raw = arProgress <= 0.1;
|
|
|
|
// public Boolean arMax { get { return arProgress >= 99.9; } }
|
|
//public Boolean arMin { get { return arProgress <= 0.1; } }
|
|
}
|
|
|
|
protected override void OnPaint(PaintEventArgs pe)
|
|
{ // base.OnPaint(pe);
|
|
|
|
|
|
|
|
pe.Graphics.DrawRectangle(Pens.Gray, DisplayRectangle.Left, DisplayRectangle.Top, DisplayRectangle.Width - 1, DisplayRectangle.Height - 1);
|
|
|
|
var baseRect = new Rectangle(DisplayRectangle.Left + Padding.Left,
|
|
DisplayRectangle.Top + Padding.Top,
|
|
DisplayRectangle.Width - Padding.Left - Padding.Right,
|
|
DisplayRectangle.Height - Padding.Top - Padding.Bottom);
|
|
|
|
|
|
//pe.Graphics.DrawRect(baseRect, Color.Blue, 1);
|
|
|
|
|
|
//사각형안에 사각형이 움직이는 걸로 하며 . 기본 H 배치한다
|
|
var rectH = (int)(baseRect.Height * 0.6);
|
|
var rectOut = new Rectangle(baseRect.Left,
|
|
(int)(baseRect.Top + (baseRect.Height - rectH) / 2.0),
|
|
(int)(baseRect.Width), rectH);
|
|
|
|
var InOffset = (int)(baseRect.Height * 0.15);
|
|
//var rectIn = new Rectangle(rectOut.Right, rectOut.Top + InOffset,
|
|
// DisplayRectangle.Width - rectOut.Width - 2, rectOut.Height - (InOffset * 2));
|
|
|
|
|
|
|
|
//진행율(%)
|
|
var progress = (arProgress / 100.0) * rectOut.Width;
|
|
var PWid = 10;
|
|
var rectP = new Rectangle((int)(progress - PWid + baseRect.Left), baseRect.Top, PWid, baseRect.Height);
|
|
|
|
pe.Graphics.FillRectangle(Brushes.Gray, rectOut);
|
|
pe.Graphics.DrawRect(rectOut, Color.Black, 2);
|
|
|
|
//pe.Graphics.DrawRect(rectIn, Color.Black, 2);
|
|
|
|
if (this.arOutputMax.Value)
|
|
pe.Graphics.FillRectangle(Brushes.Red, rectP);
|
|
else if (this.arOutputMin.Value)
|
|
pe.Graphics.FillRectangle(Brushes.Blue, rectP);
|
|
else
|
|
pe.Graphics.FillRectangle(Brushes.Gold, rectP);
|
|
|
|
pe.Graphics.DrawRect(rectP, Color.Black, 2);
|
|
|
|
|
|
//가동상태를 상단에 표시한다
|
|
var StSize = 10;// baseRect.Height * 0.15f;
|
|
var rectp1 = new RectangleF(
|
|
this.DisplayRectangle.Right - StSize - 3,
|
|
DisplayRectangle.Top + 3,
|
|
StSize, StSize
|
|
);
|
|
|
|
if (arInput1.Value)
|
|
pe.Graphics.FillRectangle(Brushes.Red, rectp1);
|
|
else
|
|
pe.Graphics.FillRectangle(Brushes.Gray, rectp1);
|
|
pe.Graphics.DrawRect(rectp1, Color.White);
|
|
|
|
if (arSensorType == eSensorType.DoubleAction)
|
|
{
|
|
var rectp2 = new RectangleF(
|
|
this.DisplayRectangle.Right - StSize - 3,
|
|
DisplayRectangle.Bottom - StSize - 3,
|
|
StSize, StSize
|
|
);
|
|
if (arInput2.Value)
|
|
pe.Graphics.FillRectangle(Brushes.Red, rectp2);
|
|
else
|
|
pe.Graphics.FillRectangle(Brushes.Gray, rectp2);
|
|
pe.Graphics.DrawRect(rectp2, Color.White);
|
|
}
|
|
|
|
// if (arMin)
|
|
// {
|
|
// pe.Graphics.DrawString("MIN", this.Font, Brushes.Black, rectOut,
|
|
// new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
|
|
// }
|
|
// else if(arMax)
|
|
// {
|
|
// pe.Graphics.DrawString("MAX", this.Font, Brushes.Black, rectOut,
|
|
//new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
|
|
// }
|
|
// else
|
|
// {
|
|
// pe.Graphics.DrawString(arProgress.ToString("N0")+"%", this.Font, Brushes.Black, rectOut,
|
|
//new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
|
|
// }
|
|
|
|
|
|
if (string.IsNullOrEmpty(Text) == false)
|
|
{
|
|
pe.Graphics.DrawString(Text + "\n" + progress.ToString(),
|
|
this.Font,
|
|
Brushes.Black,
|
|
rectOut,
|
|
new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
|
|
}
|
|
}
|
|
}
|
|
}
|