오늘은 "FB" (Function Block)에 대해서
알아볼까 합니다.
지난번에 간단하게 알아보긴 했는데,
오늘은 좀 더 자세히 알아보려고 해요.
많은 분들이 FC와 FB를 많이 헷갈려하시고 차이점이
뭔지 정확하게 잘 모르시고 어려워 하시더라구요.
그렇게 막 엄청 복잡하게 생각하실 필요 없습니다.
일단 오늘 이야기 할 "FB"에 대해서 시작해 볼께요.
오늘 제가 하는 이야기를 잘 보시면 감이 오실 겁니다.
머리속에 최대한 간단하게 정리 될 수 있도록 말해보겠습니다.
"FC"에 대해서는
아래 포스팅을 참조 해 주세요~~
출처: https://mech19.tistory.com/113 [초보 엔지니어의 다락방]
SIEMENS STEP7 PLC Simatic Manager Programing 기초 응용 ( 지멘스 PLC FC, Function )
오늘은 "FC"(Function)에 대해서 자세히 알아보겠습니다. 간단하게 얘기해서 "FC"는 프로그램을 짜는 공간이라고 생각하면 됩니다. 일단 지난번에 배운 내용중에서 "FC"를 생성하는 방법부터 살
mech19.tistory.com
1. Function과 Function Block????
초보자들 입장에서 제일 헷갈리는 순간입니다.
Function도 함수고 Block의 종류 중 하나고...
Function Block도 함수 블록이라는 뜻이고...
같은거 아니야????
맞습니다. 그렇게 생각하실 수 있어요.
거의 90% 같아요.
그런데 잘생각해 봅시다.
"FC"(Function)도 우리가 프로그램을 짜넣어서
"OB"에서 호출해서 사용하고
"FB"(Function Block)도 프로그램을 짜넣어 놓고
"OB"에서 호출해서 사용 합니다.
그리고 "FC"에서 짤 수 있는 프로그램은 "FB"에서도 짤 수 있고,
"FB"에서 짤 수 있는 프로그램 또한 "FC"에서 대부분 다 짤 수 있어요.
( 왜 대부분인지는 아래에서~~~~~~~~~~~~~)
그런데 왜 두개를 나누어 놓았느냐~~~~~~~~~
앞서 "FC"에서는 프로그램을 작성 할때 사용 할 수 있는 변수가
로컬변수와 임시변수였습니다.
이 로컬변수와 임시변수에 저장되는 데이터는
해당"FC"가 동작할때만 데이터가 저장되었다가
"FC"가 동작이 끝나면 데이터는 휘발되어 사라집니다.
"FC"에는 메모리가 고정적으로 할당되지 않기 때문입니다.
반면 "FB"의 데이터는 "FC"와는 다르게
해당 "FB"의 실행이 끝나더라도
데이터의 지속적인 저장이 가능합니다.
"FB"에는 고정적으로 메모리가 할당되기 때문입니다.
"FB"는 로컬변수와 임시변수, 그리고 정적변수를 사용하고
"DB"를 할당받기 때문에
위에서 이야기한 데이터의 지속적인 저장이 가능합니다.
이제 약간 이해가 되시나요??
그럼 이제 "FB"의 변수와 "DB"에 대해서 알아보겠습니다.
2. "FB"의 "DB"와 "변수"
1) Instance DB
자 위에서 이야기한 "FC"와 "FB"차이 중에서
"FC"는 메모리를 할당받지 않고
"FB"는 메모리를 할당 받는다고 하였습니다.
"FB"는 이렇게 할당 받는 메모리를 "DB"를 통하여
사용합니다.
여기서 "DB"는 여러분들이 흔히 생각하시는 DATA BASE가 아닙니다.
"DB"는 지멘스 PLC 프로그램상의 Block 종류 중 하나로
DATA Blcok을 의미합니다.
이 "DB"는 Global DB와 Instance DB로 종류가 나뉘어 집니다.
(일단 DB에 대해서는 나중에 따로 상세하게 이야기 해 보기로 하고 넘어가겠습니다.)
모든 "FB"에는 "Instance DB"가 각각 할당되고
"FB"의 데이터들은 이 "Instance DB"에 저장이 됩니다.
그래서 해당 "FB"의 실행이 끝나도 데이터가 휘발 되지 않고
남아있습니다.
![](https://blog.kakaocdn.net/dn/R1Qhg/btrrOclZm5h/AFVDQsF7aocJjAbOC6nUi1/img.png)
위와 같이 "FC"는 혼자라고 보면
"FB"는 데이터 저장공간인 "DB"와 항상 함께라고
생각하면 됩니다.
2) "Static변수" (정적변수)
"FB"의 변수 중에서 "Instance DB"에 저장되는
변수를 "Static"(정적변수)라고 합니다.
![](https://blog.kakaocdn.net/dn/bBx9l2/btrrPPX8y2y/kZSZChST8XWkXM7jldKPSk/img.png)
위는 "FB"의 변수 선언 창입니다.
위와 같이 선언된 변수들은 "DB"에 저장이 되는데
그 모습은 아래와 같습니다.
![](https://blog.kakaocdn.net/dn/betAmW/btrrF7zY2Cm/3AGOncrQHE4pW1KSd0b95K/img.png)
이렇게 "DB"에 변수가 저장되면
해당 "FB"의 실행이 종료되어도
변수가 가지고 있는 데이터는 그대로 남아있게 됩니다.
3. "FB" 프로그래밍
이제 직접 "FB"와 "DB"를 만들어
프로그래밍을 해보도록 하겠습니다.
먼저 "FB"를 생성하는 방법은 다른 블록들과
동일합니다.
![](https://blog.kakaocdn.net/dn/cgmBy3/btrrPpMbaih/B2gjMnAsK45K0U7dpYkObK/img.png)
위와 같이 [Insert New Object]-[Function Block]을 통해서
생성하면 됩니다.
저는 "FB1"을 만들겠습니다.
![](https://blog.kakaocdn.net/dn/MoZVL/btrrOdFfbDd/IwipcJ4raLlvpmZq92mvA1/img.png)
그리고 동일한 방법으로 "DB"도 생성하면 됩니다.
단, "DB"를 생성할 때는 type을 잘 설정해주어야 합니다.
![](https://blog.kakaocdn.net/dn/cuWP9t/btrrJVk077h/nMmbG0WNKIeWZrnJ0cuotK/img.png)
먼저 위와 같이 "Name and type"에서
"Instance DB"를 선택해 주도록 합니다.
![](https://blog.kakaocdn.net/dn/bdVc3o/btrrIgcmrjE/Uudf3VO3vYkhDrWDDZgDVk/img.png)
그리고 연동시킬 "FB"를 선택해 주면 됩니다.
우리가 만든 "FB"가 "FB1"이니까 "FB1"을 연동시켜 주도록 합시다.
![](https://blog.kakaocdn.net/dn/sqIsa/btrrPoNgGxY/1HwC5eIKZOZBCjTdS6qoA0/img.png)
자 그럼 "FB1"과 "DB1"이 잘 생성된 것을 확인 할 수 있습니다.
처음에 "DB1"을 실행시켜서 열어보면 아래와 같이 아무것도 없는것을
확인 할 수 있습니다.
![](https://blog.kakaocdn.net/dn/bQwgTQ/btrrIeFFh70/TM8iG3lHWqvcO3Vyvweb3K/img.png)
"DB"에 변수와 데이터를 넣으려면 해당하는 "FB"에 변수를 선언하고
프로그램을 작성한 다음에
"OB"에서 "FB"와 "DB"를 호출해 주어야 합니다.
그럼 찬찬히 하나씩 해볼까요??
먼저 "FB1"을 실행해 줍니다.
아직 아무것도 없는 상태죠.
실행된 화면의 상단부분을 보니 "FC"비슷하게
변수 선언창이 있습니다.
일단 위와 같이 변수를 선언하였습니다.
그리고 선언한 변수를 이용하여 프로그램도 간단하게 작성하였습니다.
프로그램을 간단히 설명드리자면
"Pump_start" A접점을 "ON"시키면
"PP_C" (S_CU : 업카운터)가 UP되며,
"Pump_run" 출력코일이 "ON" 됩니다.
그리고 자기유지를 통해
"Pum_run" 출력코일은 "ON"상태를 유지하고
"Pump_stop" B접점을 눌러 "OFF"시키면
"Pump_run" 출력코일이 "OFF" 됩니다.
간단한 자기유지 프로그램에 카운터 하나 추가한거라 보시면 됩니다.
자 이렇게 작성한 "FB1"을 저장하고
이제 "OB1"에서 호출해 보겠습니다.
(선언한 변수의 종류에 대해서는 나중에 자세히 다시 이야기 하겠습니다.)
"OB1"을 실행하여 열어보니
아무것도 없는 깔끔한 상태네요.
여기서 "Program elements"탭에서 [FB blocks]-[FB1]을
찾아들어가면 됩니다.
이제 "FB1"을 드래그&드롭 하여 "OB1"에서
호출하도록 합니다.
그럼 "FB1"박스 위에 ???(물음표)가 떠있습니다.
아직 이 "FB1"의 데이터를 어디다가 저장할 것인지
지정하지 않아서 입니다.
물음표 부분을 클릭해보면 "DB"목록이 뜹니다.
(우리는 "DB1" 하나만 만들었으니 하나만 뜨는겁니다.)
"DB1"을 선택해주면 아래와 같이
물음표는 사라지고 "FB1"과 "DB1"의 호출이 완료됩니다.
그리고 이제 다시 "DB1"을 열어보면 아래와 같이
변수들이 데이터와 함께 저장되어 있음을 확인 할 수 있습니다.
아 마지막으로 아까 "OB1"에서 호출했던 "FB1"을 사용하려면
각각 절대어드레스 혹은 심볼 어드레스 혹은 Bit Memory를 이용하여
각 입출력 포인트에 맞게 지정을 해주어야 합니다.
![](https://blog.kakaocdn.net/dn/bon32o/btrrOb8wDna/zknKDyl2ZcGHntKlRv9vbK/img.png)
![](https://blog.kakaocdn.net/dn/cO9mie/btrrOc7pFXJ/ydnMfuziZGeVlB9NfNgxjk/img.png)
지정을 해주면
위 그림의 왼쪽에서 오른쪽 처럼 각 입출력 포인트에
지정된 어드레스들이 표시가 됩니다.
(잘못 지정하면 빨간색 글씨가 뜹니다.)
참고로 여러가지 타입으로 지정이 가능하다는 것을 보여주기 위해
절대어드레스 혹은 심볼 어드레스 혹은 Bit Memory를 아무거나 집어넣어 본것이니
의미를 찾지 마시기 바랍니다.
"PP_C"는 카운터 이기 떄문에
카운터 어드레스인 "C1" 지정했습니다.
여러가지 "Program elements" (카운터, 타이머, 연산자, 명령어 등등)은
앞으로 차근차근 사용법을 배워 나갈테니
오늘 사용한 카운터 사용법을 몰라서 골머리 썩지 마시기 바랍니다.
오늘은 그냥 크게 "FB"의 사용법에 대한 감을 확실히
익히는 것에 중점을 두시기 바랍니다.
그럼 오늘은 여기까지 하겠습니다.
다음시간에는 변수의 타입과 종류에 대해서 좀 더 확실하게
전체적인 개념을 정리하도록 하겠습니다.
제 블로그를 방문해 주셔서 감사합니다.
도움이 되셨다면 공감(좋아요) 부탁드리고,
댓글은 다른분들께도 좋은 정보일 수 있으니
공개로 부탁드립니다.
여러분의 작은 정성이 좋은 포스팅을 생산하는
힘이 된답니다. :)
감사합니다.
댓글