안녕하세요.
CIMON입니다.
1워드를 16비트로 표현하려는 경우, AND 연산을 이용하여 스크립트를 작성하는 것으로 가능합니다.
다음 예제를 참고하여 주시기 바랍니다.
[예제]
1. 데이터베이스에서 아날로그 태그 1개와 디지털 태그 16개를 생성합니다. 태그 생성 시 ‘태그 동작을 지정함’, ‘태그값 변경 시 태그동작을 실행함’ 옵션을 선택합니다.
2. [도구]-[스크립트]에 진입하여 두 개의 스크립트를 아래와 같이 작성합니다.
[워드->비트]
Sub Word2bit()
worddata = GetTagVal(“WORD”) ‘‘WORD’태그를 변수 worddata에 저장 합니다.
BitMask = 1 ‘변수 BitMask 에 1을 저장 합니다.
For i = 00 To 15 ‘ i 에 0에서 15까지 저장 합니다.
tagstr$ = “BIT”+Format(i,”00”) ‘ ‘BIT00’~’BIT15’ 값을 변수 tagstr$ 에 저장 합니다.
bitdata = worddata AND BitMask ‘ 예를 들어 worddata에 5가 들어오면 000000000000101 AND 1 이면 bitdata에 1이 들어 갑니다.
if(bitdata > 0) then
SetTagVal tagstr$, 1 ‘bitdata 0보다 크면 tagstr$ 1을 저장 합니다.
else
SetTagVal tagstr$, 0 ‘bitdata 0이면 tagstr$ 0을 저장 합니다.
end if
BitMask = BitMask * 2 ‘예를 들어 처음 1 이들어가면 000000000000101
‘2에 1승 이여서 두번째 비트를 의미 합니다.
Next
End Sub
=================================================
[비트->워드]
Sub Bit2Word()
BitMask = 1 ‘ 변수 BitMask 에 1을 저장 합니다.
worddata = 0 ‘변수 worddata 에 0을 저장 합니다.
For i = 00 To 15 ‘ i 에 0부터 15까지 저장 합니다.
tagstr$ = “BIT”+Format(i,”00”) ‘‘BIT00’~’BIT15’ 값을 변수 tagstr$ 에 저장 합니다.
BitVal = GetTagVal(tagstr$) ‘tagstr$ 값을 변수 BitVal 에 저장 합니다.
For j=0 to (i-00) ‘ j 에 i 값을 저장 합니다.
BitMask = 2^j ‘BitMask 에 2 에 j 승을 저장 합니다.
Next
worddata = worddata + BitMask * BitVal
Next
SetTagVal “WORD”,worddata
End Sub
=====================================================
아래 그림과 같은 형식으로 각 스크립트를 등록합니다.
3. 아날로그 태그의 태그 동작을 다음과 같이 입력합니다.
RunScript(“Word2bit”)
각 디지털 태그들의 태그 동작을 다음과 같이 입력합니다.
RunScript(“Bit2Word”)
4. CimonX를 실행하여 동작을 확인합니다.
[워드->비트]
아날로그 태그의 값(워드 값)을 변경하였을 때, 워드의 값에 해당되는 비트 값이 디지털 태그 값으로 표현됩니다.
Ex) 아날로그 태그에 12345 값을 입력하였을 때, 다음 그림과 같이 BIT00, BIT03, BIT04, BIT05, BIT12, BIT13 태그의 값이 1로 변환됩니다.
12345 = 2^0 + 2^3 + 2^4 + 2^5 + 2^12 + 2^13
[비트->워드]
디지털 태그의 값(비트 값)을 변경하였을 때, 비트의 값에 해당되는 워드 값이 아날로그 태그 값으로 출력됩니다.
Ex) BIT00, BIT03, BIT05 태그의 값을 1로 변경하였을 때, 다음 그림과 같이 WORD 태그의 값이 41로 나타납니다.
2^0 + 2^3 + 2^5 = 41
언제나 고객을 먼저 생각하는 CIMON이 되겠습니다.
감사합니다.