X-SCADA, .Net Framework 연동 방법 (XISOM.NET Library 활용)
XISOM.NET Library(X-SCADA 또는 X-DAS + Visual Studio)는 별도의 미들웨어 없이 X-SCADA 또는 X-DAS를 Visual Studio 프로그래밍을 통해 X-SCADA or X-DAS Component Class와 연동이 가능합니다. 또한, 확장성이 뛰어나기에 다른 소프트웨어와 손쉽게 Integration할 수 있습니다.
XISOM.NET Library의 주요 기능 및 브로슈어 등 더 자세한 정보는 아래 링크에 접속하시면 얻을 수 있습니다.
https://www.xisom.com/ko-kr/php/products/xnet-library.php
1. 프로젝트 참조 등록하기
- X-SCADA 설치 Folder에 있는 DLL 파일을 참조로 등록
* Xisom.Scada.Browser.dll
* Xisom.Scada.Core.dll
* Xisom.Scada.Model.dll
* Xisom.Scada.WinForm.dll
2. X-SCADA Interface 등록하기
② X-SCADA에서 작화 된 xix 파일을 DocumentContext에 할당
③ DocumentContext의 Document 할당
④ DocumentContext Dispose
⑤ ScadaContext.Uinitalize
※ X-SCADA xix 파일 프로젝트에 포함
- 출력디렉토리로 복사 설정
3. X-SCADA Tag에 Value Changed Event 등록하기
item.LiveChanged += item_LiveChanged;
② Event 등록 가능한 Tag 종류
- Analog Tag
- Digital Tag
- String Tag
※ Group Tag는 Event 등록 불가
③ 전체 Tag 목록 추출
Program.document.Tags
4. Tag Value Changed Event 처리하기
IDataTag dataTag = sender as IDataTag;
② Tag Name 추출
dataTag.Name //GroupTag 제외
③ Tag Full Name 추출
dataTag.FullName //GroupTag 포함
④ Tag Descript 추출
dataTag.Description
⑤ Tag 값 추출
dataTag.Value
dataTag.StringValue
dataTag.BoolValue
dataTag.DoubleValue
⑥ Tag 종류 확인
dataTag.IsAnalog()
dataTag.IsGroup()
dataTag.IsDigital()
dataTag.IsString()
⑦ Tag 종류에 대한 세부 속성
// Tag의 세부속성을 접근하기 위해서는 해당 형으로 변환
var tag = dataTag as IStringTag;
var tag = dataTag as IDigitalTag;
var tag = dataTag as IAnalogTag;
⑧ 그룹에 대한 Children Tag
var g = Program.document.Tags.GetByFullName(Group명);
foreach (var tag ing.Children)
{
...
}
var port = network.RemotePort; //port
⑨ 특정 Tag 정보 추출
Program.document.Tags.GetByFullName(FullTag명);
⑩ Tag 값쓰기
var tag = Program.document.Tags.GetByFullName(FullTag명);
tag.Value = “값";
⑪ Tag 값읽기
var tag = Program.document.Tags.GetByFullName(FullTag명);
var value = tag.Value;
⑫ Device 정보 추출
var tag = Program.document.Tags.GetByFullName(FullTag명);
var device = tag.Device as IDevice; //Device 정보
device.IsAlive //Device 연결상태
//Network 정보추출
var network = device.Connections[0] as INetworkConnection;
var address = network.RemoteAddress; //IP
5. X-SCADA로 작화한 HMI를 WinForm에 적용하기
1) 도구상자에 ScadaBrowser 등록하기
(X-SCADA 설치 폴더)\Xisom.Scada.Browser.dll
2) X-SCADA에서 작화한 HMI의 Page 등록
browser.Navigate(Program.document.Pages[0])
페이지가 여러 개일 경우 해당 페이지 index 지정
6. Build 전 반드시 설정해야 하는 항목
1) App.config 설정
...... <!--- for plugins --> <runtime> <assemblyBinding xmlns="urn:schemasmicrosoft-com:asm.v1"> <probing privatePath="Views;Protocols;Drivers"/> </assemblyBinding> </runtime> ....... |
2) X-SCADA 설치 폴더에 있는 dll 파일을 복사하여 프로젝트에 추가
- post.bat 배치 파일 생성 및 작성
- 프로젝트 속성의 빌드 이벤트 등록
$(ProjectDir)\Post.bat $(ConfigurationName)
7. post.bat 배치 파일 내용
@ECHO OFF SET XSCADA_DIR=C:\XISOM\X-SCADA SET OUTPUT_DIR=. COPY /Y "%XSCADA_DIR%\license4.hpo" "%OUTPUT_DIR%" COPY /Y "%XSCADA_DIR%\NAudio.dll" "%OUTPUT_DIR%" COPY /Y "%XSCADA_DIR%\Xisom.*.dll" "%OUTPUT_DIR%" COPY /Y "%XSCADA_DIR%\DocumentFormat.OpenXml.dll" "%OUTPUT_DIR%" COPY /Y "%XSCADA_DIR%\apidsp_windows.dll" "%OUTPUT_DIR%" COPY /Y "%XSCADA_DIR%\apidsp_windows_x64.dll" "%OUTPUT_DIR%" COPY /Y "%XSCADA_DIR%\hasp_net_windows.dll" "%OUTPUT_DIR%" COPY /Y "%XSCADA_DIR%\hasp_windows_25108.dll" "%OUTPUT_DIR%" COPY /Y "%XSCADA_DIR%\hasp_windows_x64_25108.dll" "%OUTPUT_DIR%" IF NOT EXIST "%OUTPUT_DIR%\Drivers" MKDIR "%OUTPUT_DIR%\Drivers" XCOPY /S /E /Y "%XSCADA_DIR%\Drivers\*.*" "%OUTPUT_DIR%\Drivers" IF NOT EXIST "%OUTPUT_DIR%\Protocols" MKDIR "%OUTPUT_DIR%\Protocols" XCOPY /S /E /Y "%XSCADA_DIR%\Protocols\*.*" "%OUTPUT_DIR%\Protocols" IF NOT EXIST "%OUTPUT_DIR%\Views" MKDIR "%OUTPUT_DIR%\Views" XCOPY /S /E /Y "%XSCADA_DIR%\Views\*.*" "%OUTPUT_DIR%\Views" IF NOT EXIST "%OUTPUT_DIR%\Licenses" MKDIR "%OUTPUT_DIR%\Licenses" XCOPY /S /E /Y "%XSCADA_DIR%\Licenses\*.*" "%OUTPUT_DIR%\Licenses" |
8. X-SCADA HTTP Server 실행하기
/// <summary> /// HttpServer 시작 /// </summary> private static void StartHttpServer() { var httpService = GetHttpService(); if (httpService == null) return; try { httpService.Start(); } catch (Exception e) { Debug.WriteLine(e.Message); Debug.WriteLine(e.StackTrace); StopHttpServer(); MessageBox.Show("Failed to start the http server."); } } /// <summary> /// HttpServer 중지 /// </summary> private static void StopHttpServer() { var httpService = GetHttpService(); if (httpService == null) return; httpService.Stop(); } /// <summary> /// IHttpService를 가져온다. /// </summary> private static IHttpService GetHttpService() { var context = Program.documentContext; if (context == null) return null; return context.GetService(typeof(IHttpService)) as IHttpService; } |