티스토리 뷰




동운 HMI에서는 실제 PLC 태그가 아닌 내부 태그 또는 메모리 태그라 불리는 태그 형태를 지원합니다. 작업 값을 임시 저장하기 위한 용도나 여러 태그 값을 기반으로 연산한 결과를 저장하기 위한 용도(계산 태그, Computed tag)등으로 사용합니다. 다른 PLC 태그와 동일하게 위의 그림과 같이 화면의 컨트롤 오브젝트에 연결하여 사용할 수 있고 하한 또는 상한 값에 따른 알람을 설정할 수도 있습니다.




위의 그림은 모드버스 PLC 드라이버와 내부 태그 드라이버를 동시에 가동하도록 설정한 예제입니다. 동운 HMI에서는 "localcompute"라는 이름의 드라이버를 제공하고 있습니다. <driver> 항목에 "localcompute드라이버 이름을 입력하고 <name>에 해당 PLC를 지칭하는 아이디를 입력합니다. <name>에 입력한 PLC 아이디는 추후 정의한 태그 정의에서 어떤 PLC에 속한 태그인지를 지칭할 때 사용합니다. 동운 HMI에서는 위의 예제처럼 여러 PLC를 등록할 수 있으므로 PLC를 추가 등록하려면 <da_module>내부에 <plc> 그룹을 추가로 기술하면 됩니다.


내부 태그 드라이버에 대한 설정으로 필요한 정보는 드라이버의 수행 주기와 수행할 메소드 이름입니다. 수행할 메소드 이름은 <addr> 항목에 입력하고 수행주기는 밀리초 단위로 <port>에 입력합니다. 1000밀리초는 1초입니다. 수행주기가 다른 다른 내부 처리 메소드를 수행시키려면 <da_module>내부에 <plc> 항목을 추가해서 동일한 드라이버로 <name>에 다른 이름을 지정하고 <addr>에 다른 메소드 이름과 <port>에 원하는 수행주기를 입력합니다.




태그 정의는 <tags>...</tags>그룹으로 묶어서 위의 그림과 같이 정의할 수 있습니다. <name>항목에 입력한 태그 아이디는 각종 컨트롤과 태그를 연결하는 매개가 되므로 나름의 원칙을 가지고 태그를 인식하기에 어렵지 않도록 정의합니다. 태그가 어떤 PLC에 속하는지는 <plc>항목을 통해서 지정하는데 내부 태그나 계산태그도 일부 PLC 태그 처럼 앞서 <da_module><plc>항목에 기술한 드라이버의 이름을("memtags") 지정합니다. 일반 PLC 태그와는 다르게 <addr>로 지정하는 PLC주소와 <rawmin><rawmax><eumin><eumax>항목으로 지정하는 자동 스케일링은 지원하지 않습니다<type>은 다음과 같은 데이터 타입을 기술합니다.


  • "bool" : Boolean, 디지털 신호를 저장할 때 사용
  • "Int16" : 부호있는 2 byte 정수
  • "Int32" : 부호있는 4 byte 정수
  • "UInt16" : 부호없는 2 byte 정수
  • "UInt32" : 부호는 4 byte 정수
  • "float" : 실수(4 byte)
  • "String" : 문자열



태그값을 데이터베이스에 저장하고 싶다면 저장 주기를 <archive> 항목에 초 단위로 기술하면 됩니다. <archive> 항목을 기술하지 않으면 데이터베이스에 태그 값을 저장하지 않습니다. 태그 값을 읽기 전용으로("r") 사용할지 아니면 쓰기도 가능하게 할 것인지("rw")는 <io> 항목에 기술합니다. 생략하면 읽기 전용으로 간주합니다. 주의할 점은 계산 태그나 내부 태그로 그 값을 다른 태그에서 읽어와 자동 설정하는 경우 rw로 설정해서 값을 저장하더라도 자동 업데이트 주기의 실행 과정에서 값이 갱신되어 버리므로 읽기 전용과 같은 특성을 가진다는 것입니다. 예제의 "A003", "L003", "L004" 태그에는 자동 경보가 설정되어 있습니다. 아날로그 값이 일정 범위를 넘어서면 알람을 발생시키고 조작자로 하여금경보를 통해서 적절한 조치를 취하거나 인지(Ack)처리 할 수 있도록 하는 것으로 동운 HMI에서는 다음과같은 알람을 제공하고 있습니다.


  • "setAlm" : 디지털 태그값("bool" 타입)이 0이 아닐때 경보 발생
  • "resetAlm" : 디지털 태그값("bool" 타입)이 0일때 경보 발생
  • "euminAlm" : 아날로그 태그값이 "eumin" 설정 보다 작을 때 경보 발생
  • "eumaxAlm" : 아날로그 태그값이 "eumax" 설정 보다 클 때 경보 발생
  • "loAlm" : 아날로그 태그값이 지정한 값 보다 작을 때 경보 발생
  • "loloAlm" : 아날로그 태그값이 지정한 값 보다 작을 때 경보 발생
  • "hiAlm" : 아날로그 태그값이 지정한 값 보다 클 때 경보 발생
  • "hihiAlm" : 아날로그 태그값이 지정한 값 보다 클 때 경보 발생


경보 설정은 예제처럼 <setAlm>처럼 태그로 묶어서 내부에 경보 수준(알람 레벨) 또는 지정값과 경보 수준을 입력하면 됩니다. setAlm, resetAlm, euminAlm, eumaxAlm 경보는 경보 수준만 입력하면 되지만 나머지 경보는 "1000|alert"와 같이 비교 값과 경보 수준을 "|"문자로 구분해서 입력합니다. 동운 HMI에서 지원하는 경보 수준은 "none", "caution", "alert", "critical" 로 구분해서 지정할 수 있습니다.


private void loop1sec()
{
    int A001, A002, A003, A009w, L001, L002, L003, L004;

    //Get global tag index
    A001 = TagGbl.tagBase[TagGbl.tagIndex["A001"]].validx;
    A002 = TagGbl.tagBase[TagGbl.tagIndex["A002"]].validx;
    A003 = TagGbl.tagBase[TagGbl.tagIndex["A003"]].validx;
    A009w = TagGbl.tagIndex["@A009"];
    L001 = TagGbl.tagBase[TagGbl.tagIndex["L001"]].validx;
    L002 = TagGbl.tagBase[TagGbl.tagIndex["L002"]].validx;
    L003 = TagGbl.tagBase[TagGbl.tagIndex["L003"]].validx;
    L004 = TagGbl.tagBase[TagGbl.tagIndex["L004"]].validx;

    //Compute & set local tag value
    TagGbl.floatValues[L001] = TagGbl.floatValues[A001] + TagGbl.floatValues[A002] 
                                + TagGbl.floatValues[A003];
    TagGbl.floatValues[L002] = TagGbl.floatValues[L001] / 3;
    TagGbl.floatValues[L003] = (float)Math.Sin(TagGbl.floatValues[A001]);
    TagGbl.floatValues[L004] = (float)Math.Cos(TagGbl.floatValues[A001]) * 360;

    //Write to PLC
    TagGbl.floatValues[TagGbl.tagBase[A009w].validx] = TagGbl.floatValues[L002];
    TagGbl.tagBase[A009w].wrtflag = 1;  // write to PLC
} 


다른 스카다 패키지에서는 C-Like, VB-Like, Java-Like 스크립트 언어를 이용해서 계산 태그를 위한 로직을 작성하거나 사용자 로직을 반영하지만 동운 HMI의 경우에는 C# 기반으로 HMI 응용을 제작하는 환경이므로 내부 태그나 계산 태그를 위한 코드 역시 위의 예제처럼 C# 코드로 내부 태그 드라이버 소스에(PLCLocalCompute.cs) 작성합니다. private void loop1sec(){} 처럼 드라이버 환경 설정에서 지정한 메소드 이름과 부합하도록 코드를 작성합니다. 동운 HMI는 TagGbl.boolValues, TagGbl.Int16Values, TagGbl.Int32Values, TagGbl.UInt16Values, TagGbl.UInt32Values, TagGbl.floatValues, TagGbl.StringValues 와 같이 각 데이터 타입별 배열로 개별 태그 값을 응용의 전체 스레드가 공유하도록 관리합니다. 각 태그 정보는 TagGbl.tagBase라는 Tag 클래스의 배열에 저장되는데 TagGbl.tagIndex["L004"]처럼 태그 이름으로 태그의 클래스 배열내 인덱스를 추출할 수 있습니다. 각 태그의 데이터 타입을 참조해서 .validx 속성을 사용하면 ...Values 값 배열 내의 위치를 확인해서 직접 읽기 및 쓰기가 가능합니다.


실제 PLC로 값을 내려보내려면 해당 PLC 드라이버를 통해서 값을 전송해야 하므로 예제 코드의 A009w처럼 시스템 내부에서 생성하는 쓰기 태그(기본 태그명 앞에 @를 붙임)의 값에 내려 보내려는 값을 저장하고 wrtflag 속성을 1로 하면 해당 드라이버가 값을 PLC로 전송합니다.



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함