initial commit
This commit is contained in:
139
cVMS.NET_CS/RunCode/Device/_CONNECT.cs
Normal file
139
cVMS.NET_CS/RunCode/Device/_CONNECT.cs
Normal file
@@ -0,0 +1,139 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Media.Animation;
|
||||
using AR;
|
||||
using COMM;
|
||||
|
||||
namespace vmsnet
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
Boolean bRunConnection = true;
|
||||
Task thConnection; //연결체크
|
||||
|
||||
void bwDeviceConnection()
|
||||
{
|
||||
//TimeSpan ts;
|
||||
while (this.IsDisposed == false && bRunConnection)
|
||||
{
|
||||
if (VAR.I32.Get(EVarI32.DevConnectSeq) == 0)
|
||||
{
|
||||
//하나의 대상만 연결시도를 하지 않게하기 위해 연결횟수를 가지고 로테이션한다.
|
||||
if (PUB.DAQ.Any() == false)
|
||||
{
|
||||
PUB.log.AddE($"Connect Error : No DAQ List");
|
||||
System.Threading.Thread.Sleep(5000);
|
||||
}
|
||||
else
|
||||
{
|
||||
var DAQ = PUB.DAQ.Where(t => t.isOn == false).OrderBy(t => t.ConnTryCount).FirstOrDefault();
|
||||
if (DAQ != null)
|
||||
{
|
||||
//비활성화되어있다면 비활성 처리한다.
|
||||
if (DAQ.Disable == false)
|
||||
{
|
||||
PUB.RaiseRemoteCommandEvent(rCommand.DisableUIItems, DAQ.idx);
|
||||
DAQ.Disable = true;
|
||||
}
|
||||
|
||||
//장치의연결시도
|
||||
try
|
||||
{
|
||||
var ts = DateTime.Now - DAQ.ConnectTry;
|
||||
if (ts.TotalSeconds > 5)
|
||||
{
|
||||
//discnt += 1
|
||||
PUB.StatusMSG($"{DAQ.Name} 연결시도중({DAQ.IP}:{DAQ.PORT})");
|
||||
//PUB.log.Add(AR.Log.ETYPE.NORMAL, "DA100 연결시도");
|
||||
DAQ.ConnectTry = DateTime.Now;
|
||||
if (DAQ.ConnTryCount > 65530)
|
||||
DAQ.ConnTryCount = 0;
|
||||
else
|
||||
DAQ.ConnTryCount += 1;
|
||||
|
||||
PUB.RaiseRemoteCommandEvent(rCommand.DAQTryConnect, DAQ.idx);
|
||||
if (DAQ.Connect().Result)
|
||||
{
|
||||
PUB.log.Add(AR.Log.ETYPE.NORMAL, $"{DAQ.Name} 연결성공({DAQ.IP}:{DAQ.PORT})");
|
||||
PUB.RaiseRemoteCommandEvent(rCommand.DAQConnected, DAQ.idx);
|
||||
}
|
||||
else
|
||||
{
|
||||
PUB.log.Add(AR.Log.ETYPE.NORMAL, $"{DAQ.Name} 연결실패({DAQ.IP}:{DAQ.PORT})");
|
||||
PUB.RaiseRemoteCommandEvent(rCommand.DAQDisconnected, DAQ.idx);
|
||||
}
|
||||
|
||||
PUB.log.AddAT($"[{DAQ.idx}]Connect to {DAQ.IP}:{DAQ.PORT}");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
PUB.log.AddE($"[{DAQ.idx}] Connect error {DAQ.IP}:{DAQ.PORT} Message={ex.Message}");
|
||||
}
|
||||
}
|
||||
else System.Threading.Thread.Sleep(1000);
|
||||
}
|
||||
|
||||
VAR.I32[EVarI32.DevConnectSeq] += 1;
|
||||
}
|
||||
else if (VAR.I32.Get(EVarI32.DevConnectSeq) == 1)
|
||||
{
|
||||
//Master K
|
||||
if (PUB.masterk.IsInit == false && PUB.CONFIG.plc_port.StartsWith("COM"))
|
||||
{
|
||||
var ts = VAR.TIME.RUN(EVarTime.CONNTRY_PLC);
|
||||
if (ts.TotalSeconds > 5)
|
||||
{
|
||||
PUB.masterk.Init(PUB.CONFIG.plc_port);
|
||||
VAR.TIME[EVarTime.CONNTRY_PLC] = DateTime.Now;
|
||||
VAR.I32[EVarI32.CONNTRY_PLC] += 1;
|
||||
PUB.log.Add($"MasterK Connect to {PUB.CONFIG.plc_port}");
|
||||
}
|
||||
else System.Threading.Thread.Sleep(500);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (VAR.I32[EVarI32.CONNTRY_PLC] == 0)
|
||||
{
|
||||
//PUB.log.AddAT($"Master K Port Not set : {PUB.CONFIG.plc_port}");
|
||||
VAR.I32[EVarI32.CONNTRY_PLC] += 1;
|
||||
}
|
||||
System.Threading.Thread.Sleep(1000);
|
||||
}
|
||||
VAR.I32[EVarI32.DevConnectSeq] += 1;
|
||||
}
|
||||
else //indicator
|
||||
{
|
||||
if (PUB.indicator.IsOpen == false && PUB.CONFIG.indicator_port.StartsWith("COM"))
|
||||
{
|
||||
var ts = VAR.TIME.RUN(EVarTime.CONNTRY_INDICATOR);
|
||||
if (ts.TotalSeconds > 5)
|
||||
{
|
||||
PUB.indicator.SlaveID = (byte)PUB.CONFIG.indicator_slaveno;
|
||||
PUB.indicator.Configure.BaudRate = PUB.CONFIG.indicator_baud;
|
||||
PUB.indicator.Open(PUB.CONFIG.indicator_port);
|
||||
VAR.TIME[EVarTime.CONNTRY_INDICATOR] = DateTime.Now;
|
||||
VAR.I32[EVarI32.CONNTRY_INDICATOR] += 1;
|
||||
PUB.log.Add($"Indicator Connect to {PUB.CONFIG.indicator_port}");
|
||||
}
|
||||
else System.Threading.Thread.Sleep(500);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (VAR.I32[EVarI32.CONNTRY_INDICATOR] == 0)
|
||||
{
|
||||
//PUB.log.AddAT($"Indicator Port Not set : {PUB.CONFIG.indicator_port}");
|
||||
VAR.I32[EVarI32.CONNTRY_INDICATOR] += 1;
|
||||
}
|
||||
System.Threading.Thread.Sleep(1000);
|
||||
}
|
||||
VAR.I32.Clear(EVarI32.DevConnectSeq);
|
||||
}
|
||||
System.Threading.Thread.Sleep(1000);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
175
cVMS.NET_CS/RunCode/RunSequence/RUN_GETDATA.cs
Normal file
175
cVMS.NET_CS/RunCode/RunSequence/RUN_GETDATA.cs
Normal file
@@ -0,0 +1,175 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using COMM;
|
||||
using AR;
|
||||
|
||||
namespace vmsnet
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
/// <summary>
|
||||
/// 연결된 개체의 데이터를 수집합니다.
|
||||
/// </summary>
|
||||
void RUN_GETDATA()
|
||||
{
|
||||
var DAQS = PUB.DAQ.Where(t => t.isOn).ToList();
|
||||
DateTime stiem = DateTime.Now;
|
||||
var activecnt = 0;
|
||||
var TotalRecvDatas = new List<NotifyData>();
|
||||
foreach (GM10 m in DAQS)
|
||||
{
|
||||
if (m.isOn == false) continue;
|
||||
|
||||
if (PUB.CONFIG.synctime && m.opt_synctime == false)
|
||||
{
|
||||
PUB.workmsg("Sync DateTime");
|
||||
PUB.StatusMSG("장치의 시간동기화");
|
||||
if (!m.SyncDate())
|
||||
{
|
||||
PUB.log.AddE($"Device({m.title})의 시간동기화가 실패하였습니다.");
|
||||
}
|
||||
/* 작성자: 김치균, 작성일: 2024-10-11, 작성내용: 실패하더라도 1회만 동작 */
|
||||
m.opt_synctime = true;
|
||||
/*****************************************************************/
|
||||
PUB.workmsg("");
|
||||
}
|
||||
else if (PUB.CONFIG.lsb && m.opt_lsb == false)
|
||||
{
|
||||
PUB.workmsg("Set : Binary Output LSB");
|
||||
bool Rlt = m.SetBinaryLSB();
|
||||
if (Rlt == false)
|
||||
{
|
||||
PUB.log.AddE($"Device({m.title})의 Binary Output Mode : LSB 설정 실패");
|
||||
}
|
||||
/* 작성자: 김치균, 작성일: 2024-10-11, 작성내용: 실패하더라도 1회만 동작 */
|
||||
m.opt_lsb = true;
|
||||
/*****************************************************************/
|
||||
PUB.workmsg("");
|
||||
}
|
||||
else ////켜져잇다면
|
||||
{
|
||||
|
||||
// PingMsg += " | CONN," + m.IP;
|
||||
|
||||
activecnt++;
|
||||
UpdateConnectionDisplayLabel(m.idx, ConnState.Connected);
|
||||
|
||||
if (m.Disable)
|
||||
{
|
||||
PUB.RaiseRemoteCommandEvent(rCommand.EnableUIItems, m.idx);
|
||||
m.Disable = false; ////켜졌다면 아이콘을 껏다는것을 취소한다. 이후 종료되었을때 다시 disable되도록
|
||||
}
|
||||
|
||||
PUB.StatusMSG($"DAQ 데이터수집 중");
|
||||
|
||||
var RecvDatas = new List<NotifyData>();
|
||||
var recv1 = PUB.GetMeasureData(m, PUB.CONFIG.meas_pri1, PUB.CONFIG.meas_pri2);
|
||||
if (recv1.Any() == false)
|
||||
{
|
||||
////통신오류 혹은 데이터의 오류
|
||||
UpdateConnectionDisplayLabel(m.idx, ConnState.Disconnected);
|
||||
m.Disconnect();
|
||||
m.Disable = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
RecvDatas.AddRange(recv1);
|
||||
//PUB.RaiseRemoteCommandEvent(rCommand.ValueUpdate, recv1);
|
||||
|
||||
//CONFIG.meas_2nd1 = 101~160
|
||||
if (PUB.CONFIG.seconddata && (PUB.CONFIG.meas_sec1 > 0 && PUB.CONFIG.meas_sec2 > 0))
|
||||
{
|
||||
var recv2 = PUB.GetMeasureData(m, PUB.CONFIG.meas_sec1, PUB.CONFIG.meas_sec2);
|
||||
if (recv2.Any() == true) RecvDatas.AddRange(recv2);
|
||||
}
|
||||
|
||||
//CONFIG.meas_3rd1 = 201~260
|
||||
if (PUB.CONFIG.thirddata && (PUB.CONFIG.meas_3rd1 > 0 && PUB.CONFIG.meas_3rd2 > 0))
|
||||
{
|
||||
var recv3 = PUB.GetMeasureData(m, PUB.CONFIG.meas_3rd1, PUB.CONFIG.meas_3rd2);
|
||||
if (recv3.Any() == true) RecvDatas.AddRange(recv3);
|
||||
}
|
||||
|
||||
//CONFIG.meas_4th1 = 301~360
|
||||
if (PUB.CONFIG.getdata4 && (PUB.CONFIG.meas_4th1 > 0 && PUB.CONFIG.meas_4th2 > 0))
|
||||
{
|
||||
var recv4 = PUB.GetMeasureData(m, PUB.CONFIG.meas_4th1, PUB.CONFIG.meas_4th2);
|
||||
if (recv4.Any() == true) RecvDatas.AddRange(recv4);
|
||||
}
|
||||
|
||||
//update display control
|
||||
if (RecvDatas.Any())
|
||||
{
|
||||
PUB.RaiseRemoteCommandEvent(rCommand.ValueUpdate, RecvDatas);
|
||||
TotalRecvDatas.AddRange(RecvDatas);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
////모든데이터를 DB에저장한다.
|
||||
if (TotalRecvDatas.Any() && PUB.sm.Step == ESMStep.RUN)
|
||||
{
|
||||
try
|
||||
{
|
||||
RUN_SAVEDATA(TotalRecvDatas);
|
||||
if (System.Diagnostics.Debugger.IsAttached) Console.WriteLine("save ok");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
PUB.log.Add(AR.Log.ETYPE.ERROR, "Save Error" + ex.Message.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
if (PUB.sleepoffset > 0)
|
||||
{
|
||||
System.Threading.Thread.Sleep(PUB.sleepoffset);
|
||||
}
|
||||
|
||||
var TSLoop = DateTime.Now - stiem;
|
||||
refreshinterval = (int)(TSLoop.TotalMilliseconds); //;// (tspan.Minutes * 60 * 1000) + (tspan.Seconds * 1000) + tspan.Milliseconds
|
||||
|
||||
this.DispCtrl1.Invalidate();
|
||||
|
||||
if (!DispCtrl1.FullScreen)
|
||||
{
|
||||
// BarGraph1.Refresh()
|
||||
|
||||
//'//트렌드뷰 초기화
|
||||
//Dim Grp As DispCtrl.CGROUP = Me.DispCtrl1.GROUPS(DispCtrl1.ShowIndex)
|
||||
//For Each item As DispCtrl.CITEM In Grp.Items
|
||||
// TrendCtrlII1.CHInfo(item.idx - 1).Value.Add(item.value2)
|
||||
//Next
|
||||
//TrendCtrlII1.Time.Add(New TrendCtrlII.CTimeinfo(TrendCtrlII1.Time.Count, Now.ToFileTime))
|
||||
//'TrendCtrlII1.Style.X2 = Now.ToFileTime
|
||||
//TrendCtrlII1.Set_Refresh()
|
||||
//TrendCtrlII1.Refresh()
|
||||
}
|
||||
|
||||
var offsetvalue = (refreshinterval - PUB.CONFIG.threadlimit);
|
||||
if(Math.Abs(offsetvalue) > 3)
|
||||
{
|
||||
if (offsetvalue < 0) //지연시간을 더 줘야 한다
|
||||
{
|
||||
if (offsetvalue < -50) PUB.sleepoffset += -offsetvalue; //50미만에서는 보정값 그대로 사용
|
||||
else if (offsetvalue < -20) PUB.sleepoffset += 10; //50미만에서는 보정값 그대로 사용
|
||||
else PUB.sleepoffset += 5; //50을 초과한 경우에는 10씩 조정되도록 한다
|
||||
}
|
||||
else
|
||||
{
|
||||
//너무 많이 지연되었다. 속도를 줄여야 한다
|
||||
if (offsetvalue > 50) PUB.sleepoffset += -offsetvalue; //50미만에서는 보정값 그대로 사용
|
||||
else if (offsetvalue > 20) PUB.sleepoffset -= 10;
|
||||
else PUB.sleepoffset -= 5; //50을 초과한 경우에는 10씩 조정되도록 한다
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
307
cVMS.NET_CS/RunCode/RunSequence/RUN_SAVEDATA.cs
Normal file
307
cVMS.NET_CS/RunCode/RunSequence/RUN_SAVEDATA.cs
Normal file
@@ -0,0 +1,307 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using COMM;
|
||||
using AR;
|
||||
using OpenTK.Graphics.ES11;
|
||||
|
||||
namespace vmsnet
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
DateTime lasterrortime = DateTime.Now.AddDays(-10);
|
||||
DateTime lastsavetime = DateTime.Now.AddDays(-10); // VBConversions Note: Initial value cannot be assigned here since it is non-static. Assignment has been moved to the class constructors.
|
||||
System.Text.StringBuilder SaveError;
|
||||
int SaveCount = 0;
|
||||
int SaveErrCount = 0;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 데이터베이스에 자료를 저장한다.
|
||||
/// </summary>
|
||||
/// <remarks></remarks>
|
||||
public void RUN_SAVEDATA(List<NotifyData> items)
|
||||
{
|
||||
//항목이 없다면 처리하지 않음
|
||||
if (items.Any() == false) return;
|
||||
var sorteditems = items.Where(t => t.use == true).OrderBy(t => t.chno).ToList();
|
||||
if (sorteditems.Any() == false) return;
|
||||
|
||||
//시작 후 최소 몇 초동안은 저장하지 않는다(환경설정추가)
|
||||
TimeSpan ts = DateTime.Now - PUB.StartupTime;
|
||||
if (ts.TotalSeconds < PUB.CONFIG.Startup_DelayTime_Save) return;
|
||||
|
||||
SaveError = new System.Text.StringBuilder();
|
||||
if (DateTime.Now.Minute % 30 == 0 && DateTime.Now.Second == 10) ////30분단위로 수행한다.
|
||||
{
|
||||
////구데이터삭제기능수행
|
||||
PUB.CheckFreeSpace();
|
||||
}
|
||||
|
||||
////첫번째데이터으 시간정보를 이용한다.
|
||||
bool SaveOn = true;
|
||||
int Time = -1; ////데이터저장시간(일기준TIck))
|
||||
DateTime TimeDate = DateTime.Now;// default(DateTime); ////데이터저장시간(날짜)
|
||||
string timestr = "";
|
||||
|
||||
bool[] USE = new bool[10];
|
||||
bool[] ISNULLDATA = new bool[10];
|
||||
System.Text.StringBuilder[] Buffer = new System.Text.StringBuilder[10];
|
||||
for (int i = 0; i < USE.Length; i++)
|
||||
{
|
||||
USE[i] = false;
|
||||
ISNULLDATA[i] = true;
|
||||
Buffer[i] = new System.Text.StringBuilder();
|
||||
}
|
||||
|
||||
|
||||
|
||||
//제공된 배열의 데이터를 추가한다.
|
||||
foreach (var I in sorteditems)
|
||||
{
|
||||
////필수정보가 없는경우라면 넘어간다.
|
||||
if (I.idx_c == -1 || I.idx_u == -1 || I.idx_m == -1) continue;
|
||||
|
||||
////처음저장데이터라면 패스한다.
|
||||
if (PUB.ChfirstSave[I.idx_m, I.idx_u, I.idx_c] == false)
|
||||
{
|
||||
PUB.ChfirstSave[I.idx_m, I.idx_u, I.idx_c] = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
//버퍼용인덱스계산 (인덱스값을가지고 버퍼를 찾는다. 버퍼는 160개가 최대이다)
|
||||
var ValueIdx = PUB.ConvertChIndexToBufferIndex(I.chno);
|
||||
|
||||
//최초의 시간정보이다.
|
||||
if (Time == -1)
|
||||
{
|
||||
timestr = sorteditems.First().time; // PUB.Times[I.idx_dev, I.idx_unit, I.idx_ch].Trim();
|
||||
if (string.IsNullOrEmpty(timestr))
|
||||
{
|
||||
//빈데이터를 생성한다. 240729
|
||||
Buffer[ValueIdx].Append("\t" + "");
|
||||
continue;
|
||||
}
|
||||
|
||||
TimeDate = DateTime.Parse(timestr);
|
||||
Time = (int)(PUB.get_TimeNumber(TimeDate)); // dt.Day * 3600 * 24 + dt.Hour * 3600 + dt.Minute * 60 + dt.Second
|
||||
}
|
||||
|
||||
////최종저장시간이랑 다르면 저장한다.
|
||||
if (lastsavetime == TimeDate)
|
||||
{
|
||||
SaveOn = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
var LastSaveTerm = TimeDate - lastsavetime;
|
||||
if (LastSaveTerm.TotalSeconds < PUB.CONFIG.saveterm) ////저장주기확인
|
||||
{
|
||||
SaveOn = false;
|
||||
}
|
||||
}
|
||||
|
||||
////실제데이터를 저장한다. decpos*1000 + idx , value 각각 2byte 씩 총 4byte * 셀카운트
|
||||
if (SaveOn)
|
||||
{
|
||||
float V = (float)((I.value / Math.Pow(10, I.decpos)) + I.offset);
|
||||
|
||||
////파라미터추가
|
||||
USE[ValueIdx] = true;
|
||||
if (ISNULLDATA[ValueIdx] && V != 0) ISNULLDATA[ValueIdx] = false;
|
||||
Buffer[ValueIdx].Append("\t" + V.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
////메인그룹 데이터 저장
|
||||
//if (PUB.MainGroup != null && PUB.MainGroup.Any())
|
||||
//{
|
||||
// foreach (var G in PUB.MainGroup)
|
||||
// {
|
||||
// foreach (var I in G.Items)
|
||||
// {
|
||||
// ////필수정보가 없는경우라면 넘어간다.
|
||||
// if (I.idx_ch == -1 || I.idx_dev == -1 || I.idx_unit == -1 || I.Onset == false || I.사용 == false)
|
||||
// {
|
||||
// continue;
|
||||
// }
|
||||
|
||||
// ////처음저장데이터라면 패스한다.
|
||||
// if (I.firstsave)
|
||||
// {
|
||||
// I.firstsave = false;
|
||||
// continue;
|
||||
// }
|
||||
|
||||
// //버퍼용인덱스계산 (인덱스값을가지고 버퍼를 찾는다. 버퍼는 160개가 최대이다)
|
||||
// var ValueIdx = PUB.ConvertChIndexToBufferIndex(I.idx);
|
||||
|
||||
|
||||
// if (Time == -1) ////최초의 시간정보이다.
|
||||
// {
|
||||
// timestr = PUB.Times[I.idx_dev, I.idx_unit, I.idx_ch].Trim();
|
||||
// if (string.IsNullOrEmpty(timestr))
|
||||
// {
|
||||
// //빈데이터를 생성한다. 240729
|
||||
// Buffer[ValueIdx].Append("\t" + "");
|
||||
// continue;
|
||||
// }
|
||||
|
||||
// TimeDate = DateTime.Parse(timestr);
|
||||
// Time = (int)(PUB.get_TimeNumber(TimeDate)); // dt.Day * 3600 * 24 + dt.Hour * 3600 + dt.Minute * 60 + dt.Second
|
||||
// }
|
||||
|
||||
// ////최종저장시간이랑 다르면 저장한다.
|
||||
// if (lastsavetime == TimeDate)
|
||||
// {
|
||||
// SaveOn = false;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// var LastSaveTerm = TimeDate - lastsavetime;
|
||||
// if (LastSaveTerm.TotalSeconds < PUB.CONFIG.saveterm) ////저장주기확인
|
||||
// {
|
||||
// SaveOn = false;
|
||||
// }
|
||||
// }
|
||||
|
||||
// ////실제데이터를 저장한다. decpos*1000 + idx , value 각각 2byte 씩 총 4byte * 셀카운트
|
||||
// if (SaveOn)
|
||||
// {
|
||||
// float V = (float)(I.value2 / Math.Pow(10, I.decpos));
|
||||
|
||||
|
||||
|
||||
// ////파라미터추가
|
||||
// USE[ValueIdx] = true;
|
||||
// if (ISNULLDATA[ValueIdx] && V != 0) ISNULLDATA[ValueIdx] = false;
|
||||
// Buffer[ValueIdx].Append("\t" + V.ToString());
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
//}
|
||||
|
||||
////보조그룹 데이터 저장
|
||||
//if (PUB.SubGroup != null && PUB.SubGroup.Any()) ////subwindow가 켜졌다면 서브윈도우도 변경한다.
|
||||
//{
|
||||
// foreach (HMI.CGROUP G in PUB.SubGroup)
|
||||
// {
|
||||
// foreach (HMI.CITEM I in G.Items)
|
||||
// {
|
||||
|
||||
// if (I.idx_ch == -1 || I.idx_dev == -1 || I.idx_unit == -1 || I.Onset == false || I.사용 == false) continue;
|
||||
|
||||
// if (I.firstsave)
|
||||
// {
|
||||
// I.firstsave = false; ////처음저장데이터라면 패스한다.
|
||||
// continue;
|
||||
// }
|
||||
|
||||
// if (Time == -1) ////최초의 시간정보이다.
|
||||
// {
|
||||
// timestr = PUB.Times[I.idx_dev, I.idx_unit, I.idx_ch].Trim();
|
||||
// if (timestr.isEmpty()) continue;
|
||||
|
||||
// TimeDate = DateTime.Parse(timestr);
|
||||
// Time = (int)(PUB.get_TimeNumber(TimeDate));
|
||||
// }
|
||||
|
||||
// ////최종저장시간이랑 다르면 저장한다.
|
||||
// if (lastsavetime == TimeDate) SaveOn = false;
|
||||
|
||||
// ////실제데이터를 저장한다. decpos*1000 + idx , value 각각 2byte 씩 총 4byte * 셀카운트
|
||||
// if (SaveOn)
|
||||
// {
|
||||
// float V = (float)(I.value2 / Math.Pow(10, I.decpos));
|
||||
|
||||
// //버퍼용인덱스계산 (인덱스값을가지고 버퍼를 찾는다. 버퍼는 160개가 최대이다)
|
||||
// var ValueIdx = PUB.ConvertChIndexToBufferIndex(I.idx);
|
||||
|
||||
// ////파라미터추가
|
||||
// USE[ValueIdx] = true;
|
||||
// if (ISNULLDATA[ValueIdx] && V != 0) ISNULLDATA[ValueIdx] = false;
|
||||
// Buffer[ValueIdx].Append("\t" + V.ToString());
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
|
||||
|
||||
|
||||
////최종저장시간을 저장한다.
|
||||
var useCnt = USE.Where(t => t == true).Count();
|
||||
if (useCnt > 0 && SaveOn && (TimeDate.Year > 2000) && (TimeDate.Year < 2050))
|
||||
{
|
||||
SaveErrCount = 0;
|
||||
SaveCount = 0;
|
||||
|
||||
for (int i = 0; i < USE.Length; i++)
|
||||
{
|
||||
//데이터가있다면 저장한다.
|
||||
if (USE[i] && ISNULLDATA[i] == false)
|
||||
{
|
||||
try
|
||||
{
|
||||
PUB.DB.InsertData(TimeDate, $"DATAB{i + 1}", Buffer[i]);
|
||||
SaveCount++;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
SaveErrCount++;
|
||||
SaveError.AppendLine($"{i + 1}:" + ex.ToString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
////ka정보를 그룹별로 저장한다. 150310
|
||||
System.Text.StringBuilder KaBuffer = new System.Text.StringBuilder();
|
||||
System.Text.StringBuilder KaHeader = new System.Text.StringBuilder();
|
||||
KaHeader.Append("\t" + "Time");
|
||||
|
||||
if (PUB.MainGroup != null && PUB.MainGroup.Any())
|
||||
{
|
||||
foreach (HMI.CGROUP G in PUB.MainGroup)
|
||||
{
|
||||
KaHeader.Append("\t" + G.이름);
|
||||
KaBuffer.Append("\t" + G._amp.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
if (PUB.SubGroup != null && PUB.SubGroup.Any())
|
||||
{
|
||||
foreach (HMI.CGROUP G in PUB.SubGroup)
|
||||
{
|
||||
KaHeader.Append("\t" + G.이름);
|
||||
KaBuffer.Append("\t" + G._amp.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
KaHeader.Append("\r\n");
|
||||
PUB.KADB.InsertData(TimeDate, KaBuffer.ToString(), KaHeader);
|
||||
|
||||
if (SaveErrCount == 0)
|
||||
{
|
||||
lastsavetime = TimeDate; ////최종저장시간
|
||||
//this.lb_Saved.Text = "<LastSaved(" + System.Convert.ToString(savcnt) + "):" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ">";
|
||||
}
|
||||
else
|
||||
{
|
||||
lasterrortime = DateTime.Now;
|
||||
PUB.log.Add(AR.Log.ETYPE.ERROR, "Save Error Message=" + SaveError.ToString());
|
||||
//this.lb_Saved.Text = "<Save Error-" + System.Convert.ToString(errcnt) + ">";
|
||||
}
|
||||
}
|
||||
else { }
|
||||
//log.Add(AR.Log.ETYPE.NORMAL, "No Save : " & SaveOn.ToString() & ", year = " + Year.ToString() & ", month=" & Month.ToString)
|
||||
}
|
||||
}
|
||||
}
|
||||
63
cVMS.NET_CS/RunCode/StateMachine/_Events.cs
Normal file
63
cVMS.NET_CS/RunCode/StateMachine/_Events.cs
Normal file
@@ -0,0 +1,63 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using AR;
|
||||
using arDev;
|
||||
using COMM;
|
||||
|
||||
namespace vmsnet
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
private void SM_StateProgress(object sender, StateMachine.StateProgressEventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private void SM_StepCompleted(object sender, EventArgs e)
|
||||
{
|
||||
PUB.log.Add($"Step Complete({PUB.sm.Step})");
|
||||
|
||||
//초기화가 완료되면 컨트롤 글자를 변경 해준다.
|
||||
if (PUB.sm.Step == ESMStep.INIT)
|
||||
SM_InitControl(null, null);
|
||||
|
||||
}
|
||||
|
||||
private void SM_StepStarted(object sender, EventArgs e)
|
||||
{
|
||||
switch (PUB.sm.Step)
|
||||
{
|
||||
case ESMStep.IDLE:
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void SM_InitControl(object sender, EventArgs e)
|
||||
{
|
||||
//작업시작전 컨트롤 초기화 코드
|
||||
this.Invoke(new Action(() =>
|
||||
{
|
||||
|
||||
|
||||
}));
|
||||
}
|
||||
|
||||
private void SM_Message(object sender, StateMachine.StateMachineMessageEventArgs e)
|
||||
{
|
||||
//상태머신에서 발생한 메세지
|
||||
PUB.log.Add(e.Header, e.Message);
|
||||
}
|
||||
|
||||
private void SM_StepChanged(object sender, StateMachine.StepChangeEventArgs e)
|
||||
{
|
||||
var o = (ESMStep)e.Old;
|
||||
var n = (ESMStep)e.New;
|
||||
PUB.log.AddI($"step change ({o} >> {n})");
|
||||
}
|
||||
}
|
||||
}
|
||||
152
cVMS.NET_CS/RunCode/StateMachine/_Loop.cs
Normal file
152
cVMS.NET_CS/RunCode/StateMachine/_Loop.cs
Normal file
@@ -0,0 +1,152 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using AR;
|
||||
using arDev;
|
||||
using COMM;
|
||||
namespace vmsnet
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
void SM_Loop(object sender, StateMachine.RunningEventArgs e)
|
||||
{
|
||||
//main loop
|
||||
var step = (ESMStep)e.Step;
|
||||
var obj = this.GetType();
|
||||
|
||||
var stepName = step.ToString();
|
||||
|
||||
|
||||
var methodName = $"_STEP_{stepName}";
|
||||
var methodNameStart = $"_STEP_{stepName}_START";
|
||||
var runMethodName = $"_{stepName}";
|
||||
|
||||
var method = obj.GetMethod(methodName);
|
||||
var methodS = obj.GetMethod(methodNameStart);
|
||||
|
||||
switch (step)
|
||||
{
|
||||
case ESMStep.NOTSET:
|
||||
PUB.log.Add("S/M Initialize Start");
|
||||
PUB.sm.SetNewStep(ESMStep.INIT);
|
||||
break;
|
||||
|
||||
case ESMStep.WAITSTART:
|
||||
if (e.isFirst) PUB.log.Add("EVENT WAITSTART");
|
||||
break;
|
||||
|
||||
case ESMStep.PAUSE:
|
||||
case ESMStep.EMERGENCY:
|
||||
case ESMStep.ERROR:
|
||||
if (e.isFirst)
|
||||
{
|
||||
_SM_MAIN_ERROR(e.isFirst, (ESMStep)e.Step, e.StepTime);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
if (e.isFirst)
|
||||
{
|
||||
//시작명령은 반드시 구현할 필요가 없다
|
||||
if (methodS != null) methodS.Invoke(this, new object[] { step });
|
||||
else
|
||||
{
|
||||
// hmi1.ClearMessage();
|
||||
PUB.log.Add($"Undefined step start :{step}");
|
||||
}
|
||||
|
||||
if (step == ESMStep.HOME_QUICK || step == ESMStep.HOME_FULL || PUB.sm.getOldStep == ESMStep.IDLE || PUB.sm.getOldStep == ESMStep.FINISH)
|
||||
{
|
||||
PUB.sm.seq.ClearData(step);
|
||||
PUB.sm.seq.Clear(step);
|
||||
}
|
||||
|
||||
PUB.sm.seq.ClearTime();
|
||||
PUB.sm.RaiseStepStarted();
|
||||
return;
|
||||
}
|
||||
|
||||
//if (PUB.popup.needClose) System.Threading.Thread.Sleep(10);
|
||||
//else
|
||||
{
|
||||
//스텝번호값 보정 220313
|
||||
if (PUB.sm.seq.Get(step) < 1) PUB.sm.seq.Update(step, 1);
|
||||
|
||||
if (method == null)
|
||||
{
|
||||
var runMethod = obj.GetMethod(runMethodName);
|
||||
if (runMethod == null)
|
||||
{
|
||||
PUB.log.AddE($"unknown command : {methodName}/{runMethodName}");
|
||||
// PUB.Result.SetResultMessage(eResult.DEVELOP, eECode.NOFUNCTION, eNextStep.ERROR, methodName, runMethodName);
|
||||
}
|
||||
else
|
||||
{
|
||||
var stepName2 = step.ToString();
|
||||
|
||||
//실행코드는 있으니 처리한다.
|
||||
//if (PUB.popup.needClose) System.Threading.Thread.Sleep(10); //팝업이 닫힐때까지 기다린다.
|
||||
//else
|
||||
{
|
||||
//실행가능여부를 확인 합니다
|
||||
//if (CheckSystemRunCondition(false) == true)
|
||||
{
|
||||
//동작상태가 아니라면 처리하지 않는다.
|
||||
if (PUB.sm.Step == step && PUB.sm.getNewStep == step)
|
||||
{
|
||||
var param = new object[] { step };
|
||||
var rlt = (bool)runMethod.Invoke(this, param);
|
||||
if (rlt == true)
|
||||
{
|
||||
PUB.log.AddI("change to idle by userstep(auto)");
|
||||
PUB.sm.SetNewStep(ESMStep.IDLE, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var param = new object[] { step, e.StepTime, PUB.sm.seq.GetTime(step) };
|
||||
var rlt = (StepResult)method.Invoke(this, param);
|
||||
if (rlt == StepResult.Complete) PUB.sm.RaiseStepCompleted();
|
||||
else
|
||||
{
|
||||
//사용자 스텝이 설정되어있다면 자동으로 멈춘다 220223
|
||||
if (rlt == StepResult.Error)
|
||||
{
|
||||
if (PUB.sm.getNewStep != ESMStep.ERROR)
|
||||
PUB.sm.SetNewStep(ESMStep.ERROR);
|
||||
}
|
||||
|
||||
if (VAR.BOOL[EVarBool.USERSTEP] == true)
|
||||
{
|
||||
if (PUB.sm.Step >= ESMStep.RUN && PUB.sm.getNewStep >= ESMStep.RUN &&
|
||||
PUB.sm.Step < ESMStep.FINISH && PUB.sm.getNewStep < ESMStep.FINISH)
|
||||
{
|
||||
////유저스텝에 걸려있지 않다면 자동으로 멈춘다
|
||||
//if (PUB.LockUserStep.WaitOne(3)==false)
|
||||
//{
|
||||
// //Pub.Result.SetResultMessage(eResult.OPERATION, eECode.USER_STOP)
|
||||
// PUB.Result.ResultMessage = "USERSTEP - AUTO STOP";
|
||||
// PUB.sm.SetNewStep(ESMStep.PAUSE);
|
||||
|
||||
// //한번멈추면 다시 실행되게한다.
|
||||
// UserStepRun();
|
||||
//}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
26
cVMS.NET_CS/RunCode/StateMachine/_SPS.cs
Normal file
26
cVMS.NET_CS/RunCode/StateMachine/_SPS.cs
Normal file
@@ -0,0 +1,26 @@
|
||||
using System;
|
||||
using System.Drawing;
|
||||
using AR;
|
||||
using COMM;
|
||||
namespace vmsnet
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
DateTime sps_time_250ms = DateTime.Now;
|
||||
|
||||
void SM_SPS(object sender, EventArgs e)
|
||||
{
|
||||
//초기화전에는 동작하지 않는다
|
||||
if (PUB.sm.Step < ESMStep.IDLE) return;
|
||||
|
||||
SPS_Max();
|
||||
|
||||
var ts250 = DateTime.Now - sps_time_250ms;
|
||||
if (ts250.TotalMilliseconds >= 249)
|
||||
{
|
||||
SPS_250ms();
|
||||
sps_time_250ms = DateTime.Now;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
67
cVMS.NET_CS/RunCode/Step/_STEP_CLOSE.cs
Normal file
67
cVMS.NET_CS/RunCode/Step/_STEP_CLOSE.cs
Normal file
@@ -0,0 +1,67 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using COMM;
|
||||
namespace vmsnet
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
public void _STEP_CLOSING_START(ESMStep step)
|
||||
{
|
||||
//자동연결쓰레드종료
|
||||
bRunConnection = false;
|
||||
this.thConnection.Dispose();
|
||||
|
||||
//############################
|
||||
//#### 사용자 코드
|
||||
//############################
|
||||
_USER_CLOSE_START();
|
||||
|
||||
//############################
|
||||
//#### 개발자 권장코드
|
||||
//############################
|
||||
|
||||
PUB.log.Add("program off");
|
||||
PUB.log.Flush();
|
||||
}
|
||||
|
||||
public StepResult _STEP_CLOSING(ESMStep step, TimeSpan stepTime, TimeSpan seqTime)
|
||||
{
|
||||
//개체가 모두 종료되었는지 체크한다.
|
||||
|
||||
//############################
|
||||
//#### 사용자 전용 코드
|
||||
//############################
|
||||
if (USER_CLOSE_WAIT() == false) return StepResult.Wait;
|
||||
|
||||
//############################
|
||||
//#### 개발자 권장코드
|
||||
//############################
|
||||
|
||||
|
||||
PUB.sm.SetNewStep(ESMStep.CLOSED);
|
||||
return StepResult.Complete;
|
||||
}
|
||||
|
||||
public void _STEP_CLOSED_START(ESMStep step)
|
||||
{
|
||||
try
|
||||
{
|
||||
this.BeginInvoke(new Action(() =>
|
||||
{
|
||||
//화면을 닫는다
|
||||
PUB.sm.Stop();
|
||||
this.Close();
|
||||
}));
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
public StepResult _STEP_CLOSED(ESMStep step, TimeSpan stepTime, TimeSpan seqTime)
|
||||
{
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
18
cVMS.NET_CS/RunCode/Step/_STEP_ERROR.cs
Normal file
18
cVMS.NET_CS/RunCode/Step/_STEP_ERROR.cs
Normal file
@@ -0,0 +1,18 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using COMM;
|
||||
using AR;
|
||||
namespace vmsnet
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
private void _SM_MAIN_ERROR(Boolean isFirst, ESMStep Step, TimeSpan StepTime)
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
28
cVMS.NET_CS/RunCode/Step/_STEP_IDLE.cs
Normal file
28
cVMS.NET_CS/RunCode/Step/_STEP_IDLE.cs
Normal file
@@ -0,0 +1,28 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using COMM;
|
||||
using AR;
|
||||
|
||||
namespace vmsnet
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
DateTime lastDeleteTime = DateTime.Now;
|
||||
|
||||
public void _STEP_IDLE_START(ESMStep step)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public StepResult _STEP_IDLE(ESMStep step, TimeSpan stepTime, TimeSpan seqTime)
|
||||
{
|
||||
|
||||
return StepResult.Wait;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
74
cVMS.NET_CS/RunCode/Step/_STEP_INIT.cs
Normal file
74
cVMS.NET_CS/RunCode/Step/_STEP_INIT.cs
Normal file
@@ -0,0 +1,74 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Configuration;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using AR;
|
||||
using COMM;
|
||||
|
||||
namespace vmsnet
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
public void _STEP_INIT_START(ESMStep step)
|
||||
{
|
||||
//result message
|
||||
int progress = 0;
|
||||
var ProgressMax = 13;
|
||||
Color fColor = Color.DarkViolet;
|
||||
|
||||
//기본폴더를 생성합니다
|
||||
string[] basedir = new string[] { "Temp", "Log" };
|
||||
foreach (var dirname in basedir)
|
||||
{
|
||||
try
|
||||
{
|
||||
var di = System.IO.Path.Combine(UTIL.CurrentPath, dirname);
|
||||
if (System.IO.Directory.Exists(di) == false)
|
||||
System.IO.Directory.CreateDirectory(di);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
PUB.log.Add(ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
PUB.sm.RaiseStateProgress(++progress, "System Initialize", ProgressMax, fColor); System.Threading.Thread.Sleep(5);
|
||||
_SM_RUN_INIT_EVENTS();
|
||||
|
||||
//남은 공간
|
||||
PUB.sm.RaiseStateProgress(++progress, "Check Storage Space", ProgressMax, fColor); System.Threading.Thread.Sleep(5);
|
||||
PUB.CheckFreeSpace(); //181225
|
||||
|
||||
PUB.sm.RaiseStateProgress(++progress, "User Device Initialize", ProgressMax, fColor); System.Threading.Thread.Sleep(5);
|
||||
|
||||
/* Device 초기화 */ //--> _00_System_Initialize.cs
|
||||
_USER_INIT_DEVICE();
|
||||
|
||||
|
||||
PUB.sm.RaiseStateProgress(ProgressMax, "Init Complete", ProgressMax, Color.Gold); System.Threading.Thread.Sleep(5);
|
||||
|
||||
VAR.BOOL.Set(EVarBool.INIT_SYSTEM, true, "INIT");
|
||||
PUB.log.Add("init finish");
|
||||
}
|
||||
|
||||
public StepResult _STEP_INIT(ESMStep step, TimeSpan stepTime, TimeSpan seqTime)
|
||||
{
|
||||
PUB.sm.SetNewStep(ESMStep.IDLE);
|
||||
return StepResult.Complete;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 기본이벤트를 정의 합니다.
|
||||
/// </summary>
|
||||
public void _SM_RUN_INIT_EVENTS()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
105
cVMS.NET_CS/RunCode/Step/_STEP_RUN.cs
Normal file
105
cVMS.NET_CS/RunCode/Step/_STEP_RUN.cs
Normal file
@@ -0,0 +1,105 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using AR;
|
||||
using COMM;
|
||||
namespace vmsnet
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
|
||||
public void _STEP_RUN_START(ESMStep step)
|
||||
{
|
||||
//각스텝의 시작시간값을 초기화 한다.
|
||||
PUB.sm.seq.ClearTime();
|
||||
|
||||
|
||||
//재시작에 대한 코드 분리
|
||||
bool IsResume = VAR.BOOL[EVarBool.RESUMEJOB];
|
||||
|
||||
if (IsResume == false)
|
||||
{
|
||||
|
||||
PUB.log.Add($"[{step}] job start");
|
||||
|
||||
PUB.sm.RaiseInitControl();
|
||||
|
||||
//###################################
|
||||
//### 사용자 코드를 입력하세요(신규시작)
|
||||
//###################################
|
||||
if (_USER_START_CHECK() == false)
|
||||
{
|
||||
PUB.log.AddE($"[{step}] fail:_USER_START_CHECK()");
|
||||
return;
|
||||
}
|
||||
else PUB.log.AddI($"*** [{step}] START ***");
|
||||
}
|
||||
else
|
||||
{
|
||||
//###################################
|
||||
//### 사용자 코드를 입력하세요(작업재시작)
|
||||
//###################################
|
||||
if (_USER_RESUME_CHECK() == false)
|
||||
{
|
||||
PUB.log.AddE($"[{step}] fail:_USER_RESUME_CHECK()");
|
||||
return;
|
||||
}
|
||||
else PUB.log.AddI($"*** [{step}] START ***");
|
||||
}
|
||||
}
|
||||
|
||||
public StepResult _STEP_RUN(ESMStep step, TimeSpan stepTime, TimeSpan seqTime)
|
||||
{
|
||||
//데이터를 요청하고 처리하는 코드 필요
|
||||
RUN_GETDATA();
|
||||
|
||||
//인디게이터 디스플레이
|
||||
if (PUB.indicator.IsOpen)
|
||||
{
|
||||
PUB.KA1_SUM = 0f;
|
||||
foreach(var item in PUB.KA1_IndexList)
|
||||
{
|
||||
var buff = item.Split(new char[] { ',' });
|
||||
int di1 = int.Parse(buff[0]);
|
||||
int di2 = int.Parse(buff[1]);
|
||||
int di3 = int.Parse(buff[2]);
|
||||
|
||||
try
|
||||
{
|
||||
var _ampdecpos = 3;
|
||||
PUB.KA1_SUM += (float)(PUB.Values[di1, di2, di3 - 1] / (Math.Pow(10, _ampdecpos)));
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
PUB.KA2_SUM = 0f;
|
||||
foreach (var item in PUB.KA2_IndexList)
|
||||
{
|
||||
var buff = item.Split(new char[] { ',' });
|
||||
int di1 = int.Parse(buff[0]);
|
||||
int di2 = int.Parse(buff[1]);
|
||||
int di3 = int.Parse(buff[2]);
|
||||
|
||||
try
|
||||
{
|
||||
var _ampdecpos = 3;
|
||||
PUB.KA2_SUM += (float)(PUB.Values[di1, di2, di3 - 1] / (Math.Pow(10, _ampdecpos)));
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
var SUMKA = PUB.KA1_SUM + PUB.KA2_SUM;
|
||||
PUB.indicator.SetKA((Int32)SUMKA);
|
||||
}
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
17
cVMS.NET_CS/RunCode/Step/_STEP_WAITSTART.cs
Normal file
17
cVMS.NET_CS/RunCode/Step/_STEP_WAITSTART.cs
Normal file
@@ -0,0 +1,17 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using COMM;
|
||||
namespace vmsnet
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
public StepResult _STEP_WAITSTART(ESMStep step, TimeSpan stepTime, TimeSpan seqTime)
|
||||
{
|
||||
PUB.sm.SetNewStep(ESMStep.IDLE);
|
||||
return StepResult.Complete;
|
||||
}
|
||||
}
|
||||
}
|
||||
26
cVMS.NET_CS/RunCode/_00_System_Initialize.cs
Normal file
26
cVMS.NET_CS/RunCode/_00_System_Initialize.cs
Normal file
@@ -0,0 +1,26 @@
|
||||
using AR;
|
||||
using COMM;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.Common;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace vmsnet
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
|
||||
void _USER_INIT_DEVICE()
|
||||
{
|
||||
//공용변수 초기화
|
||||
VAR.Init();
|
||||
|
||||
//연결체크용 쓰레드
|
||||
thConnection= Task.Run(() => bwDeviceConnection());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
23
cVMS.NET_CS/RunCode/_04_JobStart_Check.cs
Normal file
23
cVMS.NET_CS/RunCode/_04_JobStart_Check.cs
Normal file
@@ -0,0 +1,23 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using COMM;
|
||||
using AR;
|
||||
|
||||
namespace vmsnet
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
public Boolean _USER_START_CHECK()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public Boolean _USER_RESUME_CHECK()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
30
cVMS.NET_CS/RunCode/_95_SPS.cs
Normal file
30
cVMS.NET_CS/RunCode/_95_SPS.cs
Normal file
@@ -0,0 +1,30 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using AR;
|
||||
using COMM;
|
||||
|
||||
namespace vmsnet
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
private void SPS_250ms()
|
||||
{
|
||||
if(VAR.isInit)
|
||||
{
|
||||
VAR.STR[EVarString.MCStatus] = PUB.sm.Step.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
private void SPS_Max()
|
||||
{
|
||||
|
||||
//상태머신의 가동상태
|
||||
if (VAR.isInit)
|
||||
{
|
||||
VAR.BOOL.Set(EVarBool.SMRUN, PUB.sm.isRunning, "SPS");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
60
cVMS.NET_CS/RunCode/_97_Utility.cs
Normal file
60
cVMS.NET_CS/RunCode/_97_Utility.cs
Normal file
@@ -0,0 +1,60 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Runtime.Remoting.Metadata.W3cXsd2001;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
using AR;
|
||||
using COMM;
|
||||
namespace vmsnet
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// user step 상황에서 자동으로 멈추지 않게 합니다.
|
||||
/// </summary>
|
||||
void UserStepWait()
|
||||
{
|
||||
if (VAR.BOOL.Get(EVarBool.USERSTEP))
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// user step 상황에서 자동으로 멈추게 합니다.
|
||||
/// </summary>
|
||||
void UserStepRun()
|
||||
{
|
||||
if (VAR.BOOL.Get(EVarBool.USERSTEP))
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
delegate void SelectModelHandler(string modelName);
|
||||
|
||||
void ShowDataTable(System.Data.DataTable dt)
|
||||
{
|
||||
var f = new Form
|
||||
{
|
||||
Size = new Size(800, 600),
|
||||
StartPosition = FormStartPosition.CenterScreen
|
||||
};
|
||||
var drv = new DataGridView
|
||||
{
|
||||
DataSource = dt
|
||||
};
|
||||
drv.AutoResizeColumns();
|
||||
f.Controls.Add(drv);
|
||||
drv.Dock = DockStyle.Fill;
|
||||
f.Show();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
31
cVMS.NET_CS/RunCode/_99_System_Shutdown.cs
Normal file
31
cVMS.NET_CS/RunCode/_99_System_Shutdown.cs
Normal file
@@ -0,0 +1,31 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace vmsnet
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
/// <summary>
|
||||
/// 프로그램을 닫을때 1회 실행되는 함수
|
||||
/// </summary>
|
||||
private void _USER_CLOSE_START()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// START에서 진행한 종료 동작이 완료될때까지 기다리는 코드
|
||||
/// 이 함수에서 TRUE가 반환되면 프로그램이 종료 됩니다
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private bool USER_CLOSE_WAIT()
|
||||
{
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user