This commit is contained in:
chi
2025-06-30 13:48:19 +09:00
parent 02e71d7446
commit 00dd50192b
29 changed files with 2397 additions and 1136 deletions

View File

@@ -19,7 +19,7 @@ namespace Project.Device
public string buffer = string.Empty;
public System.Text.StringBuilder newbuffer = new StringBuilder();
public string errorMessage = string.Empty;
public DateTime LastStatusSendTime = DateTime.Now;
public DateTime LastStatusSendTime { get; set; } = DateTime.Now;
private EEProtocol proto;
public class MessageArgs : EventArgs

View File

@@ -26,16 +26,11 @@ namespace Project
return;
}
//사용자 스텝처리가 아닌경우에만 검사
//if (Pub.flag.get(eFlag.UserStepCheck) == false)
//가동불가 조건 확인
if (CheckStopCondition() == false)
{
//가동불가 조건 확인
if (CheckStopCondition() == false)
{
PUB.sm.SetNewStep(eSMStep.PAUSE);
return;
}
PUB.sm.SetNewStep(eSMStep.PAUSE);
return;
}
//이머전시상태라면 stop 처리한다.
@@ -46,13 +41,6 @@ namespace Project
PUB.sm.SetNewStep(eSMStep.IDLE);
}
//실행스텝보정
//if (Pub.sm.runStep == eRunStep.NOTSET && Pub.sm.runStepNew == eRunStep.NOTSET)
//{
// Pub.sm.setNewRunStep(eRunStep.IDLE);
// Pub.log.Add("RUnStep Initialize");
//}
//스텝이 변경되었다면?
if (PUB.sm.RunStep != PUB.sm.RunStepNew)
{
@@ -88,7 +76,7 @@ namespace Project
//if (PUB.Result != null && PUB.sm != null)
// EEMStatus.AddEEDBSQL(PUB.sm.Step, PUB.sm.RunStep.ToString(), PUB.Result.TargetPos.ToString());
PUB.Speak(Lang.) ;
PUB.Speak(Lang.);
PUB.sm.SetNewRunStep(ERunStep.CHARGECHECK);
return;
}
@@ -143,8 +131,8 @@ namespace Project
PUB.Speak(Lang.);
//230601
// if (PUB.Result != null && PUB.sm != null)
// EEMStatus.AddEEDBSQL(PUB.sm.Step, PUB.sm.RunStep.ToString(), PUB.Result.TargetPos.ToString());
// if (PUB.Result != null && PUB.sm != null)
// EEMStatus.AddEEDBSQL(PUB.sm.Step, PUB.sm.RunStep.ToString(), PUB.Result.TargetPos.ToString());
//QA를 제외한 경우에는 기본 QC로 이동한다
if (PUB.Result.NextPos == ePosition.QA)
@@ -184,7 +172,7 @@ namespace Project
PUB.sm.ClearRunStep();
PUB.Result.TargetPos = ePosition.QC;
PUB.sm.SetNewRunStep(ERunStep.GOHOME);
PUB.Speak( Lang.);
PUB.Speak(Lang.);
}
return;
}
@@ -198,7 +186,7 @@ namespace Project
else if (_SM_RUN_GOHOME(runStepisFirst, PUB.sm.GetRunSteptime))
{
//230601
// if (PUB.Result != null && PUB.sm != null)
// if (PUB.Result != null && PUB.sm != null)
// EEMStatus.AddEEDBSQL(PUB.sm.Step, PUB.sm.RunStep.ToString(), PUB.Result.TargetPos.ToString());
PUB.Speak(Lang.);
@@ -215,7 +203,7 @@ namespace Project
return true;
}
void CheckAGVMoveTo(eGoDir dir)
{
//계속내려간다
@@ -545,7 +533,7 @@ namespace Project
return false;
}
}//cvass
}

View File

@@ -13,12 +13,12 @@ namespace Project
{
public Boolean _SM_RUN_READY(bool isFirst, TimeSpan stepTime)
{
//이동 불가 조건이 걸려있다면 충전을 하지 못하게 한다.
Boolean bAutoChageOn = true;
if (PUB.AGV.system1.stop_by_front_detect) bAutoChageOn = false;
else if (PUB.AGV.error.Emergency) bAutoChageOn = false;
else if (VAR.BOOL[eVarBool.FLAG_CHARGEONA]) bAutoChageOn = false;
else if (VAR.BOOL[eVarBool.FLAG_CHARGEONM]) bAutoChageOn = false;
////이동 불가 조건이 걸려있다면 충전을 하지 못하게 한다.
//Boolean bAutoChageOn = true;
//if (PUB.AGV.system1.stop_by_front_detect) bAutoChageOn = false;
//else if (PUB.AGV.error.Emergency) bAutoChageOn = false;
//else if (VAR.BOOL[eVarBool.FLAG_CHARGEONA]) bAutoChageOn = false;
//else if (VAR.BOOL[eVarBool.FLAG_CHARGEONM]) bAutoChageOn = false;
//자동 충전 중이라면 최대 충전시간과 레벨을 체크한다
@@ -73,58 +73,58 @@ namespace Project
}
VAR.STR[eVarString.ChargeCheckMsg] = "현재 위치 모름";
}
else if (PUB.setting.Enable_AutoCharge == true )
{
if(bAutoChageOn)
{
VAR.BOOL[eVarBool.CHARGE_READY] = true;
if (PUB.BMS.Current_Level < PUB.setting.ChargeStartLevel)
{
//레벨에 의한 자동 충전간격은
var ts = VAR.TIME.RUN(eVarTime.ChargeTry);
if (ts.TotalSeconds >= PUB.setting.ChargeRetryTerm)
{
VAR.I32[eVarInt32.ChargeWaitSec] = 0;
VAR.BOOL[eVarBool.CHARGE_WAIT] = false;
PUB.log.Add($"자동충전레벨시작 {PUB.BMS.Current_Level}/{PUB.setting.ChargeStartLevel}");
PUB.sm.ClearRunStep();
PUB.sm.SetNewRunStep(ERunStep.GOCHARGE);
PUB.sm.SetNewStep(eSMStep.RUN);
PUB.AddEEDB($"자동충전레벨시작 {PUB.BMS.Current_Level}/{PUB.setting.ChargeStartLevel}");
}
else
{
VAR.I32[eVarInt32.ChargeWaitSec] = (int)(PUB.setting.ChargeRetryTerm - ts.TotalSeconds);
VAR.BOOL[eVarBool.CHARGE_WAIT] = true;
}
VAR.STR[eVarString.ChargeCheckMsg] = "배터리 충전 레벨 필요";
}
else
{
//아직 레벨이 높다
VAR.BOOL[eVarBool.CHARGE_READY] = false;
VAR.I32[eVarInt32.ChargeWaitSec] = 0;
VAR.BOOL[eVarBool.CHARGE_WAIT] = false;
VAR.STR[eVarString.ChargeCheckMsg] = "배터리 레벨상 충전 불필요";
}
}
else
{
VAR.BOOL[eVarBool.CHARGE_READY] = false;
VAR.I32[eVarInt32.ChargeWaitSec] = 0;
VAR.BOOL[eVarBool.CHARGE_WAIT] = false;
VAR.STR[eVarString.ChargeCheckMsg] = "충전 불가 조건";
//충전조건이 맞지 않는다
}
}
else
{
VAR.BOOL[eVarBool.CHARGE_READY] = false;
VAR.I32[eVarInt32.ChargeWaitSec] = 0;
VAR.BOOL[eVarBool.CHARGE_WAIT] = false;
//자동충전이 해제된 상태이므로 처리하지 않는다
VAR.STR[eVarString.ChargeCheckMsg] = "자동 충전 해제 됨";
}
//else if (PUB.setting.Enable_AutoCharge == true )
//{
// if(bAutoChageOn)
// {
// VAR.BOOL[eVarBool.CHARGE_READY] = true;
// if (PUB.BMS.Current_Level < PUB.setting.ChargeStartLevel)
// {
// //레벨에 의한 자동 충전간격은
// var ts = VAR.TIME.RUN(eVarTime.ChargeTry);
// if (ts.TotalSeconds >= PUB.setting.ChargeRetryTerm)
// {
// VAR.I32[eVarInt32.ChargeWaitSec] = 0;
// VAR.BOOL[eVarBool.CHARGE_WAIT] = false;
// PUB.log.Add($"자동충전레벨시작 {PUB.BMS.Current_Level}/{PUB.setting.ChargeStartLevel}");
// PUB.sm.ClearRunStep();
// PUB.sm.SetNewRunStep(ERunStep.GOCHARGE);
// PUB.sm.SetNewStep(eSMStep.RUN);
// PUB.AddEEDB($"자동충전레벨시작 {PUB.BMS.Current_Level}/{PUB.setting.ChargeStartLevel}");
// }
// else
// {
// VAR.I32[eVarInt32.ChargeWaitSec] = (int)(PUB.setting.ChargeRetryTerm - ts.TotalSeconds);
// VAR.BOOL[eVarBool.CHARGE_WAIT] = true;
// }
// VAR.STR[eVarString.ChargeCheckMsg] = "배터리 충전 레벨 필요";
// }
// else
// {
// //아직 레벨이 높다
// VAR.BOOL[eVarBool.CHARGE_READY] = false;
// VAR.I32[eVarInt32.ChargeWaitSec] = 0;
// VAR.BOOL[eVarBool.CHARGE_WAIT] = false;
// VAR.STR[eVarString.ChargeCheckMsg] = "배터리 레벨상 충전 불필요";
// }
// }
// else
// {
// VAR.BOOL[eVarBool.CHARGE_READY] = false;
// VAR.I32[eVarInt32.ChargeWaitSec] = 0;
// VAR.BOOL[eVarBool.CHARGE_WAIT] = false;
// VAR.STR[eVarString.ChargeCheckMsg] = "충전 불가 조건";
// //충전조건이 맞지 않는다
// }
//}
//else
//{
// VAR.BOOL[eVarBool.CHARGE_READY] = false;
// VAR.I32[eVarInt32.ChargeWaitSec] = 0;
// VAR.BOOL[eVarBool.CHARGE_WAIT] = false;
// //자동충전이 해제된 상태이므로 처리하지 않는다
// VAR.STR[eVarString.ChargeCheckMsg] = "자동 충전 해제 됨";
//}
//대기모드에서는 움직이지 않게 한다
if(PUB.AGV.system1.agv_run)

View File

@@ -41,31 +41,7 @@ namespace Project
{
try
{
if (PUB.mapctl != null)
{
var rlt = AGVControl.MapControlManager.PredictNextAction();
if (rlt.ReasonCode == AGVControl.AGVActionReasonCode.busy)
{
//var premsg = $"이전 예측작업이 완료되지 않았습니다";
//PUB.log.AddE(premsg);
//PUB.log.AddE(premsg);
//Console.WriteLine(premsg);
//predicterr += 1;
//if (predicterr > 10)
//{
// var premsg = $"행동예측 오류카운트 초과";
// PUB.AGV.AGVMoveStop(premsg);
// PUB.log.AddE(premsg);
// PUB.logagv.AddE(premsg);
// Console.WriteLine(premsg);
//}
}
}
//데이터 파싱
switch (e.DataType)
{
case arDev.Narumi.DataType.STS:
@@ -83,12 +59,12 @@ namespace Project
//모터방향 입력
if (PUB.AGV.data.Direction == 'B')
AGVControl.MapControlManager.agv.CurrentMOTDirection = AGVControl.Models.Direction.Backward;
PUB.mapctl.Manager.agv.CurrentMOTDirection = AGVControl.Direction.Backward;
else
AGVControl.MapControlManager.agv.CurrentMOTDirection = AGVControl.Models.Direction.Forward;
PUB.mapctl.Manager.agv.CurrentMOTDirection = AGVControl.Direction.Forward;
AGVControl.MapControlManager.agv.IsMoving = PUB.AGV.system1.agv_run;
AGVControl.MapControlManager.agv.IsMarkCheck = PUB.AGV.system1.Mark1_check || PUB.AGV.system1.Mark2_check;
PUB.mapctl.Manager.agv.IsMoving = PUB.AGV.system1.agv_run;
PUB.mapctl.Manager.agv.IsMarkCheck = PUB.AGV.system1.Mark1_check || PUB.AGV.system1.Mark2_check;
if (PUB.AGV.signal.mark_sensor == false)
{
@@ -201,10 +177,8 @@ namespace Project
else
{
//위치는 찾았다 해당 위치가 내 목적지라면 mark stop기능으로 전환한다
}
////자동, 상하차 모드일때 RFID 가 타겟위치에 올때는 - 멈춤을 설정해준다
//if (VAR.BOOL[eVarBool.FLAG_AUTORUN] == true &&
// PUB.Result.CurrentPos == PUB.Result.TargetPos &&
@@ -237,12 +211,19 @@ namespace Project
break;
}
//이 후 상황을 예측한다
if (PUB.mapctl != null)
{
var rlt = PUB.mapctl.Manager.PredictNextAction();
if (rlt.Changed)
Console.WriteLine($"[new] predict idx:{rlt.Idx}");
}
}
catch (Exception ex)
{
Console.WriteLine($"[AGV_DataReceive] {ex.Message}");
}
}
}
}

View File

@@ -158,9 +158,10 @@ namespace Project
private void Bms_BMSDataReceive(object sender, EventArgs e)
{
AGVControl.MapControlManager.agv.BatteryLevel = PUB.BMS.Current_Level;
AGVControl.MapControlManager.agv.BatteryTemp1 = PUB.BMS.Current_temp1;
AGVControl.MapControlManager.agv.BatteryTemp2 = PUB.BMS.Current_temp2;
PUB.mapctl.Manager.agv.BatteryLevel = PUB.BMS.Current_Level;
PUB.mapctl.Manager.agv.BatteryTemp1 = PUB.BMS.Current_temp1;
PUB.mapctl.Manager.agv.BatteryTemp2 = PUB.BMS.Current_temp2;
if (PUB.BMS.Current_Level <= PUB.setting.ChargeStartLevel)
{
//배터리 레벨이 기준보다 낮다면 경고를 활성화 한다

View File

@@ -163,10 +163,7 @@ namespace Project
{
PUB.BMS.SendQuery();
}
Update_BatteryWarnSpeak();
}
}
}

View File

@@ -25,6 +25,25 @@ namespace Project
var data = e.ReceivedPacket.Data;
var dataStr = System.Text.Encoding.Default.GetString(data);
var cmd = (ENIGProtocol.AGVCommands)e.ReceivedPacket.Command;
var TargetID = 0;
if (dataStr.Length >= 2)
{
//대상디바이스
TargetID = Convert.ToByte(dataStr.Substring(0, 2), 16);
//데이터영역을 다시 설정
if (dataStr.Length > 2) dataStr = dataStr.Substring(2);
else dataStr = string.Empty;
}
else
{
PUB.log.Add($"ACS 데이터에서 TARGET ID가 없습니다(data : first byte)");
}
if (PUB.setting.XBE_ID != TargetID)
return;
switch (cmd)
{
@@ -60,7 +79,7 @@ namespace Project
case ENIGProtocol.AGVCommands.Goto: //move to tag
if (uint.TryParse(dataStr, out uint tagno2))
{
var currPos = AGVControl.MapControlManager.agv.CurrentRFID;///.AGVMoveToRFID(;
var currPos = PUB.mapctl.Manager.agv.CurrentRFID;///.AGVMoveToRFID(;
if (PUB.mapctl.SetTargetPosition(tagno2))
PUB.log.AddI($"New Target {tagno2}");
else

View File

@@ -172,7 +172,7 @@ namespace Project
MenuLift.Text = "LIFT";
toolTip1.SetToolTip(MenuLift, "I/O 및 FLAG를 확인 합니다");
MenuLift.UseVisualStyleBackColor = true;
MenuLift.Click += button3_Click;
MenuLift.Click += MenuLift_Click;
//
// MenuMAN
//
@@ -189,7 +189,7 @@ namespace Project
MenuMAN.Text = "MANUAL";
toolTip1.SetToolTip(MenuMAN, "작업 내역을 확인 합니다");
MenuMAN.UseVisualStyleBackColor = true;
MenuMAN.Click += button4_Click;
MenuMAN.Click += ManualMan_Click;
//
// MenuFlag
//
@@ -206,7 +206,7 @@ namespace Project
MenuFlag.Text = "FLAG";
toolTip1.SetToolTip(MenuFlag, "I/O 및 FLAG를 확인 합니다");
MenuFlag.UseVisualStyleBackColor = true;
MenuFlag.Click += button1_Click;
MenuFlag.Click += btMenuFlag_Click;
//
// MenuAuto
//
@@ -223,7 +223,7 @@ namespace Project
MenuAuto.Text = "AUTO";
toolTip1.SetToolTip(MenuAuto, "작업 내역을 확인 합니다");
MenuAuto.UseVisualStyleBackColor = true;
MenuAuto.Click += button2_Click;
MenuAuto.Click += btMenuAuto_Click;
//
// MenuLog
//
@@ -258,7 +258,7 @@ namespace Project
MenuAGV.Text = "AGV";
toolTip1.SetToolTip(MenuAGV, "I/O 및 FLAG를 확인 합니다");
MenuAGV.UseVisualStyleBackColor = false;
MenuAGV.Click += button1_Click_1;
MenuAGV.Click += btMenuAGV_Click_1;
//
// MenuBMS
//
@@ -275,7 +275,7 @@ namespace Project
MenuBMS.Text = "BMS";
toolTip1.SetToolTip(MenuBMS, "I/O 및 FLAG를 확인 합니다");
MenuBMS.UseVisualStyleBackColor = true;
MenuBMS.Click += button2_Click_1;
MenuBMS.Click += btMenuBMS_Click_1;
//
// btAutoRun
//
@@ -323,7 +323,7 @@ namespace Project
btAutoRun.TextShadow = true;
btAutoRun.TextVisible = true;
toolTip1.SetToolTip(btAutoRun, "작업상태(자동/수동)를 표시 합니다");
btAutoRun.Click += btStart_Click;
btAutoRun.Click += btAutorun_Click;
//
// btChargeA
//
@@ -837,14 +837,12 @@ namespace Project
gridviewTestToolStripMenuItem.Name = "gridviewTestToolStripMenuItem";
gridviewTestToolStripMenuItem.Size = new Size(228, 22);
gridviewTestToolStripMenuItem.Text = "GridviewTest";
gridviewTestToolStripMenuItem.Click += gridviewTestToolStripMenuItem_Click;
//
// 으ㅆㄷㄴㅅToolStripMenuItem
//
ToolStripMenuItem.Name = "으ㅆㄷㄴㅅToolStripMenuItem";
ToolStripMenuItem.Size = new Size(228, 22);
ToolStripMenuItem.Text = "Test DataMatrix StripID";
ToolStripMenuItem.Click += ToolStripMenuItem_Click;
//
// messageToolStripMenuItem
//
@@ -879,7 +877,6 @@ namespace Project
reloadLotListToolStripMenuItem.Name = "reloadLotListToolStripMenuItem";
reloadLotListToolStripMenuItem.Size = new Size(228, 22);
reloadLotListToolStripMenuItem.Text = "Reload Lot List";
reloadLotListToolStripMenuItem.Click += reloadLotListToolStripMenuItem_Click;
//
// moveSourceListToDestListToolStripMenuItem
//
@@ -1044,7 +1041,7 @@ namespace Project
btHome.TextAlign = ContentAlignment.MiddleCenter;
btHome.TextShadow = true;
btHome.TextVisible = true;
btHome.Click += arLabel1_Click;
btHome.Click += brHome_Click;
//
// btChargeM
//

View File

@@ -26,6 +26,7 @@ namespace Project
ViewForm.fFlag form_flag = null;
ViewForm.fAgv form_agv = null;
ViewForm.fBms form_bms = null;
Dialog.fLog form_log = null;
readonly usbdetect.DriveDetector usbdet;
public fMain()
@@ -59,6 +60,10 @@ namespace Project
this.FormClosing += __Closing;
if (PUB.setting.FullScreen) this.WindowState = FormWindowState.Maximized;
lbTime.Click += (s1,e1) => {
PUB.mapctl.ShowDesign();
};
}
protected override void WndProc(ref Message m)
@@ -240,10 +245,10 @@ namespace Project
this.btDebug.Visible = PUB.setting.UseDebugMode;
PUB.log.Add("Program Start");
UpdateControlText();
//수량표시
PUB.counter.PropertyChanged += Counter_PropertyChanged;
PUB.counter.PropertyChanged += (s1, e1) => Update_Count();
Update_Count();
PUB.log.Add("프로그램 실행 기록 추가");
@@ -256,15 +261,6 @@ namespace Project
}
private void Counter_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
//수량에 변화가 잇다면 업데이트 한다
Update_Count();
}
#region "Mouse Form Move"
private Boolean fMove = false;
@@ -296,6 +292,137 @@ namespace Project
}
#endregion
void socket_SendMessage(object sender, Device.Socket.SocketMessageEventArgs e)
{
//핑로그가 꺼져있는 상황일때 핑로그는 로그를 기록하지 않는다. 181205
if (!PUB.setting.Log_Ping && e.Message.Type == Device.Socket.eType.REPLY && e.Message.SType == Device.Socket.eSType.STATUS)
{
return;
}
PUB.log.Add("WS << " + e.rawData);
}
void socket_RecvMessage(object sender, Device.Socket.SocketMessageEventArgs e)
{
if (e.Message.isError)
PUB.log.AddE("WS >> " + e.Message.ErrorMessage + ",RAW=" + e.rawData);
else
{
switch (e.Message.Type)
{
case Device.Socket.eType.REQUEST:
if (e.Message.SType == Device.Socket.eSType.STATUS)
{
var packet = PUB.sock_debug.makeReplyStatus(Device.Socket.eStatus.IDLE);
var rlt = PUB.sock_debug.Send(PUB.setting.Asset, Device.Socket.eType.REPLY, Device.Socket.eSType.STATUS, packet);
if (!rlt)
{
PUB.log.AddE("Status Reply Error");
}
else
{
if (PUB.setting.Log_Ping) PUB.log.AddI("Server Status Reply OK");
}
}
else
{
PUB.log.Add("WS >> " + e.rawData);
}
break;
}
}
}
void socket_GetMessage(object sender, Device.Socket.MesasgeEventArgs e)
{
if (e.isError) PUB.log.AddE("WS:" + e.Message);
else PUB.log.Add("WS:" + e.Message);
}
delegate void SelectModelHandler(string modelName);
void SelectModelM(string modelName)
{
if (this.InvokeRequired)
{
this.Invoke(new SelectModelHandler(SelectModelM), new object[] { modelName });
return;
}
}
void func_sw_start(bool Prompt = false)
{
if (VAR.BOOL[eVarBool.FLAG_AUTORUN] == false) //자동상태가 아니라면
{
PUB.AGV.AGVErrorReset();
if (Prompt)
{
if (UTIL.MsgQ("AGV상태를 자동으로 전환 할까요?") != DialogResult.Yes) return;
}
//충전상태확인
if (PUB.CheckManualChargeMode() == false) return;
PUB.popup.needClose = true;
PUB.sm.bPause = false;
PUB.sm.SetNewStep(eSMStep.RUN);
if (PUB.Result.CurrentPos == ePosition.NONE || PUB.Result.TargetPos == ePosition.NONE)
{
PUB.sm.SetNewRunStep(ERunStep.GOHOME);
}
PUB.Speak(Lang.);
}
else
{
PUB.AGV.AGVCharge(PUB.setting.ChargerID, false); //230425 수동전환하면 충전 해제한다
PUB.sm.SetNewStep(eSMStep.IDLE);
PUB.Speak(Lang.);
}
}
void Resultclear()
{
PUB.Result.Clear();
PUB.log.AddI("Clear Resultclear");
}
void CheckFreeSpace()
{
try
{
if (PUB.path.FullName.StartsWith("\\"))
{
SSInfo.setTitle(0, 1, "UNC Path Detected");
SSInfo.setValue(0, 1, 2);
}
else
{
double freeSpaceRate_ = PUB.GetFreeSpace();
this.freeSpaceRate = freeSpaceRate_;
SSInfo.setTitle(0, 1, "FREE(" + PUB.path.FullName.Substring(0, 1) + ") : " + freeSpaceRate.ToString("N2") + "%");
if (freeSpaceRate < PUB.setting.AutoDeleteThreshold)
{
VAR.BOOL[eVarBool.MINSPACE] = true;
SSInfo.setValue(0, 1, 2); //lbFreeSpace.ForeColor = Color.Tomato;
}
else
{
VAR.BOOL[eVarBool.MINSPACE] = false;
SSInfo.setValue(0, 1, 3);// lbFreeSpace.ForeColor = Color.White;
}
}
//Pub.log.Add("남은디스크공간확인:" + freeSpaceRate.ToString("N2") + "%"); 190129
}
catch (Exception ex)
{
SSInfo.setTitle(0, 1, "FREE SPACE : -ERROR-");
PUB.log.AddE("check free space : " + ex.Message);
}
}
private void CtlPos1_ItemClick(object sender, CtlPos.ItemClickEventArgs e)
@@ -451,191 +578,16 @@ namespace Project
if (dlg != null) dlg.Dispose();
}
void socket_SendMessage(object sender, Device.Socket.SocketMessageEventArgs e)
{
//핑로그가 꺼져있는 상황일때 핑로그는 로그를 기록하지 않는다. 181205
if (!PUB.setting.Log_Ping && e.Message.Type == Device.Socket.eType.REPLY && e.Message.SType == Device.Socket.eSType.STATUS)
{
return;
}
PUB.log.Add("WS << " + e.rawData);
}
void socket_RecvMessage(object sender, Device.Socket.SocketMessageEventArgs e)
{
if (e.Message.isError)
PUB.log.AddE("WS >> " + e.Message.ErrorMessage + ",RAW=" + e.rawData);
else
{
switch (e.Message.Type)
{
case Device.Socket.eType.REQUEST:
if (e.Message.SType == Device.Socket.eSType.STATUS)
{
var packet = PUB.sock_debug.makeReplyStatus(Device.Socket.eStatus.IDLE);
var rlt = PUB.sock_debug.Send(PUB.setting.Asset, Device.Socket.eType.REPLY, Device.Socket.eSType.STATUS, packet);
if (!rlt)
{
PUB.log.AddE("Status Reply Error");
}
else
{
if (PUB.setting.Log_Ping) PUB.log.AddI("Server Status Reply OK");
}
}
else
{
PUB.log.Add("WS >> " + e.rawData);
}
break;
}
}
}
void socket_GetMessage(object sender, Device.Socket.MesasgeEventArgs e)
{
if (e.isError) PUB.log.AddE("WS:" + e.Message);
else PUB.log.Add("WS:" + e.Message);
}
delegate void SelectModelHandler(string modelName);
void SelectModelM(string modelName)
{
if (this.InvokeRequired)
{
this.Invoke(new SelectModelHandler(SelectModelM), new object[] { modelName });
return;
}
}
void func_sw_start(bool Prompt = false)
{
if (VAR.BOOL[eVarBool.FLAG_AUTORUN] == false) //자동상태가 아니라면
{
PUB.AGV.AGVErrorReset();
if (Prompt)
{
if (UTIL.MsgQ("AGV상태를 자동으로 전환 할까요?") != DialogResult.Yes) return;
}
//충전상태확인
if (PUB.CheckManualChargeMode() == false) return;
PUB.popup.needClose = true;
PUB.sm.bPause = false;
PUB.sm.SetNewStep(eSMStep.RUN);
if (PUB.Result.CurrentPos == ePosition.NONE || PUB.Result.TargetPos == ePosition.NONE)
{
PUB.sm.SetNewRunStep(ERunStep.GOHOME);
}
PUB.Speak(Lang.);
}
else
{
PUB.AGV.AGVCharge(PUB.setting.ChargerID, false); //230425 수동전환하면 충전 해제한다
PUB.sm.SetNewStep(eSMStep.IDLE);
PUB.Speak(Lang.);
}
}
void Resultclear()
{
PUB.Result.Clear();
PUB.log.AddI("Clear Resultclear");
}
void CheckFreeSpace()
{
try
{
if (PUB.path.FullName.StartsWith("\\"))
{
SSInfo.setTitle(0, 1, "UNC Path Detected");
SSInfo.setValue(0, 1, 2);
}
else
{
double freeSpaceRate_ = PUB.GetFreeSpace();
this.freeSpaceRate = freeSpaceRate_;
SSInfo.setTitle(0, 1, "FREE(" + PUB.path.FullName.Substring(0, 1) + ") : " + freeSpaceRate.ToString("N2") + "%");
if (freeSpaceRate < PUB.setting.AutoDeleteThreshold)
{
VAR.BOOL[eVarBool.MINSPACE] = true;
SSInfo.setValue(0, 1, 2); //lbFreeSpace.ForeColor = Color.Tomato;
}
else
{
VAR.BOOL[eVarBool.MINSPACE] = false;
SSInfo.setValue(0, 1, 3);// lbFreeSpace.ForeColor = Color.White;
}
}
//Pub.log.Add("남은디스크공간확인:" + freeSpaceRate.ToString("N2") + "%"); 190129
}
catch (Exception ex)
{
SSInfo.setTitle(0, 1, "FREE SPACE : -ERROR-");
PUB.log.AddE("check free space : " + ex.Message);
}
}
private void demoRunToolStripMenuItem_Click(object sender, EventArgs e)
{
PUB.Result.JobEndTime = DateTime.Now;
// Pub.flag.Toggle(eFlag.DemoRun);
// Pub.log.AddAT(string.Format("데모변경: {0}", Pub.flag.get(eFlag.DemoRun)));
}
private void openMapFileToolStripMenuItem_Click(object sender, EventArgs e)
{
using (OpenFileDialog od = new OpenFileDialog())
if (od.ShowDialog() != System.Windows.Forms.DialogResult.OK) return;
//if (orgImage != null) orgImage.Dispose();
}
private void setZValidToolStripMenuItem_Click(object sender, EventArgs e)
{
PUB.log.Add("user set z-home set on");
}
private void gridviewTestToolStripMenuItem_Click(object sender, EventArgs e)
{
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
/////HB9225-4280A 0901
//var striplist = new string[]{
// "HB9125-7560A 0704",
//"HB9125-7800A 0104",
//"HB9125-8480A 0701",
//"HB9130-8550A 5108",
//"HB9130-8620A 0701",
//"HB9131-9340A 0201",
//"HB9206-0810A 5301",
//"HB9206-0820A 0902",
//"HB9222-3020A 0208",
//"HB9222-3020A 0508",
//"HB9222-3720A 0205",
//"HB9222-3720A 0902",
//"HB9225-3790A 0604",
//"HB9225-4280A 0901",
//"HB9228-4840A 0104",
//"HB9228-4840A 5908",
//"HB9313-7600A 1006",
//"HB9319-9540A 6003",
//"ZGP490510700 1305"
//};
}
private void errorToolStripMenuItem_Click(object sender, EventArgs e)
{
PUB.popup.setMessage("error\berror message");
@@ -651,12 +603,6 @@ namespace Project
PUB.popup.setMessage("attention\nattention message", MessageWindow.eWindowType.attention);
}
private void reloadLotListToolStripMenuItem_Click(object sender, EventArgs e)
{
}
private void arLabel3_Click(object sender, EventArgs e)
{
@@ -676,11 +622,6 @@ namespace Project
this.Close();
}
void UpdateControlText()
{
}
private void arLabel5_Click(object sender, EventArgs e)
{
//SetScreen(form_setup);
@@ -700,7 +641,7 @@ namespace Project
}
VAR.BOOL[eVarBool.FLAG_SETUP] = false;// VAR.BOOL[eVarBool.FLAG_SETUP] = false;//VAR.BOOL[eVarBool.FLAG_SETUP] = false;
UpdateControlText();
if (popmsg) PUB.popup.Visible = true;
}
@@ -737,13 +678,13 @@ namespace Project
UTIL.RunExplorer(UTIL.CurrentPath);
}
private void button4_Click(object sender, EventArgs e)
private void ManualMan_Click(object sender, EventArgs e)
{
SetScreen(form_manu);
MenuMAN.ForeColor = Color.Gold;
}
private void button3_Click(object sender, EventArgs e)
private void MenuLift_Click(object sender, EventArgs e)
{
SetScreen(form_zlift);
MenuLift.ForeColor = Color.Gold;
@@ -755,7 +696,7 @@ namespace Project
this.cmDebug.Show(ctl, new Point((int)(ctl.Width / 1.5), (int)(ctl.Height / 1.5)));
}
private void btStart_Click(object sender, EventArgs e)
private void btAutorun_Click(object sender, EventArgs e)
{
var ctl = sender as arCtl.arLabel;
if (ctl.Enabled == false) return;
@@ -763,20 +704,18 @@ namespace Project
func_sw_start(true);
}
private void button2_Click(object sender, EventArgs e)
private void btMenuAuto_Click(object sender, EventArgs e)
{
SetScreen(form_auto);
MenuAuto.ForeColor = Color.Gold;
}
private void button1_Click(object sender, EventArgs e)
private void btMenuFlag_Click(object sender, EventArgs e)
{
SetScreen(form_flag);
MenuFlag.ForeColor = Color.Gold;
}
Dialog.fLog form_log = null;
private void btLog_Click(object sender, EventArgs e)
{
if (form_log == null || form_log.IsDisposed || form_log.Disposing)
@@ -844,8 +783,7 @@ namespace Project
PUB.Speak("고경석 수석님 밥은 드셨습니까?", true);
UpdateProgressStatus(20, 100, "progre");
}
private void arLabel1_Click(object sender, EventArgs e)
private void brHome_Click(object sender, EventArgs e)
{
var bCharge = PUB.sm.Step == eSMStep.RUN &&
(PUB.sm.RunStep == ERunStep.GOHOME);
@@ -878,30 +816,6 @@ namespace Project
}
//private void btChargeM_Click(object sender, EventArgs e)
//{
// var bCharge = PUB.flag.get(EFlag.FLAG_CHARGEONM);
// //충전을 시작해라ㅏ
// if (bCharge == true)
// {
// var dlg = Util.MsgQ("수동 충전 상태를 해제 할까요?");
// if (dlg == DialogResult.Yes)
// {
// PUB.flag.set(EFlag.FLAG_CHARGEONM, false);
// Pub.log.Add("수동 충전 상태 해제");
// }
// }
// else
// {
// var dlg = Util.MsgQ("수동 충전 상태를 설정 할까요?\n수동충전이 설정되면 AGV는 움직지 않습니다");
// if (dlg == DialogResult.Yes)
// {
// PUB.flag.set(EFlag.FLAG_CHARGEONM, true);
// Pub.log.Add("수동 충전 상태 설정");
// }
// }
//}
private void arLabel2_Click_1(object sender, EventArgs e)
{
@@ -911,17 +825,18 @@ namespace Project
private void lbCNtUp_Click(object sender, EventArgs e)
{
//down,up둘다 연결해야함
using (var f = new Dialog.fCounter())
f.ShowDialog();
}
private void button1_Click_1(object sender, EventArgs e)
private void btMenuAGV_Click_1(object sender, EventArgs e)
{
SetScreen(form_agv);
MenuAGV.ForeColor = Color.Gold;
}
private void button2_Click_1(object sender, EventArgs e)
private void btMenuBMS_Click_1(object sender, EventArgs e)
{
SetScreen(form_bms);
MenuBMS.ForeColor = Color.Gold;
@@ -971,5 +886,10 @@ namespace Project
PUB.log.Add("수동 충전 실행");
}
}
private void lbTime_Click(object sender, EventArgs e)
{
PUB.mapctl.ShowDesign();
}
}
}

View File

@@ -1,17 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
@@ -26,36 +26,36 @@
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->

View File

@@ -1,105 +1,152 @@
[RFID_POINTS]
100,486,517
173,488,516
230,493,515
309,489,514
370,490,513
437,487,512
483,459,511
511,421,510
543,371,509
569,329,508
608,289,507
661,279,506
701,297,505
698,349,504
698,391,503
699,449,502
691,491,501
570,275,400
517,264,401
454,264,402
388,262,403
315,258,404
639,234,600
621,182,601
641,183,602
657,101,603
627,82,604
560,73,605
499,65,606
432,65,607
264,232,405
363,60,608
654,508,500
96,542,100
159,542,101
226,542,102
309,541,103
369,542,104
483,165,753
735,163,700
523,170,752
565,175,751
597,182,750
665,181,703
700,176,702
722,170,701
100,486,517,False,,False
162,487,516,False,,False
230,493,515,False,,False
309,489,514,False,,False
370,490,513,False,,False
429,487,512,False,Forward,False
488,476,511,False,,False
538,445,510,False,,False
576,393,509,False,,False
598,343,508,False,,False
621,287,507,True,,False
671,293,506,False,,False
702,314,505,False,,False
711,354,504,False,,False
711,396,503,False,,False
707,454,502,False,,False
685,499,501,False,Forward,False
566,281,400,False,,False
504,274,401,False,,False
439,271,402,False,,False
383,267,403,False,,False
311,260,404,False,Forward,False
633,237,600,False,,False
609,186,601,False,,False
639,184,602,False,,False
657,101,603,False,,False
627,82,604,False,,False
560,73,605,False,,False
499,65,606,False,,False
432,65,607,False,Forward,False
242,239,405,False,Forward,True
363,60,608,False,Forward,True
633,547,500,False,Forward,True
96,542,100,False,Forward,True
159,542,101,False,Forward,True
226,542,102,False,Forward,True
310,541,103,False,Forward,True
369,542,104,False,Forward,True
397,166,753,False,Backward,True
847,152,700,False,Backward,True
484,169,752,False,Backward,False
535,176,751,False,,False
573,184,750,False,,False
665,181,703,False,,False
714,174,702,False,,False
756,165,701,False,Backward,False
[RFID_LINES]
100,486,173,488,517,516,False,73.02739
173,488,230,493,516,515,False,57.21888
230,493,309,489,515,514,False,79.1012
309,489,370,490,514,513,False,61.0082
370,490,437,487,513,512,False,67.06713
437,487,483,459,512,511,False,53.85165
483,459,511,421,511,510,False,47.20169
511,421,543,371,510,509,False,59.36329
543,371,569,329,509,508,False,49.39635
569,329,608,289,508,507,False,55.86591
608,289,639,234,507,600,False,63.13478
639,234,665,181,600,703,False,59.03389
665,181,657,101,703,603,False,80.399
657,101,627,82,603,604,False,35.51056
627,82,560,73,604,605,False,67.60178
560,73,499,65,605,606,False,61.52235
499,65,432,65,606,607,False,67
432,65,363,60,607,608,False,69.18092
641,183,665,181,602,703,False,24.08319
665,181,700,176,703,702,False,35.35534
700,176,722,170,702,701,False,22.80351
722,170,735,163,701,700,False,14.76482
641,183,621,182,602,601,False,20.02498
621,182,597,182,601,750,False,24
597,182,565,175,750,751,False,32.75668
565,175,523,170,751,752,False,42.29657
523,170,483,165,752,753,False,40.31129
264,232,315,258,405,404,False,57.24509
315,258,388,262,404,403,False,73.1095
388,262,454,264,403,402,False,66.0303
454,264,517,264,402,401,False,63
517,264,570,275,401,400,False,54.12947
570,275,608,289,400,507,False,40.49691
608,289,661,279,507,506,False,53.93515
661,279,701,297,506,505,False,43.86343
701,297,698,349,505,504,False,52.08647
698,349,698,391,504,503,False,42
698,391,699,449,503,502,False,58.00862
699,449,691,491,502,501,False,42.75512
691,491,654,508,501,500,False,40.71855
96,542,100,486,100,517,False,56.14267
159,542,173,488,101,516,False,55.7853
226,542,230,493,102,515,False,49.16299
309,541,309,489,103,514,False,52
369,542,370,490,104,513,False,52.00961
100,486,162,487,[RFIDPoint] 517,P:100,486,[RFIDPoint] 516,P:162,487,false,false,0
162,487,230,493,[RFIDPoint] 516,P:162,487,[RFIDPoint] 515,P:230,493,false,false,0
230,493,309,489,[RFIDPoint] 515,P:230,493,[RFIDPoint] 514,P:309,489,false,false,0
309,489,370,490,[RFIDPoint] 514,P:309,489,[RFIDPoint] 513,P:370,490,false,false,0
370,490,429,487,[RFIDPoint] 513,P:370,490,[RFIDPoint] 512,P:429,487,false,false,0
429,487,488,476,[RFIDPoint] 512,P:429,487,[RFIDPoint] 511,P:488,476,false,false,0
488,476,538,445,[RFIDPoint] 511,P:488,476,[RFIDPoint] 510,P:538,445,false,false,0
538,445,576,393,[RFIDPoint] 510,P:538,445,[RFIDPoint] 509,P:576,393,false,false,0
576,393,598,343,[RFIDPoint] 509,P:576,393,[RFIDPoint] 508,P:598,343,false,false,0
598,343,621,287,[RFIDPoint] 508,P:598,343,[RFIDPoint] 507,P:621,287,false,false,0
621,287,633,237,[RFIDPoint] 507,P:621,287,[RFIDPoint] 600,P:633,237,false,false,0
633,237,665,181,[RFIDPoint] 600,P:633,237,[RFIDPoint] 703,P:665,181,false,false,0
665,181,657,101,[RFIDPoint] 703,P:665,181,[RFIDPoint] 603,P:657,101,false,false,0
657,101,627,82,[RFIDPoint] 603,P:657,101,[RFIDPoint] 604,P:627,82,false,false,0
627,82,560,73,[RFIDPoint] 604,P:627,82,[RFIDPoint] 605,P:560,73,false,false,0
560,73,499,65,[RFIDPoint] 605,P:560,73,[RFIDPoint] 606,P:499,65,false,false,0
499,65,432,65,[RFIDPoint] 606,P:499,65,[RFIDPoint] 607,P:432,65,false,false,0
432,65,363,60,[RFIDPoint] 607,P:432,65,[RFIDPoint] 608,P:363,60,false,false,0
639,184,665,181,[RFIDPoint] 602,P:639,184,[RFIDPoint] 703,P:665,181,false,false,0
665,181,714,174,[RFIDPoint] 703,P:665,181,[RFIDPoint] 702,P:714,174,false,false,0
714,174,756,165,[RFIDPoint] 702,P:714,174,[RFIDPoint] 701,P:756,165,false,false,0
756,165,847,152,[RFIDPoint] 701,P:756,165,[RFIDPoint] 700,P:847,152,false,false,0
639,184,609,186,[RFIDPoint] 602,P:639,184,[RFIDPoint] 601,P:609,186,false,false,0
609,186,573,184,[RFIDPoint] 601,P:609,186,[RFIDPoint] 750,P:573,184,false,false,0
573,184,535,176,[RFIDPoint] 750,P:573,184,[RFIDPoint] 751,P:535,176,false,false,0
535,176,484,169,[RFIDPoint] 751,P:535,176,[RFIDPoint] 752,P:484,169,false,false,0
484,169,397,166,[RFIDPoint] 752,P:484,169,[RFIDPoint] 753,P:397,166,false,false,0
242,239,311,260,[RFIDPoint] 405,P:242,239,[RFIDPoint] 404,P:311,260,false,false,0
311,260,383,267,[RFIDPoint] 404,P:311,260,[RFIDPoint] 403,P:383,267,false,false,0
383,267,439,271,[RFIDPoint] 403,P:383,267,[RFIDPoint] 402,P:439,271,false,false,0
439,271,504,274,[RFIDPoint] 402,P:439,271,[RFIDPoint] 401,P:504,274,false,false,0
504,274,566,281,[RFIDPoint] 401,P:504,274,[RFIDPoint] 400,P:566,281,false,false,0
566,281,621,287,[RFIDPoint] 400,P:566,281,[RFIDPoint] 507,P:621,287,false,false,0
621,287,671,293,[RFIDPoint] 507,P:621,287,[RFIDPoint] 506,P:671,293,false,false,0
671,293,702,314,[RFIDPoint] 506,P:671,293,[RFIDPoint] 505,P:702,314,false,false,0
702,314,711,354,[RFIDPoint] 505,P:702,314,[RFIDPoint] 504,P:711,354,false,false,0
711,354,711,396,[RFIDPoint] 504,P:711,354,[RFIDPoint] 503,P:711,396,false,false,0
711,396,707,454,[RFIDPoint] 503,P:711,396,[RFIDPoint] 502,P:707,454,false,false,0
707,454,685,499,[RFIDPoint] 502,P:707,454,[RFIDPoint] 501,P:685,499,false,false,0
685,499,633,547,[RFIDPoint] 501,P:685,499,[RFIDPoint] 500,P:633,547,false,false,0
96,542,100,486,[RFIDPoint] 100,P:96,542,[RFIDPoint] 517,P:100,486,false,false,0
159,542,162,487,[RFIDPoint] 101,P:159,542,[RFIDPoint] 516,P:162,487,false,false,0
226,542,230,493,[RFIDPoint] 102,P:226,542,[RFIDPoint] 515,P:230,493,false,false,0
310,541,309,489,[RFIDPoint] 103,P:310,541,[RFIDPoint] 514,P:309,489,false,false,0
369,542,370,490,[RFIDPoint] 104,P:369,542,[RFIDPoint] 513,P:370,490,false,false,0
[RFID_CONNECTION]
100,486,162,487,517,516,1,,,
162,487,230,493,516,515,1,,,
230,493,309,489,515,514,1,,,
309,489,370,490,514,513,1,,,
370,490,429,487,513,512,1,,,
429,487,488,476,512,511,1,,,
488,476,538,445,511,510,1,,,
538,445,576,393,510,509,1,,,
576,393,598,343,509,508,1,,,
598,343,621,287,508,507,1,,,
621,287,633,237,507,600,1,,,
633,237,665,181,600,703,1,,,
665,181,657,101,703,603,1,,,
657,101,627,82,603,604,1,,,
627,82,560,73,604,605,1,,,
560,73,499,65,605,606,1,,,
499,65,432,65,606,607,1,,,
432,65,363,60,607,608,1,,,
639,184,665,181,602,703,1,,,
665,181,714,174,703,702,1,,,
714,174,756,165,702,701,1,,,
756,165,847,152,701,700,1,,,
639,184,609,186,602,601,1,,,
609,186,573,184,601,750,1,,,
573,184,535,176,750,751,1,,,
535,176,484,169,751,752,1,,,
484,169,397,166,752,753,1,,,
242,239,311,260,405,404,1,,,
311,260,383,267,404,403,1,,,
383,267,439,271,403,402,1,,,
439,271,504,274,402,401,1,,,
504,274,566,281,401,400,1,,,
566,281,621,287,400,507,1,,,
621,287,671,293,507,506,1,,,
671,293,702,314,506,505,1,,,
702,314,711,354,505,504,1,,,
711,354,711,396,504,503,1,,,
711,396,707,454,503,502,1,,,
707,454,685,499,502,501,1,,,
685,499,633,547,501,500,1,,,
96,542,100,486,100,517,1,,,
159,542,162,487,101,516,1,,,
226,542,230,493,102,515,1,,,
310,541,309,489,103,514,1,,,
369,542,370,490,104,513,1,,,
[MAP_TEXTS]
179,251,-1,-16777216,Arial,12,OPS-2
239,52,-256,-65408,Arial,12,SSOTRON-3
617,527,-16711936,-16777216,Arial,12,SSOTRON-1
87,551,-16777216,16777215,Arial,12,B1
150,550,-16777216,16777215,Arial,12,B2
227,553,-16777216,16777215,Arial,12,B3
299,555,-16777216,16777215,Arial,12,B4
367,554,-16777216,16777215,Arial,12,B5
453,128,-16777216,-8323073,Arial,12,CHG1
725,124,-16777216,-8323073,Arial,12,CHG2
231,193,-16777216,-2448096,Arial,12,TOPS-2
315,25,-256,-65408,Arial,12,SSOTRON-3
586,577,-16711936,-16777216,Arial,12,SSOTRON-1
81,564,-16777216,-1,Arial,12,B1
144,563,-16777216,-1,Arial,12,B2
214,561,-16777216,-1,Arial,12,B3
301,562,-16777216,-1,Arial,12,B4
359,562,-16777216,-1,Arial,12,B5
371,115,-16777216,-8323073,Arial,12,CHG1
822,110,-16777216,-8323073,Arial,12,CHG2
[CUSTOM_LINES]
[CUSTOM_LINES]