Compare commits

...

15 Commits

Author SHA1 Message Date
shark219
1a91a58f00 DigitalIndicator() 생성자의 인자로 (byte)PUB.CONFIG.indicator_slaveno 추가 2025-07-02 13:42:46 +09:00
7e3f87542c 1. 데이터 수신전에는 알람이 울리지 않도록 함 2025-07-01 23:02:33 +09:00
f480b508b7 1. 환경설정에 window 파일 저장 주기 추가(단위:분)
2. window1(2).grp 파일 생성시 임시(.temp) 파일에 생성 후 원본을 덮어쓰기 함 (window 파일 손상시 프로그램에 치명적이므로 임시파일로 처리)
2025-07-01 22:30:18 +09:00
bae298ca00 update : build number 2025-07-01 22:11:49 +09:00
ffa0cb9bf9 1. 알람셋팅화면에 기준값초기화 체크박스 추가
2. 기준값 초기화시 신규 설정된 기준값이 바로 저장되도록 함 (필요한 경우 5분 혹은 10분간격으로 window1, window2 : grp 파일은 생성해주는 것이 좋을 듯함)
3. 알람 설정화면을 통해서 값 변경시 , 기준값초기화 기능이 서브윈도우에 적용되지 않는 버그 수정
2025-07-01 22:11:17 +09:00
shark219-hub
9958dd0cf8 커밋3 2025-06-23 18:18:20 +09:00
shark219-hub
00683decda 재커밋 2025-06-23 17:52:18 +09:00
shark219-hub
891b394854 Frm_trend.cs, 'Parallel.For(0, this.ChartListData.Length - 1' -> 'Parallel.For(0, this.ChartListData.Length' 변경 2025-06-23 17:35:45 +09:00
shark219-hub
bdd929a984 20250623 커밋 2025-06-23 09:25:42 +09:00
Arin(asus)
e46b1c709b arMaskterK 프로젝트를 vms2016_cs 레포에서 현 레포로 이동 2025-06-21 11:43:19 +09:00
Arin(asus)
229ec8be66 백업파일제거 2025-06-21 11:42:01 +09:00
Arin(asus)
b189af27c3 1. 알람 AUTO설정 時, 관련 오류수정 후 적용
2.    NullBalance 관련 요청사항(절대치로 비교) 적용

3.    알람목록의 '비고'컬럼에 알람수치 입력 기능 추가
2025-06-21 11:24:18 +09:00
shark219-hub
d4c6715811 Merge branch 'master' of https://gitlab.com/jd-tek/vms2016_kadisp 2025-06-12 10:09:13 +09:00
shark219-hub
c1ba388b5a 재커밋 2025-06-12 10:09:01 +09:00
shark219
6e777e9599 재커밋 2025-06-12 09:40:47 +09:00
48 changed files with 3718 additions and 715 deletions

6
Sub/arMasterK/.gitignore vendored Normal file
View File

@@ -0,0 +1,6 @@
################################################################################
# 이 .gitignore 파일은 Microsoft(R) Visual Studio에서 자동으로 만들어졌습니다.
################################################################################
/Project/bin/Debug
/Project/.vs

View File

@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{D92246F1-981A-452C-9E0A-09CD9F68B102}</ProjectGuid>
<OutputType>Exe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Demo</RootNamespace>
<AssemblyName>Demo</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Project\arMasterK.csproj">
<Project>{e0133085-e5f9-4275-9db8-f8f20ef8561f}</Project>
<Name>arMasterK</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View File

@@ -0,0 +1,86 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Demo
{
class Program
{
static arDev.MasterK dev;
static void Main(string[] args)
{
dev = new arDev.MasterK();
dev.Message += dev_Message;
if (!dev.Init("COM8", 9600))
{
Console.WriteLine("init error");
Console.ReadKey();
return;
}
System.Text.StringBuilder sb = new StringBuilder();
sb.AppendLine("=====================");
sb.AppendLine("Master K Protocol Test");
sb.AppendLine("Version : 0.1");
sb.AppendLine("Author : tindevil@nate.com");
sb.AppendLine("=====================");
sb.AppendLine("1. Port 40 - ON");
sb.AppendLine("2. Port 40 - OFF");
sb.AppendLine("3. Port 41 - ON");
sb.AppendLine("4. Port 41 - OFF");
sb.AppendLine("5. Read Port");
sb.AppendLine("9. Exit");
sb.AppendLine("=====================");
sb.Append("Select Menu = ");
while (true)
{
Console.Write(sb.ToString());
var key = Console.ReadKey(true);
//program end
if (key.Key == ConsoleKey.D9) break;
switch (key.Key)
{
case ConsoleKey.D1:
dev.SetOutput(0, true);
break;
case ConsoleKey.D2:
dev.SetOutput(0, false);
break;
case ConsoleKey.D3:
dev.SetOutput(1, true);
break;
case ConsoleKey.D4:
dev.SetOutput(1, false);
break;
case ConsoleKey.D5:
dev.Read_RelayPort();
Console.WriteLine();
Console.WriteLine("========================");
Console.WriteLine("DI:" + dev.GetInputState());
Console.WriteLine("DO:" + dev.GetOutputState());
Console.WriteLine("========================");
Console.WriteLine("Press any key");
Console.ReadKey();
break;
default:
Console.WriteLine("unknown menu number");
break;
}
Console.Clear();
}
Console.WriteLine("Press any key : Exit");
Console.ReadKey(true);
}
static void dev_Message(object sender, arDev.MasterK.MessageEventArgs e)
{
Console.WriteLine((e.IsError ? "[ERR]" : "") + e.Message);
}
}
}

View File

@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 어셈블리의 일반 정보는 다음 특성 집합을 통해 제어됩니다.
// 어셈블리와 관련된 정보를 수정하려면
// 이 특성 값을 변경하십시오.
[assembly: AssemblyTitle("Demo")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Demo")]
[assembly: AssemblyCopyright("Copyright © 2018")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에
// 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면
// 해당 형식에 대해 ComVisible 특성을 true로 설정하십시오.
[assembly: ComVisible(false)]
// 이 프로젝트가 COM에 노출되는 경우 다음 GUID는 typelib의 ID를 나타냅니다.
[assembly: Guid("d649cb64-a01f-4f2b-99b2-a2797844f375")]
// 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다.
//
// 주 버전
// 부 버전
// 빌드 번호
// 수정 버전
//
// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 버전이 자동으로
// 지정되도록 할 수 있습니다.
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

28
Sub/arMasterK/MasterK.sln Normal file
View File

@@ -0,0 +1,28 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013
VisualStudioVersion = 12.0.40629.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "arMasterK", ".\Project\arMasterK.csproj", "{E0133085-E5F9-4275-9DB8-F8F20EF8561F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Demo", ".\Demo\Demo.csproj", "{D92246F1-981A-452C-9E0A-09CD9F68B102}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{E0133085-E5F9-4275-9DB8-F8F20EF8561F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E0133085-E5F9-4275-9DB8-F8F20EF8561F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E0133085-E5F9-4275-9DB8-F8F20EF8561F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E0133085-E5F9-4275-9DB8-F8F20EF8561F}.Release|Any CPU.Build.0 = Release|Any CPU
{D92246F1-981A-452C-9E0A-09CD9F68B102}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D92246F1-981A-452C-9E0A-09CD9F68B102}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D92246F1-981A-452C-9E0A-09CD9F68B102}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D92246F1-981A-452C-9E0A-09CD9F68B102}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

2
Sub/arMasterK/Project/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/MasterK.v12.suo
/MasterK.sln

View File

@@ -0,0 +1,236 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace arDev
{
public partial class MasterK
{
[Description("")]
public enum eMsgType
{
[Description("")]
Rx = 0,
[Description("")]
Tx,
RxRaw,
}
[Description("Operation Code , 이 코드값으로 컨트롤 보드에 명령합니다.")]
public enum eOpCode : byte
{
GET_IO_DATA = 0,
RELAY_OUTPUT,
}
/// <summary>
/// digital input/output direction
/// </summary>
public enum eIOPINDIR : byte
{
[Description("Digital Input")]
INPUT = 0,
[Description("Digital Output")]
OUTPUT = 1,
}
/// <summary>
/// error code list
/// </summary>
public enum eErrorCode : byte
{
[Description("포트가사용중입니다.")]
PortBusy = 0,
[Description("열려있지않습니다.")]
NotOpen,
[Description("쓰기오류")]
WriteError,
[Description("읽기오류")]
ReadError,
[Description("프레임오류")]
FrameError,
[Description("체크섬오류")]
ChecksumError
}
/// <summary>
/// message frame
/// </summary>
public struct sRecvMessage
{
/// <summary>
/// 국번
/// </summary>
public string Device;
/// <summary>
/// 명령어
/// </summary>
public char Command;
/// <summary>
/// 명령어타입
/// </summary>
public string CmdType;
/// <summary>
/// 블록수
/// </summary>
public int BlockCount;
/// <summary>
/// 데이터갯수
/// </summary>
public int DataLen;
/// <summary>
/// 데이터
/// </summary>
public string Data;
public string FullString;
/// <summary>
/// full message frame
/// </summary>
[Description("전체 메세지 영역")]
public byte[] Buffer;
/// <summary>
/// check byte (crc16)
/// </summary>
[Description("체크섬 2byte(CRC 16)")]
public byte[] checksum;
/// <summary>
/// checksum error
/// </summary>
[Description("체크섬에 오류가 있는지 확인합니다.(true일경우 오류)")]
public Boolean isCSError;
[Description("기타메세지")]
public string Message;
[Description("정보를 삭제합니다.")]
public void Clear()
{
Message = "NOTSET";
Data = null;
Buffer = null;
checksum = null;
isCSError = false;
BlockCount = 0;
DataLen = 0;
FullString = string.Empty;
}
[Description("응답코드가 NAK인지확인합니다. NAK응답은 컨트롤러로부터 오류가 수신되었음을 의미합니다.")]
public Boolean isNAK
{
get
{
if (Buffer[0] == 0x15) return true;
else return false;
}
}
[Description("오류가 있는지 체크합니다. 버퍼가 없거나 체크섬 오류 , DLC오류등을 체크 합니다.")]
public Boolean isError
{
get
{
if (Buffer == null || isCSError || BlockCount == 0 || isNAK) return true;
else return false;
}
}
}
public struct sSendMessage
{
/// <summary>
/// 국번
/// </summary>
public string Device;
/// <summary>
/// 명령어
/// </summary>
public char Command;
/// <summary>
/// 명령어타입
/// </summary>
public string CmdType;
/// <summary>
/// 변수길이
/// </summary>
public int DeviceLength;
public int NumberofBlock;
/// <summary>
/// 변수명
/// </summary>
public string VarName;
/// <summary>
/// 데이터갯수
/// </summary>
public int DataLen;
public string Data;
/// <summary>
/// full message frame
/// </summary>
[Description("전체 메세지 영역")]
public byte[] Buffer;
public string Strbuffer;
/// <summary>
/// check byte (crc16)
/// </summary>
[Description("체크섬 2byte(CRC 16)")]
public byte[] checksum;
/// <summary>
/// checksum error
/// </summary>
[Description("체크섬에 오류가 있는지 확인합니다.(true일경우 오류)")]
public Boolean isCSError;
[Description("기타메세지")]
public string Message;
[Description("정보를 삭제합니다.")]
public void Clear()
{
Data = string.Empty;
Message = "NOTSET";
Buffer = null;
checksum = null;
isCSError = false;
DeviceLength = 0;
NumberofBlock = 0;
DataLen = 0;
Strbuffer = string.Empty;
}
[Description("오류가 있는지 체크합니다. 버퍼가 없거나 체크섬 오류 , DLC오류등을 체크 합니다.")]
public Boolean isError
{
get
{
if (Buffer == null || isCSError || DeviceLength == 0) return true;
else return false;
}
}
}
}
}

View File

@@ -0,0 +1,131 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace arDev
{
public partial class MasterK
{
public class DataEventArgs : EventArgs
{
private byte[] _buffer = null;
/// <summary>
/// 바이트배열의 버퍼값
/// </summary>
public byte[] Value { get { return _buffer; } }
public eMsgType Direction { get; set; }
/// <summary>
/// 버퍼(바이트배열)의 데이터를 문자로 반환합니다.
/// </summary>
public string StrValue
{
get
{
if (_buffer == null || _buffer.Length < 1) return string.Empty;
return System.Text.Encoding.Default.GetString(_buffer);
}
}
public DataEventArgs(eMsgType dir_, byte[] buffer)
{
_buffer = buffer;
Direction = dir_;
}
}
public class MessageEventArgs : EventArgs
{
protected Boolean _isError = false;
public Boolean IsError { get { return _isError; } }
protected string _message = string.Empty;
public string Message { get { return _message; } }
public MessageEventArgs(Boolean isError, string Message)
{
_isError = isError;
_message = Message;
}
}
public class FrameEventArgs : EventArgs
{
public eOpCode OpCode { get; set; }
public FrameEventArgs(eOpCode opCode_)
{
OpCode = opCode_;
}
}
public class IOValueEventArgs : EventArgs
{
protected eIOPINDIR _direction;
protected int _arridx;
protected Boolean _oldvalue;
protected Boolean _newvalue;
public eIOPINDIR Direction { get { return _direction; } }
public int ArrIDX { get { return _arridx; } }
public Boolean OldValue { get { return _oldvalue; } }
public Boolean NewValue { get { return _newvalue; } }
public IOValueEventArgs(eIOPINDIR dir, int arridx, Boolean oldvalue, Boolean newvalue)
{
_direction = dir;
_arridx = arridx;
_oldvalue = oldvalue;
_newvalue = newvalue;
}
}
public class AIValueEventArgs : EventArgs
{
public float[] Value { get; protected set; }
public AIValueEventArgs(float[] value_)
{
Value = value_;
}
}
#region "Events"
/// <summary>
/// 일반적인 메세지 혹은 오류메세지 이벤트
/// </summary>
public event EventHandler<MessageEventArgs> Message;
/// <summary>
/// 데이터메시이벤트 (Rx,Tx) 별로 구분됩니다.
/// </summary>
public event EventHandler<DataEventArgs> DataMessage;
/// <summary>
/// 가공되어진 최종 메세지 형태값을 가지고 있습니다.
/// </summary>
public event EventHandler<FrameEventArgs> ReceiveFrame;
/// <summary>
/// ReadProcess에의해서 감시되며 포트의 상태값이 바뀐다면 발생함
/// </summary>
public event EventHandler<IOValueEventArgs> IOValueChanged;
/// <summary>
/// AI의 값을 이벤트로 발생합니다.발생주기는 AIInterval을 참고합니다.
/// </summary>
public event EventHandler<AIValueEventArgs> AIValueChanged;
/// <summary>
/// 오류발생시 메세지가 발생함
/// </summary>
public event EventHandler<MessageEventArgs> IOErrorMessage;
/// <summary>
/// anlog 관련한 오류 메세지
/// </summary>
/// <remarks>Analog Data Error Message</remarks>
public event EventHandler<MessageEventArgs> AIErrorMessage;
#endregion
}
}

View File

@@ -0,0 +1,13 @@
181005 chi init 시 baudrate 를 기본값 19200 설정
180802 chi init 시에 baudrate 도 입력하도록 함
180625 chi TestVersion 0.1;
RunMonitor 가 중복실행되지 않도록 수정
makepacket 수정
00RSB06%PW00001
00WSS0107%PX004001
[18-03-29 06:45:38] RAW: 06 30 30 52 53 42 30 31 30 32 30 30 30 30 03
00RSB01020000
180329 Create

View File

@@ -0,0 +1,686 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.ComponentModel;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Design;
using System.Reflection;
using System.Runtime;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
namespace arDev
{
public partial class MasterK : IDisposable
{
#region "Variable"
public bool bRunMonitor; //쓰레드작동시그널
public Boolean bAIMonitor=false; //배경쓰레드에서 아날로그값을 모니터링 합니다.\
public Boolean bDIOMonitor=true; //배경쓰레드에서 dIO를 모니터링 할것인가?
public string errorMessage = string.Empty;
System.Diagnostics.Stopwatch aiMonWatch = new System.Diagnostics.Stopwatch();
public long LoopDelay;
protected byte wSTX = 0x05;
protected byte wETX = 0x04;
protected byte rSTX = 0x06;
protected byte rETX = 0x03;
protected int interchar_delay;
protected Boolean bSyncRecvOK = false;// 메세지를 수신할 경우 설정됩니다.
protected Boolean _isInit = false;// 보드가 초기화가 되었는지 확인합니다.
public Boolean disposed = false;// Dipose 되었는가?
protected byte _CommandCode = 0x00;// recv command code
protected Boolean _bDlc = false;
protected int _dlc = 0;
protected Boolean _bStx = false; //stx를 찾앗는지?
protected Boolean _bEtx = false; //etx를 찾앗는지?
protected Boolean[] _valueI; //입력접점
protected Boolean[] _valueO; //출력접점
protected Boolean[] OldvalueI;
protected Boolean[] OldvalueO;
protected Thread thMonitor; //배경쓰레드(상태체크 및 이벤트 발생)
protected ManualResetEvent _mre;
protected string _mreowner = string.Empty;
protected System.Diagnostics.Stopwatch wat = new System.Diagnostics.Stopwatch();
protected System.IO.Ports.SerialPort _device;
public int DOCount { get; protected set; }
public int DICount { get; protected set; }
public double ThreadSpeed = 0;
public sRecvMessage LastRecvMessage;
public sSendMessage lastSendMessage;
public DateTime lastSendTime;
public byte[] lastSendBuffer;
/// <summary>
/// device index
/// </summary>
public byte IDX = 0;
#endregion
public MasterK()
{
//serial port
_device = new System.IO.Ports.SerialPort();
_device.BaudRate = 9600;
_device.DtrEnable = false;
_device.WriteTimeout = 2000;
_device.ReadTimeout = 2000;
_device.DiscardNull = true;
//autoreset events
_mre = new System.Threading.ManualResetEvent(true);
bRunMonitor = false;
LoopDelay = 150;
//모든ls산전은 논리적으로 64개가 지정되어있다.
this.DICount = 64;
this.DOCount = 64;
//변수초기화
this._valueI = new bool[DICount];
this._valueO = new bool[DOCount];
this.OldvalueI = new bool[_valueI.Length];
this.OldvalueO = new bool[_valueO.Length];
//초기값설정(인풋)
for (int i = 0; i < _valueI.Length; i++)
{
this._valueI[i] = false;
this.OldvalueI[i] = false;
}
//초기값설정(아웃풋)
for (int i = 0; i < _valueO.Length; i++)
{
this._valueO[i] = false;
this.OldvalueO[i] = false;
}
}
~MasterK()
{
Dispose(false);
}
public void Close()
{
if (_device.IsOpen)
{
if (_mre.WaitOne(3000))
{
_mre.Reset();
_mreowner = "Close";
_device.Close();
_mre.Set();
}
else
{
RaiseMessage(true, "close error timeout");
}
}
}
/// <summary>
/// 개체를 해제합니다.
/// </summary>
[Description("")]
public virtual void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
// Protected implementation of Dispose pattern.
protected virtual void Dispose(bool disposing)
{
if (disposed)
return;
if (disposing)
{
// Dispose managed resources.
}
StopMonitor();
// Call the appropriate methods to clean up
// unmanaged resources here.
// If disposing is false,
// only the following code is executed.
// Note disposing has been done.
disposed = true;
}
public string PortName
{
get
{
return _device.PortName;
}
set
{
_device.PortName = value;
}
}
public Boolean Init(string port,int baud = 19200)
{
Close();
errorMessage = string.Empty;
_device.PortName = port;
_device.BaudRate = baud;
try
{
_device.Open();
_device.DiscardInBuffer();
_device.DiscardOutBuffer();
_isInit = true;
sw_ch = new System.Diagnostics.Stopwatch();
interchar_delay = GetIntercharDelay();
interframe_delay = GetInterframeDelay();
}
catch (Exception ex)
{
_isInit = false;
errorMessage = ex.Message;
RaiseMessage(true, ex.Message);
}
return _isInit;
}
#region "Properties"
/// <summary>
/// 입력핀 상태값을 확인합니다.
/// </summary>
/// <param name="arridx">0부터 시작하는 인덱스값</param>
/// <returns></returns>
[Description("")]
public Boolean INPUT(int arridx)
{
if (arridx < 0 || arridx > DICount - 1)
{
if (IOErrorMessage != null)
IOErrorMessage(this, new MessageEventArgs(true, "INPUT Command : ArrayIndex Error Value=" + arridx.ToString()));
return false;
}
return this._valueI[arridx];
}
/// <summary>
/// 입력핀 상태를 모두 반환합니다.
/// </summary>
[Description("")]
public Boolean[] getInputArray
{
get
{
return (Boolean[])this._valueI.Clone();
}
}
public byte getInputValueToByte(int startindex)
{
System.Collections.BitArray ba = new System.Collections.BitArray(this._valueI);
byte[] value = new byte[8];
ba.CopyTo(value, startindex);
return value[0];
}
public Int64 getInputValue
{
get
{
System.Collections.BitArray ba = new System.Collections.BitArray(this._valueI);
byte[] value = new byte[8];
ba.CopyTo(value, 0);
return BitConverter.ToInt64(value, 0);
}
}
/// <summary>
/// 출력핀 상태를 모두 반환합니다.
/// </summary>
[Description("")]
public Boolean[] getOutputArray
{
get
{
return (Boolean[])this._valueO.Clone();
}
}
/// <summary>
/// 출력핀 상태 값을 확인합니다.
/// </summary>
/// <param name="arridx">0부터 시작하는 인덱스값</param>
/// <returns></returns>
[Description("")]
public Boolean OUTPUT(int arridx)
{
// get { return (Boolean[])this._valueO.Clone(); }
if (arridx < 0 || arridx > DOCount - 1)
{
if (IOErrorMessage != null)
IOErrorMessage(this, new MessageEventArgs(true, "OUTPUT Command : ArrayIndex Error Value=" + arridx.ToString()));
return false;
}
return this._valueO[arridx];
}
/// <summary>
/// read digital input port state
/// </summary>
/// <returns></returns>
[Description("")]
public string GetInputState()
{
System.Text.StringBuilder sb = new StringBuilder();
for (int i = 0; i < OldvalueI.Length; i++)
sb.Append(OldvalueI[i] ? "1" : "0");
return sb.ToString();
}
/// <summary>
/// read digital output port state
/// </summary>
/// <returns></returns>
[Description("")]
public string GetOutputState()
{
System.Text.StringBuilder sb = new StringBuilder();
for (int i = 0; i < OldvalueO.Length; i++)
sb.Append(OldvalueO[i] ? "1" : "0");
return sb.ToString();
}
#endregion
#region "Method"
/// <summary>
/// 오류메세지 반환
/// </summary>
/// <returns></returns>
[Description("")]
public string GetErrorMessage()
{
return this.errorMessage;
}
#region "raise Message"
/// <summary>
/// 일반메세지륿 라생시킵니다.
/// </summary>
/// <param name="isError"></param>
/// <param name="message"></param>
[Description("")]
public void RaiseMessage(Boolean isError, string message)
{
if (isError) errorMessage = message; //170920
if (Message != null) Message(this, new MessageEventArgs(isError, message));
}
/// <summary>
/// 지정한 데이터로 바코드가 수신된것처럼 발생시킵니다.(Parser를 사용함)
/// </summary>
/// <param name="b"></param>
[Description("")]
public void RaiseDataMessage(eMsgType dir, byte[] Data)
{
try
{
if (dir == eMsgType.Rx) Parse_RecvBuffer(Data);
if (DataMessage != null) DataMessage(this, new DataEventArgs(dir,Data));
}
catch (Exception ex)
{
errorMessage = ex.Message;
RaiseMessage(true, "RaiseDataMessage:" + ex.Message);
}
}
#endregion
/// <summary>
/// Input / Output 핀 상태를 지속적으로 읽는 쓰레드작업을 시작합니다.
/// </summary>
[Description("")]
public void RunMonitor(int loopDelay_ = 150)
{
this.LoopDelay = loopDelay_;
if(!this.bRunMonitor)
{
this.bRunMonitor = true;
this.thMonitor = new Thread(new ThreadStart(this.bwMonitor));
this.thMonitor.IsBackground = true;
this.thMonitor.Start();
}
}
/// <summary>
/// INPUT/OUPUT 핀 상태를 모니터링하는 쓰레드를 종료시킵니다.
/// </summary>
/// <returns></returns>
[Description("")]
public bool StopMonitor()
{
try
{
this.bRunMonitor = false;
RaiseMessage(false, "Stop Monitor");
return true;
}
catch (Exception ex)
{
RaiseMessage(true, ex.Message);
return false;
}
}
/// <summary>
/// 지정한 출력포트의 값을 반전 시킵니다.
/// </summary>
/// <param name="arrIndex"></param>
/// <returns></returns>
[Description("")]
public Boolean SetToggle(int arrIndex)
{
if (!IsInit) return false;
if (arrIndex < 0 || (arrIndex + 1) > DOCount)
throw new Exception(string.Format("IDX Range Errror({0}~{1})", 0, DOCount-1));
Boolean currentValue = OUTPUT(arrIndex);
return SetOutput(arrIndex, !currentValue);
}
/// <summary>
/// 출력을 설정합니다.
/// </summary>
/// <param name="arrIndex"></param>
/// <param name="Value"></param>
/// <param name="Duration"></param>
/// <returns></returns>
[Description("")]
public Boolean SetOutput(int arrIndex, Boolean Value, int Duration = 0)
{
errorMessage = string.Empty;
if (!IsInit)
{
//RaiseMessage(true, "SetOutput:No Init");
return false;
}
//RaiseMessage(false, "Set Output Index=" + arrIndex.ToString() + ",Value=" + Value.ToString());
if (arrIndex < 0 || (arrIndex + 1) > DOCount)
{
RaiseMessage(true, "SetOutput:ArrIndex Error = " + arrIndex.ToString());
return false;
}
if (!_mre.WaitOne(1000))
{
RaiseMessage(true, "SetOutput Wait on timeout");
return false;
}
_mre.Reset();
if (Duration < 0) Duration = 0;
int Port = 0x40 + arrIndex; //출력포트는 64번부터 시작한다.
string cmd = "00WSS0107%PX00" + Port.ToString("X2") + (Value ? "01":"00");
//해당라인에 그값을 쓴다.
Boolean bRet = true;
try
{
var buffer = WriteSync(cmd);
string strBuffer = System.Text.Encoding.Default.GetString(buffer);
if (buffer == null)
{
RaiseMessage(true, "SetOutput:No Response");
bRet= false;
}
else
{
if(buffer[0] == 0x06)
{
if (Duration != 0)
{
var task = new Task(() =>
{
Thread.Sleep(Duration);
string cmd2 = "00WSS0107%PX00" + Port.ToString("X2") + (Value ? "00" : "01");
var buffer2 = WriteSync(cmd2);
if (buffer2 == null)
{
RaiseMessage(true, "SetOutput:Duration toggle Error:No Reponse");
}
});
task.Start(); //비동기로 실행한다.
}
}
else
{
RaiseMessage(true, "SetOutput:Nak response");
bRet = false;
}
}
}
catch (Exception ex)
{
RaiseMessage(true, "SetOutput:"+ex.Message);
bRet = false;
}
_mre.Set();
return bRet;
}
/// <summary>
/// 이벤트를 강제 생성합니다.
/// </summary>
/// <param name="Direction"></param>
/// <param name="ArrIDX"></param>
/// <param name="newvalue"></param>
[Description("")]
public void RaiseEvent(eIOPINDIR Direction, int ArrIDX, Boolean newvalue)
{
if (IOValueChanged != null)
{
//mre.WaitOne();
//mre.Reset();
//171226
if (Direction == eIOPINDIR.INPUT)
{
_valueI[ArrIDX] = newvalue;
OldvalueI[ArrIDX] = newvalue;
}
else
{
_valueO[ArrIDX] = newvalue;
OldvalueO[ArrIDX] = newvalue;
}
try
{
if (IOValueChanged != null)
IOValueChanged(this, new IOValueEventArgs(Direction, ArrIDX, !newvalue, newvalue));
}
catch (Exception ex)
{
if (IOErrorMessage != null)
this.IOErrorMessage(this, new MessageEventArgs(true , string.Format( "{0},{1}:{2}:{3}",ex.Message,Direction,ArrIDX,newvalue)));
}
//mre.Set();
}
}
public virtual void UserMonitorCode() { }
private byte loopIndex = 0;
/// <summary>
/// I/O상태를 모니터링 하여 내부 변수에 값을 저장합니다.
/// </summary>
[Description("")]
protected void bwMonitor()
{
DateTime lastaitime = DateTime.Now;
DateTime lastmottime = DateTime.Now;
System.Diagnostics.Stopwatch wat = new System.Diagnostics.Stopwatch();
while (this.bRunMonitor)
{
wat.Restart();
//170905
if (!IsInit)
{
aiMonWatch.Stop();
System.Threading.Thread.Sleep(1000);
continue;
}
else
{
if (!aiMonWatch.IsRunning) aiMonWatch.Reset();
}
//read dio status
if (loopIndex == 0)
{
//RaiseMessage(false,"Run IOMonitor");
if (bDIOMonitor)
Read_RelayPort();
loopIndex += 1;
}
else
{
//RaiseMessage(false, "Run AIMonitor");
UserMonitorCode();
loopIndex = 0;
}
wat.Stop();
ThreadSpeed = wat.ElapsedMilliseconds;
if(wat.ElapsedMilliseconds < LoopDelay)
{
Thread.Sleep((int)(LoopDelay- wat.ElapsedMilliseconds));
}
}
wat.Stop();
}
#endregion
#region "Send Method"
//public Boolean Read_AIPort()
//{
// if (!_mre.WaitOne(1000))
// {
// RaiseMessage(true, "Read_AIPort Wait on timeout");
// return false;
// }
// //RaiseMessage(false, "Read_AIPort");
// _mre.Reset();
// System.Threading.Thread.Sleep(25);
// _mre.Set();
// return true;
//}
public Boolean isValid
{
get
{
var ts = DateTime.Now - lastrecvTime;
if (ts.TotalSeconds > 5) return false;
else return true;
}
}
private DateTime lastrecvTime = DateTime.Now;
public Boolean Read_RelayPort()
{
if(!_mre.WaitOne(1000))
{
RaiseMessage(true, "Read_RelayPort Wait on timeout");
return false;
}
// RaiseMessage(false, "Read_RelayPort");
_mre.Reset();
var packet = MakePacket(0, 'R', "SB","%PW000", 8); //"00RSB06%PW00008"
var buffer = WriteSync(packet);
if(buffer != null)
{
var frame = Parse_RecvBuffer(buffer);
if(!frame.isError)
{
this.Run_RelayPortData(ref frame);
lastrecvTime = DateTime.Now;
}
LastRecvMessage = frame;
}
_mre.Set();
return buffer != null;
}
/// <summary>
///
/// </summary>
/// <param name="Station">0~9</param>
/// <param name="Command">R,W</param>
/// <param name="CmdType">SB,SW ??</param>
/// <param name="Device">%PW000</param>
/// <param name="NumberofData">1</param>
/// <param name="data">HexString</param>
/// <returns></returns>
public string MakePacket(byte Station,char Command,string CmdType,string Device,byte NumberofData,string data = "")
{
string buffer = Station.ToString("X2").PadLeft(2, '0') +
Command +
CmdType +
Device.Length.ToString("X2").PadLeft(2, '0') +
Device +
NumberofData.ToString("X2").PadLeft(2, '0');
if (data != "") buffer += data;
return buffer;
}
#endregion
}
}

View File

@@ -0,0 +1,230 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace arDev
{
public partial class MasterK
{
public sRecvMessage Parse_RecvBuffer(byte[] buffer)
{
sRecvMessage frame = new sRecvMessage();
frame.Clear();
frame.Message = string.Empty;
if(buffer==null)
{
frame.Message = "null buffer";
return frame;
}
frame.FullString = System.Text.Encoding.Default.GetString(buffer);
if (buffer == null || buffer.Length < 5)
{
frame.Message = "No Buffer";
errorMessage = frame.Message;
return frame;
}
//buffer copy
frame.Buffer = new byte[buffer.Length];
buffer.CopyTo(frame.Buffer, 0);
if ((buffer[0] != 0x06 && buffer[0] != 0x15) || buffer[buffer.Length - 1] != 0x03)
{
frame.Message = "No STX,ETX";
errorMessage = frame.Message;
return frame;
}
try
{
frame.checksum = new byte[2];
frame.isCSError = false;// !CheckCrc(buffer);
frame.Device = System.Text.Encoding.Default.GetString(buffer, 1, 2);
frame.Command = (char)buffer[3];
frame.CmdType = System.Text.Encoding.Default.GetString(buffer, 4, 2);
//쓰기명령은 데이터가 없다.
if (frame.Command == 'W')
{
frame.BlockCount = 0;
frame.DataLen = 0;
frame.Data = null;
}
else
{
if (!frame.isNAK)
{
frame.BlockCount = Convert.ToInt32(System.Text.Encoding.Default.GetString(buffer, 6, 2), 16);
frame.DataLen = Convert.ToInt32(System.Text.Encoding.Default.GetString(buffer, 8, 2), 16);
int stringDataLen = frame.BlockCount * frame.DataLen * 2;
if (frame.FullString.Length < stringDataLen + 10)
{
frame.BlockCount = 0;
frame.Data = string.Empty;
errorMessage = "Frame length Error:" + frame.FullString;
}
else
{
frame.Data = frame.FullString.Substring(10, stringDataLen); //, 10, DataBufferLen);
}
}
}
} catch(Exception ex) //180706
{
frame.BlockCount = 0;
errorMessage = ex.Message;
}
if (frame.isError && errorMessage == "") errorMessage = "Recvbuffer Has Error";
return frame;
}
public sSendMessage Parse_SendBuffer(byte[] buffer)
{
sSendMessage msg = new sSendMessage();
msg.Clear();
msg.Message = string.Empty;
if (buffer == null || buffer.Length < 5)
{
msg.Message = "No Buffer";
errorMessage = msg.Message;
return msg;
}
//buffer copy
msg.Buffer = new byte[buffer.Length];
msg.Strbuffer = System.Text.Encoding.Default.GetString(buffer);
buffer.CopyTo(msg.Buffer, 0);
if ((buffer[0] != wSTX) || buffer[buffer.Length - 1] != wETX)
{
msg.Message = "No STX,ETX";
errorMessage = msg.Message;
return msg;
}
msg.checksum = new byte[2];
msg.isCSError = false;// !CheckCrc(buffer);
msg.Device = System.Text.Encoding.Default.GetString(buffer, 1, 2);
msg.Command = (char)buffer[3];
if (msg.Command == 'R')
{
msg.CmdType = msg.Strbuffer.Substring(4, 2);
msg.DeviceLength = int.Parse(msg.Strbuffer.Substring( 6, 2));
msg.VarName = msg.Strbuffer.Substring( 8, msg.DeviceLength);
msg.DataLen = int.Parse(msg.Strbuffer.Substring( 8 + msg.DeviceLength, 2));
} else if (msg.Command == 'W')
{
msg.CmdType = System.Text.Encoding.Default.GetString(buffer, 4, 2);
if(msg.CmdType == "SB")
{
//블록수가 없다.
msg.NumberofBlock = 0;
msg.DeviceLength = int.Parse(msg.Strbuffer.Substring(6, 2));
msg.VarName = msg.Strbuffer.Substring(8, msg.DeviceLength);
msg.DataLen = Convert.ToByte(msg.Strbuffer.Substring(8 + msg.DeviceLength, 2),16);
int remain = msg.Strbuffer.Length - 2 - 10 - msg.DeviceLength+1;
msg.Data = msg.Strbuffer.Substring(10 + msg.DeviceLength, remain);
}
else
{
msg.NumberofBlock = int.Parse(msg.Strbuffer.Substring(6, 2));
msg.DeviceLength = int.Parse(msg.Strbuffer.Substring(8, 2));
msg.VarName = msg.Strbuffer.Substring(10, msg.DeviceLength);
msg.Data = msg.Strbuffer.Substring(10 + msg.DeviceLength, 2);
msg.DataLen = (int)(msg.Data.Length / 2.0);
}
}
return msg;
}
/// <summary>
/// 수신된 데이터를 분석하고 관련 메세지를 생성합니다.
/// </summary>
/// <param name="opCode"></param>
/// <param name="dataBuffer"></param>
[Description("")]
protected void Run_RelayPortData(ref sRecvMessage message)
{
if (message.isNAK) return; //req nak process
if (message.Command == 'R')
{
if (message.CmdType == "SB")
{
var Port = lastSendMessage.VarName.Substring(1, 1);
var DataType = lastSendMessage.VarName.Substring(2, 1);
//int DataLen = 0;
//if (DataType == "W") DataLen = 16;
switch (Port)
{
case "P": //relay
//들어온값이 16진수 문자형태이므로 숫자로 변경
var InBufferStrH = message.Data.Substring(0, 8);
var InBufferStrL = message.Data.Substring(8, 8);
var OtBufferStrH = message.Data.Substring(16, 8);
var OtBufferStrL = message.Data.Substring(24, 8);
Int32 numvalueHI = Convert.ToInt32(InBufferStrL, 16);
Int32 numvalueLI = Convert.ToInt32(InBufferStrH, 16);
Int32 numvalueHO = Convert.ToInt32(OtBufferStrL, 16);
Int32 numvalueLO = Convert.ToInt32(OtBufferStrH, 16);
var bufHI = BitConverter.GetBytes(numvalueHI).ToArray();
var bufLI = BitConverter.GetBytes(numvalueLI).ToArray();
var bufHO = BitConverter.GetBytes(numvalueHO).ToArray();
var bufLO = BitConverter.GetBytes(numvalueLO).ToArray();
System.Collections.BitArray b = new System.Collections.BitArray(new byte[] { bufLI[2], bufLI[3], bufLI[0], bufLI[1] });
for (int i = 0; i < b.Length; i++)
{
this._valueI[i] = b.Get(i);
if (OldvalueI[i] != this._valueI[i])
{
try
{
if (IOValueChanged != null)
IOValueChanged(this, new IOValueEventArgs(eIOPINDIR.INPUT, i, OldvalueI[i], _valueI[i]));
}
catch (Exception ex)
{
if (IOErrorMessage != null)
IOErrorMessage(this, new MessageEventArgs(true, ex.Message));
}
this.OldvalueI[i] = this._valueI[i];
}
}
System.Collections.BitArray bO = new System.Collections.BitArray(new byte[] { bufLO[2], bufLO[3], bufLO[0], bufLO[1] });
for (int i = 0; i < bO.Length; i++)
{
this._valueO[i] = bO.Get(i);
if (OldvalueO[i] != this._valueO[i])
{
try
{
if (IOValueChanged != null)
IOValueChanged(this, new IOValueEventArgs(eIOPINDIR.OUTPUT, i, OldvalueO[i], _valueO[i]));
}
catch (Exception ex)
{
if (IOErrorMessage != null)
IOErrorMessage(this, new MessageEventArgs(true, ex.Message));
}
this.OldvalueO[i] = this._valueO[i];
}
}
break;
}
}
}
}
}
}

View File

@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 어셈블리의 일반 정보는 다음 특성 집합을 통해 제어됩니다.
// 어셈블리와 관련된 정보를 수정하려면
// 이 특성 값을 변경하십시오.
[assembly: AssemblyTitle("MasterK PLC I/O DLL")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("SIMP")]
[assembly: AssemblyProduct("MasterKDLL")]
[assembly: AssemblyCopyright("Copyright © SIMP 2018")]
[assembly: AssemblyTrademark("SimpleSoft")]
[assembly: AssemblyCulture("")]
// ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에
// 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면
// 해당 형식에 대해 ComVisible 특성을 true로 설정하십시오.
[assembly: ComVisible(false)]
// 이 프로젝트가 COM에 노출되는 경우 다음 GUID는 typelib의 ID를 나타냅니다.
[assembly: Guid("59413cb9-8a6a-4a66-92c1-94d7baea812d")]
// 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다.
//
// 주 버전
// 부 버전
// 빌드 번호
// 수정 버전
//
// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 버전이 자동으로
// 지정되도록 할 수 있습니다.
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("18.08.02.1730")]
[assembly: AssemblyFileVersion("18.08.02.1730")]

View File

@@ -0,0 +1,63 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 이 코드는 도구를 사용하여 생성되었습니다.
// 런타임 버전:4.0.30319.42000
//
// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면
// 이러한 변경 내용이 손실됩니다.
// </auto-generated>
//------------------------------------------------------------------------------
namespace arDev.Properties {
using System;
/// <summary>
/// 지역화된 문자열 등을 찾기 위한 강력한 형식의 리소스 클래스입니다.
/// </summary>
// 이 클래스는 ResGen 또는 Visual Studio와 같은 도구를 통해 StronglyTypedResourceBuilder
// 클래스에서 자동으로 생성되었습니다.
// 멤버를 추가하거나 제거하려면 .ResX 파일을 편집한 다음 /str 옵션을 사용하여 ResGen을
// 다시 실행하거나 VS 프로젝트를 다시 빌드하십시오.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// 이 클래스에서 사용하는 캐시된 ResourceManager 인스턴스를 반환합니다.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("arDev.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// 이 강력한 형식의 리소스 클래스를 사용하여 모든 리소스 조회에 대해 현재 스레드의 CurrentUICulture 속성을
/// 재정의합니다.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
}
}

View File

@@ -0,0 +1,117 @@
<?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
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<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
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
mimetype set.
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
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.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
: 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
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -0,0 +1,26 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 이 코드는 도구를 사용하여 생성되었습니다.
// 런타임 버전:4.0.30319.42000
//
// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면
// 이러한 변경 내용이 손실됩니다.
// </auto-generated>
//------------------------------------------------------------------------------
namespace arDev.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.11.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
}
}

View File

@@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

View File

@@ -0,0 +1,425 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace arDev
{
public partial class MasterK
{
protected int ReceiveByte()
{
bool done = false;
int ret_val;
// Await 1 char...
if (!sw_ch.IsRunning)
sw_ch.Start();
do
{
if (_device.BytesToRead > 0)
{
ret_val = _device.ReadByte();
done = true;
}
else
ret_val = -1;
} while ((!done) && ((sw_ch.ElapsedMilliseconds - char_tmo) < 10));
if (done)
char_tmo = sw_ch.ElapsedMilliseconds; // Char received with no errors...reset timeout counter for next char!
return ret_val;
}
protected int GetInterframeDelay()
{
int ret_val;
if (_device.BaudRate > 19200)
ret_val = 2; // Fixed value = 1.75ms up rounded
else
{
int nbits = 1 + _device.DataBits;
nbits += _device.Parity == System.IO.Ports.Parity.None ? 0 : 1;
switch (_device.StopBits)
{
case System.IO.Ports.StopBits.One:
nbits += 1;
break;
case System.IO.Ports.StopBits.OnePointFive: // Ceiling
case System.IO.Ports.StopBits.Two:
nbits += 2;
break;
}
ret_val = Convert.ToInt32(Math.Ceiling(1 / (((double)_device.BaudRate / ((double)nbits * 3.5d)) / 1000)));
}
return ret_val;
}
protected int GetIntercharDelay()
{
int ret_val;
if (_device.BaudRate > 19200)
ret_val = 1; // Fixed value = 0.75 ms up rounded
else
{
int nbits = 1 + _device.DataBits;
nbits += _device.Parity == System.IO.Ports.Parity.None ? 0 : 1;
switch (_device.StopBits)
{
case System.IO.Ports.StopBits.One:
nbits += 1;
break;
case System.IO.Ports.StopBits.OnePointFive: // Ceiling
case System.IO.Ports.StopBits.Two:
nbits += 2;
break;
}
ret_val = Convert.ToInt32(Math.Ceiling(1 / (((double)_device.BaudRate / ((double)nbits * 1.5d)) / 1000)));
}
return ret_val;
}
/// <summary>
/// IO모니터가 실행중인지 확인합니다.
/// </summary>
[Description("I/O보드 핀 상태를 쓰레드를 이용하여 읽고 있는지 여부"), Browsable(false)]
public Boolean isRunMonitor
{
get
{
if (thMonitor == null) return false;
return this.thMonitor.IsAlive;
}
}
/// <summary>
/// 16진수 문자열 형태로 반환합니다.
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[Description("")]
protected string GetHexString(Byte[] input)
{
if (input == null || input.Length < 1) return string.Empty;
System.Text.StringBuilder sb = new System.Text.StringBuilder();
foreach (byte b in input)
sb.Append(" " + b.ToString("X2"));
return sb.ToString();
}
/// <summary>
/// 현재 시스템이 x64 인지 확인합니다.
/// </summary>
[Description("")]
protected Boolean isX64
{
get
{
if (IntPtr.Size == 8) return true;
else return false;
}
}
/// <summary>
/// 초기화가 되어잇는지 체크합니다.
/// </summary>
[Description("")]
public bool IsInit
{
get
{
if (!IsOpen() || !this._isInit) return false;
else return true;
}
}
/// <summary>
/// 해당 버퍼가 NAK 응답인지 체크합니다.
/// </summary>
/// <param name="buffer"></param>
/// <returns></returns>
[Description("")]
protected Boolean isNak(byte[] buffer)
{
if (buffer[0] == 0x15)
{
string hexString = GetHexString(buffer);
RaiseMessage(true, "NAK Response : " + hexString);
return true;
}
return false;
}
public bool IsOpen()
{
if (_device == null) return false;
return _device.IsOpen;
}
protected void ClearBuffer(Boolean ClearDeviceBuffer=false)
{
_dlc = 0;
_bDlc = false;
_bStx = false;
_CommandCode = 0x00;
if (ClearDeviceBuffer)
{
this._device.DiscardInBuffer();
this._device.DiscardOutBuffer();
}
}
/// <summary>
/// io모니터창을 표시합니다.
/// </summary>
[Description("")]
public void ShowIOMonitor()
{
fIOMonitor f = new fIOMonitor(this);
f.Show();
}
#region "html generate"
private string getHtmlHeader()
{
return "<html>" +
"<head>" +
"<script src=\"https://rawgit.com/google/code-prettify/master/loader/run_prettify.js?autoload=true&amp;skin=sunburst&amp;lang=css\" defer></script>" +
"<link rel=\"stylesheet\" href=\"styles.css\">" +
"</head>" +
"<body>";
}
private string getHtmlTail()
{
return "</body></html>";
}
private string getTableHeadStr()
{
return "<table> <thead> <tr> <td>Type</td> <td>Name</td> <td>Return</td> <td>Description</td> </tr> </thead> <tbody>";
}
private string getTableHead()
{
return "<table> <thead> <tr> <td>Type</td> <td>Name</td><td>Description</td> </tr> </thead> <tbody>";
}
private string getTableHeadEnum()
{
return "<table> <thead> <tr> <td>Return</td> <td>Name</td> <td>Description</td> </tr> </thead> <tbody>";
}
private string getTableTail()
{
return "</tbody></table>";
}
private string findReturnType(string fieldname)
{
if (fieldname.IndexOf('+') >= 0)
{
return fieldname.Split('+')[1];
}
else return fieldname;
}
private string getMethodReturnType(Type source, MemberInfo member)
{
switch (member.MemberType)
{
case MemberTypes.Method:
var met = source.GetMethod(member.Name);
return source.GetMethod(member.Name).ReturnType.ToString().Substring(7);
case MemberTypes.Property:
var pt = source.GetProperty(member.Name);
if (pt != null)
return pt.PropertyType.FullName.Substring(7);
break;
case MemberTypes.Field:
var fd = source.GetField(member.Name);
string fieldname = fd.FieldType.FullName.Substring(7);
return findReturnType(fieldname);
}
return "";
}
/// <summary>
/// HTML 메뉴얼작성용 코드를 생성합니다.(0==command,1==enum,2==structure)
/// </summary>
public string MakeHTML(byte type = 0)
{
System.Text.StringBuilder sb = new StringBuilder();
sb.AppendLine(getHtmlHeader());
if (type == 2)
{
var typeSmsg = typeof(sRecvMessage);
sb.AppendLine("<h4 class=\"structure\">[ " + typeSmsg.Name + " ]</h4>");
sb.AppendLine(getTableHeadStr());
foreach (var member in typeSmsg.GetMembers())
{
if (member.Name.StartsWith("get_") || member.Name.StartsWith("set_") ||
member.Name.StartsWith("Equals") || member.Name.StartsWith("GetHashCode") ||
member.Name.StartsWith("GetType")) continue;
sb.AppendLine("<tr>");
sb.AppendLine(" <td>" + member.MemberType.ToString() + "</td>");
sb.AppendLine(" <td class=\"tleft\">" + member.Name + "</td>");
sb.AppendLine(" <td>" + getMethodReturnType(typeSmsg, member) + "</td>");
sb.AppendLine(" <td class=\"tleft\">" + member.Name + "</td>");
sb.AppendLine("</tr>");
}
sb.AppendLine(getTableTail());
}
else if (type == 1)
{
//enum list
var typeeIO = typeof(eIOPINDIR);
sb.AppendLine("<h4 class=\"enum\">[ " + typeeIO.Name + " ]</h4>");
sb.AppendLine(getTableHeadEnum());
foreach (var member in typeeIO.GetFields())
{
if (member.Name.StartsWith("get_") || member.Name.StartsWith("set_") ||
member.Name.StartsWith("Equals") || member.Name.StartsWith("GetHashCode") ||
member.Name.StartsWith("GetType") || member.Name.EndsWith("__")) continue;
sb.AppendLine("<tr>");
sb.AppendLine(" <td>Byte</td>");
sb.AppendLine(" <td class=\"tleft\">" + member.Name + "</td>");
sb.AppendLine(" <td class=\"tleft\">" + member.Name + "</td>");
sb.AppendLine("</tr>");
}
sb.AppendLine(getTableTail());
typeeIO = typeof(eErrorCode);
sb.AppendLine("<h4 class=\"enum\">[ " + typeeIO.Name + " ]</h4>");
sb.AppendLine(getTableHeadEnum());
foreach (var member in typeeIO.GetFields())
{
if (member.Name.StartsWith("get_") || member.Name.StartsWith("set_") ||
member.Name.StartsWith("Equals") || member.Name.StartsWith("GetHashCode") ||
member.Name.StartsWith("GetType") || member.Name.EndsWith("__")) continue;
sb.AppendLine("<tr>");
sb.AppendLine(" <td>Byte</td>");
sb.AppendLine(" <td class=\"tleft\">" + member.Name + "</td>");
sb.AppendLine(" <td class=\"tleft\">" + member.Name + "</td>");
sb.AppendLine("</tr>");
}
sb.AppendLine(getTableTail());
typeeIO = typeof(eOpCode);
sb.AppendLine("<h4 class=\"enum\">[ " + typeeIO.Name + " ]</h4>");
sb.AppendLine(getTableHeadEnum());
foreach (var member in typeeIO.GetFields())
{
if (member.Name.StartsWith("get_") || member.Name.StartsWith("set_") ||
member.Name.StartsWith("Equals") || member.Name.StartsWith("GetHashCode") ||
member.Name.StartsWith("GetType") || member.Name.EndsWith("__")) continue;
sb.AppendLine("<tr>");
sb.AppendLine(" <td>Byte</td>");
sb.AppendLine(" <td class=\"tleft\">" + member.Name + "</td>");
sb.AppendLine(" <td class=\"tleft\">" + member.Name + "</td>");
sb.AppendLine("</tr>");
}
sb.AppendLine(getTableTail());
}
else
{
//main
sb.AppendLine("<h4 class=\"method\">[ Methods ]</h4>");
sb.AppendLine(getTableHead());
foreach (var member in GetType().GetMethods())
{
if (member.Name.StartsWith("get_") || member.Name.StartsWith("set_") ||
member.Name.StartsWith("Equals") || member.Name.StartsWith("GetHashCode") ||
member.Name.StartsWith("GetType") || member.Name.StartsWith("add_") ||
member.Name.StartsWith("remove_")) continue;
sb.AppendLine("<tr>");
sb.AppendLine(" <td>" + findReturnType(member.ReturnType.ToString().Substring(7)) + "</td>");
sb.AppendLine(" <td class=\"tleft\">" + member.Name + "</td>");
sb.AppendLine(" <td class=\"tleft\">" + member.Name + "</td>");
sb.AppendLine("</tr>");
}
sb.AppendLine(getTableTail());
sb.AppendLine("<h4 class=\"method\">[ Properties ]</h4>");
sb.AppendLine(getTableHead());
foreach (var member in GetType().GetProperties())
{
if (member.Name.StartsWith("get_") || member.Name.StartsWith("set_") ||
member.Name.StartsWith("Equals") || member.Name.StartsWith("GetHashCode") ||
member.Name.StartsWith("GetType") || member.Name.StartsWith("add_") ||
member.Name.StartsWith("remove_")) continue;
sb.AppendLine("<tr>");
sb.AppendLine(" <td>" + findReturnType(member.PropertyType.FullName.Substring(7)) + "</td>");
sb.AppendLine(" <td class=\"tleft\">" + member.Name + "</td>");
sb.AppendLine(" <td class=\"tleft\">" + member.Name + "</td>");
sb.AppendLine("</tr>");
}
sb.AppendLine(getTableTail());
sb.AppendLine("<h4 class=\"method\">[ Events ]</h4>");
sb.AppendLine(getTableHead());
foreach (var member in GetType().GetEvents())
{
if (member.Name.StartsWith("get_") || member.Name.StartsWith("set_") ||
member.Name.StartsWith("Equals") || member.Name.StartsWith("GetHashCode") ||
member.Name.StartsWith("GetType") || member.Name.StartsWith("add_") ||
member.Name.StartsWith("remove_")) continue;
sb.AppendLine("<tr>");
sb.AppendLine(" <td>" + "" + "</td>");
sb.AppendLine(" <td class=\"tleft\">" + member.Name + "</td>");
sb.AppendLine(" <td class=\"tleft\">" + member.Name + "</td>");
sb.AppendLine("</tr>");
}
sb.AppendLine(getTableTail());
sb.AppendLine("<h4 class=\"method\">[ Fields ]</h4>");
sb.AppendLine(getTableHead());
foreach (var member in GetType().GetFields())
{
if (member.Name.StartsWith("get_") || member.Name.StartsWith("set_") ||
member.Name.StartsWith("Equals") || member.Name.StartsWith("GetHashCode") ||
member.Name.StartsWith("GetType") || member.Name.StartsWith("add_") ||
member.Name.StartsWith("remove_")) continue;
sb.AppendLine("<tr>");
sb.AppendLine(" <td>" + findReturnType(member.FieldType.FullName.Substring(7)) + "</td>");
sb.AppendLine(" <td class=\"tleft\">" + member.Name + "</td>");
sb.AppendLine(" <td class=\"tleft\">" + member.Name + "</td>");
sb.AppendLine("</tr>");
}
sb.AppendLine(getTableTail());
}
sb.AppendLine(getHtmlTail());
return sb.ToString();
}
#endregion
}
}

View File

@@ -0,0 +1,213 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.ComponentModel;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Design;
using System.Reflection;
using System.Runtime;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
//for tcp,udp
using System.Net.Sockets;
using System.Net;
namespace arDev
{
public partial class MasterK
{
protected Boolean Send(byte[] packet)
{
try
{
_device.DiscardInBuffer();
System.Threading.Thread.Sleep(1);
_device.DiscardOutBuffer();
System.Threading.Thread.Sleep(1);
_device.Write(packet, 0, packet.Length);
char_tmo = 0;
return true;
}
catch (Exception ex)
{
RaiseMessage(true, "Device Send Error : " + ex.Message);
return false;
}
}
protected Boolean Write(byte[] packet)
{
bSyncRecvOK = false;
errorMessage = string.Empty;
lastSendTime = DateTime.Now;
lastSendMessage = Parse_SendBuffer(packet);
Boolean retval = Send(packet);
if (!retval) RaiseMessage(true, "Tx Error : " + System.Text.Encoding.Default.GetString(packet));
else RaiseDataMessage(eMsgType.Tx, packet);
return retval;
}
public byte[] UserWrite(string command)
{
_mre.Reset();
var buffer = WriteSync(command);
_mre.Set();
return buffer;
}
protected byte[] WriteSync(string command)
{
var bytes = System.Text.Encoding.Default.GetBytes(command);
if (command[0] == (char)wSTX)
{
return WriteSync(bytes);
}
else
{
List<byte> packet = new List<byte>();
packet.Add(wSTX);
packet.AddRange(bytes);
packet.Add(wETX);
return WriteSync(packet.ToArray());
}
}
protected int interframe_delay;
System.Diagnostics.Stopwatch sw_ch;
long char_tmo;
string savefil = string.Empty;
// Int64 writeCnt = 0;
protected byte[] WriteSync(byte[] command)
{
//writeCnt += 1;
//RaiseMessage(false, ">> WriteSync Enter " + writeCnt.ToString());
if (savefil == "")
{
savefil = Environment.CurrentDirectory + "\rxBuffer.txt";
}
// if (!mre.WaitOne(500))
// {
// errorMessage = "WaitOne error 500ms";
// return null;
// }
//// RaiseMessage(false, "write data sync");
// mre.Reset();
//Boolean isComplete = false;
Boolean isTimeOut = false;
errorMessage = "Wait Data #2";
LastRecvMessage.Clear();
List<byte> _buffer = new List<byte>();
wat.Restart();
System.Threading.Thread.Sleep(interframe_delay);
//send data
if (!Write(command))
{
errorMessage = "sync Buffer is null(1)";
//mre.Set();
//RaiseMessage(false, "<< WriteSync Out " + writeCnt.ToString());
return null;
}
bool done = false;
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
int rcv ;
long tmo = 0;
do
{
int buffercnt = 0;
try
{
buffercnt = _device.BytesToRead;
}
catch (Exception ex)
{
RaiseMessage(true, ex.Message);
}
if (buffercnt > 0)
{
try
{
rcv = _device.ReadByte();
// System.IO.File.WriteAllBytes(savefil, new byte[] { (byte)rcv });
RaiseDataMessage(eMsgType.RxRaw, new byte[(byte)rcv]);
if (rcv == 0x06 || rcv == 0x015)
{
_buffer.Clear();
_buffer.Add((byte)rcv);
//isComplete = false;
}
else if (rcv == 0x03) //endtext
{
//모두 수신한경우이다.
_buffer.Add((byte)rcv);
//isComplete = true;
done = true;
break;
}
else
{
_buffer.Add((byte)rcv);
}
}
catch {
}
}
tmo = sw.ElapsedMilliseconds;
} while ((!done) && (_device.ReadTimeout > tmo));
sw_ch.Stop();
sw.Stop();
if (tmo >= _device.ReadTimeout)
{
errorMessage = string.Format("Writesync TimeOut({0})", _device.ReadTimeout);
isTimeOut = true;
}
byte[] Dummy = new byte[_buffer.Count];
_buffer.CopyTo(Dummy);
// mre.Set();
if (isTimeOut)
{
RaiseMessage(true, errorMessage);
//RaiseMessage(false, "<< WriteSync Out " + writeCnt.ToString());
return null;
}
else
{
RaiseDataMessage(eMsgType.Rx, Dummy);
var frame = Parse_RecvBuffer(Dummy);
if (frame.Buffer == null)
{
errorMessage = "sync buffer is null(2)";
RaiseMessage(true, errorMessage);
// RaiseMessage(false, "<< WriteSync Out " + writeCnt.ToString());
return null;
}
else
{
// RaiseMessage(false, "<< WriteSync Out " + writeCnt.ToString());
return frame.Buffer;
}
}
}
}
}

View File

@@ -0,0 +1,100 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{E0133085-E5F9-4275-9DB8-F8F20EF8561F}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>arDev</RootNamespace>
<AssemblyName>arMasterK</AssemblyName>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\..\DLL\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup>
<StartupObject />
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Util.cs" />
<Compile Include="Parser.cs" />
<Compile Include="EventArgs.cs" />
<Compile Include="EnumAStruct.cs" />
<Compile Include="fIOMonitor.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="fIOMonitor.Designer.cs">
<DependentUpon>fIOMonitor.cs</DependentUpon>
</Compile>
<Compile Include="Write.cs" />
<Compile Include="MasterK.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="fIOMonitor.resx">
<DependentUpon>fIOMonitor.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<Content Include="History.txt" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View File

@@ -0,0 +1,144 @@
namespace arDev
{
partial class fIOMonitor
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.tblOutput = new System.Windows.Forms.TableLayoutPanel();
this.tblINput = new System.Windows.Forms.TableLayoutPanel();
this.tableLayoutPanel1.SuspendLayout();
this.SuspendLayout();
//
// tableLayoutPanel1
//
this.tableLayoutPanel1.ColumnCount = 2;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel1.Controls.Add(this.label1, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.label2, 1, 0);
this.tableLayoutPanel1.Controls.Add(this.tblOutput, 1, 1);
this.tableLayoutPanel1.Controls.Add(this.tblINput, 0, 1);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 2;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 36F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(582, 480);
this.tableLayoutPanel1.TabIndex = 0;
//
// label1
//
this.label1.Dock = System.Windows.Forms.DockStyle.Fill;
this.label1.Location = new System.Drawing.Point(3, 0);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(285, 36);
this.label1.TabIndex = 0;
this.label1.Text = "INPUT";
this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// label2
//
this.label2.Dock = System.Windows.Forms.DockStyle.Fill;
this.label2.Location = new System.Drawing.Point(294, 0);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(285, 36);
this.label2.TabIndex = 0;
this.label2.Text = "OUTPUT";
this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// tblOutput
//
this.tblOutput.ColumnCount = 4;
this.tblOutput.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));
this.tblOutput.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));
this.tblOutput.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));
this.tblOutput.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));
this.tblOutput.Dock = System.Windows.Forms.DockStyle.Fill;
this.tblOutput.Location = new System.Drawing.Point(294, 39);
this.tblOutput.Name = "tblOutput";
this.tblOutput.RowCount = 8;
this.tblOutput.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 12.5F));
this.tblOutput.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 12.5F));
this.tblOutput.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 12.5F));
this.tblOutput.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 12.5F));
this.tblOutput.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 12.5F));
this.tblOutput.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 12.5F));
this.tblOutput.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 12.5F));
this.tblOutput.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 12.5F));
this.tblOutput.Size = new System.Drawing.Size(285, 438);
this.tblOutput.TabIndex = 1;
//
// tblINput
//
this.tblINput.ColumnCount = 4;
this.tblINput.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));
this.tblINput.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));
this.tblINput.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));
this.tblINput.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));
this.tblINput.Dock = System.Windows.Forms.DockStyle.Fill;
this.tblINput.Location = new System.Drawing.Point(3, 39);
this.tblINput.Name = "tblINput";
this.tblINput.RowCount = 8;
this.tblINput.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 12.5F));
this.tblINput.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 12.5F));
this.tblINput.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 12.5F));
this.tblINput.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 12.5F));
this.tblINput.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 12.5F));
this.tblINput.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 12.5F));
this.tblINput.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 12.5F));
this.tblINput.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 12.5F));
this.tblINput.Size = new System.Drawing.Size(285, 438);
this.tblINput.TabIndex = 1;
//
// fIOMonitor
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(582, 480);
this.Controls.Add(this.tableLayoutPanel1);
this.Name = "fIOMonitor";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "fIOMonitor";
this.Load += new System.EventHandler(this.fIOMonitor_Load);
this.tableLayoutPanel1.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.TableLayoutPanel tblOutput;
private System.Windows.Forms.TableLayoutPanel tblINput;
}
}

View File

@@ -0,0 +1,77 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace arDev
{
public partial class fIOMonitor : Form
{
MasterK dio;
public fIOMonitor(MasterK _device)
{
InitializeComponent();
dio = _device;
}
Button[] btInput;
Button[] btOutput;
private void fIOMonitor_Load(object sender, EventArgs e)
{
btInput = new Button[dio.DICount];
btOutput = new Button[dio.DOCount];
for(int i = 0; i< dio.DICount;i++)
{
Button lb = new Button();
lb.Text = string.Format("{0}",i+1);
lb.Tag = i;
lb.Click += lb_ClickI;
lb.Dock = DockStyle.Fill;
lb.BackColor = dio.INPUT(i) ? Color.Lime : Color.White;
btInput[i] = lb;
this.tblINput.Controls.Add(lb);
}
for (int i = 0; i < dio.DOCount; i++)
{
Button lb = new Button();
lb.Text = string.Format("{0}", i + 1);
lb.Tag = i;
lb.Click += lb_ClickO;
lb.Dock = DockStyle.Fill;
lb.BackColor = dio.OUTPUT(i) ? Color.Lime : Color.White;
btOutput[i] = lb;
this.tblOutput.Controls.Add(lb);
}
dio.IOValueChanged += dio_IOValueChanged;
}
void dio_IOValueChanged(object sender, MasterK.IOValueEventArgs e)
{
if(e.Direction == MasterK.eIOPINDIR.INPUT)
{
btInput[e.ArrIDX].BackColor = e.NewValue ? Color.Lime : Color.White;
}
else
{
btOutput[e.ArrIDX].BackColor = e.NewValue ? Color.Lime : Color.White;
}
}
void lb_ClickI(object sender, EventArgs e)
{
var bt = sender as Button;
//MessageBox.Show("input click : " + bt.Tag.ToString());
}
void lb_ClickO(object sender, EventArgs e)
{
var bt = sender as Button;
var idx = int.Parse(bt.Tag.ToString());
dio.SetToggle(idx);
}
}
}

View File

@@ -0,0 +1,120 @@
<?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
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<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
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
mimetype set.
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
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
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
: 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
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -180,7 +180,6 @@ namespace vmsnet
//
this.BindingNavigatorPositionItem.AccessibleName = "위치";
this.BindingNavigatorPositionItem.AutoSize = false;
this.BindingNavigatorPositionItem.Font = new System.Drawing.Font("맑은 고딕", 9F);
this.BindingNavigatorPositionItem.Name = "BindingNavigatorPositionItem";
this.BindingNavigatorPositionItem.Size = new System.Drawing.Size(50, 23);
this.BindingNavigatorPositionItem.Text = "0";
@@ -223,7 +222,6 @@ namespace vmsnet
//
this.tb_search.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(192)))));
this.tb_search.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.tb_search.Font = new System.Drawing.Font("맑은 고딕", 9F);
this.tb_search.Name = "tb_search";
this.tb_search.Size = new System.Drawing.Size(100, 38);
this.tb_search.KeyUp += new System.Windows.Forms.KeyEventHandler(this.ToolStripTextBox1_KeyUp);

View File

@@ -191,7 +191,9 @@ namespace vmsnet
lv.SubItems.Add(item.MAXVOLT.ToString());
lv.SubItems.Add(item.MINVOLT.ToString());
lv.SubItems.Add(item.ATYPESTR);
lv.SubItems.Add(item.REMARK);
var remark = item.REMARK;
if (remark.isEmpty()) remark = item.AM2;
lv.SubItems.Add(remark);
switch (item.RTYPESTR.ToUpper())
{

View File

@@ -361,7 +361,10 @@ namespace vmsnet
var sttdate = PUB.TREND.graph_time_start;
var enddate = PUB.TREND.graph_time_end;
//각 파일 그룹별 대상 파일을 수집합니다.
Parallel.For(0, this.ChartListData.Length - 1, i =>
/* 작성자: 이재웅, 작성일: 2025-06-23, 내용: 0 ~ this.ChartListData.Length - 1 */
// Parallel.For(시작값, 종료값, ...) 형태라고 했을 때, 루프 진행은 '시작값 ~ 종료값-1' 실행된다.
// 'this.ChartListData.Length - 1' -> 'this.ChartListData.Length' 변경
Parallel.For(0, this.ChartListData.Length, i =>
{
var DataFileName = $"DATAB{i + 1}";
if (ChartListData[i].ChannelList.Any() == true) this.ChartListData[i].FileList = PUB.DB.GetfileS(DataFileName, sttdate, enddate);
@@ -496,6 +499,7 @@ namespace vmsnet
//대상파일의 자료를 읽어와서 차트데이터를 구축한다.
RecordCount = 0;
// Parallel.For(시작값, 종료값, ...) 형태라고 했을 때, 루프 진행은 '시작값 ~ 종료값-1' 실행된다.
Parallel.For(0, this.ChartListData.Length, i =>
{
ParseChDataToChart(i, ChartListData[i], DTCHLIST);

View File

@@ -27,6 +27,10 @@ namespace vmsnet
DAQDisconnected,
DAQTryConnect,
RefreshChart,
/// <summary>
/// 알람설정에서 확인을 누르면 호출됩니다.
/// </summary>
AlarmValueReset,
}
enum ConnState
{

View File

@@ -13,13 +13,13 @@ namespace vmsnet
/// </summary>
public byte SlaveID { get; set; } = 1; // Slave No
public DigitalIndicator(byte slaveID = 0) : base("", new RtuConfigure { BaudRate = 9600, DataBits = 8, StopBits = System.IO.Ports.StopBits.One, Parity = System.IO.Ports.Parity.None })
public DigitalIndicator(byte slaveID = 1) : base("", new RtuConfigure { BaudRate = 9600, DataBits = 8, StopBits = System.IO.Ports.StopBits.One, Parity = System.IO.Ports.Parity.None })
{
SlaveID = slaveID;
}
public DigitalIndicator(string comPort, RtuConfigure configure, byte slaveId = 0) : base(comPort, configure)
public DigitalIndicator(string comPort, RtuConfigure configure, byte slaveId = 1) : base(comPort, configure)
{
SlaveID = slaveId;
}
@@ -45,13 +45,6 @@ namespace vmsnet
//return WriteValue(buffer);
}
UInt16[] splitI32(Int32 value)
{
var hValue = (UInt16)(value >> 16); // 상위 16 Bit
var lValue = (UInt16)(value & 0xFFFF); // 하위 16 Bit
return new ushort[] { hValue, lValue };
}
public bool WriteValue(UInt16[] values)
{
if (IsOpen == false)
@@ -77,5 +70,11 @@ namespace vmsnet
}
}
UInt16[] splitI32(Int32 value)
{
var hValue = (UInt16)(value >> 16); // 상위 16 Bit
var lValue = (UInt16)(value & 0xFFFF); // 하위 16 Bit
return new ushort[] { hValue, lValue };
}
}
}

View File

@@ -125,16 +125,16 @@ namespace vmsnet
this.lbPLC,
this.lbINDI,
this.lb_status});
this.StatusStrip1.Location = new System.Drawing.Point(0, 747);
this.StatusStrip1.Location = new System.Drawing.Point(0, 757);
this.StatusStrip1.Name = "StatusStrip1";
this.StatusStrip1.Size = new System.Drawing.Size(1561, 32);
this.StatusStrip1.Size = new System.Drawing.Size(1561, 22);
this.StatusStrip1.TabIndex = 1;
this.StatusStrip1.Text = "StatusStrip1";
//
// lb_diskfree
//
this.lb_diskfree.Name = "lb_diskfree";
this.lb_diskfree.Size = new System.Drawing.Size(122, 25);
this.lb_diskfree.Size = new System.Drawing.Size(77, 17);
this.lb_diskfree.Text = "<FreeSpace>";
//
// lb_chcount
@@ -142,21 +142,21 @@ namespace vmsnet
this.lb_chcount.Font = new System.Drawing.Font("맑은 고딕", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129)));
this.lb_chcount.ForeColor = System.Drawing.Color.Navy;
this.lb_chcount.Name = "lb_chcount";
this.lb_chcount.Size = new System.Drawing.Size(110, 25);
this.lb_chcount.Size = new System.Drawing.Size(73, 17);
this.lb_chcount.Text = "<장치정보>";
//
// lb_msec
//
this.lb_msec.Font = new System.Drawing.Font("맑은 고딕", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129)));
this.lb_msec.Name = "lb_msec";
this.lb_msec.Size = new System.Drawing.Size(86, 25);
this.lb_msec.Size = new System.Drawing.Size(58, 17);
this.lb_msec.Text = "<MSEC>";
//
// lb_Saved
//
this.lb_Saved.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
this.lb_Saved.Name = "lb_Saved";
this.lb_Saved.Size = new System.Drawing.Size(121, 25);
this.lb_Saved.Size = new System.Drawing.Size(79, 17);
this.lb_Saved.Text = "<LASTSAVE>";
this.lb_Saved.Click += new System.EventHandler(this.lb_Saved_Click);
//
@@ -164,7 +164,7 @@ namespace vmsnet
//
this.lb_alarm.ForeColor = System.Drawing.Color.Silver;
this.lb_alarm.Name = "lb_alarm";
this.lb_alarm.Size = new System.Drawing.Size(30, 25);
this.lb_alarm.Size = new System.Drawing.Size(19, 17);
this.lb_alarm.Text = "●";
//
// lbMonitor
@@ -172,7 +172,7 @@ namespace vmsnet
this.lbMonitor.Font = new System.Drawing.Font("맑은 고딕", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129)));
this.lbMonitor.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(64)))), ((int)(((byte)(0)))));
this.lbMonitor.Name = "lbMonitor";
this.lbMonitor.Size = new System.Drawing.Size(125, 25);
this.lbMonitor.Size = new System.Drawing.Size(84, 17);
this.lbMonitor.Text = "<MONITOR>";
//
// lbPLC
@@ -180,7 +180,7 @@ namespace vmsnet
this.lbPLC.Font = new System.Drawing.Font("맑은 고딕", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129)));
this.lbPLC.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(64)))), ((int)(((byte)(0)))));
this.lbPLC.Name = "lbPLC";
this.lbPLC.Size = new System.Drawing.Size(69, 25);
this.lbPLC.Size = new System.Drawing.Size(46, 17);
this.lbPLC.Text = "<PLC>";
//
// lbINDI
@@ -188,7 +188,7 @@ namespace vmsnet
this.lbINDI.Font = new System.Drawing.Font("맑은 고딕", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129)));
this.lbINDI.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(64)))), ((int)(((byte)(0)))));
this.lbINDI.Name = "lbINDI";
this.lbINDI.Size = new System.Drawing.Size(137, 25);
this.lbINDI.Size = new System.Drawing.Size(92, 17);
this.lbINDI.Text = "<INDICATOR>";
//
// lb_status
@@ -196,7 +196,7 @@ namespace vmsnet
this.lb_status.Font = new System.Drawing.Font("맑은 고딕", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129)));
this.lb_status.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(64)))), ((int)(((byte)(0)))));
this.lb_status.Name = "lb_status";
this.lb_status.Size = new System.Drawing.Size(104, 25);
this.lb_status.Size = new System.Drawing.Size(70, 17);
this.lb_status.Text = "<STATUS>";
//
// ToolStrip1
@@ -251,7 +251,7 @@ namespace vmsnet
this.btMonitorOn.Image = ((System.Drawing.Image)(resources.GetObject("btMonitorOn.Image")));
this.btMonitorOn.ImageTransparentColor = System.Drawing.Color.Magenta;
this.btMonitorOn.Name = "btMonitorOn";
this.btMonitorOn.Size = new System.Drawing.Size(168, 39);
this.btMonitorOn.Size = new System.Drawing.Size(120, 41);
this.btMonitorOn.Text = "Monitor On/Off";
this.btMonitorOn.Click += new System.EventHandler(this.toolStripButton3_Click_1);
//
@@ -260,7 +260,7 @@ namespace vmsnet
this.bt_fullscreen.Image = ((System.Drawing.Image)(resources.GetObject("bt_fullscreen.Image")));
this.bt_fullscreen.ImageTransparentColor = System.Drawing.Color.Magenta;
this.bt_fullscreen.Name = "bt_fullscreen";
this.bt_fullscreen.Size = new System.Drawing.Size(112, 39);
this.bt_fullscreen.Size = new System.Drawing.Size(83, 41);
this.bt_fullscreen.Text = "개별보기";
this.bt_fullscreen.Click += new System.EventHandler(this.bt_fullscreen_Click);
//
@@ -270,7 +270,7 @@ namespace vmsnet
this.bt_tviewr.Image = ((System.Drawing.Image)(resources.GetObject("bt_tviewr.Image")));
this.bt_tviewr.ImageTransparentColor = System.Drawing.Color.Magenta;
this.bt_tviewr.Name = "bt_tviewr";
this.bt_tviewr.Size = new System.Drawing.Size(177, 39);
this.bt_tviewr.Size = new System.Drawing.Size(128, 41);
this.bt_tviewr.Text = "실시간트렌드(F1)";
this.bt_tviewr.Click += new System.EventHandler(this.ToolStripButton3_Click);
//
@@ -280,7 +280,7 @@ namespace vmsnet
this.bt_tview.Image = ((System.Drawing.Image)(resources.GetObject("bt_tview.Image")));
this.bt_tview.ImageTransparentColor = System.Drawing.Color.Magenta;
this.bt_tview.Name = "bt_tview";
this.bt_tview.Size = new System.Drawing.Size(159, 39);
this.bt_tview.Size = new System.Drawing.Size(116, 41);
this.bt_tview.Text = "과거트렌드(F1)";
this.bt_tview.Click += new System.EventHandler(this.ToolStripButton1_Click_2);
//
@@ -290,7 +290,7 @@ namespace vmsnet
this.bt_alamhistory.Image = ((System.Drawing.Image)(resources.GetObject("bt_alamhistory.Image")));
this.bt_alamhistory.ImageTransparentColor = System.Drawing.Color.Magenta;
this.bt_alamhistory.Name = "bt_alamhistory";
this.bt_alamhistory.Size = new System.Drawing.Size(141, 39);
this.bt_alamhistory.Size = new System.Drawing.Size(104, 41);
this.bt_alamhistory.Text = "알람목록(F3)";
this.bt_alamhistory.Click += new System.EventHandler(this.ToolStripButton2_Click_1);
//
@@ -300,7 +300,7 @@ namespace vmsnet
this.bt_alamsetup.Image = ((System.Drawing.Image)(resources.GetObject("bt_alamsetup.Image")));
this.bt_alamsetup.ImageTransparentColor = System.Drawing.Color.Magenta;
this.bt_alamsetup.Name = "bt_alamsetup";
this.bt_alamsetup.Size = new System.Drawing.Size(141, 39);
this.bt_alamsetup.Size = new System.Drawing.Size(104, 41);
this.bt_alamsetup.Text = "알람설정(F4)";
this.bt_alamsetup.Click += new System.EventHandler(this.ToolStripButton1_Click_4);
//
@@ -310,7 +310,7 @@ namespace vmsnet
this.bt_save.Image = ((System.Drawing.Image)(resources.GetObject("bt_save.Image")));
this.bt_save.ImageTransparentColor = System.Drawing.Color.Magenta;
this.bt_save.Name = "bt_save";
this.bt_save.Size = new System.Drawing.Size(105, 39);
this.bt_save.Size = new System.Drawing.Size(80, 41);
this.bt_save.Text = "저장(F5)";
this.bt_save.Click += new System.EventHandler(this.bt_save_Click);
//
@@ -319,7 +319,7 @@ namespace vmsnet
this.ToolStripButton2.Image = ((System.Drawing.Image)(resources.GetObject("ToolStripButton2.Image")));
this.ToolStripButton2.ImageTransparentColor = System.Drawing.Color.Magenta;
this.ToolStripButton2.Name = "ToolStripButton2";
this.ToolStripButton2.Size = new System.Drawing.Size(141, 39);
this.ToolStripButton2.Size = new System.Drawing.Size(104, 41);
this.ToolStripButton2.Text = "소리끄기(F2)";
this.ToolStripButton2.Click += new System.EventHandler(this.ToolStripButton2_Click);
//
@@ -329,7 +329,7 @@ namespace vmsnet
this.bt_print.Image = ((System.Drawing.Image)(resources.GetObject("bt_print.Image")));
this.bt_print.ImageTransparentColor = System.Drawing.Color.Magenta;
this.bt_print.Name = "bt_print";
this.bt_print.Size = new System.Drawing.Size(105, 39);
this.bt_print.Size = new System.Drawing.Size(80, 41);
this.bt_print.Text = "인쇄(F9)";
this.bt_print.Visible = false;
this.bt_print.Click += new System.EventHandler(this.bt_print_Click);
@@ -345,7 +345,7 @@ namespace vmsnet
this.bt_show2ndwindow.Image = ((System.Drawing.Image)(resources.GetObject("bt_show2ndwindow.Image")));
this.bt_show2ndwindow.ImageTransparentColor = System.Drawing.Color.Magenta;
this.bt_show2ndwindow.Name = "bt_show2ndwindow";
this.bt_show2ndwindow.Size = new System.Drawing.Size(94, 39);
this.bt_show2ndwindow.Size = new System.Drawing.Size(71, 41);
this.bt_show2ndwindow.Text = "보조창";
this.bt_show2ndwindow.Visible = false;
this.bt_show2ndwindow.Click += new System.EventHandler(this.bt_show2ndwindow_Click);
@@ -357,7 +357,7 @@ namespace vmsnet
this.bt_config.Image = ((System.Drawing.Image)(resources.GetObject("bt_config.Image")));
this.bt_config.ImageTransparentColor = System.Drawing.Color.Magenta;
this.bt_config.Name = "bt_config";
this.bt_config.Size = new System.Drawing.Size(76, 39);
this.bt_config.Size = new System.Drawing.Size(59, 41);
this.bt_config.Text = "설정";
this.bt_config.Click += new System.EventHandler(this.btConfig_Click);
//
@@ -367,7 +367,7 @@ namespace vmsnet
this.ToolStripButton1.Image = ((System.Drawing.Image)(resources.GetObject("ToolStripButton1.Image")));
this.ToolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta;
this.ToolStripButton1.Name = "ToolStripButton1";
this.ToolStripButton1.Size = new System.Drawing.Size(76, 39);
this.ToolStripButton1.Size = new System.Drawing.Size(59, 41);
this.ToolStripButton1.Text = "정보";
this.ToolStripButton1.Click += new System.EventHandler(this.ToolStripButton1_Click_6);
//
@@ -376,7 +376,7 @@ namespace vmsnet
this.btLog.Image = ((System.Drawing.Image)(resources.GetObject("btLog.Image")));
this.btLog.ImageTransparentColor = System.Drawing.Color.Magenta;
this.btLog.Name = "btLog";
this.btLog.Size = new System.Drawing.Size(112, 29);
this.btLog.Size = new System.Drawing.Size(83, 41);
this.btLog.Text = "운영로그";
this.btLog.Click += new System.EventHandler(this.toolStripButton3_Click_2);
//
@@ -385,7 +385,7 @@ namespace vmsnet
this.toolStripButton3.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton3.Image")));
this.toolStripButton3.ImageTransparentColor = System.Drawing.Color.Magenta;
this.toolStripButton3.Name = "toolStripButton3";
this.toolStripButton3.Size = new System.Drawing.Size(112, 29);
this.toolStripButton3.Size = new System.Drawing.Size(83, 41);
this.toolStripButton3.Text = "저장폴더";
this.toolStripButton3.Click += new System.EventHandler(this.toolStripButton3_Click_3);
//
@@ -434,7 +434,7 @@ namespace vmsnet
this.TableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 35F));
this.TableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.TableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.TableLayoutPanel1.Size = new System.Drawing.Size(1561, 703);
this.TableLayoutPanel1.Size = new System.Drawing.Size(1561, 713);
this.TableLayoutPanel1.TabIndex = 5;
//
// Panel1
@@ -455,7 +455,7 @@ namespace vmsnet
this.cmb_tanks.FormattingEnabled = true;
this.cmb_tanks.Location = new System.Drawing.Point(0, 0);
this.cmb_tanks.Name = "cmb_tanks";
this.cmb_tanks.Size = new System.Drawing.Size(657, 45);
this.cmb_tanks.Size = new System.Drawing.Size(657, 33);
this.cmb_tanks.TabIndex = 5;
this.cmb_tanks.SelectedIndexChanged += new System.EventHandler(this.cmb_group_SelectedIndexChanged);
//
@@ -488,13 +488,13 @@ namespace vmsnet
this.cmbt_x_gap_21600,
this.cmbt_x_gap_43200});
this.menus_xgap.Name = "menus_xgap";
this.menus_xgap.Size = new System.Drawing.Size(198, 32);
this.menus_xgap.Size = new System.Drawing.Size(150, 22);
this.menus_xgap.Text = "X축 간격";
//
// cmbt_x_gap_5
//
this.cmbt_x_gap_5.Name = "cmbt_x_gap_5";
this.cmbt_x_gap_5.Size = new System.Drawing.Size(170, 34);
this.cmbt_x_gap_5.Size = new System.Drawing.Size(112, 22);
this.cmbt_x_gap_5.Tag = "5";
this.cmbt_x_gap_5.Text = "5초";
//
@@ -504,7 +504,7 @@ namespace vmsnet
this.cmbt_x_gap_10.CheckOnClick = true;
this.cmbt_x_gap_10.CheckState = System.Windows.Forms.CheckState.Checked;
this.cmbt_x_gap_10.Name = "cmbt_x_gap_10";
this.cmbt_x_gap_10.Size = new System.Drawing.Size(170, 34);
this.cmbt_x_gap_10.Size = new System.Drawing.Size(112, 22);
this.cmbt_x_gap_10.Tag = "10";
this.cmbt_x_gap_10.Text = "10초";
//
@@ -512,7 +512,7 @@ namespace vmsnet
//
this.cmbt_x_gap_30.CheckOnClick = true;
this.cmbt_x_gap_30.Name = "cmbt_x_gap_30";
this.cmbt_x_gap_30.Size = new System.Drawing.Size(170, 34);
this.cmbt_x_gap_30.Size = new System.Drawing.Size(112, 22);
this.cmbt_x_gap_30.Tag = "30";
this.cmbt_x_gap_30.Text = "30초";
//
@@ -520,14 +520,14 @@ namespace vmsnet
//
this.cmbt_x_gap_60.CheckOnClick = true;
this.cmbt_x_gap_60.Name = "cmbt_x_gap_60";
this.cmbt_x_gap_60.Size = new System.Drawing.Size(170, 34);
this.cmbt_x_gap_60.Size = new System.Drawing.Size(112, 22);
this.cmbt_x_gap_60.Tag = "60";
this.cmbt_x_gap_60.Text = "1분";
//
// cmbt_x_gap_600
//
this.cmbt_x_gap_600.Name = "cmbt_x_gap_600";
this.cmbt_x_gap_600.Size = new System.Drawing.Size(170, 34);
this.cmbt_x_gap_600.Size = new System.Drawing.Size(112, 22);
this.cmbt_x_gap_600.Tag = "600";
this.cmbt_x_gap_600.Text = "10분";
//
@@ -535,7 +535,7 @@ namespace vmsnet
//
this.cmbt_x_gap_1800.CheckOnClick = true;
this.cmbt_x_gap_1800.Name = "cmbt_x_gap_1800";
this.cmbt_x_gap_1800.Size = new System.Drawing.Size(170, 34);
this.cmbt_x_gap_1800.Size = new System.Drawing.Size(112, 22);
this.cmbt_x_gap_1800.Tag = "1800";
this.cmbt_x_gap_1800.Text = "30분";
//
@@ -543,7 +543,7 @@ namespace vmsnet
//
this.cmbt_x_gap_3600.CheckOnClick = true;
this.cmbt_x_gap_3600.Name = "cmbt_x_gap_3600";
this.cmbt_x_gap_3600.Size = new System.Drawing.Size(170, 34);
this.cmbt_x_gap_3600.Size = new System.Drawing.Size(112, 22);
this.cmbt_x_gap_3600.Tag = "3600";
this.cmbt_x_gap_3600.Text = "1시간";
//
@@ -551,7 +551,7 @@ namespace vmsnet
//
this.cmbt_x_gap_21600.CheckOnClick = true;
this.cmbt_x_gap_21600.Name = "cmbt_x_gap_21600";
this.cmbt_x_gap_21600.Size = new System.Drawing.Size(170, 34);
this.cmbt_x_gap_21600.Size = new System.Drawing.Size(112, 22);
this.cmbt_x_gap_21600.Tag = "21600";
this.cmbt_x_gap_21600.Text = "6시간";
//
@@ -559,7 +559,7 @@ namespace vmsnet
//
this.cmbt_x_gap_43200.CheckOnClick = true;
this.cmbt_x_gap_43200.Name = "cmbt_x_gap_43200";
this.cmbt_x_gap_43200.Size = new System.Drawing.Size(170, 34);
this.cmbt_x_gap_43200.Size = new System.Drawing.Size(112, 22);
this.cmbt_x_gap_43200.Tag = "43200";
this.cmbt_x_gap_43200.Text = "12시간";
//
@@ -571,14 +571,14 @@ namespace vmsnet
this.cmbt_x_21600,
this.cmbt_x_43200});
this.menus_xterm.Name = "menus_xterm";
this.menus_xterm.Size = new System.Drawing.Size(198, 32);
this.menus_xterm.Size = new System.Drawing.Size(150, 22);
this.menus_xterm.Text = "X축 범위";
//
// cmbt_x_1800
//
this.cmbt_x_1800.CheckOnClick = true;
this.cmbt_x_1800.Name = "cmbt_x_1800";
this.cmbt_x_1800.Size = new System.Drawing.Size(170, 34);
this.cmbt_x_1800.Size = new System.Drawing.Size(112, 22);
this.cmbt_x_1800.Tag = "1800";
this.cmbt_x_1800.Text = "30분";
//
@@ -588,7 +588,7 @@ namespace vmsnet
this.cmbt_x_3600.CheckOnClick = true;
this.cmbt_x_3600.CheckState = System.Windows.Forms.CheckState.Checked;
this.cmbt_x_3600.Name = "cmbt_x_3600";
this.cmbt_x_3600.Size = new System.Drawing.Size(170, 34);
this.cmbt_x_3600.Size = new System.Drawing.Size(112, 22);
this.cmbt_x_3600.Tag = "3600";
this.cmbt_x_3600.Text = "1시간";
//
@@ -596,7 +596,7 @@ namespace vmsnet
//
this.cmbt_x_21600.CheckOnClick = true;
this.cmbt_x_21600.Name = "cmbt_x_21600";
this.cmbt_x_21600.Size = new System.Drawing.Size(170, 34);
this.cmbt_x_21600.Size = new System.Drawing.Size(112, 22);
this.cmbt_x_21600.Tag = "21600";
this.cmbt_x_21600.Text = "6시간";
//
@@ -604,7 +604,7 @@ namespace vmsnet
//
this.cmbt_x_43200.CheckOnClick = true;
this.cmbt_x_43200.Name = "cmbt_x_43200";
this.cmbt_x_43200.Size = new System.Drawing.Size(170, 34);
this.cmbt_x_43200.Size = new System.Drawing.Size(112, 22);
this.cmbt_x_43200.Tag = "43200";
this.cmbt_x_43200.Text = "12시간";
//
@@ -618,14 +618,14 @@ namespace vmsnet
this.cmbt_y_2_0,
this.cmbt_y_5_0});
this.menus_ygap.Name = "menus_ygap";
this.menus_ygap.Size = new System.Drawing.Size(198, 32);
this.menus_ygap.Size = new System.Drawing.Size(150, 22);
this.menus_ygap.Text = "Y축 간격";
//
// cmbt_y_0_1
//
this.cmbt_y_0_1.CheckOnClick = true;
this.cmbt_y_0_1.Name = "cmbt_y_0_1";
this.cmbt_y_0_1.Size = new System.Drawing.Size(138, 34);
this.cmbt_y_0_1.Size = new System.Drawing.Size(91, 22);
this.cmbt_y_0_1.Tag = "0.1";
this.cmbt_y_0_1.Text = "0.1";
//
@@ -635,7 +635,7 @@ namespace vmsnet
this.cmbt_y_0_5.CheckOnClick = true;
this.cmbt_y_0_5.CheckState = System.Windows.Forms.CheckState.Checked;
this.cmbt_y_0_5.Name = "cmbt_y_0_5";
this.cmbt_y_0_5.Size = new System.Drawing.Size(138, 34);
this.cmbt_y_0_5.Size = new System.Drawing.Size(91, 22);
this.cmbt_y_0_5.Tag = "0.5";
this.cmbt_y_0_5.Text = "0.5";
//
@@ -643,7 +643,7 @@ namespace vmsnet
//
this.cmbt_y_1_0.CheckOnClick = true;
this.cmbt_y_1_0.Name = "cmbt_y_1_0";
this.cmbt_y_1_0.Size = new System.Drawing.Size(138, 34);
this.cmbt_y_1_0.Size = new System.Drawing.Size(91, 22);
this.cmbt_y_1_0.Tag = "1.0";
this.cmbt_y_1_0.Text = "1.0";
//
@@ -651,7 +651,7 @@ namespace vmsnet
//
this.cmbt_y_1_5.CheckOnClick = true;
this.cmbt_y_1_5.Name = "cmbt_y_1_5";
this.cmbt_y_1_5.Size = new System.Drawing.Size(138, 34);
this.cmbt_y_1_5.Size = new System.Drawing.Size(91, 22);
this.cmbt_y_1_5.Tag = "1.5";
this.cmbt_y_1_5.Text = "1.5";
//
@@ -659,7 +659,7 @@ namespace vmsnet
//
this.cmbt_y_2_0.CheckOnClick = true;
this.cmbt_y_2_0.Name = "cmbt_y_2_0";
this.cmbt_y_2_0.Size = new System.Drawing.Size(138, 34);
this.cmbt_y_2_0.Size = new System.Drawing.Size(91, 22);
this.cmbt_y_2_0.Tag = "2.0";
this.cmbt_y_2_0.Text = "2.0";
//
@@ -667,38 +667,38 @@ namespace vmsnet
//
this.cmbt_y_5_0.CheckOnClick = true;
this.cmbt_y_5_0.Name = "cmbt_y_5_0";
this.cmbt_y_5_0.Size = new System.Drawing.Size(138, 34);
this.cmbt_y_5_0.Size = new System.Drawing.Size(91, 22);
this.cmbt_y_5_0.Tag = "5.0";
this.cmbt_y_5_0.Text = "5.0";
//
// ToolStripMenuItem2
//
this.ToolStripMenuItem2.Name = "ToolStripMenuItem2";
this.ToolStripMenuItem2.Size = new System.Drawing.Size(195, 6);
this.ToolStripMenuItem2.Size = new System.Drawing.Size(147, 6);
//
// menus_winsize
//
this.menus_winsize.Name = "menus_winsize";
this.menus_winsize.Size = new System.Drawing.Size(198, 32);
this.menus_winsize.Size = new System.Drawing.Size(150, 22);
this.menus_winsize.Text = "창 크기";
//
// GraphReSetToolStripMenuItem
//
this.GraphReSetToolStripMenuItem.Name = "GraphReSetToolStripMenuItem";
this.GraphReSetToolStripMenuItem.Size = new System.Drawing.Size(198, 32);
this.GraphReSetToolStripMenuItem.Size = new System.Drawing.Size(150, 22);
this.GraphReSetToolStripMenuItem.Text = "그래프 초기화";
this.GraphReSetToolStripMenuItem.Click += new System.EventHandler(this.GraphReSetToolStripMenuItem_Click);
//
// ToolStripMenuItem3
//
this.ToolStripMenuItem3.Name = "ToolStripMenuItem3";
this.ToolStripMenuItem3.Size = new System.Drawing.Size(195, 6);
this.ToolStripMenuItem3.Size = new System.Drawing.Size(147, 6);
//
// DataPointToolStripMenuItem
//
this.DataPointToolStripMenuItem.CheckOnClick = true;
this.DataPointToolStripMenuItem.Name = "DataPointToolStripMenuItem";
this.DataPointToolStripMenuItem.Size = new System.Drawing.Size(198, 32);
this.DataPointToolStripMenuItem.Size = new System.Drawing.Size(150, 22);
this.DataPointToolStripMenuItem.Text = "Data Point";
this.DataPointToolStripMenuItem.Click += new System.EventHandler(this.DataPointToolStripMenuItem_Click);
//
@@ -707,14 +707,14 @@ namespace vmsnet
this.DebugMsgToolStripMenuItem.CheckOnClick = true;
this.DebugMsgToolStripMenuItem.ForeColor = System.Drawing.Color.Gray;
this.DebugMsgToolStripMenuItem.Name = "DebugMsgToolStripMenuItem";
this.DebugMsgToolStripMenuItem.Size = new System.Drawing.Size(198, 32);
this.DebugMsgToolStripMenuItem.Size = new System.Drawing.Size(150, 22);
this.DebugMsgToolStripMenuItem.Text = "Debug Msg";
this.DebugMsgToolStripMenuItem.Click += new System.EventHandler(this.DebugMsgToolStripMenuItem_Click);
//
// ToolStripMenuItem4
//
this.ToolStripMenuItem4.Name = "ToolStripMenuItem4";
this.ToolStripMenuItem4.Size = new System.Drawing.Size(195, 6);
this.ToolStripMenuItem4.Size = new System.Drawing.Size(147, 6);
//
// cm1
//
@@ -731,7 +731,7 @@ namespace vmsnet
this.DebugMsgToolStripMenuItem,
this.ToolStripMenuItem4});
this.cm1.Name = "ContextMenuStrip1";
this.cm1.Size = new System.Drawing.Size(199, 246);
this.cm1.Size = new System.Drawing.Size(151, 176);
//
// documentElement1
//
@@ -745,7 +745,7 @@ namespace vmsnet
//
// FMain
//
this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 22F);
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1561, 779);
this.Controls.Add(this.TableLayoutPanel1);

View File

@@ -96,7 +96,7 @@ namespace vmsnet
this.DispCtrl1.Size = new System.Drawing.Size(774, 699);
this.DispCtrl1.TabIndex = 3;
this.DispCtrl1.Times = null;
this.DispCtrl1.Values = null;
this.DispCtrl1._Values = null;
this.DispCtrl1.OnAlamChange += DispCtrl1_OnAlamChangeL;
this.DispCtrl1.OnChangedShowIndex += DispCtrl1_OnChangedShowIndex;
this.DispCtrl1.OnClickCell += DispCtrl1_OnClickCell;
@@ -766,7 +766,34 @@ namespace vmsnet
private void Pub_RemoteCommandEvent(object sender, RemoteCommand e)
{
if (e.Command == rCommand.StateMessage)
if(e.Command == rCommand.AlarmValueReset)
{
////auto로 된 그룹의 기준값을 변경한다.
this.DispCtrl1.SuspendLayout();
foreach (HMI.CGROUP c in DispCtrl1.GROUPS)
{
if (c.AlarmType == "AUTO")
{
////이그룹을 사용하는 모든셀의 auto값을 초기화한다.
foreach (HMI.CITEM i in c.Items)
{
i.alamv = -999;
}
}
else if (c.AlarmType == "STOP")
{
c._alamcount = (short)0;
c._alamcountlb = (short)0;
}
}
this.DispCtrl1._raise_alarm_pre = true; ////혹알람이 발생되어있을지 모르니. 끄도록 발생한것 처럼 표시해준다.
this.DispCtrl1.ResumeLayout();
this.DispCtrl1.Invalidate();
////설정정보를 가져온다.
PUB.SaveConfigFile("GRP");
}
else if (e.Command == rCommand.StateMessage)
{
var msg = e.Data.ToString();
if (PUB.lastStatueMessage.Equals(msg) == false)
@@ -1222,7 +1249,8 @@ namespace vmsnet
if (maxunno < 0) maxunno = 5;
if (maxchno < 0) maxchno = 59;
PUB.Values = new int[maxmcno + 1, maxunno + 1, maxchno + 1];
PUB._Values = new int[maxmcno + 1, maxunno + 1, maxchno + 1];
PUB.Received = new bool[maxmcno + 1, maxunno + 1, maxchno + 1];
PUB.Times = new string[maxmcno + 1, maxunno + 1, maxchno + 1];
PUB.ChNos = new int[maxmcno + 1, maxunno + 1, maxchno + 1];
PUB.ChVOffset = new float[maxmcno + 1, maxunno + 1, maxchno + 1];
@@ -1236,7 +1264,8 @@ namespace vmsnet
{
for (int k = 0; k <= maxchno; k++)
{
PUB.Values[c, i, k] = 0;
PUB._Values[c, i, k] = 0;
PUB.Received[c, i, k] = false;
PUB.Times[c, i, k] = "";
PUB.ChVOffset[c, i, k] = 0f;
PUB.ChDecPos[c, i, k] = 0;
@@ -1262,7 +1291,8 @@ namespace vmsnet
PUB.StatusMSG("Ready...");
this.DispCtrl1.initmsg = "Complete";
this.DispCtrl1.init = true;
this.DispCtrl1.Values = PUB.Values;
this.DispCtrl1._Values = PUB._Values;
this.DispCtrl1.Received = PUB.Received;
this.DispCtrl1.Times = PUB.Times;
this.DispCtrl1.SmallSize = PUB.CONFIG.viewSize; ////개별표시모드일떄 사용하는 윈도우의 크기
this.DispCtrl1.FullScreen = true;
@@ -1560,41 +1590,22 @@ namespace vmsnet
{
PUB.log.Add(AR.Log.ETYPE.NORMAL, "알람설정화면확인");
////auto로 된 그룹의 기준값을 변경한다.
this.DispCtrl1.SuspendLayout();
foreach (HMI.CGROUP c in DispCtrl1.GROUPS)
{
if (c.AlarmType == "AUTO")
{
////이그룹을 사용하는 모든셀의 auto값을 초기화한다.
foreach (HMI.CITEM i in c.Items)
{
i.alamv = -999;
}
}
else if (c.AlarmType == "STOP")
{
c._alamcount = (short)0;
c._alamcountlb = (short)0;
}
}
this.DispCtrl1._raise_alarm_pre = true; ////혹알람이 발생되어있을지 모르니. 끄도록 발생한것 처럼 표시해준다.
this.DispCtrl1.ResumeLayout();
this.DispCtrl1.Invalidate();
////설정정보를 가져온다.
PUB.RaiseRemoteCommandEvent(rCommand.AlarmValueReset);
////설정정보를 가져온다(저장은 메인에서만 진행한다)
PUB.SaveConfigFile("GRP");
//각 창별로 window1.grp / window2.grp 의 파일에 그룹상태를 저장 합니다
PUB.RaiseRemoteCommandEvent(rCommand.SaveGroupClass);
}
}
private void DispCtrl1_OnAlamChangeL(int ch, COMM.EALAMRAISETYPE ison, COMM.EALAMTYPE atype, string AM, float value, float maxvalue, float minvalue)
private void DispCtrl1_OnAlamChangeL(int ch, COMM.EALAMRAISETYPE ison, COMM.EALAMTYPE atype, string AM, float value, float maxvalue, float minvalue, string remark)
{
TimeSpan ts = DateTime.Now - PUB.StartupTime;
if (ts.TotalSeconds < PUB.CONFIG.Startup_DelayTime_Alam) return;
bool rlt = PUB.Alarm.InsertData(DateTime.Now, ch, ison, value, atype, maxvalue, minvalue, AM, "");
bool rlt = PUB.Alarm.InsertData(DateTime.Now, ch, ison, value, atype, maxvalue, minvalue, AM, remark);
PUB.log.Add(AR.Log.ETYPE.NORMAL, "알람이 발생되었습니다(ch=" + ch.ToString() + ",type=" + ison.ToString() + ", value=" + value.ToString() + ", min=:" + minvalue.ToString() + ",max=" + maxvalue.ToString() + ",atype=" + atype.ToString() + " ,am=" + AM);
}
@@ -2249,7 +2260,7 @@ namespace vmsnet
if (PUB.indicator != null && PUB.indicator.IsOpen)
{
this.lbINDI.ForeColor = Color.green;
this.lbINDI.ForeColor = Color.Green;
}
else if (PUB.CONFIG.indicator_port.isEmpty())
{

View File

@@ -127,7 +127,7 @@
<data name="btMonitorOn.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAHWSURBVFhH7ZZbSwJBFIB76uf1Ft2IIsr3HiSMYCGtrMCF
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHWSURBVFhH7ZZbSwJBFIB76uf1Ft2IIsr3HiSMYCGtrMCF
qIeoKLKXpCACCzQvPXQxKkMLbw9lkUaUl0goEk+cBSVnJNedHVhxD3ysO+dw5mPc2dm2Nj1aIQwmEbRI
lWDsAzRF6whG8yVqTA1UEYzmAaYcIelK5lhRRdARSEHHuBP2b16pHCvMgpFsCYbm/WDZDsHo8jmVZ4VZ
cN33AMbVC4jkSjBg9YIrmqVqWGASDL8XoW/6CDyJnHS/5r2Hic1rqo4FJsHFgzgIW8HKfThThF6LG06S
@@ -141,7 +141,7 @@
<data name="bt_fullscreen.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAN3SURBVFhHxVdNU5JRGGWmae30D5qWzdSiVYt+UsuaaRUG
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAN3SURBVFhHxVdNU5JRGGWmae30D5qWzdSiVYt+UsuaaRUG
oqVglmk600wbEcOPQgWV1D4EDFFEU0iwaVEivECh0vo0z/147+WtxqEJvDNnnuc55zz3npcdtmBkBWcJ
2zPfKM7q0NsswNbnfdz0xFsKelMF2M/BM1PCwHINg0s1DC7/5FX2xJtajfsYhE/3MI5mfY/3tDew/BO9
s2Wk9nMqQGo/C/d0CU8WaxhYPDGr7PmsV64xLBE4z/3E1/CEcXKfcxKemTJSOS3AZi6LnoCB/vAJ+l8T
@@ -162,7 +162,7 @@
<data name="bt_tviewr.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAabSURBVFhHxZZ7TJPnHsebtGR/9X1fL2e4oUXdzbk5F8yS
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAabSURBVFhHxZZ7TJPnHsebtGR/9X1fL2e4oUXdzbk5F8yS
ZX9syXL+ODnJsmRZsi05Wc7x7MwYLwg6pyCCWIsoskIvMCdoubQUaAuVuakIKrch4AUt9ykXQQdt3xZ2
Ocv++C6/533bQhnbjFv2JJ98f8/z/B5+n0BKqlAoFArjlcUFZo/mW/Ot1d+aPQtz/Hqcl/r/8GVq1+CH
H79D/495CzL6fwvrMV/RIPr9Qy/TVxq0BTbj9D3hV6Ee6o1+/9DL2KZBa+CDeQOjaQ18CEPbij9eIL9F
@@ -196,7 +196,7 @@
<data name="bt_tview.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAabSURBVFhHxZZ7TJPnHsebtGR/9X1fL2e4oUXdzbk5F8yS
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAabSURBVFhHxZZ7TJPnHsebtGR/9X1fL2e4oUXdzbk5F8yS
ZX9syXL+ODnJsmRZsi05Wc7x7MwYLwg6pyCCWIsoskIvMCdoubQUaAuVuakIKrch4AUt9ykXQQdt3xZ2
Ocv++C6/533bQhnbjFv2JJ98f8/z/B5+n0BKqlAoFArjlcUFZo/mW/Ot1d+aPQtz/Hqcl/r/8GVq1+CH
H79D/495CzL6fwvrMV/RIPr9Qy/TVxq0BTbj9D3hV6Ee6o1+/9DL2KZBa+CDeQOjaQ18CEPbij9eIL9F
@@ -230,7 +230,7 @@
<data name="bt_alamhistory.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAURSURBVFhHzZdrTFNnGMfPl1JEuVgEBPHjsuzDkmVR5KLz
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAURSURBVFhHzZdrTFNnGMfPl1JEuVgEBPHjsuzDkmVR5KLz
wihjkswblDvIRLkVRWRKxKHC4ubinDA3gmxzm1uMcSbKnRYEdcNt6jbNlkyBFitTTIhZtnMBNf/ledtT
T0/LqJsme5Jfctr35f97nvccTlKOe8zKrth2JKdiGzxBa+r9T7yytpSj49drHqE19f4nXmmlRqzZUOCR
dGPZf2+gYWXgwAcrA0A0JAegYWUgjNl6pBQWOcmtqPBISpG8pxhl2XrkxoU7Muw5lK32udWhVwPwy75o
@@ -258,7 +258,7 @@
<data name="bt_alamsetup.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQnSURBVFhH5ZRtTFtVGICvGmWM9t5aWlhpy8DCNrdg2CaE
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAQnSURBVFhH5ZRtTFtVGICvGmWM9t5aWlhpy8DCNrdg2CaE
xTBds8yEAD+Y7I+LxsQ/ix9Rf6gM2IlO4seQxkAyWaeMkU23AWNsOj6EIsOJM87p5n4QF8JaPlrarkDv
Z0dfcw+jrqdU0RUS45M86cn7vud9z217D0X9l/E1Gp72HdWXkvFlYbRet9LXYJy5dYzhpxpTEsn8kuNt
0tWwtp3A9ZeC75j+JJlfUtxNeoOzTisGpRmAWQlGj+skzxHjBrJuyfAc0fXwP70O0o+FEPj1BRB+fgNu
@@ -282,7 +282,7 @@
<data name="bt_save.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAARxSURBVFhH7ZdLU5tVGMffGfd+BBeV3BNyIRBCSEIuJAYw
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAARxSURBVFhH7ZdLU5tVGMffGfd+BBeV3BNyIRBCSEIuJAYw
NCUEEgLFta2fwZ0b9QPIzo2u2xm/gE21jtpAKFCqrhzMmwsJWlfJzN95znvOe81ohym6MTO/eS7nOc//
z5sQBkn6/8Vftd33DtKZHFKZHChW6/vI5VdZ/tWjR9fi1z9eIhyOqDsplstbtXz+XY9ZX6KBjz/5FO/f
+4AhDFD+52h0bcrlirqT9gsTZn0plV5GdWefCdd4JAO1+l38fHWFX66GPOoZGnKfP6Ai7uTyK6jt3GU7
@@ -307,7 +307,7 @@
<data name="ToolStripButton2.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAABhKSURBVHhe7ZsHWFRnusePTKNPodo3btpqNsmmGDXqKGAn
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAABhKSURBVHhe7ZsHWFRnusePTKNPodo3btpqNsmmGDXqKGAn
ighIUVFEyoBi1Giqxxg1mtx0o4nZ7M1zn81uNru5WVEULBkLxUKRIjAz1KHXoYiFMu993u+cM3PmMKhp
u/c+z/2e5x8IzJzv/f3f93u/7xxGivr/8euOEo2Xa3mycpE+SfmWXqM8a9C41+sTXG7oNco7+iRlP5FG
eac8ybXPEK9sNSQoLukSlR+UJytXlmi8fIXX+z8x9BtV43SJyl3lGtdahKuO9hpo3PEAtNKPQef+56Hr
@@ -417,7 +417,7 @@
<data name="bt_print.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAStSURBVFhH7ZZdTJNnFMef290sS1x0zhgXhyjJLiZ6sezG
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAStSURBVFhH7ZZdTJNnFMef290sS1x0zhgXhyjJLiZ6sezG
i3lBtt3uauFmcOHHPmI2dS4a2OIUiZluUTTSCPJhUWiLtWhtpaXY10Kp5cMWaCms6MAXBhQtgn2r7385
z9sX6OuIkXLpSX455zznec7/n6ZNytibeEXUemJYLpc9MWj3vXbUeqYgPEjC/SAJYViCeziZ6iUIVA+r
OclnHH43CX3bShhoi+HOsITWqIQ70STPan2H5wWUmXKH+isdjzM3oG+fhutvCS1RCS2UOcn5zGdpZwt9
@@ -443,7 +443,7 @@
<data name="bt_show2ndwindow.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAKdSURBVFhH7VZNiFJRGJ2IVm2CZhtEwQRBi1kEMQgR0SKC
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAKdSURBVFhH7VZNiFJRGJ2IVm2CZhtEwQRBi1kEMQgR0SKC
DDT8QXETTjUQBEbSgJY1Qw5MpFPTQsRUEMRZWptIazdOZUbgH4Wlgz+0mfwhCfGL8/A6+Urn3lYtPHDA
B98597z7Xe/3JibGGEMMu8xm8x6DwbDXZDLtMxqN+3U63eQooga10EALD7kpN2AAM71ef0ir1U5rNJoZ
nU6nGEXUoBYaaHsh/g14CxidcWxETy99IRFCAy085L7cwBvgbU7dL5B3/Se9yHa4iFpooIWH3FeOoX3W
@@ -460,7 +460,7 @@
<data name="bt_config.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAZRSURBVFhH7VZtbJNVFFZBiB/RiJqgIgnR+MPEGENMNFGr
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAZRSURBVFhH7VZtbJNVFFZBiB/RiJqgIgnR+MPEGENMNFGr
P0gwkMhi3/ZtmfCDhF+SEsJYM5KVZS9h61YCtBS6FTbavm1vu0/YLOvWbl1Hxz7Y+NiAsQ8YX4PBNhJ/
+MOYa54Lt3n7jlXR+M+TPLlv7z3nPOeee869fe65/+UfCiFkSzgc7n+CJCHEqNb5z4QQ8nMsFqN37txh
uHXrFm1tbaWEkJ/Uuv9aCCGfBINBZzAYtBFCPiSErPL7/cM3b96kjx49ojMzM2ycmJiggUAgRQh5jxDy
@@ -493,7 +493,7 @@
<data name="ToolStripButton1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAciSURBVFhHnZZpTFvZGYaPqnbU0bSj/pi2U3VRR6qqVmql
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAciSURBVFhHnZZpTFvZGYaPqnbU0bSj/pi2U3VRR6qqVmql
VqPOn0oz/VFV7Y+2qhS1Umc0SaWpqqQzUaTQkGDwZQ2MbQgkQMxqwLsD2GwhkBAgJGEnYTcQNmNj3+vl
egFvhLzVuRMssB1D+0mPrOv7nvd7z3euF0JOWMV6y+syk/NP0hZOITM6JiQt3IrMyEGghVuj78laWbXE
5PhLuYH9Wvz6/7skBvZtWQtbyxi5YGmHE4oHPhinQxjdjGCRjcaY3Iqg6VEAZZ0uUK2slWsqavf8IN7v
@@ -530,7 +530,7 @@
<data name="btLog.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAJSSURBVFhH7db/axJxHMfx/RH9Ff3aH2A/7dym5mhBQo2x
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJSSURBVFhH7db/axJxHMfx/RH9Ff3aH2A/7dym5mhBQo2x
+qkf+qEvPw9ibDs9XYOVtVoz2qDol9jI6CfDOu+805mVFfNkWBq1wNWuaNO5V3wEZX7COXc7Peie8P5B
TvTBh7d3dnWZ/S8xEwKMNLSvArwVKxtiTKDWMYFapyHQKJlArZlArZlArbUMvLKQqns96F/+5+He6pDP
aBS5Tvv2BLY7E6i14duJ1oDt3kES7dsT2IlonyGAyexPnL+TxAmfBIdHembjYkcMAwyEP8HpleHn1/Hk
@@ -546,7 +546,7 @@
<data name="toolStripButton3.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAC6SURBVFhHY2AYBaNgEIBpVS7/icY1Lr3o+mkOQBbf3pBK
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAC6SURBVFhHY2AYBaNgEIBpVS7/icY1Lr3o+mkOQBbf3pBK
EF9dk/x/Wr3nlxlVLn3oZtAUEOvAAXMkKQ4E4fMrEv/X12n9wYh+KmOyHHhkXtT/uQ0e//fMjv3/8XTz
/6/nWmmCMRxILF7S5vv/wZ5yDAOpjTEciK5goPGoAynFow6kFI86kFI86kBK8agDKcWjDqQUjzqQUjzq
QErxqAMpxaMOpBSPOpBSPOpASjGGAwcjhjtwFIyCAQQAl/T9hdakfvYAAAAASUVORK5CYII=

View File

@@ -72,9 +72,9 @@ namespace vmsnet
this.lb_status,
this.lb_lasttime,
this.lb_alarm});
this.StatusStrip1.Location = new System.Drawing.Point(0, 750);
this.StatusStrip1.Location = new System.Drawing.Point(0, 744);
this.StatusStrip1.Name = "StatusStrip1";
this.StatusStrip1.Size = new System.Drawing.Size(929, 26);
this.StatusStrip1.Size = new System.Drawing.Size(929, 32);
this.StatusStrip1.TabIndex = 1;
this.StatusStrip1.Text = "StatusStrip1";
//
@@ -83,7 +83,7 @@ namespace vmsnet
this.lb_status.Font = new System.Drawing.Font("맑은 고딕", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129)));
this.lb_status.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(64)))), ((int)(((byte)(0)))));
this.lb_status.Name = "lb_status";
this.lb_status.Size = new System.Drawing.Size(130, 20);
this.lb_status.Size = new System.Drawing.Size(155, 25);
this.lb_status.Text = "<SUBWINDOW>";
//
// lb_lasttime
@@ -91,14 +91,14 @@ namespace vmsnet
this.lb_lasttime.Font = new System.Drawing.Font("맑은 고딕", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129)));
this.lb_lasttime.ForeColor = System.Drawing.Color.Gray;
this.lb_lasttime.Name = "lb_lasttime";
this.lb_lasttime.Size = new System.Drawing.Size(103, 20);
this.lb_lasttime.Size = new System.Drawing.Size(123, 25);
this.lb_lasttime.Text = "<LASTTIME>";
//
// lb_alarm
//
this.lb_alarm.ForeColor = System.Drawing.Color.Silver;
this.lb_alarm.Name = "lb_alarm";
this.lb_alarm.Size = new System.Drawing.Size(24, 20);
this.lb_alarm.Size = new System.Drawing.Size(30, 25);
this.lb_alarm.Text = "●";
//
// Timer1
@@ -151,7 +151,7 @@ namespace vmsnet
this.TableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 35F));
this.TableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.TableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.TableLayoutPanel1.Size = new System.Drawing.Size(929, 706);
this.TableLayoutPanel1.Size = new System.Drawing.Size(929, 700);
this.TableLayoutPanel1.TabIndex = 6;
//
// panel1
@@ -172,7 +172,7 @@ namespace vmsnet
this.cmb_tanks.FormattingEnabled = true;
this.cmb_tanks.Location = new System.Drawing.Point(0, 0);
this.cmb_tanks.Name = "cmb_tanks";
this.cmb_tanks.Size = new System.Drawing.Size(341, 38);
this.cmb_tanks.Size = new System.Drawing.Size(341, 45);
this.cmb_tanks.TabIndex = 5;
this.cmb_tanks.SelectedIndexChanged += new System.EventHandler(this.cmb_group_SelectedIndexChanged);
//
@@ -229,7 +229,7 @@ namespace vmsnet
this.bt_fullscreen.Image = ((System.Drawing.Image)(resources.GetObject("bt_fullscreen.Image")));
this.bt_fullscreen.ImageTransparentColor = System.Drawing.Color.Magenta;
this.bt_fullscreen.Name = "bt_fullscreen";
this.bt_fullscreen.Size = new System.Drawing.Size(97, 41);
this.bt_fullscreen.Size = new System.Drawing.Size(112, 39);
this.bt_fullscreen.Text = "개별보기";
this.bt_fullscreen.Click += new System.EventHandler(this.bt_fullscreen_Click);
//
@@ -239,7 +239,7 @@ namespace vmsnet
this.bt_tviewr.Image = ((System.Drawing.Image)(resources.GetObject("bt_tviewr.Image")));
this.bt_tviewr.ImageTransparentColor = System.Drawing.Color.Magenta;
this.bt_tviewr.Name = "bt_tviewr";
this.bt_tviewr.Size = new System.Drawing.Size(152, 41);
this.bt_tviewr.Size = new System.Drawing.Size(177, 39);
this.bt_tviewr.Text = "실시간트렌드(F1)";
this.bt_tviewr.Click += new System.EventHandler(this.bt_tviewr_Click);
//
@@ -249,7 +249,7 @@ namespace vmsnet
this.bt_save.Image = ((System.Drawing.Image)(resources.GetObject("bt_save.Image")));
this.bt_save.ImageTransparentColor = System.Drawing.Color.Magenta;
this.bt_save.Name = "bt_save";
this.bt_save.Size = new System.Drawing.Size(92, 41);
this.bt_save.Size = new System.Drawing.Size(105, 39);
this.bt_save.Text = "저장(F5)";
this.bt_save.Click += new System.EventHandler(this.bt_save_Click);
//
@@ -263,7 +263,7 @@ namespace vmsnet
this.ToolStripButton2.Image = ((System.Drawing.Image)(resources.GetObject("ToolStripButton2.Image")));
this.ToolStripButton2.ImageTransparentColor = System.Drawing.Color.Magenta;
this.ToolStripButton2.Name = "ToolStripButton2";
this.ToolStripButton2.Size = new System.Drawing.Size(122, 41);
this.ToolStripButton2.Size = new System.Drawing.Size(141, 39);
this.ToolStripButton2.Text = "소리끄기(F2)";
this.ToolStripButton2.Click += new System.EventHandler(this.ToolStripButton2_Click);
//
@@ -279,7 +279,7 @@ namespace vmsnet
//
// Frm_Sub
//
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F);
this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 22F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(929, 776);
this.Controls.Add(this.TableLayoutPanel1);

View File

@@ -64,7 +64,7 @@ namespace vmsnet
this.DispCtrl1.Size = new System.Drawing.Size(774, 699);
this.DispCtrl1.TabIndex = 3;
this.DispCtrl1.Times = null;
this.DispCtrl1.Values = null;
this.DispCtrl1._Values = null;
this.DispCtrl1.OnAlamChange += DispCtrl1_OnAlamChangeL;
this.DispCtrl1.OnChangedShowIndex += DispCtrl1_OnChangedShowIndex;
this.DispCtrl1.OnClickCell += DispCtrl1_OnClickCell;
@@ -222,7 +222,31 @@ namespace vmsnet
delegate void Pub_RemoteCommandEventHandler(object sender, RemoteCommand e);
private void Pub_RemoteCommandEvent(object sender, RemoteCommand e)
{
if (e.Command == rCommand.StateMessage)
if(e.Command == rCommand.AlarmValueReset)
{
////auto로 된 그룹의 기준값을 변경한다.
this.DispCtrl1.SuspendLayout();
foreach (HMI.CGROUP c in DispCtrl1.GROUPS)
{
if (c.AlarmType == "AUTO")
{
////이그룹을 사용하는 모든셀의 auto값을 초기화한다.
foreach (HMI.CITEM i in c.Items)
{
i.alamv = -999;
}
}
else if (c.AlarmType == "STOP")
{
c._alamcount = (short)0;
c._alamcountlb = (short)0;
}
}
this.DispCtrl1._raise_alarm_pre = true; ////혹알람이 발생되어있을지 모르니. 끄도록 발생한것 처럼 표시해준다.
this.DispCtrl1.ResumeLayout();
this.DispCtrl1.Invalidate();
}
else if (e.Command == rCommand.StateMessage)
{
if (this.InvokeRequired)
{
@@ -744,7 +768,8 @@ namespace vmsnet
PUB.StatusMSG("Ready...");
this.DispCtrl1.initmsg = "Complete";
this.DispCtrl1.init = true;
this.DispCtrl1.Values = PUB.Values;
this.DispCtrl1._Values = PUB._Values;
this.DispCtrl1.Received = PUB.Received;
this.DispCtrl1.Times = PUB.Times;
//Me.DispCtrl1.WINDOW.restarttime = CONFIG.Restart
this.DispCtrl1.SmallSize = System.Convert.ToInt32(PUB.CONFIG.viewSize);
@@ -844,13 +869,13 @@ namespace vmsnet
//Me.bt_window.Text = Me.DispCtrl1.WINDOW.이름 & "(윈도우속성)"
}
private void DispCtrl1_OnAlamChangeL(int ch, COMM.EALAMRAISETYPE raisetype, COMM.EALAMTYPE atype, string AM, float value, float maxvalue, float minvalue)
private void DispCtrl1_OnAlamChangeL(int ch, COMM.EALAMRAISETYPE raisetype, COMM.EALAMTYPE atype, string AM, float value, float maxvalue, float minvalue, string remark)
{
TimeSpan ts = DateTime.Now - PUB.StartupTime;
if (ts.TotalSeconds < 7) return;
if (ts.TotalSeconds < PUB.CONFIG.Startup_DelayTime_Alam) return;
bool rlt = PUB.Alarm.InsertData(DateTime.Now, ch, raisetype, value, atype, maxvalue, minvalue, AM, "");
PUB.log.Add(AR.Log.ETYPE.NORMAL, "알람이 발생되었습니다(ch=" + ch.ToString() + ",type=" + raisetype.ToString() + ", value=" + value.ToString() + ", min=:" + minvalue.ToString() + ",max=" + maxvalue.ToString() + ",atype=" + atype.ToString() + " ,am=" + AM);
bool rlt = PUB.Alarm.InsertData(DateTime.Now, ch, raisetype, value, atype, maxvalue, minvalue, AM, remark);
PUB.log.Add(AR.Log.ETYPE.NORMAL, "알람이 발생되었습니다(ch=" + ch.ToString() + ",type=" + raisetype.ToString() + ", value=" + value.ToString() + ", min=:" + minvalue.ToString() + ",max=" + maxvalue.ToString() + ",atype=" + atype.ToString() + " ,am=" + AM + " ,remark=" + remark);
}
public void DispCtrl1_OnSetNullbalance(HMI.CGROUP grp, float value)

View File

@@ -488,190 +488,191 @@
<data name="bt_fullscreen.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAANqSURBVFhHxVdLT5NREG1iXBP/gXFpIgtWLvxJLjVxZbGl
gLUFBEFITNhYikVQgVYLFFT6AAqlILTQYlwopS+Ul+tx5r4hVVK15SYnM3PmzJ3zfV8XYPGH5+EiYXnm
HYKLOrSbGVj7vAO33Yt1Be3UBnay4J4oQe/sCfSFELM/eZQ58ap3wnUMQmdqGEe1OcdzmutFvmOyDEnc
qQwkdzLgGi/BkxkUzByrKHNem5H3GEIEznM98ahhnJznnIR7Ag1kDQOr2Qw8elOEnqlj6JkmHGEuQDXj
qRZ9iohuo9ctOD5v5JI37nPh217NZLSBxPY2OF8XoevdITyWCMr8iCNI0eCoz3CEc7J/ViN6WPPIcyc+
bCKzpQ0sb6ehfawAnYFDgQMVO4zc5E/HQ9TxqGuaPR2lnh52eSutDcTTKWgbzYN78geDa/IAvxPmEoKn
3MX6mnfJvtSyGufP6oy6DR82njYMLKU2wTGSB+f4d/wtEPbhEeZOzCVULTSMO9vDOdaXIE702J1C0/qy
AIu4UxmIbW5Aiy8P7a/KAvsGRD12uvdQxTN6ppM1n+EaHR0jBVjAncpAdGMdbC9y6KyMn6KMsQStowiK
KkeeIuvLXPJGLftsTuSSFzq7bw93ftIGIutrYPPm0FkRHL4itGBs8ZUYHASqJYhXtewJjs3wnuLFHZor
gm04D2HcqQzMJ5NgHdrFt1DAZgHsFFWOA5hLzm72GehCM4q8gpbusg8Xodm7x3YqAx9XE2B9vgsPvAVE
njmUuQbVEgZPWlykctlnHC4W0P08NHv24APuVAbmEitwHw00D2GzDrB6cvA+sawNzK7E0UCuorgWsOIb
mFsxDITii/gJ6msgFF/SBqaX0AC+lkriWoAMzOBOZWBqcQHu9Kfgbn+6Tkjhzpg2EIxFIfv1G8OX3G5d
EIwZBgKRMMNbgUBUxEgEowbxTBelnNdshkWsmU5quI5p1R1aT5wy4BdDAfwrNRAhhAXH80BYwOj5JYfQ
81rDdKLnl3OyL+aUgYuEpZpzz26D8yCktTnkuH/I81tU/UTVHlpQ6b8biZoaoAXlg4NzQTox8n/PeU8v
UZO3QJdWc0jf5/Fc8fl8l8QV/3bsXZ1QLZ4ODl4dGBi4LK74u9PQ0HDtRlPTTUyrxvXGxls0j/kfjsXy
C5OMes1Y4DvuAAAAAElFTkSuQmCC
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAN3SURBVFhHxVdNU5JRGGWmae30D5qWzdSiVYt+UsuaaRUG
oqVglmk600wbEcOPQgWV1D4EDFFEU0iwaVEivECh0vo0z/147+WtxqEJvDNnnuc55zz3npcdtmBkBWcJ
2zPfKM7q0NsswNbnfdz0xFsKelMF2M/BM1PCwHINg0s1DC7/5FX2xJtajfsYhE/3MI5mfY/3tDew/BO9
s2Wk9nMqQGo/C/d0CU8WaxhYPDGr7PmsV64xLBE4z/3E1/CEcXKfcxKemTJSOS3AZi6LnoCB/vAJ+l8T
jtEfFqCZ8TQLnWr4BI817bHg+L7WS167zz1TwmY2qwIk9/bQ/cpA3/wRHkksyP6YY4GqxpHOcIw+U7d6
hDZ/JCrvuwMGktlPKsD6Xgb3p4p4GDoSqJq1V+t1vr4eodfclTPt1lfpp49d/5RRARKZNLomC/DM/mBw
z1bhmfmhIHjq3UxXvFvqdf6quEfzaXPXVBGJjBZgLb0L13gB3dPf0RMgVNAz/R3dAQVzFh7GWbVAhesS
ws+9FeGvoHOiiHh6VwVY3d1Bh7+A+y/LAhUNYp6q1x6Y1eJnPn23LDyqusaL+LC7owLEdrbheJFH50QZ
XZNldE6U0DlZ4tXsy7wyXfaS12apsz3dq3xO/yFiOx9VgOj2Fhy+PFzjBlx+Ax3jBjr8JQYXgWYJ4s1Z
aoJjO1wzeXGH4gw4xgqIbG+pACupFOyjB3C8KMIxVoSTqtkbrJecU9cZ6EK9iv4PXrrLOWag3XfI3jQD
vN9Mwj5ygHu+Iu75Ciyh7BVoltB48o4JTt9jXBEOAaUX0O49xLvNpArwJrmBuyMHaB8ttAR2bx5vk+sq
wPJGAndH8r8ZmwW79xBvNrQAS4k47C0OsJRYUwFer8XZz2I1NgsUYHEtrgKE4x9wayiN20OZFiGNcHxV
BVhYjSH39RvDl/xBS7CwqgUIRSMMcwKhmKjRKOY0EM98Mer5zHZYjQq/9HAf85p3KD9xZoCgWApFVhCK
EiKC430oIqBpQclFpLfew3xCC8o9qYs9M8BZwtbIueN04DRYd/7rocRDo96/ouEvavTQA9Z/NjqaGoAe
KFerp4L93WrGOe3rm/or0KWNHPIPer0X/H7/Oetd/3ScfQ/RKJ4+f35xeHj4vPWuhk5bW9ulK9euXbfZ
bA3j8tWrN2jfeqf1/AKTjHrN6L0l5gAAAABJRU5ErkJggg==
</value>
</data>
<data name="bt_tviewr.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
RU5ErkJggg==
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
</value>
</data>
<data name="bt_save.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAARcSURBVFhH7ZVJU2NVFMepcu9HcNGSOSEDgRBCRgIxgNA0
YUiA7nbt8BncuVE/gOzc6Lq7yi9gpx1K7TA0YFpdWW0SZodVqDqe/333vPfSL9V2UY1uvFW/OsO993/+
vCSPgf+XrNrmW1uFyWnKM4jVjbs0XZpV+RcPHlyJX//4k+LxhKmJWKms1kqlNwN6rLVw4MOPPqa333lP
IQaQ/9XtXplKZcXUhL6Y0GOtlS9MUXX9rhpc0xEGaht36OeLC/rl4lxHO+c9eSgcMZE706UZ1rujNGus
CSOYpcdaK5cv0tr6barWbtMaIwZQN8/P6Mfzc0XzDPFM9Zpn0ufIOQYXim8oUDd5b2q6rHQF6GGWHmut
bH6SVqobtLrGcBQDK9VNenx6+kLYDUhvcqrMeptalyNrZ3OTTgOZbIGWV9c1NdMA6sbxMXNC2ycn1GC2
uVY5+rpunBz3GECNfqFYsukyKzXCLD3WWulsnpaW10zEAPLvjo7oewaxh2Mjyp7dgJzB5720XO3RTmdz
TgOpdI4Wl1YUNxkxgPrrTkfxTZvptM3a3ke0GzD6bfW4RVe0U5k+BsZTGZq/WaH5xQotMGIAPGy3qN5q
U50FhYcqcl/gfbsB7IN0psCaSz3aqYmM00ByPE1z84s0t8DM3zLfBeDTe/foy1brSqTSWUPXRjKVdhpI
JCdoZm6BZmYXqIyoQZ7kp4MnNM4XAWqISA+5cca+b90pz84bWqw9wzlm6bHWGh1LUak894LM/kP+/P3R
sXGngZFEkoqlsuKTz+/T4dHlS2Xrs/tU5JcSGEmMOQ0MjyT4y8P/MPh3e3DUpYNO17x8oHm2tvft+4ed
Z3JdQx9glh5rrVh8lLL8isQb8clunX4CexqdP9G5inbkvNyRyJhaDLQxIxYfcRqIxuI0kckrDtjxvgZP
wsoNpO7FOmfVgnFP6fMLLzocdxoIR2KU5N8nvrX77Ut6DPgS4n7bEJIaUZ1BRM+GGo47OK8i+si7NA59
JhwddhoIhaP880gpmjv1Xvjx9cR+PG9PI/qYpcdaK8hvsZHRMcUeO99rdWmXXSPfbUmNyLXqGXt7OIM9
fV766qza02c54pcW519AaCjiNBAIDfGXY1SBgTv6InLEHVsu+0bPvif7Vl9ALfqYpcdayx8IUZi/iJHY
MB1u1+kANDQ6P9S1ityTc/aIPYmqJ+eZSJT1GX8w5DTg9QfVZzPEbP/WpYbi0gQ9o2/lcs6eW7VxTs6j
D/1QJEreQLCfAT8FhsKKxlMtxvGRxKcwYvSlB/FHiGpf9np71v2uevTA6ws4Dbi9PvLxx+Bjd+qiwhDr
V//Q0++PcebSPAttXzBImKXHWsvl8ZLH5ycPP4nT91+5Frz+gJqBWXqstQbdHnKxM5fX2/fyy8CtBw+6
+xh43eVmZx6Ckd8/ePVacOGPZDBLj7XWjcHBLWyAb98duBZE/4bL/ZUeq9ZrTIzJMbf+JTDLw2D2f7kG
Bv4GtT2Ldl7X4kgAAAAASUVORK5CYII=
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAARxSURBVFhH7ZdLU5tVGMffGfd+BBeV3BNyIRBCSEIuJAYw
NCUEEgLFta2fwZ0b9QPIzo2u2xm/gE21jtpAKFCqrhzMmwsJWlfJzN95znvOe81ohym6MTO/eS7nOc//
z5sQBkn6/8Vftd33DtKZHFKZHChW6/vI5VdZ/tWjR9fi1z9eIhyOqDsplstbtXz+XY9ZX6KBjz/5FO/f
+4AhDFD+52h0bcrlirqT9gsTZn0plV5GdWefCdd4JAO1+l38fHWFX66GPOoZGnKfP6Ai7uTyK6jt3GU7
a/V9ZoS0zPrSUiqL7Z09VGt72K7tqQaoPh8O8Hw4ZJwPKA5Y73wg+gM8HwyYcDr7DoPq8+EQy7kC2yug
faRl1peSqQwq1Tq2tuvYqtZVA5XqLp5dXr4SegOil1kuYKu6y/fust3JpYzVQCKZxubWDqemGqC62euh
2evjsN9Hs9/HYa+n5NTndbPfMxigmvrpbF63dweblRpIy6wvxZMpbGxuqwgDlH/f7eKHbpdFAz0lijO9
ATFD7/fGZtWwO55cshqIxZdQ2qgwbm9UVANUf9vpMJ7IHTzpyGqt71PUG1D6MnvcYq/YHUtMMLAQS6B4
u4xiqYz1Ulk1QDyW22i0ZTRkjccstjXassEAnRPxRBrF0oZhd2wxYTUQXYhjrVjC2noJa8U76ncB8fmD
B/i63b4WsXhS2asjGotbDUSii1hZW8fK6joKFDmUR2MJ0BNaiMUZVNMS0aNcmdGfa3cKq0Vl1yrtL4K0
zPrS3HwM+cLaK7L6D/mknpbPzS9YDcxGosjmC4zPvnyIs+74tXLwxUNkcwXGbGTeamBmNoJ0NodUNo/T
7ginnZF6+ZRjrvV9/flZx5TzmvYTpGXWl0LhOSRTWdA34otWAz8Rxxyev+A5i3rEvLiju6vuajXYbtII
hWetBoKhMBYTKcZpZ4wTDj0JLVcQtRFtTqsFyj22P5lCcCZsNeAPhBBdVD61J/IYz4iOEk9kZZGoKbIZ
Lsb6HCZOd2ieRepTPsIC7V9MwB+csRrw+YOIRGOM86OGkZYpTuLvzjhiP2mZ9SWvP4DZuXnGsTzGcXuE
ljxieastaopjFltt5eyYZuiMz4s+m2VnfLY9Bv2mhSPz8E0HrAY8vmnQB5EgwSN+kXKKR7pcnCs9/Zk4
1/oCqsV+0jLrS26PD/5QGIHQDM4OGzglmhyen/GaxcOGOqePdCYi6+nuBYJhhtvrsxpwur3svZn2B3H4
2whNxliFekpfy8WcPtdqZU7MU5/2+wJBOD3eSQbc8Ez7Gc0LvuxihKciXpARpS96tPwpRXYuzow97f6I
PXrC6fJYDdidLrg8Prg8XuUiF9VyY/2joT8ZZWasztJul9cL0jLrSzaHEw6XGw63G5cfvnEjON0epkFa
Zn1pyu6AzemCzem0XHxd2LnwlH2CgbdtdtgcDpCR3z9680aw0Q9pd4C0zPrSrampAzogvrsv3Qhi/y2b
/Ru99lv0x5D+N5Ek6c6/BGk5uPZ/+/oLtT2Ldn0m2N0AAAAASUVORK5CYII=
</value>
</data>
<data name="ToolStripButton2.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
KOQU/Q+Qx3HtqiuXvQAAAABJRU5ErkJggg==
</value>
</data>
<metadata name="ds1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">

View File

@@ -69,6 +69,7 @@ namespace vmsnet.HMI
private String _value = "";
public int value2 = 0; //소수자리가 들어가기전의 값
public bool received = false;
public Single CurValue =0f;
public Single CurValue1 = 0f;
@@ -92,6 +93,7 @@ namespace vmsnet.HMI
BarRect = new RectangleF(0, 0, 0, 0);
_value = "";
value2 = 0;
received = false;
mtime = "";
idx = 0;
// detailform = null;

View File

@@ -129,7 +129,8 @@ namespace vmsnet.HMI
// }
//}
private int[,,] values;
private bool[,,] received;
private int[,,] _values;
private String[,,] times;
private Boolean _init = false; //그리드초기화완료여부
@@ -197,7 +198,7 @@ namespace vmsnet.HMI
public delegate void OnSetNBHandler(CGROUP grp, Single value);
public event OnAlamChangeHHandler OnAlamChange; //알람이 변경되었을경우(활성/비활성)
public delegate void OnAlamChangeHHandler(int ch, COMM.EALAMRAISETYPE raisetype, COMM.EALAMTYPE atype, String AM, Single value, Single maxvalue, Single minvalue);
public delegate void OnAlamChangeHHandler(int ch, COMM.EALAMRAISETYPE raisetype, COMM.EALAMTYPE atype, String AM, Single value, Single maxvalue, Single minvalue, string remark);
public event OnRaiseAlamChangeHHandler RaiseAlarm; //알람이 변경되었을경우(활성/비활성)
public delegate void OnRaiseAlamChangeHHandler(Boolean On);
@@ -309,10 +310,20 @@ namespace vmsnet.HMI
#region *** Constructors ***
public int[,,] Values
/// <summary>
/// 데이터를 수신했는지
/// </summary>
public bool[,,] Received
{
get { return this.values; }
set { this.values = value; }
get { return this.received; }
set { this.received = value; }
}
public int[,,] _Values
{
get { return this._values; }
set { this._values = value; }
}
public String[,,] Times
@@ -615,7 +626,7 @@ namespace vmsnet.HMI
Item.alaml = grp.LOW;
Item.aalamh = grp.UP;
Item.aalaml = grp.UP;
Item.alamv = -999; /* 작성자: 이재웅, 작성일: 2025-06-11, 작성내용: 알람발생 원인으로 의심 -> 'Item.alamv = -999' 주석해제 */
//Item.alamv = -999; /* 작성자: 이재웅, 작성일: 2025-06-11, 작성내용: 알람발생 원인으로 의심 -> 'Item.alamv = -999' 주석해제 했다가 다시 원복 */
break;
case COMM.EALAMTYPE.:
Item.alamh = -999;
@@ -669,9 +680,11 @@ namespace vmsnet.HMI
//값의 저장소가 아에없다면?
//Boolean OverDATA = false;
if (this.Values == null)
var alarmRemark = string.Empty;
if (this._Values == null)
{
Item.value2 = 0;
Item.received = false;
Item.CurValue = 0f;
Item.CurValue1 = 0f;
TimeStr = "Null Error";
@@ -684,6 +697,7 @@ namespace vmsnet.HMI
if (!Item.) //사용여부자체를 설정한다.
{
Item.value2 = 0;
Item.received = false;
Item.alamv = -999;
Item.CurValue = 0f; //미설정상태라면 값을 표시하지 않는다.
Item.CurValue1 = 0f;
@@ -697,18 +711,20 @@ namespace vmsnet.HMI
//Br = new SolidBrush(Color.Black);
Offset = Item.Offset; //수동으로입력된 옾셋
var u1 = this.Values.GetUpperBound(0);
var u2 = this.Values.GetUpperBound(1);
var u3 = this.Values.GetUpperBound(2);
var u1 = this._Values.GetUpperBound(0);
var u2 = this._Values.GetUpperBound(1);
var u3 = this._Values.GetUpperBound(2);
if (Item.idx_dev >= 0 && Item.idx_unit >= 0 && Item.idx_ch >= 0 &&
Item.idx_dev <= u1 && Item.idx_unit <= u2 && Item.idx_ch <= u3)
{
Item.value2 = this.Values[Item.idx_dev, Item.idx_unit, Item.idx_ch]; //측정값
Item.value2 = this._Values[Item.idx_dev, Item.idx_unit, Item.idx_ch]; //측정값
TimeStr = this.Times[Item.idx_dev, Item.idx_unit, Item.idx_ch]; //측정시간
Item.received = this.Received[Item.idx_dev, Item.idx_unit, Item.idx_ch]; //수신여부
}
else
{
Item.value2 = 0;
Item.received = false;
TimeStr = "";
}
@@ -728,7 +744,7 @@ namespace vmsnet.HMI
if (TimeStr != "" && TimeStr != "Not USE" && Item._p_onalamover == false)
{
String alamtimes = DateTime.Parse(TimeStr).ToString("yy-MM-dd HH:mm:ss");
OnAlamChange(Item.idx, COMM.EALAMRAISETYPE.OVER_ON, Item., "--", Item.CurValue, Item.alamh, Item.alaml);
OnAlamChange(Item.idx, COMM.EALAMRAISETYPE.OVER_ON, Item., "--", Item.CurValue, Item.alamh, Item.alaml, "over 32000");
Item._p_onalamover = true;
}
Item.CurValue = 0f;
@@ -744,7 +760,7 @@ namespace vmsnet.HMI
if (TimeStr != "" && TimeStr != "Not USE" && Item._p_onalamover == true)
{
String alamtimes = DateTime.Parse(TimeStr).ToString("yy-MM-dd HH:mm:ss");
OnAlamChange(Item.idx, COMM.EALAMRAISETYPE.OVER_OFF, Item., "--", Item.CurValue, Item.alamh, Item.alaml);
OnAlamChange(Item.idx, COMM.EALAMRAISETYPE.OVER_OFF, Item., "--", Item.CurValue, Item.alamh, Item.alaml, "");
Item._p_onalamover = false;
}
}
@@ -785,11 +801,17 @@ namespace vmsnet.HMI
case COMM.EALAMTYPE.:
if (grp.AlarmType == "AUTO")
{
/* 작성자: 이재웅, 작성일: 2025-06-11, 작성내용: 알람발생 원인으로 의심 -> '알람타입:그룹설정을따름' 일때 'Item.alamv == -999' 주석해제 */
if (Item.alamv == -999) Item.alamv = Item.CurValue;
//if (Item.alamv == -999) Item.alamv = Item.CurValue;
/* 작성자: 이재웅, 작성일: 2025-06-17, 작성내용: 'Item.alamv == 0' OR조건 추가 */
if (Item.alamv == -999 || Item.alamv == 0) Item.alamv = Item.CurValue;
Item. = "AUTO";
if (Item.CurValue > Item.alamv) //큰값이 있을경우 상한선을 확인한다.
if (Item.received == false)
{
Item.onalamh = false;
Item.onalaml = false;
}
else if (Item.CurValue > Item.alamv) //큰값이 있을경우 상한선을 확인한다.
{
Single gap = Math.Abs(Item.CurValue - Item.alamv);
if (gap >= Math.Abs(Item.aalamh))
@@ -797,6 +819,7 @@ namespace vmsnet.HMI
Item.onalamh = true;
Item.onalaml = false;
BackColor = Color.Orange; //BackColor0 = Color.LightPink;
alarmRemark = $"ref({Item.alamv})";
}
}
else if (Item.CurValue < Item.alamv)
@@ -807,6 +830,7 @@ namespace vmsnet.HMI
Item.onalamh = false;
Item.onalaml = true;
BackColor = Color.SkyBlue; //BackColor0 = Color.LightBlue;
alarmRemark = $"ref({Item.alamv})";
}
}
@@ -814,17 +838,24 @@ namespace vmsnet.HMI
else if (grp.AlarmType == "MANUAL")
{
Item. = "MANUAL";
if (Item.CurValue >= Item.alamh)
if (Item.received == false)
{
Item.onalamh = false;
Item.onalaml = false;
}
else if (Item.CurValue >= Item.alamh)
{
Item.onalamh = true;
Item.onalaml = false;
BackColor = Color.Orange;// BackColor0 = Color.LightPink;
alarmRemark = $"ref({Item.alamh})";
}
else if (Item.CurValue < Item.alaml)
{
Item.onalamh = false;
Item.onalaml = true;
BackColor = Color.SkyBlue; //BackColor0 = Color.LightBlue;
alarmRemark = $"ref({Item.alaml})";
}
}
else
@@ -836,25 +867,39 @@ namespace vmsnet.HMI
break;
case COMM.EALAMTYPE.:
Item. = "MANUAL";
if (Item.CurValue >= Item.alamh)
if (Item.received == false)
{
Item.onalamh = false;
Item.onalaml = false;
}
else if (Item.CurValue >= Item.alamh)
{
Item.onalamh = true;
Item.onalaml = false;
BackColor = Color.Orange; //BackColor0 = Color.LightPink;
alarmRemark = $"ref({Item.alamh})";
}
else if (Item.CurValue < Item.alaml)
{
Item.onalamh = false;
Item.onalaml = true;
BackColor = Color.SkyBlue;// BackColor0 = Color.LightBlue;
alarmRemark = $"ref({Item.alaml})";
}
break;
case COMM.EALAMTYPE.:
Item. = "AUTO";
if (Item.alamv == -999) Item.alamv = Item.CurValue;
//if (Item.alamv == -999) Item.alamv = Item.CurValue; // 이전 코드
/* 작성자: 이재웅, 작성일: 2025-06-17, 작성내용: 'Item.alamv == 0' OR조건 추가 */
if (Item.alamv == -999 || Item.alamv == 0) Item.alamv = Item.CurValue;
if (Item.CurValue > Item.alamv) //큰값이 있을경우 상한선을 확인한다.
if (Item.received == false)
{
Item.onalamh = false;
Item.onalaml = false;
}
else if (Item.CurValue > Item.alamv) //큰값이 있을경우 상한선을 확인한다.
{
Single gap = Math.Abs(Item.CurValue - Item.alamv);
if (gap >= Math.Abs(Item.aalamh))
@@ -862,6 +907,7 @@ namespace vmsnet.HMI
Item.onalamh = true;
Item.onalaml = false;
BackColor = Color.Orange; //BackColor0 = Color.LightPink;
alarmRemark = $"ref({Item.alamv})";
}
}
else if (Item.CurValue < Item.alamv)
@@ -872,6 +918,7 @@ namespace vmsnet.HMI
Item.onalamh = false;
Item.onalaml = true;
BackColor = Color.SkyBlue; //BackColor0 = Color.LightBlue;
alarmRemark = $"ref({Item.alamv})";
}
}
break;
@@ -883,9 +930,10 @@ namespace vmsnet.HMI
if (Item. && init == true && (Item.onalaml != Item._p_onalaml || Item._p_onalamh != Item.onalamh)) //이전과 알람상태가 변경된경우다.
{
String alamtimes;
String alamtimes = "";
if (TimeStr != "" && TimeStr != "Not USE") alamtimes = DateTime.Parse(TimeStr).ToString("yy-MM-dd HH:mm:ss");
if (TimeStr != "" && TimeStr != "Not USE")
alamtimes = DateTime.Parse(TimeStr).ToString("yy-MM-dd HH:mm:ss");
else alamtimes = "";
Single AH, AL;
@@ -901,28 +949,27 @@ namespace vmsnet.HMI
}
if (Item.onalamh && !Item._p_onalamh)
{
OnAlamChange(Item.idx, COMM.EALAMRAISETYPE.HIGH_ON, Item., Item., Item.CurValue, AH, AL);
OnAlamChange(Item.idx, COMM.EALAMRAISETYPE.HIGH_ON, Item., Item., Item.CurValue, AH, AL, alarmRemark);
Item._p_onalamh = true;
}
else if (Item.onalaml && !Item._p_onalaml)
{
OnAlamChange(Item.idx, COMM.EALAMRAISETYPE.LOW_ON, Item., Item., Item.CurValue, AH, AL);
OnAlamChange(Item.idx, COMM.EALAMRAISETYPE.LOW_ON, Item., Item., Item.CurValue, AH, AL, alarmRemark);
Item._p_onalaml = true;
}
else if (!Item.onalamh && Item._p_onalamh)
{
OnAlamChange(Item.idx, COMM.EALAMRAISETYPE.HIGH_OFF, Item., Item., Item.CurValue, AH, AL);
OnAlamChange(Item.idx, COMM.EALAMRAISETYPE.HIGH_OFF, Item., Item., Item.CurValue, AH, AL, "");
Item._p_onalamh = false;
}
else if (!Item.onalaml && Item._p_onalaml)
{
OnAlamChange(Item.idx, COMM.EALAMRAISETYPE.LOW_OFF, Item., Item., Item.CurValue, AH, AL);
OnAlamChange(Item.idx, COMM.EALAMRAISETYPE.LOW_OFF, Item., Item., Item.CurValue, AH, AL, "");
Item._p_onalamh = false;
}
}
if (!Item. && Item.)
if ((!Item. && Item.) || Item.received == false)
{
Item._onalamover = false;
Item._onalamh = false;
@@ -942,6 +989,10 @@ namespace vmsnet.HMI
BrColor = (Color.DarkMagenta);
grp._errorcount += 1;
}
else if (Item.received == false)
{
ValueStr = "--";
}
else if (!Item.)
{
ValueStr = "--";
@@ -1282,7 +1333,7 @@ namespace vmsnet.HMI
//g.DrawString(this.window.disconnecttime.ToString(), this.Font, Brushes.Red, R.Left,R.Top);
}
grp._amp = 0;
if (grp._ampidx != "" && grp._ampidx != null)
{
@@ -1294,7 +1345,7 @@ namespace vmsnet.HMI
try
{
grp._ampdecpos = 3;
grp._amp = (float)(this.Values[di1, di2, di3 - 1] / (Math.Pow(10, grp._ampdecpos)));
grp._amp = (float)(this._Values[di1, di2, di3 - 1] / (Math.Pow(10, grp._ampdecpos)));
}
catch
{
@@ -1338,12 +1389,15 @@ namespace vmsnet.HMI
Single imgheight = 30;
if (!(grp.nbh == 0 && grp.nbl == 0))
{
if (Math.Abs(nullvalue) > grp.nbl)
//if (Math.Abs(nullvalue) > grp.nbl) // a2영역보다 크다면
/* 작성자: 이재웅, 작성일: 2025-06-17, 작성내용: 'a2영역 절대값보다 클 경우'로 변경 */
if (Math.Abs(nullvalue) > Math.Abs(grp.nbl)) // a2영역 절대값보다 크다면
{
grp._nbalam_l = true; //a2 on
if (!grp._pre_nbalam_l)
{
if (grp.AlarmType != "STOP") OnAlamChange(grp.IDX, COMM.EALAMRAISETYPE.A2_ON, COMM.EALAMTYPE., "NB", (Single)nullvalue, (Single)grp.nbl, (Single)grp.nbl);
if (grp.AlarmType != "STOP") OnAlamChange(grp.IDX, COMM.EALAMRAISETYPE.A2_ON, COMM.EALAMTYPE., "NB",
(Single)nullvalue, (Single)grp.nbl, (Single)grp.nbl, $"> {grp.nbl}");
grp._pre_nbalam_l = true;
A2 = false;
blink2 = 0;
@@ -1376,18 +1430,21 @@ namespace vmsnet.HMI
if (grp._pre_nbalam_l) //이전에 a2알람이 켜져잇엇다면 알람을 끈다.
{
OnAlamChange(grp.IDX, COMM.EALAMRAISETYPE.A2_OFF, COMM.EALAMTYPE., "NB", (Single)nullvalue, (Single)grp.nbl, (Single)grp.nbl);
OnAlamChange(grp.IDX, COMM.EALAMRAISETYPE.A2_OFF, COMM.EALAMTYPE., "NB", (Single)nullvalue, (Single)grp.nbl, (Single)grp.nbl, "");
grp._pre_nbalam_l = false;
blink1 = 0;
}
if (Math.Abs(nullvalue) > grp.nbh) //a1영역보다 크다면
//if (Math.Abs(nullvalue) > grp.nbh) // a1영역보다 크다면
/* 작성자: 이재웅, 작성일: 2025-06-17, 작성내용: 'a1영역 절대값보다 클 경우'로 변경 */
if (Math.Abs(nullvalue) > Math.Abs(grp.nbh)) // a1영역 절대값보다 크다면
{
grp._nbalam_h = true;
if (!grp._pre_nbalam_h) //이전에 발생안햇다면
{
if (grp.AlarmType != "STOP") OnAlamChange(grp.IDX, COMM.EALAMRAISETYPE.A1_ON, COMM.EALAMTYPE., "NB", (Single)nullvalue, (Single)grp.nbh, (Single)grp.nbh);
if (grp.AlarmType != "STOP") OnAlamChange(grp.IDX, COMM.EALAMRAISETYPE.A1_ON, COMM.EALAMTYPE., "NB",
(Single)nullvalue, (Single)grp.nbh, (Single)grp.nbh, $"> {grp.nbh}");
grp._pre_nbalam_h = true;
blink1 = 0;
}
@@ -1418,7 +1475,7 @@ namespace vmsnet.HMI
grp._nbalam_h = false; //a1 off
if (grp._pre_nbalam_h) //이전에 a1알람이 켜져잇엇다면 알람을 끈다.
{
OnAlamChange(grp.IDX, COMM.EALAMRAISETYPE.A1_OFF, COMM.EALAMTYPE., "NB", (Single)nullvalue, (Single)grp.nbl, (Single)grp.nbl);
OnAlamChange(grp.IDX, COMM.EALAMRAISETYPE.A1_OFF, COMM.EALAMTYPE., "NB", (Single)nullvalue, (Single)grp.nbl, (Single)grp.nbl, "");
grp._pre_nbalam_h = false;
}
blink1 = 0;
@@ -1472,7 +1529,7 @@ namespace vmsnet.HMI
//끝부분에 KA 를 표시한다.
String Kaunit = grp._ampunit;// +grp._ampidx.ToString() + "/" + grp._ampdecpos.ToString();
/* 작성자: 이재웅, 작성일: 2024-12-04, 작성내용: {전류량[KA] × 100} 변경 */
String MaxKA = (grp._amp * 10f).ToString("#0.00");
@@ -1714,7 +1771,7 @@ namespace vmsnet.HMI
if (grp.Showinfo) infogrp = grp;
//else
//{
DrawGroup(g, grp, new Point(0, 0), new SizeF(WINDOW.ITEMWIDTH, WINDOW.ITEMHEIGHT), WindowRect, , , false, visible);
DrawGroup(g, grp, new Point(0, 0), new SizeF(WINDOW.ITEMWIDTH, WINDOW.ITEMHEIGHT), WindowRect, , , false, visible);
//}
idx += 1;
@@ -2054,27 +2111,27 @@ namespace vmsnet.HMI
//if (this.FullScreen)
//{ /* 작성자: 이재웅, 작성일: 2024-12-04, 작성내용: '전체보기' 상태일 때만 그룹헤더의 [Null Balance] 팝업 정보가 표시되도록 변경 */
//마우스가 현재 그룹헤더에 존재하는지확인 (헤더에 올경우 특정 정보를 표시)
if (!Mouseinfo.Hand && !Mouseinfo.Move)
//마우스가 현재 그룹헤더에 존재하는지확인 (헤더에 올경우 특정 정보를 표시)
if (!Mouseinfo.Hand && !Mouseinfo.Move)
{
int tpidx = Check_GroupHeader(e, true);
if (tpidx != -1)
{
int tpidx = Check_GroupHeader(e, true);
if (tpidx != -1)
{
Mouseinfo.Hand = true;
this.GROUPS[tpidx].Showinfo = true;
//this.showHeaderInfo = true;
}
Mouseinfo.Hand = true;
this.GROUPS[tpidx].Showinfo = true;
//this.showHeaderInfo = true;
}
}
//마우스가 현재 그룹에 존재하는지?
if (!Mouseinfo.Hand && !Mouseinfo.Move)
}
//마우스가 현재 그룹에 존재하는지?
if (!Mouseinfo.Hand && !Mouseinfo.Move)
{
int tpidx = Check_Group(e);
if (tpidx != -1)
{
int tpidx = Check_Group(e);
if (tpidx != -1)
{
Mouseinfo.Hand = true;
}
Mouseinfo.Hand = true;
}
}
//}
if (Mouseinfo.Hand) this.Cursor = Cursors.Hand;

View File

@@ -1281,8 +1281,6 @@ namespace TrendCtrlII
base.OnSizeChanged(e);
if (this.Visible == false) return;
Console.WriteLine("OnSizeChanged");
}
void CreateBufferGraphic()

View File

@@ -38,6 +38,6 @@ using System.Runtime.InteropServices;
// 지정되도록 할 수 있습니다.
// <Assembly: AssemblyVersion("1.0.*")>
[assembly: AssemblyVersion("24.11.26.2200")]
[assembly: AssemblyFileVersion("24.11.26.2200")]
[assembly: AssemblyVersion("25.07.01.2200")]
[assembly: AssemblyFileVersion("25.07.01.2200")]

View File

@@ -74,7 +74,7 @@ namespace vmsnet
try
{
PUB.KA1_SUM += (float)(PUB.Values[di1, di2, di3 - 1] / (Math.Pow(10, _ampdecpos)));
PUB.KA1_SUM += (float)(PUB._Values[di1, di2, di3 - 1] / (Math.Pow(10, _ampdecpos)));
}
catch { }
}
@@ -89,7 +89,7 @@ namespace vmsnet
try
{
PUB.KA2_SUM += (float)(PUB.Values[di1, di2, di3 - 1] / (Math.Pow(10, _ampdecpos)));
PUB.KA2_SUM += (float)(PUB._Values[di1, di2, di3 - 1] / (Math.Pow(10, _ampdecpos)));
}
catch { }
}

View File

@@ -19,7 +19,7 @@ namespace vmsnet
VAR.Init();
//연결체크용 쓰레드
thConnection= Task.Run(() => bwDeviceConnection());
thConnection = Task.Run(() => bwDeviceConnection());
}
}

View File

@@ -9,10 +9,18 @@ namespace vmsnet
{
private void SPS_250ms()
{
if(VAR.isInit)
if (VAR.isInit)
{
VAR.STR[EVarString.MCStatus] = PUB.sm.Step.ToString();
}
//셀정보자동저장
if (PUB.sm != null && PUB.sm.Step == ESMStep.RUN && PUB.CONFIG.savetermcellinfo > 0)
{
var ts_saveCellinfo = DateTime.Now - PUB.LastWindowCellinfoSaved;
if (ts_saveCellinfo.TotalMinutes > PUB.CONFIG.savetermcellinfo)
PUB.RaiseRemoteCommandEvent(rCommand.SaveGroupClass);
}
}
private void SPS_Max()

View File

@@ -117,7 +117,16 @@ namespace vmsnet
/// </summary>
public bool opensubwindow { get; set; }
public short trashper { get; set; } ////자동삭제용량단위
/// <summary>
/// 저장주기(단위:초)
/// </summary>
public short saveterm { get; set; }
/// <summary>
/// 셀저장보 저장 주기(단위:분)
/// </summary>
public short savetermcellinfo { get; set; }
public bool seconddata { get; set; }
public bool thirddata { get; set; }
public bool getdata4 { get; set; }

View File

@@ -70,11 +70,14 @@ namespace vmsnet
this.StatusStrip1 = new System.Windows.Forms.StatusStrip();
this.ToolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel();
this.Button1 = new System.Windows.Forms.Button();
this.panel1 = new System.Windows.Forms.Panel();
this.chkResetValue = new System.Windows.Forms.CheckBox();
((System.ComponentModel.ISupportInitialize)(this.DataGridView1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.BindingSource1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.DataSet1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.DataTable1)).BeginInit();
this.StatusStrip1.SuspendLayout();
this.panel1.SuspendLayout();
this.SuspendLayout();
//
// DataGridView1
@@ -85,6 +88,7 @@ namespace vmsnet
this.DataGridView1.AutoGenerateColumns = false;
this.DataGridView1.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.AllCells;
this.DataGridView1.AutoSizeRowsMode = System.Windows.Forms.DataGridViewAutoSizeRowsMode.AllCells;
this.DataGridView1.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.DataGridView1.ColumnHeadersHeight = 40;
this.DataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
this.DataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
@@ -116,7 +120,7 @@ namespace vmsnet
this.DataGridView1.RowHeadersWidth = 50;
this.DataGridView1.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.DisableResizing;
this.DataGridView1.RowTemplate.Height = 23;
this.DataGridView1.Size = new System.Drawing.Size(1010, 461);
this.DataGridView1.Size = new System.Drawing.Size(1010, 475);
this.DataGridView1.TabIndex = 0;
this.DataGridView1.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.DataGridView1_CellContentClick);
this.DataGridView1.CellFormatting += new System.Windows.Forms.DataGridViewCellFormattingEventHandler(this.DataGridView1_CellFormatting);
@@ -146,7 +150,7 @@ namespace vmsnet
this.TypeDataGridViewTextBoxColumn.Name = "TypeDataGridViewTextBoxColumn";
this.TypeDataGridViewTextBoxColumn.Resizable = System.Windows.Forms.DataGridViewTriState.True;
this.TypeDataGridViewTextBoxColumn.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic;
this.TypeDataGridViewTextBoxColumn.Width = 125;
this.TypeDataGridViewTextBoxColumn.Width = 82;
//
// HighDataGridViewTextBoxColumn
//
@@ -156,7 +160,7 @@ namespace vmsnet
this.HighDataGridViewTextBoxColumn.HeaderText = "Manual(H)";
this.HighDataGridViewTextBoxColumn.MinimumWidth = 8;
this.HighDataGridViewTextBoxColumn.Name = "HighDataGridViewTextBoxColumn";
this.HighDataGridViewTextBoxColumn.Width = 160;
this.HighDataGridViewTextBoxColumn.Width = 108;
//
// LowDataGridViewTextBoxColumn
//
@@ -166,7 +170,7 @@ namespace vmsnet
this.LowDataGridViewTextBoxColumn.HeaderText = "Manual(L)";
this.LowDataGridViewTextBoxColumn.MinimumWidth = 8;
this.LowDataGridViewTextBoxColumn.Name = "LowDataGridViewTextBoxColumn";
this.LowDataGridViewTextBoxColumn.Width = 156;
this.LowDataGridViewTextBoxColumn.Width = 105;
//
// AhighDataGridViewTextBoxColumn
//
@@ -176,7 +180,7 @@ namespace vmsnet
this.AhighDataGridViewTextBoxColumn.HeaderText = "Auto(±)";
this.AhighDataGridViewTextBoxColumn.MinimumWidth = 8;
this.AhighDataGridViewTextBoxColumn.Name = "AhighDataGridViewTextBoxColumn";
this.AhighDataGridViewTextBoxColumn.Width = 127;
this.AhighDataGridViewTextBoxColumn.Width = 87;
//
// AlowDataGridViewTextBoxColumn
//
@@ -187,7 +191,7 @@ namespace vmsnet
this.AlowDataGridViewTextBoxColumn.MinimumWidth = 8;
this.AlowDataGridViewTextBoxColumn.Name = "AlowDataGridViewTextBoxColumn";
this.AlowDataGridViewTextBoxColumn.Visible = false;
this.AlowDataGridViewTextBoxColumn.Width = 103;
this.AlowDataGridViewTextBoxColumn.Width = 71;
//
// nbhh
//
@@ -196,7 +200,7 @@ namespace vmsnet
this.nbhh.MinimumWidth = 8;
this.nbhh.Name = "nbhh";
this.nbhh.Visible = false;
this.nbhh.Width = 113;
this.nbhh.Width = 81;
//
// nbh
//
@@ -206,7 +210,7 @@ namespace vmsnet
this.nbh.HeaderText = "NullB(Alarm1)";
this.nbh.MinimumWidth = 8;
this.nbh.Name = "nbh";
this.nbh.Width = 199;
this.nbh.Width = 131;
//
// nbl
//
@@ -216,7 +220,7 @@ namespace vmsnet
this.nbl.HeaderText = "NullB(Alarm2)";
this.nbl.MinimumWidth = 8;
this.nbl.Name = "nbl";
this.nbl.Width = 199;
this.nbl.Width = 131;
//
// nbll
//
@@ -225,7 +229,7 @@ namespace vmsnet
this.nbll.MinimumWidth = 8;
this.nbll.Name = "nbll";
this.nbll.Visible = false;
this.nbll.Width = 109;
this.nbll.Width = 79;
//
// BindingSource1
//
@@ -324,10 +328,10 @@ namespace vmsnet
this.StatusStrip1.ImageScalingSize = new System.Drawing.Size(24, 24);
this.StatusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.ToolStripStatusLabel1});
this.StatusStrip1.Location = new System.Drawing.Point(0, 529);
this.StatusStrip1.Location = new System.Drawing.Point(0, 536);
this.StatusStrip1.Name = "StatusStrip1";
this.StatusStrip1.Padding = new System.Windows.Forms.Padding(1, 0, 20, 0);
this.StatusStrip1.Size = new System.Drawing.Size(1010, 29);
this.StatusStrip1.Size = new System.Drawing.Size(1010, 22);
this.StatusStrip1.TabIndex = 2;
this.StatusStrip1.Text = "StatusStrip1";
//
@@ -335,29 +339,50 @@ namespace vmsnet
//
this.ToolStripStatusLabel1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.999999F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129)));
this.ToolStripStatusLabel1.Name = "ToolStripStatusLabel1";
this.ToolStripStatusLabel1.Size = new System.Drawing.Size(423, 22);
this.ToolStripStatusLabel1.Size = new System.Drawing.Size(373, 17);
this.ToolStripStatusLabel1.Text = "개별알람 및 개별알람(자동)으로 설정된 셀은 영향을 받지 않습니다.";
//
// Button1
//
this.Button1.Dock = System.Windows.Forms.DockStyle.Bottom;
this.Button1.Dock = System.Windows.Forms.DockStyle.Fill;
this.Button1.Font = new System.Drawing.Font("Microsoft Sans Serif", 14F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.Button1.Location = new System.Drawing.Point(0, 461);
this.Button1.Location = new System.Drawing.Point(0, 0);
this.Button1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.Button1.Name = "Button1";
this.Button1.Size = new System.Drawing.Size(1010, 68);
this.Button1.Size = new System.Drawing.Size(858, 61);
this.Button1.TabIndex = 3;
this.Button1.Text = "저장";
this.Button1.UseVisualStyleBackColor = true;
this.Button1.Click += new System.EventHandler(this.Button1_Click);
//
// panel1
//
this.panel1.Controls.Add(this.Button1);
this.panel1.Controls.Add(this.chkResetValue);
this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom;
this.panel1.Location = new System.Drawing.Point(0, 475);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(1010, 61);
this.panel1.TabIndex = 4;
//
// chkResetValue
//
this.chkResetValue.Dock = System.Windows.Forms.DockStyle.Right;
this.chkResetValue.Location = new System.Drawing.Point(858, 0);
this.chkResetValue.Name = "chkResetValue";
this.chkResetValue.Padding = new System.Windows.Forms.Padding(10, 0, 0, 0);
this.chkResetValue.Size = new System.Drawing.Size(152, 61);
this.chkResetValue.TabIndex = 0;
this.chkResetValue.Text = "알람 기준값 초기화";
this.chkResetValue.UseVisualStyleBackColor = true;
//
// Frm_Alam
//
this.AutoScaleDimensions = new System.Drawing.SizeF(14F, 29F);
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1010, 558);
this.Controls.Add(this.DataGridView1);
this.Controls.Add(this.Button1);
this.Controls.Add(this.panel1);
this.Controls.Add(this.StatusStrip1);
this.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(129)));
this.KeyPreview = true;
@@ -372,6 +397,7 @@ namespace vmsnet
((System.ComponentModel.ISupportInitialize)(this.DataTable1)).EndInit();
this.StatusStrip1.ResumeLayout(false);
this.StatusStrip1.PerformLayout();
this.panel1.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
@@ -406,6 +432,8 @@ namespace vmsnet
internal System.Windows.Forms.DataGridViewTextBoxColumn nbl;
internal System.Windows.Forms.DataGridViewTextBoxColumn nbll;
private System.ComponentModel.IContainer components;
private Panel panel1;
private CheckBox chkResetValue;
}
}

View File

@@ -65,7 +65,10 @@ namespace vmsnet
if (CDT == null)
{
//MsgBox("변경된 내용이 없습니다", MsgBoxStyle.Information, "확인")
this.DialogResult = System.Windows.Forms.DialogResult.Cancel;
if (chkResetValue.Checked)
this.DialogResult = DialogResult.OK;
else
this.DialogResult = System.Windows.Forms.DialogResult.Cancel;
}
else
{
@@ -94,8 +97,7 @@ namespace vmsnet
////설정바꾼다.
PUB.RaiseRemoteCommandEvent(rCommand.UpdateAlarmSetting,idx);
//각 창별로 window1.grp / window2.grp 의 파일에 그룹상태를 저장 합니다
PUB.RaiseRemoteCommandEvent(rCommand.SaveGroupClass);
}
this.DialogResult = System.Windows.Forms.DialogResult.OK;
}

File diff suppressed because it is too large Load Diff

View File

@@ -180,6 +180,8 @@ namespace vmsnet
this.chk_lsb.Checked = PUB.CONFIG.lsb;
this.tb_trashper.Text = PUB.CONFIG.trashper.ToString();
this.tb_saveterm.Text = PUB.CONFIG.saveterm.ToString();
this.tb_savetermCellInfo.Text = PUB.CONFIG.savetermcellinfo.ToString();
this.chk_2nddata.Checked = PUB.CONFIG.seconddata;
this.chk_3rdData.Checked = PUB.CONFIG.thirddata;
this.chk_4thData.Checked = PUB.CONFIG.getdata4;
@@ -348,6 +350,25 @@ namespace vmsnet
return;
}
if (short.TryParse(this.tb_saveterm.Text, out short v_saveterm) == false)
{
UTIL.MsgE("저장주기를 입력하세요");
this.tb_saveterm.Focus();
return;
}
if (short.TryParse(this.tb_savetermCellInfo.Text, out short v_savetermCellInfo) == false)
{
UTIL.MsgE("셀정보 저장주기를 입력하세요");
this.tb_savetermCellInfo.Focus();
return;
}
if(short.TryParse(this.tb_trashper.Text, out short v_trashper) == false)
{
UTIL.MsgE("디스크 정리주기를 입력하세요");
this.tb_trashper.Focus();
return;
}
//데이터베이스적용
PUB.DS.Clear();
PUB.DS.Merge(this.DocumentElement1);
@@ -367,8 +388,10 @@ namespace vmsnet
PUB.CONFIG.synctime = this.chk_synctime.Checked;
PUB.CONFIG.databasefolder = this.tb_savepath.Text;
PUB.CONFIG.lsb = this.chk_lsb.Checked;
PUB.CONFIG.trashper = short.Parse(this.tb_trashper.Text);
PUB.CONFIG.saveterm = short.Parse(this.tb_saveterm.Text);
PUB.CONFIG.trashper = v_trashper;// short.Parse(this.tb_trashper.Text);
PUB.CONFIG.saveterm = v_saveterm;// short.Parse(this.tb_saveterm.Text);
PUB.CONFIG.savetermcellinfo = v_savetermCellInfo;// short.Parse(this.tb_savetermCellInfo.Text);
PUB.CONFIG.seconddata = this.chk_2nddata.Checked;
PUB.CONFIG.thirddata = this.chk_3rdData.Checked;
PUB.CONFIG.getdata4 = this.chk_4thData.Checked;

View File

@@ -124,7 +124,7 @@
<data name="bt_save.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAWfSURBVFhH7ZZrTFNnHMaZFu/Oy3QxE5cQk12yGS+oUbm0
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAWfSURBVFhH7ZZrTFNnHMaZFu/Oy3QxE5cQk12yGS+oUbm0
WqWES6HQc3oDoqCACDjBTRCxjhF1uDjdCNOBMgzqFJB6w4EDKZeWm7QqKligBHFbsmTf9sFkybP8j3JG
3zoU93VP8qTved/n/3venvRDPTz+1ziUd9Vj4cGfJCl51ZIbedUTOo03JH+RaU17wtlVj4Xs3H9W7jVP
n7zrE4uP/jwfFV0haHXmwD58BEN/lAumNe3RGWUoSzMs57X0xdWJ+V/VzkPdw0QM/F6Ent8O4t6TXeh6
@@ -263,7 +263,7 @@
<data name="toolStripButton1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAIFSURBVDhPpZLtS1NhGMbPPxJmmlYSgqHiKzGU1EDxg4iK
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIFSURBVDhPpZLtS1NhGMbPPxJmmlYSgqHiKzGU1EDxg4iK
YKyG2WBogqMYJQOtCEVRFBGdTBCJfRnkS4VaaWNT5sqx1BUxRXxDHYxAJLvkusEeBaPAB+5z4Jzn+t3X
/aLhnEfjo8m+dCoa+7/C3O2Hqe0zDC+8KG+cRZHZhdzaaWTVTCLDMIY0vfM04Nfh77/G/sEhwpEDbO3t
I7TxE8urEVy99fT/AL5gWDLrTB/hnF4XsW0khCu5ln8DmJliT2AXrcNBsU1gj/MH4nMeKwBrPktM28xM
@@ -278,7 +278,7 @@
<data name="toolStripButton2.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAIFSURBVDhPpZLtS1NhGMbPPxJmmlYSgqHiKzGU1EDxg4iK
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIFSURBVDhPpZLtS1NhGMbPPxJmmlYSgqHiKzGU1EDxg4iK
YKyG2WBogqMYJQOtCEVRFBGdTBCJfRnkS4VaaWNT5sqx1BUxRXxDHYxAJLvkusEeBaPAB+5z4Jzn+t3X
/aLhnEfjo8m+dCoa+7/C3O2Hqe0zDC+8KG+cRZHZhdzaaWTVTCLDMIY0vfM04Nfh77/G/sEhwpEDbO3t
I7TxE8urEVy99fT/AL5gWDLrTB/hnF4XsW0khCu5ln8DmJliT2AXrcNBsU1gj/MH4nMeKwBrPktM28xM
@@ -623,7 +623,7 @@
<data name="bt_remakelist.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAZPSURBVFhH7ZJrTFRnHsatvaXtZpveku1lm/RLP7SdghFZ
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAZPSURBVFhH7ZJrTFRnHsatvaXtZpveku1lm/RLP7SdghFZ
15Tih03ELt0IzDlzgVK8FFbFWky7EWozbdNL2rCVRUS8UECwVooSUFRSRSwCMzADBRGYC2eYGeZ6zpxz
hmGm2mzybN7jMpEDDNp+9Ul+Oe+85/9/nv/7zlm27K7u6g60umTw2ZSPTIUpe/rPpZSYjC/tMf2XQNbS
3kemQlIj7/vdWlNiSkr50Fj9bo0Zp4c42LgopsTr4CI3EIzekNbmQBTtIzx21VlAateUGJLkPncunW75

View File

@@ -14,6 +14,7 @@ using System.Runtime.CompilerServices;
using System.Linq;
using System.Threading.Tasks;
using vmsnet;
using System.Xml;
namespace vmsnet
{
@@ -47,10 +48,14 @@ namespace vmsnet
public static DigitalIndicator indicator;
public static int sleepoffset = 0; ////쓰레드슬립시간
/// <summary>
/// 데이터를 수신받았는지 체크
/// </summary>
public static bool[,,] Received;
/// <summary>
/// 측정값(전압)이 들어있다(mcidx/unitno/chidx)
/// </summary>
public static int[,,] Values;
public static int[,,] _Values;
/// <summary>
/// 측정값(시간)이 들어있다(mcidx/unitno/chidx)
/// yyyy-MM-dd HH:mm:ss
@@ -84,6 +89,7 @@ namespace vmsnet
public static FMain mainWindow;
public static DocumentElement DS = new DocumentElement();
public static bool runerror = false; ////실행오류
public static DateTime LastWindowCellinfoSaved = DateTime.Now;
public static string lastStatueMessage = "";
@@ -122,7 +128,7 @@ namespace vmsnet
}
public static void RaiseRemoteCommandEvent(rCommand cmd, object data = null)
{
{
RemoteCommandEvent?.Invoke(null, new RemoteCommand(cmd, data));
}
@@ -219,16 +225,17 @@ namespace vmsnet
/// <returns></returns>
public static bool AddMeasureValue(int mcidx, int unit, int ch, int value, string time)
{
var l0 = PUB.Values.GetUpperBound(0) + 1; //mc array size
var l1 = PUB.Values.GetUpperBound(1) + 1; //unit array size
var l2 = PUB.Values.GetUpperBound(2) + 1; //ch array size
var l0 = PUB._Values.GetUpperBound(0) + 1; //mc array size
var l1 = PUB._Values.GetUpperBound(1) + 1; //unit array size
var l2 = PUB._Values.GetUpperBound(2) + 1; //ch array size
if (mcidx < l0 && unit < l1 && ch > 0 && ch <= l2)
{
try
{
PUB.Values[mcidx, unit, ch - 1] = value;
PUB._Values[mcidx, unit, ch - 1] = value;
PUB.Times[mcidx, unit, ch - 1] = time;
PUB.Received[mcidx, unit, ch - 1] = true;
return true;
}
catch (Exception)
@@ -596,15 +603,22 @@ namespace vmsnet
public static void SaveGroupClass(HMI.CGROUP[] grous, System.IO.FileInfo fi)
{
LastWindowCellinfoSaved = DateTime.Now;
////그룹정보를 파일로 직렬화저장
try
{
if (fi.Directory.Exists == false) fi.Directory.Create();
System.IO.FileStream fs2 = new System.IO.FileStream(fi.FullName, System.IO.FileMode.Create);
var tempfile = fi.FullName + ".temp";
System.IO.FileStream fs2 = new System.IO.FileStream(tempfile, System.IO.FileMode.Create);
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf2 = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
bf2.Serialize(fs2, grous);
fs2.Close();
PUB.log.Add(AR.Log.ETYPE.NORMAL, "그룹정보파일 저장완료");
System.IO.File.Copy(tempfile, fi.FullName, true);
}
catch (Exception ex)
{
@@ -783,7 +797,9 @@ namespace vmsnet
////master-K 231120 chi
masterk = new arDev.MasterK();
indicator = new DigitalIndicator();
//indicator = new DigitalIndicator();
/* 작성자: 이재웅, 작성일: 2025-06-26, 작성내용: DigitalIndicator() 생성자의 인자로 (byte)PUB.CONFIG.indicator_slaveno 추가 */
indicator = new DigitalIndicator((byte)PUB.CONFIG.indicator_slaveno);
////init Folder
workmsg("Init Dir");

View File

@@ -1,3 +1,7 @@
..\
1) DesignSetting.xml
2) Setting.xml
..\Database\Config
위 경로에 아래 설정파일들이 존재한다.