176 lines
7.2 KiB
C#
176 lines
7.2 KiB
C#
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씩 조정되도록 한다
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
}
|
|
}
|