Compare commits
	
		
			10 Commits
		
	
	
		
			cbb7d14753
			...
			9958dd0cf8
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 9958dd0cf8 | ||
|   | 00683decda | ||
|   | 891b394854 | ||
|   | bdd929a984 | ||
|   | e46b1c709b | ||
|   | 229ec8be66 | ||
|   | b189af27c3 | ||
|   | d4c6715811 | ||
|   | c1ba388b5a | ||
|   | 6e777e9599 | 
							
								
								
									
										6
									
								
								Sub/arMasterK/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								Sub/arMasterK/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| ################################################################################ | ||||
| # 이 .gitignore 파일은 Microsoft(R) Visual Studio에서 자동으로 만들어졌습니다. | ||||
| ################################################################################ | ||||
|  | ||||
| /Project/bin/Debug | ||||
| /Project/.vs | ||||
							
								
								
									
										61
									
								
								Sub/arMasterK/Demo/Demo.csproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								Sub/arMasterK/Demo/Demo.csproj
									
									
									
									
									
										Normal 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> | ||||
							
								
								
									
										86
									
								
								Sub/arMasterK/Demo/Program.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								Sub/arMasterK/Demo/Program.cs
									
									
									
									
									
										Normal 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); | ||||
|         } | ||||
|  | ||||
|     } | ||||
| } | ||||
							
								
								
									
										36
									
								
								Sub/arMasterK/Demo/Properties/AssemblyInfo.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								Sub/arMasterK/Demo/Properties/AssemblyInfo.cs
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										28
									
								
								Sub/arMasterK/MasterK.sln
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										2
									
								
								Sub/arMasterK/Project/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| /MasterK.v12.suo | ||||
| /MasterK.sln | ||||
							
								
								
									
										236
									
								
								Sub/arMasterK/Project/EnumAStruct.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										236
									
								
								Sub/arMasterK/Project/EnumAStruct.cs
									
									
									
									
									
										Normal 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; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										131
									
								
								Sub/arMasterK/Project/EventArgs.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										131
									
								
								Sub/arMasterK/Project/EventArgs.cs
									
									
									
									
									
										Normal 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 | ||||
|  | ||||
|     } | ||||
| } | ||||
							
								
								
									
										13
									
								
								Sub/arMasterK/Project/History.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								Sub/arMasterK/Project/History.txt
									
									
									
									
									
										Normal 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 | ||||
							
								
								
									
										686
									
								
								Sub/arMasterK/Project/MasterK.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										686
									
								
								Sub/arMasterK/Project/MasterK.cs
									
									
									
									
									
										Normal 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 | ||||
|  | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										230
									
								
								Sub/arMasterK/Project/Parser.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										230
									
								
								Sub/arMasterK/Project/Parser.cs
									
									
									
									
									
										Normal 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; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|     } | ||||
| } | ||||
							
								
								
									
										36
									
								
								Sub/arMasterK/Project/Properties/AssemblyInfo.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								Sub/arMasterK/Project/Properties/AssemblyInfo.cs
									
									
									
									
									
										Normal 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")] | ||||
							
								
								
									
										63
									
								
								Sub/arMasterK/Project/Properties/Resources.Designer.cs
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								Sub/arMasterK/Project/Properties/Resources.Designer.cs
									
									
									
										generated
									
									
									
										Normal 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; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										117
									
								
								Sub/arMasterK/Project/Properties/Resources.resx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								Sub/arMasterK/Project/Properties/Resources.resx
									
									
									
									
									
										Normal 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> | ||||
							
								
								
									
										26
									
								
								Sub/arMasterK/Project/Properties/Settings.Designer.cs
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								Sub/arMasterK/Project/Properties/Settings.Designer.cs
									
									
									
										generated
									
									
									
										Normal 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; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										7
									
								
								Sub/arMasterK/Project/Properties/Settings.settings
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								Sub/arMasterK/Project/Properties/Settings.settings
									
									
									
									
									
										Normal 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> | ||||
							
								
								
									
										425
									
								
								Sub/arMasterK/Project/Util.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										425
									
								
								Sub/arMasterK/Project/Util.cs
									
									
									
									
									
										Normal 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&skin=sunburst&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 | ||||
|  | ||||
|       | ||||
|     } | ||||
| } | ||||
							
								
								
									
										213
									
								
								Sub/arMasterK/Project/Write.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										213
									
								
								Sub/arMasterK/Project/Write.cs
									
									
									
									
									
										Normal 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; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										100
									
								
								Sub/arMasterK/Project/arMasterK.csproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								Sub/arMasterK/Project/arMasterK.csproj
									
									
									
									
									
										Normal 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> | ||||
							
								
								
									
										144
									
								
								Sub/arMasterK/Project/fIOMonitor.Designer.cs
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										144
									
								
								Sub/arMasterK/Project/fIOMonitor.Designer.cs
									
									
									
										generated
									
									
									
										Normal 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; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										77
									
								
								Sub/arMasterK/Project/fIOMonitor.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								Sub/arMasterK/Project/fIOMonitor.cs
									
									
									
									
									
										Normal 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); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										120
									
								
								Sub/arMasterK/Project/fIOMonitor.resx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								Sub/arMasterK/Project/fIOMonitor.resx
									
									
									
									
									
										Normal 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> | ||||
| @@ -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); | ||||
|   | ||||
| @@ -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()) | ||||
|                 { | ||||
|   | ||||
| @@ -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); | ||||
|   | ||||
| @@ -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 }; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1589,12 +1589,12 @@ namespace vmsnet | ||||
|                 } | ||||
|         } | ||||
|  | ||||
|         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 +2249,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()) | ||||
|             { | ||||
|   | ||||
							
								
								
									
										24
									
								
								cVMS.NET_CS/Frm_Sub.Designer.cs
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										24
									
								
								cVMS.NET_CS/Frm_Sub.Designer.cs
									
									
									
										generated
									
									
									
								
							| @@ -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); | ||||
|   | ||||
| @@ -844,13 +844,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) | ||||
|   | ||||
| @@ -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> | ||||
|         iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 | ||||
|         YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAZoSURBVFhHxVZrTJV1HHYD1yfOezRTyzxe0jTLbLQ214fa | ||||
|         Wh9aW2tzbdXWXNltTRFBM0URRERJReBwDnhBBOR+P5qlIqjcwrsmIuIVFA04F6Ay54en5/d/33OOiBZu | ||||
|         uH7bs+d3fZ+Hc867MUwi5ejIVHuT5Q/7ucl/2Jseja2nx3Wrg6EOW6MFd+7+iZa7SY9E29+Zasd+1ALj | ||||
|         bOjC9qsFDZ7vsPuW+V8hO7JrnA1dpDRYUO/56qGi96Pe8w2sDeOH3kBynQV17s/hoIhAxBwdeq7YQL17 | ||||
|         HpLrn4CBpNrxqHV9hoqbZkKDg6xE7+MKcq17LmTXOBu6SKyxoMb1McoNAzrMKL8htR81rk+RWPMEDCQc | ||||
|         seCwcw7K2zUlWmZA8vJ2f33E+RFkV26i8v/6JCK/pz2uvBdxZYI+gwn2Ykt6ZquHDyY2Vk9AdfcHKKNY | ||||
|         KU2Uimgb8zaNPYH0zTjU/SE2VusGwlIvqdfywPU7AyB9mauHDyY2VE3Awa73UHKd4hQuobAOCquenld1 | ||||
|         vY8NNCs3i+yXkF7Xh/g9Hvwo2O3x5en1fQjjXD18MBFfOREHfn8HxRQTE8XXvDCzR0PSIyo730V8pd/A | ||||
|         1ppexIvwbjeF3Yqllr7M1cMHE+v2T8S+22+hkKJFVzUUEoppoEj1zKq3//bbkF25CbO3Iu0wDTjEgAfr | ||||
|         FdMAOe2QGGgdvIG4XyZib8dsFF7RUEAUXqGg4v75zx1vIm7fJOMTaIWtqkcJrneIsFuxQPqPZSB27yTs | ||||
|         uRGM/Muajks6F3hzAz/dfAOxP+sGQm0XYa3swboKtwHdiMB6oAehtscwELNnMhxtM5HXqiGXQrlkyRVY | ||||
|         e9nRPguyKzdiIPEXD9aVew34kbjPg0Wcq4cPJqIdU1B2bTpyLpqQS+Rc1JBDUeFcyY1e2bUZiHa8YBho | ||||
|         waafKCgGytx8912EXm/c60Zoit9A59rRuB9G2x9RFVNQfPkF7GoxERqyDd51waTy7AuS8w25+iKiKvwG | ||||
|         NvDHFyfiZRQn1jIXyCspc9kTwXsNc/thgInIsqkoaJ2A7GYRMyGrWfODwt684NIkRJZOVccLUy5gfQVF | ||||
|         S12ILXUTei5Yz69hYYpu4OLiSehLCeiH1iX61+iLFSXTkNsyDjvOashsMiHzPNHE/LyGnYTU6WfMyGt5 | ||||
|         HitKXjQMtPCvpXiJU4nHlvgRx3qhVTfQHD7QQMti/VX2RUTRdP71Y7DtpBkZ5zQdNJJBExnnyMTW42bu | ||||
|         jEVE0TTdgPUCYoudWEMDaygqiC3WWSBz2Tu3aCL6rAHo2RyAXooLnw97wMDywpews2kU0o6Zkf6bCTsU | ||||
|         NIOJsyakNpr5qTyD5TQrNwuTmxFDA6sLurBGjBQJXKy7FYcYBs6GTkBfMoU3Beq8MRC/sSczXyzLn4H0 | ||||
|         s2bYGkbwozZhu4Jm5Bq204CtbgTNjMCyghnqOEQMFDoRnd9JdiGGBoSj86R2QuaydypkPHop7I6ngaQA | ||||
|         eH4MxJmQB/6t+yHvZWw7bYK1doTigQhC8hGZaVjGXbkJSWrGagqtyrmt2AtvvYBz2Tsx/3n0JtLAukDF | ||||
|         LvLJ+Q/8T7E0bya2njIh6fBIbCELpPZC6sRDI1W+NO8Vw8B5RBc4EZl9i9ztg9Sr2V/Auewd+26c+t6d | ||||
|         awIVu2IDcZymZOaLpTkzkXYiCIlVTyPtpOk+BGGLkW8+yNkJGsidqY5FIDrfiZVZN8ndiDKwMqtDsddA | ||||
|         w7c0kEADMcN93EhTMvPF97teRSofnkCR1OMm2I8HsSbIdtbSS6iUWRC+z3lVHc+ngAit2HkDUXkUN+Ct | ||||
|         vQbqv32OP7wAdEfRgMEN7MnMF0t2zYL9WBASDoxSbD/GHx3FbMwVaGDT/lHMTViSPUs3kEgDuRTMaMcq | ||||
|         8iqKCqSW/oKkJrVX+/VY/vAC0BU53Md13zzb38DirNeQcjRIiQinHDUptqlcWDcg+eLs1wwDTUo4IqNN | ||||
|         N0BEGrXwAs5l7/CXY+CJp/AKGiB3rhyOI1+N7W8gPCsY1kbdwL/B2mhCOM3KjW6gCxE7rg+AmJG57FXP | ||||
|         G4MuinaEPqXQuXw4xJTMfBGeGYwdp6dj+8nJPkj9MMiu3IhAzJ57j4TXQBUNuOLkNeQbEBeouPoBA5bw | ||||
|         zNcRtjOYD9dZgULhvh5BFnFhORKB/4LsHfxiNARVPoxRtcy8EUzM+R9A3WHD/gG8ZzhJD4PJLAAAAABJ | ||||
|         RU5ErkJggg== | ||||
|         YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAabSURBVFhHxZZ7TJPnHsebtGR/9X1fL2e4oUXdzbk5F8yS | ||||
|         ZX9syXL+ODnJsmRZsi05Wc7x7MwYLwg6pyCCWIsoskIvMCdoubQUaAuVuakIKrch4AUt9ykXQQdt3xZ2 | ||||
|         Ocv++C6/533bQhnbjFv2JJ98f8/z/B5+n0BKqlAoFArjlcUFZo/mW/Ot1d+aPQtz/Hqcl/r/8GVq1+CH | ||||
|         H79D/495CzL6fwvrMV/RIPr9Qy/TVxq0BTbj9D3hV6Ee6o1+/9DL2KZBa+CDeQOjaQ18CEPbij9eIL9F | ||||
|         gxbx33DfExg0zD0h1SxlWsWNyG/9EwTymleg2f8v1I4LqB3n4R6Xh87K2gkBzeL7oN7o9w+99E0aNPnf | ||||
|         QY0sICGg5i7tIzT534O+6U8QyL2swSXfW6gZ49lQlwzVNWOR/WXf26BeepNe8f27KRXBMV3NNHQuYkbO | ||||
|         adCZ1hF8OXrOgiunMR6N3jfgGhPgHOPhpKGjApyjPFxjBJ0LuOh9EzmNkkBSwRD7WJ4f+WEedE730XMW | ||||
|         XEcb4nFh6h9wjPBwjgpwjPIyApzsTKobpv6Jo43x7AfvMA+hqGUG2XUBHCFOB8J1UesMkswPIJBdvxLn | ||||
|         v3kd1SM8k6geDiGgekSQzkZ41E/+Hdn1EYHjTdPIpsGnRRypE1nSns7pPnrOgivr3Eqcvf8qKod5VN3h | ||||
|         UXlHzmEBVexMYGfn7r8G6qU3SeZBFF6aRrabBAI4zFJk+8KLJDD4+wV0X67EmYmXUXmbh/02j8rbAqsl | ||||
|         IvUXE69Ad3aV/BsYhKkhyAYedtNgkSVB5w8koD2zCnV3E1DxNS8xJKU9VMt8Pv4StF9IAommARjqg8iq | ||||
|         FWUkEcJwPohE0wMIZNathnt0HWyDPKxDPKyDPKsZQ5F0j60H9dIbEtB/GUBWTUgggv5sADtMA79fIMP9 | ||||
|         JFzDa1A+wME6wKF8gEf5IM/SSrV85hpeiwz3E7JAP459LkoCLhG6Gj90VNeIyDkjItEYEZg89ChmM2c4 | ||||
|         rfTaJ1H99RMo6+dQ1s+jVM6yPo7VpX1U83DceRrptRGBo6cD0NFwl59xyCUy6CNJ96HhP7W9P4d5Emmu | ||||
|         p2AfjEdpLw3jUNLLR+iL1PahVUhzPsUebzf24XCtH4ecfmidIrROqSYO14rYbpQEBnauwoxROYfBXdKf | ||||
|         MbxSHc/A2h+H4m4eFg8HSw8Hi4eHpYfHqR5KDkU3BNj6lyPV8bQs0I9DLj+0Dh8brnVE0Dn92G6QBHqT | ||||
|         5wv075Q+yuGVUrUGpb2x+OyqgJO3eAkPh5MeqjnG8U4Bpb3LkFL1jCRg6IO22oeDDsLP0FZLSdA99d3a | ||||
|         sRIzBiWCnygxbZSyJylKYG/lszjlWYrCDgFFNzkUM3g5ORR3cyhoF2Dx/A17q9ZIAvm9yKz24YB9CgdJ | ||||
|         pIrw44Ddy3KbLNCdGI+ZfCWCx1RS5qhwM1H6bxpeeyrWoqhbgKltEYpucDjB4OWax4luDqaWRSi+uQh7 | ||||
|         7GvZ420kUOlDRsUkMiv9yKzyscyw0d4Huqe+a9tWYDpfCTFbhZk8JQJHVLixLepr3ce25/DZdQ6G5kUs | ||||
|         56NG/mW647HH9pwkkNeLA5U+7C+/zzJEaL81TxLo2rIc03olxCwVS3+WCle3RH2n2G1bh+PXOORdWoxP | ||||
|         r3EM2oegvf7iYlbvtj0vC/Qgw+5DWuk9ZNi9YWh/wE4CPayvY3Mc+7v7DqpY+rUqdG5ZHiVQvg6FXWro | ||||
|         G5ag8Co3CzU+letPLixBYReH3dZ17DENyKjwYV/JODIqvEiX2VcywTIk0LYpDsFcJXyZMeFs3xw3V+Cj | ||||
|         shdQ0MUh98ISFHRyMHeqUdClRkGnGuZOjp3l1tOdGh+Vv8Aeb8nrYYNST91Fus0bJrQPCbRuehzBHCW8 | ||||
|         6THhbNv0+FyBXWXrYe5QI/f8UpbmDg6mTjVMHTKdHI6dWwpTB4ddpeslAX0P0q1epJ4cw36rF/ttErSn | ||||
|         8615HtbX/L9lCBxRYiotJpwtHz42V2BnyYswXlGzIZTGKxxLE6spJQGqd5a+KAt42OCUk6OSgNWLNHlP | ||||
|         uVUvCVz6bywC2UpMpcawnNwXg8sfLJsrkFySAEO7JPBrGNo5JJfMFphCSvHIPEiG7qmvcWMspvbFYCLx | ||||
|         Ecbk3hiQ1FwBSwKKr6/Biaurw9D+l6DekEBm3U8LEhJo2BgLv44+hkr4dSqWjVECmmTLBiSdSkAoGZYE | ||||
|         JIfPNiDJsoENpwwJ/BbUd+E/j4JoCBPL9rMFEhQKxVt/ATRX8TO8ZzhJn31RwgAAAABJRU5ErkJggg== | ||||
| </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> | ||||
|         iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 | ||||
|         YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAABglSURBVHhe7ZsHeJPX1ccVbEveljyw2Q3NKkmTNIMAARSM | ||||
|         2ZQVGzxIDMZgPMCEEMhEhEAC6ZedQkKafnm+p2nTtGkK2GAbiMB4MDzwwEPylry3zfTQ+c65732lV7YM | ||||
|         zmr7Pc93n+cfKbL03vP7n3PPva9sZP8/fuZRGOPjWhKnWqCLVb2hi1Gd0se4G3UbXa7g85v4Wg8TPi+J | ||||
|         db2qj1I16Tcqz5VGq97Dz6zCz/rxy/zfGrpNnmMRYldJjGs1wVWG+/TW7bgTmjQPQNu+J6Hj/bnQ8fEi | ||||
|         uPa3zXD98Ivssf3DBdD2u5nQvOshqH/xl6BV+/Xr8bOo1tJo5ef6WI9H+OX/MwfIZHcUxyqX6KM9ivVh | ||||
|         qhuarWNNLXsnQ8eBpdDx2Uro+HAhdPzXU9D55hTo3P0wdO76NXTj8yvvBUD3/mnQ+Tq+tvdx6EQTOj6Y | ||||
|         Dx2HAqHjkxXQun8GaHZMNJXFeN4silE1lsSqttY8N9aJT/vvHwReGqMKKYlWNlTEefU0aR6CjoPLBVG2 | ||||
|         X50EHc+Pgc6to6Hz+dHQhc+ZttkQ/xm9r3PrGOh4+R7oIBM/XswMaUHDCuN9+9gSilbu/LcbgeV5f3GM | ||||
|         x2UCb979CHR8Ggjt7/hD+8v3Qnu8H7Rv8YOO50YxMQNEE0TYIeEFiZ+l67TvuAva909nc7TumyEYISyP | ||||
|         RTycf90AjWxEabTHW7kxHtc1L91jomy3v62G1m2/gLbNI6Et3hcNQJEBQ5nAgaWyBU+fZwbg9ei6bVgZ | ||||
|         7XufYMuj6fVHgJaGLkZ5onyDyoOH9/MO6sy6aNWlyjjvnrZ3A6D9gwXQuv0uaI3zgdZNCE8GbLYYYF0F | ||||
|         1iYMkvgzfJ/4GfEazAC8Ll2f5mndOg7afzcL2n+/BBvmmH6shubiWPfHeJg/z8DuPgnXe5vm+Qmm9gPL | ||||
|         oO2NydAc6wMtsd7QQgZITSADuAnSKhCMkMJaS/q+QdkX4XEemo/mbX3lfjRhKTS8ej8UrnO/VhKjWsnD | ||||
|         /WlHcbRqmi7cubv+pfug/eMl0LLjbmiO9oLmGIQfaAAzQQja3AsGmEASKkLQwJ9Z4P04PIrgBxjA5t8y | ||||
|         FtremwvNe6YALUtdrMcWHvZPM0pjPJ+gztuw80FW8k3xY6Bpoyc0MQOGMEG6FLgJIlDLZj9oiPWD2mhf | ||||
|         MG70hboYX2iM84NWfN0Mzt87qPQHwNP8FEdTLM739lPQgjsPbcM/mQklcV736WKcuuqx1NrenQuNGHhj | ||||
|         lAoamQGe1lWAy0E0QGpCXfRIKF/ng2vVuz83xAtImlAfU17EhL688Am9WvWo/txQb/Y6vUezxttUswEh | ||||
|         0ZA2Jg4vGsCXHTOA4DEOiqdxoxe0vvkkNL85jVXCj14O+dEeKmoumu13mdrem4fwvtCwQSkYEIUGiFUg | ||||
|         NYEMQDXHIXSEtwCEsAU7JvVd/GwnnPzyICR+/Sc4cuQw6ohEh+HYX/4btAd2gkYTYtKqx/VrQrxNmvhf | ||||
|         mtrenApd7/lD2/aJzBRreBTBYzwUVwM+tr41A3eIxwBPold/cGOkA44uxj21cPOovrb35kND3CioX+8B | ||||
|         DeuVaAIZwKtANIEvBVLlOgG8ALN7/ot9kPiPr82ghw8fZrKGF16XPh7Bx5RD+/AUOMeUG+wF7V9EAVz+ | ||||
|         Fm588zyfRwLPDEB4jIviqycT9j8FdTvuAUpgZbyHkmMNf+g2uu+gMmp9Zw40Pj8R6ta5Q32kaABWATdB | ||||
|         MEBYCrVRQgnnR/yi7+If98BRnuWjR48yHT9+HLRaLWRkZMD58+chOzsb8vLyID8/H3Jzc+HixYvs9dTU | ||||
|         VEhJSWGfoc+nfvg8XApyhf6cP0Hnh7MFs1n2hQSwZBA8xsUMwDjrsa9Q7IWb8MAUrTzFsYY39NGqcdT0 | ||||
|         qIyaXnsY6iLczQZYqkBcCoIJ1es8cV1jyWrWmRIPf2vO5rFjx+DMmTMM9vLly1BaWgrl5eVQXV0NBoOB | ||||
|         qba2lqmmpgYqKyuhrKwMSkpKoKCgAHK++USAv/g5dP9xBbQ8N2YwPMoMj/FRnBRv49aJ0Pr2LL49Kpdy | ||||
|         vNuP0hjld9SYWrCMatcpoTbCjV3QYoIwmbgU9GsE+Ow/7jaXcGJiIqSlpUFhYSHo9XoG19DQAC0tLdDe | ||||
|         3g5dXV1w5coVuHr1qlnd3d3Q0dEBbW1t0NjYCMaz3zD4voyPoPvz5TbgB5Q+icOTKO7mXY/hUrgXSiOV | ||||
|         LVkbRjlzxKEHds7pesx+yz411MePB+NaV6hd62Y2gRmAYgagNGs8sWH59af95YCwdlGnT59m4JTJuro6 | ||||
|         Bk1w165dg5s3b0Jvby/09fVBf3+/WfT/JPpZT08PdOWdZPA9p/dD9x+W4V6PW+8t4JkBPDYRnsW9wQso | ||||
|         kRXRXjdLNio1HHPogefqC4Yt47GLTgZjuAsY15ABKDJAuhRQVWtVLPOZX37AwBMSEuDcuXOszI1Goxn8 | ||||
|         xo0bg6BNJpP5UfqcHq8XaRn8zZSd0PXZUgs8gluXPWkwPMUpGODK4m944V6of+XXkBfp1HnLKqAtoxSz | ||||
|         37x3OtTGjAYDN0AwgVcBN8EQoWQNL/vTFxk8rfWcnBy2vql8Ozs74fr16zazfStdLzrN4G8kbIOuQ0ug | ||||
|         mcFz8IHwNjJvgXczx26M8MCzwQwoC/O8URzlsY3jDh54a/lXTZyfqUnzONQ86wyGZ10sJkiXAk5SEObV | ||||
|         p31D3S+ud+rkVVVV0NzczLJOpU6lLJb2cHS96AyDv/rVs9D5yWKEHy0B5/CSrIvwdaicZS7W8Dz7FD9x | ||||
|         1GMV1L1wD5REedRxXOtRGT7BsZTO+q88CHWbx0PNM2QAigwYYEJ5uAdm37c/+duv2FZFmSd4KnlqbFTy | ||||
|         BE+iChiOrhUKZU/wHQcXQnP8aKuMm7Nu7vYW+LT5CI/9aiA8xS0Y4AzGSFxCb0yFkkinruINNg5HxTGe | ||||
|         gSVRrlfpTTXhrmiAE6+CwSbkY/Y1mi0myj6tedq6xMwTvJj94epqwSkL/O/nQ9PmUUOCC/BCyVc84w6n | ||||
|         A5yYzi1TQdWz7jbhiYN4Gl59GDRRPqaide5/4NiWUbpB+deqGD+o33E/VK92YrJlQtkzHpC3ZlzfscPf | ||||
|         wHfffQcVFRVszdO2Rl1eNGC4upJvgW//aK4Aj8DmUrcBTipHeC2CJ3+0CxIPvQOpMTNAE+RhGgqeeGo3 | ||||
|         TwDj1rugKMK9nmNbRn6UR3PdtnvAGDcOqsMchzShMMyzN/v9WFb6RUVF7ABD+zrt49T0yIDhqlsC3/ZB | ||||
|         ADRuwrvEAdADwanRla8W4JM+3MXioN0n+cBeyFyixFhtw5MM69DU1x6B7GCnrqL1zqM4Om59kZ5jS6Oc | ||||
|         uhpeexRq1uL2RgZYmcAvhhfXhHiZtH8+CGfPnjWvezH7ZMBw1XXphAX+/dnsdtgCbA0tgovwpwKcGXwC | ||||
|         wicmJDITko4lgGa5r6kkGBufGd7ZzEA8xNXw6m+gcI37tUur3YM5Pq7/SPd5pdgcGtGdylAFVJEGmeAE | ||||
|         +tVucGnt+L6jR4+ATqeD+vp6tt1R4yMDhqtOCXzru09BA95lSmGlEsHN8LOx7D9+3XzuOJaYAKdOnmSH | ||||
|         L61a3a9Z4WYamHkRnrjqtt0LmghPU/5ql7c5vkxWFOmxRR+u6q3fPgkqQxRDmlAYqsTmt9pEa5+OttT4 | ||||
|         RAOkR9pbqSPXAt/yjtoMLwW1Ep07sLuXhbnBSYRPwjUvbr0pScmQgcft85mZcCk7B3I/3wvnJ6n6hoIn | ||||
|         LuOmCVAR5Qd5oa6WG6Site7/U7HeB2rjJ6IB8iFNKFjs1ZP50QuQlZXF1j6d2cUz/XDUnptigf/dDLxj | ||||
|         G2kDVgBmWxqXAI9lL4GnJFy6lMf6UDnea1RXVkF5WgqkL3AfEp64DFG+YIibAJeCXao5vkx2OcI1qRJ/ | ||||
|         YIwdBxXBZIBtE/LCvHvPfraH3dxQ5xdvamj7u53aspPN8M37p7FviaSQVqIDF5ce4U8weKHs6cRJ5U5L | ||||
|         sMYg3GA1NzUxNRmqLQbYgCeu6nXeYIy/EzKDFO0cXyYrDHfJqMKyMGwcjQY4DGkCNcC0rw6yc34TTiga | ||||
|         cDu15Vjgm/ZNhbqNWG3sUMVPl+bnwjlD3Mt1oW6QgvDHP95thqdba7rJov5DDbgDYyBRLG2tLdgHlP0M | ||||
|         3AY8cVVhk6/dfCfkBLpc5fi4BT7jVkAG1KwfCRWryACpCSh2IUf2nV3qka9Y+bPJ8daVesCt1JqVZIF/ | ||||
|         8wkGz/bq20gX6srgj338BoOnL1No56F7DYJvbW1l84sxiM+PLPbrYQkzwwsMxENcVc+i4VgB2XOdr3F8 | ||||
|         mSw31DWrcsNINMAHyskAUWQCN6IiRDAg48hfzLe41APEiW2pRQLfuOdxqI3yFvbo26gUM58828UKnjJP | ||||
|         hy4RnjJua870Sco+Bs+zTvEzeM7EToubxoN2mbOlAvJCXLXlEV5QgyaUr7RHE+xtmkBLIOufX5jLjwyg | ||||
|         QGypOeu4Gb5h96NgxPtydpgyC2EHyRlKQ1whicNLv1GizJPxtPMMNW9rnQHS5rkNCU9czICYMXAhwKmL | ||||
|         42MFBLn8E7dBNMBXMGCQCYIRl0K8+vL/fkBoPDwQW2q6YIFv3PUbMK73ZPsyO1BJRfu1KPx/OsQkzXYd | ||||
|         BE9Nl5Yd9R3KPsnWvPUFF7gBHJzilsATVxXeyFWt94Vzi+VNHF8mywp02acJczMZNo6CsiBugNkIiwkF | ||||
|         i1U9hZ+8YDaAqkAMSJQUvkHzEBgiPS3bEpdghrVKgl3guD9m/vd7rBqeCE+7Ds1na05R1acPYxP06JfC | ||||
|         U/xSnuoIT7ybVcGFhY55HF8mOx/oElYQ5HyVSqMsyI5J+iHRhCLMUMF2dQ8FQ9kQAxLVIIXf+SDU4Nlb | ||||
|         3EKFs4Qoa0OKVyE4Zj6Rw9M+T/C01dGOIxoumj6Uig68iE3QrceSdWt44qqJ9Mb5XCFzvuJLjo8GLHF6 | ||||
|         7MIKRZsxdiy+ycFswsBqKF3lBLmhI/sa64RtkCQG1nD+mBm+/tUHoCZCKWyfJHFbsiGCT7QBT1+r0TfG | ||||
|         1G8GzjWUzoXcfaNghbMNcAGeZMBlnr/cqTdjjtNzHF8m06pljulLnK9QE6wIc4KyQNGAwSbkBnv1VSV9 | ||||
|         YQ6KVH8uwQL/Mt5O414rNCKUaIINFa10hgR/gt9rhk9PT2fwdNSmpkfVJlbcrWQszIL0+W6gWym3ilcK | ||||
|         T8k1bPSDzHny9vRZjtM4vjAyFyly9Lj9VIW7gz5whGCCDSO0atf+wpfmsGVAqstMNMPXvfQrqFqD8LgG | ||||
|         WRe2krg1Cbq8EjPv72YFT1+jEzz9zoDgqfRJ4ly3UtGhnVj+Hj02wTkLJbcKe0B6gKI761GZA0cXRvoC | ||||
|         x9fyVzj21qzzAv3TI5gJ+kEm4EUifUCz2tdkyEmF2kxL5utevA/h3c0NU2hEgpghElMuB1Hm3SDhwFtW | ||||
|         8PTLELrFpqZHpU8STbiV6ir0cG6Sd19RoAvGKM04CuMnDuKhQ1ApVl2GvzyTY1uGdq78vrMLHTtqIr1w | ||||
|         DcklJlgbUbHaGYwv/goK4x/vEeFrd9wLleFu+Dl0nzcgKzFDBBUGucDRAfBU9sXFxeyrNWp6ZABVgGjC | ||||
|         7aTRxJtyl3v00ty2wJmQx7DOE3LU8qtn1A6RHNt6pM11LNXhdlT5jKtggCh+EcEEezBuu4v9opJUu/0e | ||||
|         qERnxdIzi5shNaQQM39klvuQ8NT0pAYMRzUF2aAJ9DTpsJmK4AI8j5szVATj0sPlnTJL3nUiQGb774nO | ||||
|         +CvitOgQdXCd5MNSE0jVeOfYsHsaNO33R3hXi+u8T9hSQSDC+1vg6csMKnu6naUjLjU9qQHDkbG6Etf9 | ||||
|         qB7NGi9TBfYVK3DSCouqMU7NMrnp7EyHBI47eCTPkbmcma1oLw91YWd/3Yo7QCc1QWKEYfM4qI7GbZM7 | ||||
|         bjFBlNCIGPzTTnCYw9MJjzJPNzb0y9IfCk/K0YT0adWe/WLjNgvj1C0XVIoqxzjIAK3aofPsLIdHOa7t | ||||
|         cWqWYtfFufJr9NU4uxAzAUVOSo0gSSY1GzHAjHyCx7I/OqDh/ZjMkzQajYngq9cq2TzSuETw0uV3QOmy | ||||
|         O/C84YTZdzCdVTukc8yhB62PE08p2vSrHNktsA4vQqKL2awIksQIQYIR+Suc4J8Mft9PB280IPxWkybI | ||||
|         00TH2rKVDlaxMHCELl0qqAKzX4UclP0zM+wnc8xbjxNPKiLSZ8u7avihSHSSyWzEHVYTm8VNyPsZ4A3l | ||||
|         OjiyZW4PZb4uCg9tuEzFeSkeFt8Si3T4/zV44Lq00L7n7Az7P3O82w/685gTMxWXNEvsTXQBVgHcUSbR | ||||
|         BHF5SA1AZS91gW+p2x/cb9Xtfwy8Pukr0Ab73NSqvfprN3izrk7zCssThTGVILQoirMy2B7jsYcTaoe2 | ||||
|         E7NlXhxveOPEdMXE408o2nWB9uxCDJw7y4Tumk2QmFGCveLYHHdIWuSLt7V72F2dCE9b3feFr0hLAm3U | ||||
|         tJuaZUpTDX2fh3eXemysVvMS/G+tVYGVW4nvy5hl35U6Xb6MY32/cXKqPDBlpryrCi9UsRKXAndX6rJV | ||||
|         IKiMRY7Q8cJE9stKzQoVNqo7+zWaHSbdhdRhw1flZkLhZ7vhXNhjNzS/9TBp1nqZ6qJ8WCdn5S6ZjxJR | ||||
|         slgihC/DRFSvGgFZc+2vpantPuU4P2wkT3X4MG2qwxW6YAWubQYvcZqtNUlAJOoB1Xg4oqANePupVav6 | ||||
|         Mxe5s+/rjjw3v6fgo+1w+Yt9UPK3g1Dy908YbN478ZAd/nRvxqq7b2QudIfLq1S9VWu9oG7jSKjBI7Ye | ||||
|         O/3AeWjuYoQWRQbosRpqMFat2u5m2kyHrMJJMjlH+WGD+kHyFPu/a9X2V+nCFUHcBD6h6LqtJUG7QSUd | ||||
|         nbFsCcS4HtduuCdoQpSmwpXKvrxAZW/e06pegqVvc8ufVQHdi7D34meq8ERaNrDcSbzkixdJRPCYeYqx | ||||
|         YJJdX+p0O/2QJ77vO/B22R4rIYVMqF45Aiq5CVL3WQbICGmDlIjMoK5NlUF/XULncuN6Lyb6pSX9TpJ+ | ||||
|         VhnmzA5Qtq5hBl9oLUpCOS6NmuARkL/Irhe3u6qT/jJfHv5PM74OktklT5N/efYph+5KNIGWBG0zVlng | ||||
|         upURP0gEToYT8AJr0VxVGA9l/twC+xups+QFGVNknjzsn35gJexJmeHQVbrcDgzoeBk6bysrTKIZtnaM | ||||
|         24g1N4ImUyXARVx0fXG9U0Wen+fQfdbfISlrsez2fwr3Y0fyZIV/0lR5cy6uNSo7qga9WA2SYK0kMYTA | ||||
|         2FYqnitQrK+QkXQNfK8IOlB0LfosZd0QbAfFy+yw4ck702bLLV9x/StG8lSXkSem2x+myUswCAqGgmJG | ||||
|         4Jq0FXzR/B8uMoWMoh5Ec9E+nxXg0JXhryhOn+3wGx7Wv34kT1X4a2fYV2dgMKUr7MCIwbHdArdCtk1h | ||||
|         Rs3w876fCJqqogKXmRErrSEUdxXcDnPnOlzTqhWtmbMV0fTvl3go/76hkclGnJouDzo9w64sY468XbPU | ||||
|         3kSZqg0R+gQ9L6e1TaVOOwYvcyvR8sCfkWnluLarcV3X4WcbEbo+hI689pAdIO9KXSBvyZjnuD0Zb935 | ||||
|         9D963IEiF0l2KPqykA4PChT9uzxqKq4odxT92bkKRV3WB0VbDf2tzRjUOPzAL/Y94LAyQa04kjrHsftc | ||||
|         gKKLbkMpawTRFGYHLavtoJkeQ0fgI76Gj/S8CZ+34OutKIKuWWWHx2oHyFkiv5q+yPHKd3MUFw5NUWwa | ||||
|         7yqbhHP9EnUnagLNixqNojgoHm8UxUdxUrwUN8VPHI4o4iI+4iRe9h97/gL9kN5E4OQwfZgOE3Qhuihd | ||||
|         nMBHosaiKJBfoR5APYSitUhfOEz2c5SpX5pk/9yfpyu+TgmwN6QvdLqRsdCxW4tAWL43CyYp+oqflgMJ | ||||
|         +0h//nJ5b/ZSxfVMfE/mYsfrJ2Yr2v7h73Bq98MObzyotPstXnMm6knUVLo+iuah+Whemp/imIiiZFB8 | ||||
|         FKdoBsVPHGQEcREfcbJT4lAGiJl3Q4lGiNmnOytymzJwN+o+FAVwP2qgGY+jpjjay2YunTAi9OVf27+y | ||||
|         73HF++9OcTx0aLriy0+nK756e7LiT/sekx98+SGHt1aMt4/zksvoT9sDUGoUQT+BousMhKb5aF6a/y7U | ||||
|         eBTFRfFJwSl+4hArwcqAgUtANEO6FOjNJPowOUgXIkkrhMwRDSLnRYkVQ4GR6F+Ei8uGSpceyUiqKPE1 | ||||
|         +jm9T/yMNKOiaB5xTimoGJs00yRp6ZOQU2b3v5DHce1etE0FAAAAAElFTkSuQmCC | ||||
|         YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAABhKSURBVHhe7ZsHWFRnusePTKNPodo3btpqNsmmGDXqKGAn | ||||
|         ighIUVFEyoBi1Giqxxg1mtx0o4nZ7M1zn81uNru5WVEULBkLxUKRIjAz1KHXoYiFMu993u+cM3PmMKhp | ||||
|         u/c+z/2e5x8IzJzv/f3f93u/7xxGivr/8euOEo2Xa3mycpE+SfmWXqM8a9C41+sTXG7oNco7+iRlP5FG | ||||
|         eac8ybXPEK9sNSQoLukSlR+UJytXlmi8fIXX+z8x9BtV43SJyl3lGtdahKuO9hpo3PEAtNKPQef+56Hr | ||||
|         w/nQdXAJ3Pz7Jrh19GXy1fTxIuh8dza07XoCml7+LWjVvkMGjfKOQaPs0CUqvjQkyZ8SzvO/agBFjSpL | ||||
|         Uiw1JMrLDFHK2/SWceb2vVOh69Ay6PoiDLo+Xgxd/zEHuvdNg+7dT0L3rt9D775pcOODAOg9MAO633wS | ||||
|         uvc+C93vzoaujxZC15EQ6PosGDoOzAJ6xyRzhUZ1p1SjbClPUm4xvjjOSTj/v20guE6jjChPVDRXJXv0 | ||||
|         t9JPQNfh5Yww269Phq6tY6F7yxjo3joGeraOZbTNjtjf4eu6t4yFrlcfhi408WAgMaR93zQoSfEZJEso | ||||
|         UbHz326EQaOcUqaRX0fwtt1PQdfnIWB6zw9Mrz4CphRfMG32ha4XRxMRAzgTONgR4Rlx78XrmHY8CKYD | ||||
|         M8kcHftnMUYwy2OJMK5ffQBNOegS5W8XaOS36FceNmO2Te+ooWPbb6Bzkzd0pviACYUGjGQCVwk82YPH | ||||
|         9xMDUnzIdTu3jAXT3ufI8mh98ynApaHXKE5Xxinlwjh/lYGdWZ+ovFad7Nnf+X4AmD5aBB3bH4SOZC/o | ||||
|         2OjNGLDJaoBtFdiaMEzc77aw8Fz2OQM2obzJPB1bxoPp3blg+nQpaNVjh/QaZVtZkvszwnh/0aHfqJqs | ||||
|         0yg76a0TzaZDQdD51lRoS/KC9iRPaEcD+CaMUAU2lWBH/NcNyz4Hn+xF5sN5O16bAqZPl0Hz61OgZL37 | ||||
|         zXKNMkwY9y8yyhKVM/TRzr1NrzwKpoNLoX3HQ9CW6AFtGs/hBhATmKAtvUBggrUiGAl/Z4X3ZeF9yHWF | ||||
|         BpD5N4+Dzg/mQ9ueaYDLUp8k3yyM/2cNnUb1HHbe5p2Pk5JvTRkLrQkqaCUGjGACfymwJnBA7Zt8oTnJ | ||||
|         FxoSfaA+wQcaNT7QkuwLHZsYo/ivHVb6AnicH+NoTfKGznfmQPv+5wG34V/MhPJkj0f1GqeeptemQOf7 | ||||
|         86ElyRda4pXQQgxQ2VZBktUAvgmNid5Qud4LtGrPoYIID0DRkV7mwpiJg4XREwe06tFDBZGe5Of4Gnqt | ||||
|         p9kY50WM6iRi4TkD2GVHDED4RBWJpyXBAzr2PQ9t+2aQSvjZy6EoUa7E5kJvf9Dc+cECaEnygeY4BWNA | ||||
|         vMpaBXaWQluyN1TGeDJAkV7m4h2TB69+sRPOfH0Y0r79M6SmHoXU1FSejsKJv/4naA/tBJqOMGvV44fo | ||||
|         CE8znfJbc+e+6dDzgR90bp9ETLGF9yBxYDwYV3O8CjrengWtbz4D5RrXvp/cGPGAo9e4XyjZNHqw84OF | ||||
|         0Jw8Gpo2yKF5gwKa49AAtgoESwFVvZ4BL46eOHD5q/2Q9t/fWkCPHj1KZAvP/Jz/NfXoUTh1ZD/QO+aZ | ||||
|         C8I9wPRVPMD17+H2d1ttS59knoWPU5L4mtCEA3OgccfDgAmsTpErhHz3HPoE9x1YRh3vzYOWrZOgcb07 | ||||
|         NMVyBiighTWBMYBZCg3xTAkXxfxm8Oqf9sAxNsvHjh0jOnnyJGi1WsjOzobLly9DXl4eFBYWQlFRERQU | ||||
|         FMDVq1fJzy9cuACnTp0i78H3X/h4K1wLdYWh/D9D98f+jNls6TPZV5J4MC5iQKwcmjQ+gLGXbPQZ1Ccq | ||||
|         zgr57joMicrx2PSwjFrfeBIaY9wtBlirgFsKjAm161VAR3qaaXq9Oe3o95ZsnjhxAs6fP09gr1+/Djqd | ||||
|         DiorK6G2thbq6uqIGhoaiIxGI1RXV0NFRQWUl5dDcXEx5H/3GQN/9Uvo/VMwtL84djg8yT4Lv0FO4sR4 | ||||
|         W7ZMgo535rLbo2KZkHPEodMofsDG1H5gDjSsV0BDjBu5oNUEZjJuKRjWMvB5f9ptKeG0tDTIzMyEkpIS | ||||
|         MBgMBK65uRna29vBZDJBT08P3LhxA/r6+izq7e2Frq4u6OzshJaWFqi/+B2BH8z+BHq/XG4HXlD6bPa5 | ||||
|         WDHutl3PQOOOR0AXq2jPjRvtLGQdNso1ypmGBJcb7fvV0JQyAerXuULDOjeLCcQAbilsUAC9VmXGW9fM | ||||
|         vx6yrOdz584RcMxkY2MjgUa4mzdvwp07d2BgYAAGBwdhaGjIIvx/FP6uv78fegrPEPj+cweg949B0L55 | ||||
|         LLPmR4C3lD5rAMZL4o7zAExkVaLHnfIEBS3kHTb0GsWVus0ToPXNqVAf7QL1a9EAV8YA/lKIlUPNOiXJ | ||||
|         fM7XHxHw48ePw6VLl0iZ19fXW8Bv3749DNpsNlu+8r/Hr7dKtQT+zqmd0PPFMis823StZS9Y91z2YzgD | ||||
|         XEn8zS89Ak2v/R4KY52671oFuGXoElxutO2dCQ2aMVDHGsCYwFYBa0JdjII0vLzPXybwuNbz8/PJ+sby | ||||
|         7e7uhlu3bg0Dv5dulZ4j8LePb4OeI0uhjcCz4EJ4O5m3wrtZYq+PkUPbvllQEaW6XRYv3ybktgxdouJv | ||||
|         dLKvuZV+FoxrnKFujYvVBP5SiHGH4iiPQe1b6iFuvWMnr6mpgba2NpJ1LHUsZa6070e3Ss8T+L5v1kD3 | ||||
|         Z4HQtnkMD3x4t+fgG2PlkB/kYgvPZh/jR46mlx6BxpcehvJ4eaOQm4zq6ImOOjzrv/Y4NG6aAMbVaIAz | ||||
|         Y4DAhMpoOWjVPkMZ339DtirMPMJjyWNjw5JHeBRWwP3oZglT9gjfdXgxtKWMscn4sJLnwWcudIHGlAnD | ||||
|         4DFuxgBnqI/1gNa3pkN5rFNPWZydw1GZRhVSHu/ahy8yRruCcbUTWwXDTSiK8hik6c1mzD6uedy6uMwj | ||||
|         PJf9+1Vf8Vkr/KcLoXXT6BHB+Vtd1Wp3OBfgRHQpSAk1a9ztwiMH8jS//iTQ8V7m0vXufxTyU7o4xd9q | ||||
|         NL7QtGMK1K5yIrJnQsVqORSuHT944uh38MMPP0BVVRVZ87itYZfnDLhf3Siywps+mc/A4/bKQdsBR1Wu | ||||
|         dgdtgBNkfLIL0o68Bxc0s4AOlZtHgkeehk0ToX7Lg1Aa494k5KeK4uVtjdsehvrk8VAb5TiiCSVRqoG8 | ||||
|         D5NI6ZeWlpIDDO7ruI9j00MD7le9PPjOjwKgZaPvMGghODa6ylUMfPrHu0gcuPtkHNoLOUsVYGT7lhAe | ||||
|         VbdeCc1vPAV54U49pRucR1vg9bGqcbp4p57mN54G4zo51KABNiawF1vjAnSEh1n7l8Nw8eJFy7rnso8G | ||||
|         3K96rp22wn/oT26HrcC20JYOz8KfDXAm8MePHYO042nEhPQTx4Fe7mMuD3flwTtbGJAHuZpf/wOUrHW/ | ||||
|         eW2Ve7jFgLJY9wW6WKeeljeegupIGdSghpngBIZVbnBt3YTBY8dSQa/XQ1NTE9nusPGhAferbh58x/tz | ||||
|         oDnJxwbWHrgF3t8JMg6+aTl3nEg7DmfPnCGHL61aPUQHu5mFmefgkatx2yNAx6jMRatc3rEYUBor32yI | ||||
|         Vg40bZ8M1RGyEU0oiVQM0vQqM659PNpi4+MM4B9p76auAit8+3tqCzwf1EZ47ohxg4ooNzjj7wTpn+yy | ||||
|         HLVPpWdAdmYmXM7JgWt5+VDw5V64PFk5OBI8ctVvnAhV8b5QGOlqvUEqXef+X1UbvKAhZRJUR0hHNKE4 | ||||
|         0KM/55OXIDc3l6x9PLNzZ/r7kanglBX+3VnQpPG2A8sAky2NFQPvbAOPSbh2rZD0oUqDAWqra6Ay8xRk | ||||
|         LXIfER656uJ9oC55IlwLd6m1GHA9xjW9Ot4H6pPGQ1U4GmDfhMIoz4GLX+whNzfY+bmbGtz+7qXOvAwL | ||||
|         fNuBGeQpER/SRnjgYmWIcoPTBJ4pezxxYrnjEjTWMTdYba2tRK11tVYD7MAjV+16T6hPeQByQmUmiwEl | ||||
|         0S7ZNfG+UJcwBqrCJSOagA0w85vD5Jzf2tpqMeBe6sy3wrfunw6NCV7M/QV3urR8z5wzuL1cH+kGp/yd | ||||
|         4eTB3RZ4vLXGmyzsP9iAu0wmIoyls6MdtGrFEAG3A49cNevk0LDpAcgPcemzGFC02q0YDTBu8IaqlWgA | ||||
|         3wQpc5FIR/LM7kLqN6T8yeRdXaQH3E0duelW+H3PEXjLGf0u0ke6EvgTB98i8PgwBXcevNdA+I6ODjI/ | ||||
|         FwP3fWqgbz9JmAWeYUAe5KpZ4wYNKQ9A3nznmxYDCiJdc6vjvMG4wQsq0QBOaAJrRFUEY0B26l8tt7jY | ||||
|         A7iJ7amdB9+y51loiPdk9uh7SBfpBhn+LjbwmHk8dHHwmHHhfKisyYpBAs9mHeMn8CwTOS1unADaIGdr | ||||
|         BRRGuGorYzzAGOcNlWFiqFwptmsCLoHcf35lKT80AAOxp7bckxb45t1PQ32cB3OYsoi5SbGVM+giXCGd | ||||
|         hec/UcLMo/G484w0b0djHWQucBsRHrmIAZqxcCXAqcdaAaEu/zREK8EY58MYMMwExohrER6DRf84xDQe | ||||
|         NhB7ar1ihW/Z9Qeo36BiTpR4oOKLO7CwhxY8xKT7uw6Dx6aLyw77DmYfJZwT1VR8hTXAWvJ8eOSqiZZD | ||||
|         zQYfuBQobbUYkBvisp+OcjPXJYyGilDWAIsRVhOKA5X9JZ+9ZDEAq4ALiBMfvpl+AupiVdZtiX+8Fqg8 | ||||
|         3AVO+rnAiU/32DQ8Dh53HZzP3pycas8dBa1aPsSHx/j5PLUxKqiMVsKVxY6FFgMuh7hEFYc692FpVISK | ||||
|         iOyZUBruCsXb1f0YDGaDC4hTMx9+5+NgXK+0niPIWYKTrSFlK13ghL8rpLHwuM8jPG51uONwhnOmj6TS | ||||
|         Qy9DaqBbvzXrtvDIZYz1hLKVrpCzUPa11YClTs9cCZZ11ieNg4pQicUEYTXoVjpBQaT3YEsjsw2iuMCa | ||||
|         L5+wwDe9/hgYYxTM9sluoSMJ4dPswONjNXxijP1GONdIuhTx0O3iYGc74Aw8qi7OB4qWOw1kz3N60WKA | ||||
|         Vk05Zi11voFNsCrKCSpCOAOGm1AQ7jFYk/6VJShU06XjVvhXp0DtOjnbiHjnCDsqDXOG434Iv9cCn5WV | ||||
|         ReDxqI1ND6uNq7i7qb4kF7IWuoE+TDoiPCa3LsEXchZITVlzHWdYDMCRs0SWb4h0g5podzCEODAm2DFC | ||||
|         q3YdKnllHlkGqMacNAt84yu/g5q1csuuYStua2J0PcwF0vzcbODxMTrC498MEB5LH8XNdTeVHtkJqYHy | ||||
|         frvgLAsmtyZGBVkBst7cpymJjQFZixzfKAp2HDCu9wDDCgdigmGYCSKoivUCepWPuS7/AjTkWDPf+PKj | ||||
|         ULPW3WbX4EQM4ZlyPRQz7wbHD71tA49/DMFbbGx6WPoozoS7qbHKAJcmew6WhrgIMs7EjxzIg4cgXZgz | ||||
|         ZPtJc2zgcWjnSx+9uNixyxjrAZUrpTwTbI2oWuUM9S//DkpSnu3n4Bt2PALV0W7MVsM/SNlso4xKQl3g | ||||
|         mAAey76srIw8WsOmhwZgBXAm3Es0nWIuWC4fwLntgROtcIC69SrIV0v7zqslsUJ+MjLnO+r04S5QvdqV | ||||
|         MYATexHGBDHUb3uQ/KES1bD9Yahe42az7ohYM/iGlIQ6Q+pc9xHhsenxDbgfGYvzgA5RmfUrMfvWcueD | ||||
|         o6rCZVAd7Q6n5kp7TgdQ9j9PdN5PlqxVS/uwg+t5b7atBgeojfeB5t0zoPWAH1SvcR3WJ+ypOMQZUv2s | ||||
|         8PgwA8seb2fxiItNj2/A/ai+thpSA0f302s9zFURMltwVLBVtWtcgQ6Smi/OlhwXcltGxjzK5by/zFQZ | ||||
|         6ULO/vrgUaDnm8Azom7TeKhNHGenWVrN4AwpXuEER1l4POFh5vHGBv9Y+lPhUfl0xKBWrRriGjc/6/rl | ||||
|         jHTLHaAyVEwM0Kol3RfnSp4WctuMs3Nlu67Ol97ER+PkQsSEUaBHJ0cww7I87JhRhPBz3eGYoOH9nMyj | ||||
|         aJo2I3ztOgWZhx8XB65bPgp0QaOgJsoJ6CCJ+aJakiXkHTZwfZyeI+s0rHQkt8D65aOI8GJ2K0JgBCPG | ||||
|         iKJgJ/gngd//y8HX1wFNbzHToSozHmsrwiQ2sRDwoFGgW8aoKlQMNZGOJPvnZ4mnCnntjtPPy2Ky/KU9 | ||||
|         RvZQxDlJZDFi1HAjeGYU/grwdZV6SN08vx8z3xjvTZapJesr2PiWWqUPGgXGSBlcWyzuvzhL/Bch54gD | ||||
|         Px5zerbsGr1UbMYLkApgHSXiTOCWh8CEvGUu8D12+8MHbLr9z4E3pH8D2nCvO1q1x1BDnCfp6jgvszyZ | ||||
|         Ki1fahXGWR0uBsMKMZxWSzpP+1MeQs67jtMzZZNOPicz6UPE5EIEnOcuum0xgWdGebADnJjnDulLfODE | ||||
|         wT3kro6Dx63ux8JXZaaDNn7GHTpIYTbi87xYFRjCxLbzIvwLtqoKEUF1mBiy54p7LsyUBgn57mucmS4N | ||||
|         OTVb2lMTJoaqMBEBF7osNCF7iSN0vTSJ/LGSDlaateoHhmh6h1l/5cJ9w9cU5EDJF7vhUtQzt+kX5GZ6 | ||||
|         nYe5Md6LdHJS7rz5MBHlgTy9MAoqVoyC2pUOkDtffDNTLfpcyPWjRsZ0yceZ0yU38IJVIQ4MPM9pstYE | ||||
|         JmAPqF3jBhh0XSx+Ykw5lLPEnTyvS31xYX/xJ9vh+lf7ofzvh6H8H58R2ML3UiAvesVA9sqHbucsdofr | ||||
|         K5UDNes8oDHBG4xr3cEQKho2D85dFmgVGmBYPgqMKx1AqxbdyZwtyS2ZTEmFTD9qYD/ImCb+h1Yt7sML | ||||
|         V4WyJghct7ckcDeoxqNzrIqA1G/whKpoFdARCnNJmGKwMEQxULhCOYCw+DS3co0S8F6EvDZWBTWrXaFC | ||||
|         WO4otuTLlvCE8CsY+OLJosELM0WGEU98P3Zo1ZQ4Y7rkFJpQG+YA1awJfPdJBtAIfoMUmIFdGysDP12C | ||||
|         5/L6DR5E+EdL/Jsk/q46ypkcoITvtwFfbCtMQuUKBzCGO0DREtHA+VnimjN+lI+Q42eNb0MpUcYM6dcX | ||||
|         50h6q8McyBrDbcYmC6zuZsRPEtvhCfAiW+FcNWEOJPOXFolvX5grLc6eRqmE8f9iI2O6ZM+pWZIe3XIR | ||||
|         1IU7QMUKB7tZIeLMsLM87iXS3BAaTeUBl7LC63PrHSvy8gJJ70U/SXpuIDXyh6B+qZExVeaXPl3aVjBZ | ||||
|         NIhlh9Vg4KpBkCGLeIaQHYTdRThxzZVcY7EVVCi8Fr4Xs14XLoKyIBFo1dLuTH+p9RHXv2JkTHfxPj1T | ||||
|         fBQnLw/CahCRoIgRgcMDJ1r404WmoFHYg3Au3OdzAyQ92X6ysix/yR+E8f3LRsZ0mZ92lrg2O0DSowsW | ||||
|         QX24iJQlbplkm1rCg1/w40QaHB5qVjhAfbgDNEeKoDpUBAXzJTe1allHjr8sEf/9kjCmf/mgKcrh7Exp | ||||
|         6LlZoorseVITvUxsxkw1RDB9Ar+vxLWNpY47Blvmw/pFIFPelctHQW2oAzSGO0BLpAiaIvDIK4a8AGnP | ||||
|         hUXS9uwFjtvx1l0Yx08doyiKuIgSURR5WIiHBxlFUfjv8rCpuFIU5U5RFH7sXElRpMt6URTZavCzNmMp | ||||
|         ihovo6jf7H9MEnZcLUu9MM+x91KArAdvQzFrCNEaJYL2VSJow6+RDtAW5QCtkQ7k+9YoB2iPEkFHlIhA | ||||
|         G1eKoDxYAvlLpX1ZSxxv/DBPduXINNnGCa7UZIqifktR1AMURU3EeSmKGsPGgfF4svFhnBgvxo3xI4cj | ||||
|         y4V8yIm85D9i9gf4S3wRgqPD+GY8TOCF8KJ4cQT3pihqHBvI7yiKeoyiqCcoisK1iA8cpvo6UupXJotf | ||||
|         /MtM2benAsR1WYudbmcvduzVLpX2adWyO8WTZYNlK6SA0qqlQ0XLpQN5y2S3chY79uYEOt467S/r/G8/ | ||||
|         ydndT0reelwheoGiqNkURT1PUdR0vD47D86H8+L8GMckNhkYH8bJmYHxIwcagVzIh5zklDiSAVzm3XhG | ||||
|         cNnHOyt0GzPwEEVRj7IBTLFjxrMURU1zFFOzl010iHz19+LX9j8r+/D9aY5HjsyUff35TNk370yV/Xn/ | ||||
|         M9LDrz4heTt4gjjZQ0rhR9sDKIpSs9DPsdcRQuN8OC/O/yBFURPYuDA+PjjGjxxcJdgYIFwCnBn8pYAv | ||||
|         RuGb0UG8ELcsuApBcziD0HlOXMVgYCj8F+HcssHSxa9oJFYU9zP8Pb6Oew8/o5y4MudKnQPlYuNnWlj6 | ||||
|         KOQU/Q+Qx3HtqiuXvQAAAABJRU5ErkJggg== | ||||
| </value> | ||||
|   </data> | ||||
|   <metadata name="ds1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> | ||||
|   | ||||
| @@ -197,7 +197,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); | ||||
| @@ -615,7 +615,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,6 +669,7 @@ namespace vmsnet.HMI | ||||
|  | ||||
|                     //값의 저장소가 아에없다면? | ||||
|                     //Boolean OverDATA = false; | ||||
|                     var alarmRemark = string.Empty; | ||||
|                     if (this.Values == null) | ||||
|                     { | ||||
|                         Item.value2 = 0; | ||||
| @@ -728,7 +729,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 +745,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,8 +786,9 @@ 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)  //큰값이 있을경우 상한선을 확인한다. | ||||
| @@ -797,6 +799,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 +810,7 @@ namespace vmsnet.HMI | ||||
|                                                 Item.onalamh = false; | ||||
|                                                 Item.onalaml = true; | ||||
|                                                 BackColor = Color.SkyBlue; //BackColor0 = Color.LightBlue; | ||||
|                                                 alarmRemark = $"ref({Item.alamv})"; | ||||
|                                             } | ||||
|                                         } | ||||
|  | ||||
| @@ -819,12 +823,14 @@ namespace vmsnet.HMI | ||||
|                                             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 | ||||
| @@ -841,18 +847,22 @@ namespace vmsnet.HMI | ||||
|                                         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)  //큰값이 있을경우 상한선을 확인한다. | ||||
|                                     { | ||||
| @@ -862,6 +872,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 +883,7 @@ namespace vmsnet.HMI | ||||
|                                             Item.onalamh = false; | ||||
|                                             Item.onalaml = true; | ||||
|                                             BackColor = Color.SkyBlue; //BackColor0 = Color.LightBlue; | ||||
|                                             alarmRemark = $"ref({Item.alamv})"; | ||||
|                                         } | ||||
|                                     } | ||||
|                                     break; | ||||
| @@ -883,9 +895,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,23 +914,22 @@ 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; | ||||
|                         } | ||||
|                     } | ||||
| @@ -1338,12 +1350,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 +1391,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 +1436,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; | ||||
|   | ||||
| @@ -1,3 +1,7 @@ | ||||
| ..\ | ||||
| 1) DesignSetting.xml | ||||
| 2) Setting.xml | ||||
|  | ||||
| ..\Database\Config | ||||
|  | ||||
| 위 경로에 아래 설정파일들이 존재한다. | ||||
|   | ||||
		Reference in New Issue
	
	Block a user