[Excel Tip-03] 열 삽입! 행 삽입!! (Feat. 열 삭제, 행 삭제)

셀 형태로 구분된 엑셀은 데이터 취합이나 해야할 업무를 리스트로 만드는데 상당히 유용한 프로그램이다.
그렇게 리스트로 작성하여 데이터를 관리하다보면 정형화된 틀을 깨트리지 않은 채로
항목을 추가 또는 삭제해야 하는 경우가 종종 발생하는데,
이럴 때 업무 속도를 올려주는 유용한 팁!!
함께 알아보자.


1. 열 (or 행) 삽입하기


다음과 같은 엑셀 문서가 있을 때,

각 품목별로 할인율을 적용할 수 있도록 '수량'과 '합계' 열 사이에 '할인율'이라는 항목을 추가한다고 가정하자.
그러기 위해서는 두 열 사이에 새로운 열을 추가해야 한다.
가장 흔히 사용하는 방법은 역시나 마우스를 이용한 방법!!

하지만, 마우스를 쓰지 않고도 쉽게 열 (or 행)을 삽입하는 방법이 있었으니,
그건 바로 단축키 Alt + I, C (열의 경우 Alt + I, R)이 되겠다.

삽입하고자 하는 셀에 가서 단축키를 입력하면,

이렇게 바로 열이 삽입된다.

그러고나서 이렇게  문서를 완성하면 된다.


2. 열 (or 행) 삭제하기


이번에는 Item04의 행 전체를 삭제해보자.
역시나 행 전체 삭제를 위해 자연스레 마우스로 손이 갈 것이다.

마우스를 쓰지 않고 행 전체를 삭제할 때 사용하는 단축키는
Alt + E , D, R, Enter (열의 경우 Alt + E, D, C, Enter) 이다.

삭제하고자 하는 셀에 가서 단축키를 누르면,

이렇게 행이 바로 삭제된다.



spacer

[Excel Tip-02] 선택하여 붙여넣기

일을 하면서 프로그래밍 개발 툴만큼이나 빈번하게 열어서 활용하는 프로그램 중 하나가 엑셀이다.
정말이지 알면 알수록 대단한 프로그램이라는 생각과 함께 이런 대단한 프로그램을 개발한 개발자들이 존경스럽다는 생각도 하게 된다.
오늘도 엑셀의 뉴비스러움을 벗어나보자는 취지에서 팁을 하나 더 끄적여볼까 한다.
역시나 함께 알아보자. ㅎㅎㅎ


1. 수식 표시하기


다음과 같은 엑셀 문서가 있을 때,
누가봐도 각 품목별 단가와 수량을 곱해서 합계를 내놓은 문서이고,
누가봐도 어디가 데이터이고 어디가 수식인지, 그리고 어떤 식이 사용되었을지 뻔히 추측이 가능한 문서이지만,
오늘의 뉴비스러움을 탈출하기 위한 팁의 설명으로 이 문서를 사용할 것이다. ㅎㅎ

엑셀 문서를 보면 수식이 적용되어 연산까지 끝낸 결과를 나에게 보여주고 있다.
당연히 단가나 수량을 수정하면 거기에 연관된 수식 결과가 자동으로 반영되어 표시될 것이다.
그런데, 저 간단한 예제에 약간의 상상력을 더해서 꼬리에 꼬리를 물고 수식들이 반영된 엑셀 시트를 마주하게 되었다고 가정해보자.
그렇다면, 어떤 수식이 어떤 셀을 참조하게 되는지를 하나하나 셀을 선택하며 함수창을 통해 확인할 수 밖에 없다.

이 때 사용할 수 있는 유용한 기능이 바로 '수식 표시하기' 기능이다. (°ロ°) !

< 수식이 반영된 셀들이 모두 값 표시에서 수식 표시로 바뀌었다!! >


2. 선택하여 붙여넣기


아주아주 간단한 예제이지만 복잡한 데이터를 다루는 엑셀 시트라 가정하고,
입력한 데이터를 바탕으로 연산 수행 결과를 다른 엑셀 시트에서 활용하기 위해 복.붙을 했을 때,

보는 거와 같이 아주 깔끔하게 잘 붙었다. ㅎㅎ

그런데, 위에서 이야기했던 '수식 표시하기' 기능을 사용하면 어떻게 될까?

수식까지 함께 따라온 것을 확인할 수 있다.

나는 연산된 결과만 깔끔하게 가져와서 이용하고 싶은건데, 어떻게 하면 될까??
여기에 유용한 기능이 바로 '선택하여 붙여넣기' 이다.

다시 처음으로 돌려 놓고 복.붙하려는 영역을 Ctrl + C로 복사하자.
그리고, 붙여넣기 위치로 이동한 다음 'Ctrl + Alt + V'를 눌러보자.


선택하여 붙여넣기 라는 창이 나타나면서 나에게 어떻게 붙여 넣을 것인지를 물어본다.
여기서 '값'을 선택한 다음 아래 부분의 '확인' 버튼을 클릭하자.

깔끔하게 값만 가져온 것을 확인할 수 있다. ㅎㅎ



spacer

SoMachine Basic: Grafcet POU

SoMachine Basic의 POU 알아보기 제 2탄!!
1탄은 General POU에 대해 알아보았고, 2탄은 Grafcet POU를 알아보려고 한다.
역시나, 그냥 한번 부딪혀보자.  (๑و•̀Δ•́)و

2. Grafcet POU


이름이 Grafcet POU란다.
문득, Grafcet이라는 단어가 무슨 뜻인지 궁금하여 구글신에게 물어봤다.
몇 군데의 웹사이트를 돌아다니다보니, Grafcet이 무슨 말인지 알 수 있었다.

Grafcet은 "GRAphe Fonctionnel de Commande Etapes / Transitions"의 약자이고,
(귀차니즘이 발동하여, 어느 나라 말인지까지는 찾아보지 않았다. ㅎㅎ)
영어로 번역하자면, "Step Transition Function Chart"란다.
결국 SFC (Sequential Function Chart)와 유사한 의미로 보인다.

본론으로 들어가서, Grafcet POU를 추가하려면 SoMachine Basic > Programming 탭dml
왼쪽 부분 중 'Master Task'에서 추가할 수 있다.
(왜!! 다른 Task에서는 추가할 수 없을까??)

Grafcet POU를 추가하니 POU 밑에 'Transitions'도 함께 생성된다.

그런데, SFC 격인 Grafcet POU가 추가되었는데, POU만 달랑 추가될 뿐 프로그래밍을 위한 다른 어떤 항목들이 보이지 않는다.
(살짝 당황... (⊙_⊙))
그냥 부딪혀보기로 했으니 일단 POU 내부에 마우스 우클릭을 해보자.

역시나, 스텝을 추가하는 메뉴가 나타났다. ٩(ˊᗜˋ )و
곧바로 스텝들을 추가해보자.


눈에 띄는 것은 가장 먼저 추가한 스텝은 두 줄짜리이고 나머지는 한 줄짜리 스텝이라는 점이다.
토큰을 이용하여 동작할 스텝을 결정하는 SFC 언어의 특성 상 처음 토큰을 가지고 시작하는 스텝 (Initial Step)을
구별하기 위함일 것이다.
당연히 이니셜 스텝은 사용자에 의해 변경이 가능하다.

이니셜 스텝이 2개 생겼다. (o_O) !
토큰을 여러개 핸들링 할 수 있다는 의미 같다.
어차피 난 하나의 POU 안에서 여러개의 토큰을 핸들링 할 생각도 없으니, 일단 넘어가자.
(그리고, 토큰을 여러개 둔다는 것은 별로 좋은 프로그래밍 습관도 아니다.)

다시 3번 스텝을 원상 복귀 시키고나서 가만 보니 뭔가 빠진게 있다.
바로 토큰을 전달하는 브랜치들과 토큰의 전이를 제어할 트렌지션들이다.
Grafcet POU를 좀 가지고 놀다보니 눈에 띄는 것 중 하나가,
스텝의 상단과 하단에 마우스 포인터가 지나갈 때 그 부분에 굵은 녹색 네모가 생긴다는 것이다.
아마도, 거기가 브랜치를 연결하는 곳이 아닐까 싶은데...

역시!! 연결하고자 하는 한쪽 스텝의 끝 부분을 마우스로 드래그 해주면 브랜치가 연결되고,
브랜치 사이에 트랜지션도 함께 추가된다.
(자연스레 만들어진 Alternative Branch ㅎㅎ)

이번에는 Parallel Branch를 만들어보자.
먼저, 'Tr2'가 있는 브랜치를 먼저 삭제하고, 'Tr1'과 스텝3을 연결해보자.
('Delete' 키로 삭제할 수 있다.)

< 쉽네!! ㅎㅎ ٩(^ᴗ^)۶ >

Grafcet POU에 스텝과 트랜지션들을 만들고 나면 왼쪽의 Task 부분에 추가된 스텝들과 트랜지션들이 생겨난다.
어차피, SFC의 역할은 그려진 차트 안에서 토큰들을 이리 저리 굴리는 것 뿐,
토큰을 받은 스텝이 해야할 일은 분명 스텝 안에다가 만들어줘야 할 것이다.
Grafcet POU에 대해 이해한 것이 맞는 지 확인하기 위해 간단한 프로그램을 하나 만들어보자.

정말정말 간단한 프로그램이다.
각 스텝마다 하는 역할은 현재 토큰이 위치한 스텝의 번호를 알 수 있도록 %MW0에 상수를 할당하도록 되어 있고,
자기 자신에게 토큰이 전이되도록 만든 트랜지션을 리셋하도록 되어 있다.
그리고, 각 트랜지션은 %Mn (n은 타켓 스텝 번호)이 True가 되었을 때 토큰을 전이하도록 프로그래밍하였다.

동작하는지 확인하기 위해 애니메이션 테이블을 하나 만들자.

시뮬레이션으로 동작을 확인한다.

예상대로 잘 동작하는 것을 확인할 수 있다. ㅎㅎ



요약
- Grafcet POU는 SFC와 유사한 개념
- Grafcet POU에는 토큰을 핸들링하기 위한 스텝과 트랜지션만 추가하고 각 스텝별 액션은 스텝에 지정


spacer

SoMachine Basic: General POU

SoMachine Basic에서 사용자가 작성하는 프로그램을 POU라고 부른다.
POU가 무슨 뜻인지 SoMachine Basic의 Help에게 물어봤더니 Program Organization Unit 이란다.
좀 더 정확한 정의를 알아보려고 구글에게 물어봐도 정보를 얻는데 한계가 있다.  (`ヘ´)
그래서, 그냥 한번 부딪혀보기로 했다.  (๑و•̀Δ•́)و

1. General POU

SoMachine Basic으로 새로운 프로젝트를 생성하면 'Programming' 탭에 기본적으로 POU가 하나 추가되어 있다.
이것이 일반 POU이다.

지금까지 얻은 정보들로는 SoMachine Basic은 IEC61131-3 언어 중 LD와 IL, 그리고 SFC를 사용할 수 있다고 한다.
거기서 추측컨데, 일반 POU는 프로그래밍 언어로 LD와 IL을 사용하는 POU로 보인다.

왼쪽의 트리 구조에서 봤을 때, POU는 프로그램의 덩어리이고, 아래의 Rung이라는 녀석이 LD 기준 프로그램 단위가 아닐까 하는 생각이 든다.
렁의 추가는 왼쪽 트리에서 마우스 우클릭을 통해 할 수도 있고, 프로그램 화면 위쪽의 아이콘을 통해 할 수도 있다.

렁 안에서는 래더 심볼들을 이용하여 프로그램을 작성할 수 있다.


< LD에서 'Hello World'와 비슷한 수준의 예제인 자기 유지 회로를 만들어보았다. ㅎㅎ>

내친 김에 SoMachine Basic에서 지원하는 프로그램 요소들도 살펴보자.

가장 왼쪽부터 렁을 추가, 삽입, 삭제 아이콘들, 선들을 그리거나 지우는 아이콘들을 지나 래더 심볼들이 보인다.
A접과 B접 다음에는 Edge Detection, 그리고 그 뒤로 비교 연산자가 위치한다.

< 비교 연산자를 추가했을 때 화면 >

그 뒤로, XOR 심볼을 지나 Function Block이 보인다.

< SoMachine Basic에서 제공하는 기본 펑션 블록들 >

다음으로 코일과 관련된 심볼들이 보이고, Operation Block이 나온다.

마지막으로, 래더 프로그램 작성에 필요한 기타 항목들까지...

눈에 띄는 것은 래더 프로그램인데, 조건문과 반복문처럼 보이는 항목이 있다는 것이다.
(이 부분은 나중에 여유가 생길 때 살펴보자. ㅎ)


SoMachine Basic의 General POU 항목을 살펴보면서 '읭??  (๑°ㅁ°๑)‼✧' 했던 부분은 별도의 '컴파일'이 실시간으로 이루어진다는 것!!
작성 중인 프로그램에 문법적인 문제가 있으면 'Programming' 탭에 X 표시가 나타난다.

그리고, SoMachine Basic의 왼쪽 부분에서 'Tools' 탭을 누르면 'Messages' 메뉴가 나오는데,
이 메뉴를 클릭하면 아래 부분에 SoMachine Basic이 사용자에게 전달하는 메세지가 나온다.

< 에러가 2개 있다고 한다.  (ㅇ︿ㅇ) >

SoMachine Basic의 또 다른 POU인 Grafcet POU는 다음 시간에... ㅎㅎㅎ




요약
- POU는 사용자가 작성하는 프로그램의 큰 덩어리, 렁은 프로그램의 작은 단위가 아닐까?



spacer

SoMachine Basic: Hardware 설정하기 (Digital In/Output 편)

Hardware 설정하기 (Digital In/Output 편)


SoMachine Basic에서 DI 채널을 설정하려면 우선 왼쪽 리스트 중에서 'Digital Inputs'를 클릭하자.
그러면 SoMachine Basic의 아래 부분으로 표가 나온다.
생각보다 항목이 많다.
이럴때 필요한건?? 참고 자료!!
일단 SoMachine Basic의 Help를 열어본다.

< 참고로, Help는 저기 있다!! >

Help를 열어 원하는 곳을 뒤적뒤적...

< OMG!!! 죄다 영어... OTL >
짧은 영어 실력으로 대충 읽어봤을 때,
Used는 프로그램에서 해당 채널의 사용 여부를 표시하는 곳인 것 같고,
Address는 뭐 당연히 주소이고, 입력이니 %I로 시작하겠지..
Symbol은 다른 개발 환경에서의 변수?? 와 비슷한 느낌 같은데.............
.
.
.
.
.
.
.
프로그램이랑 같이 써보기 전에는 설명만으로 무슨 내용인지 알아먹기 어렵다.
DI 채널에 대한 설정은 여기서 한다는 것과 각 채널에 속성들을 확인 또는 설정하는 곳이라는 정도까지만
확인하고 다음으로 넘어가자.
SoMachine Basic에서 DO 채널을 설정하기 위해 왼쪽 리스트 중에서 'Digital Outputs'를 클릭하자.
이 부분도 Help를 열어서 항목들을 확인해보자.
.
.
.
.
.
.
.
정리하자면, 컨트롤러에 내장되어 있는 DI/DO 채널은 컨트롤러를 선택하는 'Configuration' 탭에서 할 수 있고, 왼쪽의 리스트에서 Digital Input (또는 Digital Output)을 클릭하면 설정할 수 있다.
그리고,
- DI 채널은 '%I'로 시작하는 주소를 갖는다는 것과 DO 채널은 '%Q'로 시작하는 주소를 갖는다는 것을
  확인할 수 있다. 그리고, Symbol이라는 변수?? 같은 것을 지정할 수 있다.
- DI 채널 중 오직 한 채널에 대해서만 런/스탑 스위치 입력 용도로 사용할 수 있다.
- DI 채널 중 %I0.2 ~ %I0.5는 필터 기능을 해제한 상태에서 Edge Detection이나 래치 기능을 쓸 수
  있다.
- DO 채널에서 %Q0.0~%Q0.7 중 한 채널은 컨트롤러의 상태를 전달하는 역할로 사용할 수 있다.
- DO 채널은 모두 컨트롤러가 정지 상태가 되었을 때 현재 값을 유지하거나 특정 값으로 강제 셋팅할 수
  있다.
는 정도로 요약 된다.
이번에는 여기까지.. 나머지는 다음에... ㅎㅎㅎ  


spacer

Labview: 조건문

Case문


C나 Java에서 특정 조건에 따라 연산할 내용을 변경할 때, If문이나 Switch문을 이용한다.
랩뷰에서는 동일한 역할을 수행하기 위해 Case문을 사용하는데, 이렇게 만든다.

생긴 모양을 먼저 보자면,

케이스문을 나타내는 사각형 제일 위로 '선택자 레이블'이 보이고, 왼쪽에 '선택자 터미널'이 위치한다. 
선택자 터미널은 실행할 케이스를 결정하는 소스 역할을 하고, 불리언/정수/Enumeration/에러 클러스터 등이 연결될 수 있다.
선택자 레이블은 선택자 터미널에 연결된 항목을 구분하여 표시하는 역할을 하고, 개별적인 값이나 범위 등을 지정할 수 있다.

간단한 예제를 하나 만들어보자.

아주 간단한 프로그램이다.
VI가 실행되는 동안 'Enable/Disable' 버튼이 True이면 'Value'에 'Slide'의 값이 표시되고, False이면 '0'을 표시하는 프로그램이다.

케이스문에는 선택자 터미널에 '참'과 '거짓'으로만 구별되는 불리언말고, 값을 갖는 정수형도 연결할 수 있다.
다음의 예를 한번 보자.

이번에는 'Enable/Disable'이라는 불리언 대신 'Selector'라는 정수 값을 케이스에 연결하였다.
시연 동영상을 보기 전에 간단히 설명하자면,
셀렉터의 값이 '0'이면 'Value'는 '0'을 표시하고, '1'이면 'Slide'의 값을 표시한다.
끝으로, 셀렉터의 값이 '2'이면 While문의 반복 횟수가 표시된다.

이번 예제에서 눈에 띄는 것은 케이스문의 선택자 터미너에 불리언을 연결했을 때와 달리,
정수형을 연결했을 때는 선택자 레이블에 'Default'라는 표시가 나타난다는 것이다.
이번에는 'Default'의 역할을 알아보기 위해 블록 다이어그램은 고치지 않고 프론트 패널의 셀렉터만 항목을 하나 더 추가해보자.


셀렉터가 하나 더 추가된 값인 '3'을 가졌는데, '0'의 값을 가졌을 때와 동일한 결과가 나오는 것을 확인할 수 있다.
다시 말해, C나 Java에서 Switch 문을 썼을 때, Case로 지정한 경우 이외의 상황을 처리하기 위한 Default Case와 동일한 역할을 한다.

다음 시간에는 랩뷰의 기본적인 시퀀스 처리 기능인 플랫 시퀀스를 살펴보자. ㅎㅎ


요약
- 랩뷰에서의 케이스문은 C나 Java에서의 If문과 Switch문 모두를 커버할 수 있다.
- 선택자 터미널에 정수형과 같이 여러 값을 가질 수 있는 변수가 연결될 경우 Default 인식자를 지정하여
  지정하지 않은 값이 들어왔을 때 에러 없이 처리할 수 있다.



spacer