lua script를 이용한 logic 심볼 만들기



※ AND Gate


function _ontask()

if(input1 == true and input2 == true) then

output = true

else

output = false

end

end


※ OR Gate

function _ontask()

if(input1 == false and input2 == false) then

output = false

else

output = true

end

end


※ NAND Gate

function _ontask()

if(input1 == true and input2 == true) then

output = false

else

output = true

end

end


※ NOR Gate


function _ontask()
if(input1 == false and input2 == false) then
output = true
else
output = false
end
end

※ XOR Gate


function _ontask()
local icount = 0
if(input1 == true) then
icount = icount + 1
end
if(input2 == true) then
icount = icount + 1
end
if(icount%2 ~= 0) then
output = true
else
output = false
end
end

※ XNOR Gate

function _ontask()
local icount = 0
if(input1 == true) then
icount = icount + 1
end
if(input2 == true) then
icount = icount + 1
end
if(icount%2 ~= 0) then
output = false
else
output = true
end
end

※ INVERTOR Gate

function _ontask()

if(input == false) then

output = true

elseif(input == true) then

output = false

end

end


※ BUFFER Gate

function _ontask()

if(input == false) then

output = true

elseif(input == true) then

output = false

end

end


※ 3 STATE BUFFER Gate

function _ontask()

if(state == true) then

if(input == true) then

output = true

elseif(input == false) then

output = false

end

elseif(state == false) then

output = false

end

end


※ MUX Gate



function _ontask()
if(select1 == false) then
output = input1
elseif(select1== true) then
output = input2
end
end

※ HALF ADDER Gate


function _ontask()
local icount = 0
if(x_value == true) then
icount = icount + 1
end
if(y_value == true) then
icount = icount + 1
end
if(icount%2 ~= 0) then
s_value = true
else
s_value = false
end
if(x_value == true and y_value == true) then
c_value = true
else
c_value = false
end
end

※ HALF SUBTRACTOR Gate


function _ontask()
local icount = 0
if(x_value == true) then
icount = icount + 1
end
if(y_value == true) then
icount = icount + 1
end
if(icount%2 ~= 0) then
d_value = true
else
d_value = false
end
if(x_value == false and y_value == true) then
b_value = true
else
b_value = false
end
end


※ 사용자가 제작한 심볼을 이용한 로직 프로세싱.


다기능 그래픽 솔루션 : enuSpace 이엔유 주식회사 



enuSpace professional 2016 기준

enuSpace 편집기 스크립트 사용자 함수 호출 (lua script)


스크립트 내에서의 다른 함수 실행 


같은 객체 내의 함수 실행


각 객체는 다른 여러 개의 함수를 포함할 수 있으며 예시로 사용된 것처럼 직접 함수 이름을 호출할 수 있다.

다음 그림에서 GetColor함수는 같은 사각형 객체 내에 있으며 onmousedown함수에서 사용된 예이다.





이웃 객체 내의 함수 실행


각 객체에 함수는 이웃하는 다른 객체의 함수를 호출할 수 있다.

다음 그림에서 GetColor함수는 같은 사각형 객체 내에 있으며 onmousedown함수에서 사용된 예이다.



다음 그림은 "빨강"이라는 텍스트 객체에 SetFontSize함수를 이용하여 fonts-size를 바꾸는 함수를 만들고 이웃한 객체인 사각형 객체의 마우스다운 이벤트 함수를 이용하여 실행하는 함수 예시이다. 사각형 객체는 마우스를 클릭하여 index 값을 바꾸고 인덱스 값에 따라 이웃한 객체인 ID_TestRed 객체의 font-size를 바꾼다.




Lua Script 함수 실행


각 객체는 자식객체의 함수, 상위객체의 함수 페이지 함수, 전역 함수, 인터페이스 함수, 루아스크립트 함수 등을 실행할 수 있는데 실행되는 순서는 다음과 같다.

- 같은 객체 내의 함수

- 자식 객체의 함수

- 이웃 객체의 함수

- 상위 객체의 함수

- 페이지 함수

- 전역함수

- 인터페이스 함수

- .루아스크립트 함수

우선 순위는 같은 객체 내의 함수가 가장 높고 루아스크립트 함수가 가장 낮다. 자식 객체의 함수를 실행하기 위해서는 자식객체 id.함수 이름으로 실행해야 하며 자식객체에서 찾지 못하면 이웃 객체에서 찾는데 이웃객체에도 없으면 차례로 우선순위가 높은 순으로 찾는다. 따라서 우선 순위가 낮은 함수를 사용하려면 같은 이름의 함수는 우선 순위가 낮은 함수를 찾을 때까지 존재하지 않아야 한다. mean 함수는 테이블을 인수로 받아 테이블 내의 모든 값을 더해서 테이블의 필드 개수로 나누어 평균값을 구한 후 그 값을 반환한다. 다음 그림은 mean 전역함수를 선언한 예시이다.




다음 그림은 전역함수 mean 함수를 이용해서 onmousedown에 의해 바뀌는 index 값을 각 테이블의 필드 값에 더하고 테이블의 평균값을 구하는 전역함수 mean을 이용해서 평균값을 구해서 텍스트 객체(ID_TextRed)의 text 에 문자열을 할당하는 onmousedown함수 예제와 그 실행된 상태를 표시하는 예시이다.





다른 함수를 실행함으로써 바뀐 값을 그 후에 사용하는 방법


다른 함수를 실행함으로써 전역 변수나 다른 기타의 변수가 바뀐 상태의 것을 현재의 스크립트 함수에서 다시 사용하고자 할 때 값을 다시 가져오는 GetValue(변수이름) 을 사용하여야 하며 그냥 사용할 시는 변경된 값이 적용되지 않는다.

다음 그림은 스크립트 내에서 index의 값을 사용하는 예시를 보여준다. IncreaseIndex함수는 index값을 1씩 증가시키므로 IncreaseIndex함수가 실행된 후에는 index 값이 1이 증가되어 있으나 스크립트 내에서는 아직 이전 값을 가지고 있다. 변경된 값을 가져오기 위해서 GetValue(index)를 사용하여 현재의 값을 가지고 와서 사용한다.










enuSpace professional 2016 기준

enuSpace HMI 편집기를 이용한 동적 디스플레이 기능



Dynamic Script


속성 변경


속성의 변수 타입이 boolean인 속성은 스크립트 내에서는 true, false 값을 할당함으로써 바꿀 수 있으며, wchar 인 속성은 string의 보조 함수인 string.format 함수를 이용해서 바꿀 수 있다. wchar 속성의 변수를 string.format 함수를 사용하지 않고 직접 할당할 경우 처음에 할당되었던 문자의 크기보다 새로이 할당된 문자의 크기가 클 경우 메모리 침범이 발생할 수 있으며, 심해질 경우 프로그램이 정지할 수도 있다. 속성 변수의 이름은 -가 포함될 수 없으며 '-'는 '_'로 대치(속성 : fill-opacity, 변수명 : fill_opacity)하여 변수를 설정하였으므로 반드시 '-'는 '_'로 바꾸어 사용해야 한다.


boolean : visibility, lock, disabled, multiline, password, read-only, want-return, border, number, lowercase, uppercase, static-edge, auto-scroll, horizontal-scroll, vertical-scroll 등.

wchar : id, fill, stroke-dash, stroke, points, d, text, font-family 등.

int : stroke-width, stroke-linejoin, stroke-linecap, text-anchor, font-style, font-weight 등.

float, double : fill-opacity, stroke-opacity, x, y, rx, ry, width, height, translate-x, translate-y, rotate, scale-x, scale-y, center-x, center-y, cx, cy, r, rx, ry, font-size 등. 


색상변경 : 문자열 속성


각 객체의 색상은 텍스트 문자열로 "rgb(0,0,0)" , "black" 또는 "#000000" 처럼 스크립트 내에서 입력함으로써 변경할 수 있다.





onmousedown 이벤트에 의해 index의 값을 바꾸고 index 값에 따라 색상 값을 반환해주는 GetColor함수에서 색상 값을 받아서 사각영역을 채우는 색상 fill값을 바꾼다.





투명도 변경 : float 속성


각 객체의 색상은 0~1 사이의 투명도를 가지며 실수이다. 0은 완전 투명 1은 완전 불투명이다. 





onmousedown 이벤트에 의해 index의 값을 바꾸고 index 값에 따라 투명도 값을 반환해주는 GetOpacity함수에서 투명도 값을 받아서 사각영역의 투명도를 설정하는 fill-opacity 값을 바꾼다.





visibility 변경 : boolean 속성


각 객체의 속성 중 visibility는 객체가 보여질 것인지 보여지지 않을 것인지에 대해 결정하며 조건에 따라 객체가 보여질지 안 보여질지에 대해 스크립트 내에서 설정할 수 있는데 visibility의 변수 타입은 boolean이므로 스크립트 내에서 true 혹은 false로 할당하여 바꿀 수 있다.

다음 그림 예시는 세 개의 문자열 "빨강", "녹색", "파랑"의 visibility속성을 사각형의 마우스 다운이벤트가 한번 발생할 때마다 바뀌는 예시이며, 각각의 문자열은 사각형에 이웃한 객체의 고유한 id를 가지고 id.visibility를 바꾸는 스크립트를 작성한 예제이다.





다음 그림은 visibility를 바꾸는 이벤트 함수가 차례로 실행되어 표시된 상태이고 ○1은 편집 창에서의 표시를 나타내고 ○2는 실행창에서의 표시를 나타낸다. 편집 창에서는 편집을 위해 객체가 완전히 사라지지 않고 hidden 상태를 나타내는 회색 박스를 표시한다. 






enuSpace professional 2016 그래픽 편집기와 루아 스크립트



그래픽 편집기는 그래픽에 대한 속성들과 사용자 정의 전역 및 지역 변수 들을 가지고 있으며 현재의 값을 Lua Script에 전달하고 Lua Script에서 함수의 실행에 의해 바뀐 값을 그래픽 편집기의 그래픽 속성이나 전역 또는 지역변수에 전달하여 값을 변경시킨다. 모든 값을 변경시키는 행위는 프로그램이나 사용자의 마우스 이벤트 등에 의해 발생되며 현재 값의 전달 및 변경된 값의 반환이 함수의 실행 전과 실행 후에 각각 발생한다. 아래 그림은 그래픽 편집기에서 객체의 사용자 정의 함수인 GetColor()에 대한 예시를 나타낸 것이다.





아래 그림은 그래픽 편집기에서 객체의 사용자 정의 함수인 onmousedown()에 대한 예시를 나타낸 것이다.




Lua Script 내부에서만 실행되는 변수 및 함수는 별도로 User Interface가 지원되며Lua Script내부에서는 이벤트 또는 사용자 함수에 의해서 사용 가능하다.



그래픽 편집기에서 Lua Script를 사용하는 방법은 아래와 같다.

1. Lua Script 편집 창을 연다. 

2. Lua Script 편집 다이얼로크 창에서 편집된 내용을 Lua Script에 등록한다.

3. Lua Script에 등록된 변수의 값을 확인하거나 새로운 값을 할당하는 스크립트를 작성한다.

4. 3번 항목에서 작성된 스크립트를 Lua Script에서 실행한다.

5. COLOR 테이블을 Lua Script에 작성하는 스크립트.

6. COLOR 테이블에서 Red 필드.

7. 4번 항목에서 실행한 결과 값의 표현.

그래픽 편집기에서는 전역변수 및 각 객체의 속성 등 다양한 구조적 변수를 가지고 있으며 이러한 구조적 변수를 Lua State에 그대로 가지지 않는다. 모든 값의 변경은 Lua Script에 등록된 함수의 실행에 의해 이루어 지며, 사용되는 변수와 함수 스크립트는 Lua Script에 테이블을 생성하여 변수 및 함수로 등록한다. 이벤트 및 프로그램에 의해 실행되는 함수는 각 함수에 해당하는 Lua Script 테이블과 1:1 대응 관계에 있으며 변수의 인터페이스나 반환 값이 없는 경우 그래픽 편집기 함수는 Lua State에 등록되지 않는다. 아래 그림은 그래픽 편집기의 데이터 구조를 나타낸 것이다.





아래 그림은 Lua Script데이터 구조에 대해 나타낸 것이다.











lua script의 기본 문법


Lua Script의 기본 문법 중 변수 생성 규칙은 아래와 같다.

1. 숫자로 시작하지 않는 영문자, 숫자, 밑줄의 조합으로 생성할 수 있으나 Lua Script에서 사용하는 예약어 (and, break, do, else, elseif, end, false, for, function, if, in, local, nil, not, or, repeat, return, then, true, until, while 등) 는 피해야 한다 

2. Lua Script는 대소문자를 구분하며, and는 예약어 이지만 And, AND 등은 서로 다른 식별자이다. 

Lua Script의 주석 처리는 한 줄 주석은 "--"으로 시작하여 EOL에서 끝나며, 블록 주석은 "--[[" 으로 시작하여 “]]”에서 끝난다.

Lua Script의 변수는 적용 영역에 따라 지역변수와 전역변수를 가지며, 지역변수는 local로 변수 앞에 선언해 주거나 제어문 안에서 사용된 변수에 해당하고, 전역변수는 어디에서는 호출 가능한 변수이다. 아래 표는 Lua Script에서 사용되는 자료형을 정리한 것이다.


Lua Script 자료형

자료형

설명

예시

nil

()의 값을 갖는 자료형이다.

논리연산에서의 nil은 거짓이고, 전역변수 및 테이블 키에서의 nil은 전역변수 및 테이블에서의 키는 버려진다.

a=nil

if a then --거짓이므로

        str = "I have many friends."

else

        str = "I have few friends." --실행.

end

boolean

true false값 만을 갖는다. 0, 1 과 같이 수치로 변환되지 않는다.

a = true or false

number

double형 수치이다. 정수나 실수를 구분하지 않는다

a = 4

b = 23.0

c = 2.3e-1

d = 2.3E5

string

"또는 ' 으로 감싼다. 긴 문자열은 [[...]]을 사용하다. string은 편집이 되지 않으며 오로지 새로운 문자열을 생성한다.  string은 보조 라이브러리를 가지고 있다.

str = "white"

varName = "Rect1"

value = 20

str = string.format("%s = %d", varName,value)

str = string.lower(varName)

coroutine

동시에 어떤 일을 수행시킬 때 사용한다. (thread)

co = coroutine.create

                     (function ()

           for i=1,10 do

             print("co", i)

             coroutine.yield()

           end

         end)

coroutine.resume(co)

coroutine.status(co)

userdata

Lua에서 배열을 표시하는 방법으로 Lua에서 정의되지 않은 raw 메모리를 생성한다.

void *lua_newuserdata (lua_State *L, size_t size)를 사용한다.

static int newarray (lua_State *L)

              {

      int n = luaL_checkint(L, 1);

      size_t nbytes = sizeof(NumArray) + (n - 1)*sizeof(double);

      NumArray *a = (NumArray *)lua_newuserdata(L, nbytes);

      a->size = n;

      return 1;  /* new userdatum is already on the stack */

    }

table

Lua의 테이블은 복합 자료형이면서도 중요한 역활을 한다. key-value가 아닌 배열이나 객체 프로그래밍을 할 때 필요하기 때문이다. 전체적으로 {}로 감싸며 key []로 감싼 형태이다. 배열도 테이블이다. key-value형식이 아닌 우리가 흔히 하는 요소가 한 줄로 배치된 모습이다. 배열의 처음 시작 인덱스는 1부터 시작하며 0인덱스를 사용하려면 사용자가 직접 만들어 주어야 한다.

COLOR = {Red = "rgb(255,0,0)",Green = "rgb(0,255,0)",Yellow = "rgb(0,0,255)"}

T = {x = 10, y=20 ,z=30, func = function () return a end}

T2={10,20,30}

COLOR.Red --> rgb(255,0,0)

COLOR["Red"]  --> rgb(255,0,0)

T["x"] -->10

T2[1]  -->10

Lua Script에서는 다른 Script 언어와 같이 치환, 산술, 관계, 논리 연산자 등과 같은 연산자를 제공하며, 아래 표는 Lua Script에서 사용되는 연산자에 대해 설명한 것이다.


Lua Script 연산자

연산자

연산 기호

예시

치환 연산자

=

A = 10

산술 연산자

+, -, *, /, %, ^(자승)

A = 10

B = A*10

관계 연산자

>, >=, == , <=, <, ~=(같지않음)

if(A>B)

논리 연산자

and, or, not

if(A>B and B<5)

기타 연산자

..(문자열 연결),#(문자열 혹은 테이블 등의 크기 반환)

str1 = "ab "

str2 = "efgh"

str3 = str1..str2

str3         -->  "ab efgc"

COLOR = {Red = "rgb(255,0,0)",Green = "rgb(0,255,0)",Yellow = "rgb(0,0,255)"}

A = #COLOR

A                    -->  3


아래 표는 Lua Script 연산자의 우선 순위를 나타낸 것이다.

Lua Script 연산자 우선순위

연산자

비고

^

오른쪽 우선 연산자

-, not, #

- 단항연산자(부호) 의미

*, /, %

- 이항연산자(빼기 연산) 의미

+, -

 

..

오른쪽 우선 연산자

>, <, >=, <=, ==, ~=

 

and

 

or

 


Lua Script에서는 다른 Script 언어와 같이 if, for, while 등과 같은 제어문을 제공하며, 아래 표는 Lua Script에서 사용되는 제어문을 정리한 것이다.


Lua Script 제어문

제어문

설명

예시

if

조건부 실행을 위한 if문은 기본구조는 "if 조건 then 실행문 end"의 구조이다.

- if 조건 then

  statement

elseif 조건 then

  statement

else

  statement

end

switch

Lua Script에는 switch 문이 없으므로 switch문 대신에 연속 비교문

if 조건1 then

실행문

elseif 조건2 then 

실행문

elseif 조건3 then 

실행문

elseif 조건4 then 

실행문

.elseif 조건n then 

실행문

else

실행문

end

While

조건이 참이면 무한 반복을 하는 while 문은 C C++ 처럼 먼저 조건을 검사하고 조건이 참이면 do 에서 end까지의 실행 문을 실행한다. 조건이 거짓이 되거나 break 문에 의 탈출할 수 있다.

while 조건 do

   statement

 end

repeat, until

조건이 참이 될 때까지 반복해서 실행하는 repeat 문은 repeat에서 until까지 조건이 거짓이면 무한 반복 실행한다. while 이나 for문과는 다르게 repeat에서 until까지 무조건 한번은 실행한다. C C++ 에서 "do 실행문 while(조건)"과 유사하다. 조건이 참이 되거나 break 문에 의해 탈 출할 수 있다.

repeat

   statement

 until 조건

for

for문은 수치 for 문과 일반 for 문의 두 가지 사용방법으로 사용하며 수치 for 문은 시작조건에서 종료조건이 될 때까지 step 만큼씩 더하면서 do 에서 end까지 실행한다. 제어변수는 반복문 안에서만 사용가능하며 반복문을 벗어나면 인식되지 않는다. break에 의해 탈출 할 수 있다. 일반 for 문은 반복자함수에서 반환된 모든 값을 실행한다. 배열의 값을 모두 실행하기 위해서 반복자 함수 ipairs 가 제공되고 반복될 때 마다 색인과 값을 얻는다. "for i, v in ipairs(a) do 실행문 end"에서 a는 배열이름 이고 i는 색인, v는 값이다.

for 시작조건, 종료조건, step do

   statement

 end

 

for 반복자 do

   statement

 end

break

while, for, repeat 문을 탈출하는데 사용한다.

for 시작조건, 종료조건, step do

   statement

   break

 end

return

값을 되돌리거나 함수를 종료할 때 사용한다.

for 시작조건, 종료조건, step do

   statement

   return

 end


http://www.lua.org/



enuSpace professional 2016 기준


enuSpace professional 2016 과 lua script language


enuSpace는 스크립트로 다양한 기능을 구현할 수 있으며, 적용한 Script Language는 Lua Script를 사용했다. enuSpace에 적용한 Lua Script는 C, C++언어뿐 아니라 포트란, 자바, 스몰토크, 에이터, C# 등 다양한 언어와 연결되며, 펄이나 루비와 같은 다른 스크립트 언어와도 잘 통합되며 작고 간단한 언어이다. 또한 스크립트 언어 중에서 가장 빠르며, 윈도우 유닉스뿐 아니라 모든 플랫폼에 이식이 가능한 특징을 가지고 있다. 


Lua Script License

Lua is free software distributed under the terms of the MIT license reproduced here. Lua may be used for any purpose, including commercial purposes, at absolutely no cost. No paperwork, no royalties, no GNU-like "copyleft" restrictions, either. Just download it and use it.

Lua is certified Open Source software. Its license is simple and liberal and is compatible with GPL. Lua is not in the public domain and PUC-Rio keeps its copyright.

The spirit of the Lua license is that you are free to use Lua for any purpose at no cost without having to ask us. The only requirement is that if you do use Lua, then you should give us credit by including the copyright notice somewhere in your product or its documentation. A nice, but optional, way to give us further credit is to include a Lua logo and a link to our site in a web page for your product.

The Lua language is entirely designed, implemented, and maintained by ateam at PUC-Rio in Brazil. The implementation is not derived from licensed software.

Before Lua 5.0, Lua used its own license, which was very close to the zlib license and others, but not quite the same. Check the source distribution for the exact license text for each version before Lua 5.0. Nevertheless, if you wish to use those old versions, you may hereby assume that they have all been re-licensed under the MIT license as described above.





+ Recent posts