2015. 3. 30.

부추 16일차


역시 성장속도가 어마어마하다.

그러나 아직 너무 얇아서 더 키워야 한다.

2015. 3. 29.

화랑대역

화랑대역(폐역).
공사하려고 준비중이어서 얼른 나왔다.
개인적으로 저런 사진 찍는 건 오글거리는데,, 하늘이 멋지게 나와서 올린다.

요즘 대학원 진학에 대해 고민이 많이 생겼다.
내가 하려는 것과 내가 원하는 것이 같은 것일까...

그리고 내가 꿈꾸는 미래와 현실은 뭐가 다를까.

내가 미래에 대해 너무 신경을 끄고 살았던 거 같다.

2015. 3. 26.

'Light the time 공포' 에 외국분이 극찬의 댓글을 달아주셨다.


  작년에 만든 'Light the time 공포' 앱을 얼마전에 외국에도 출시했는데,
어느 분께서 댓글을 달아주셨다. 뭔가 굉장히 뿌듯한 기분.
VR게임인데 우리 게임처럼 'VR전용 안경' 없이도 VR게임이 가능한 것은 흔치 않나보다.

  별도의 홍보 없이도 무료고 요구사항도 없어서 그런지 다운로드수와 설치수가 꾸준히 늘고 있다.

그런데 호러게임이라 그런지 얼마전 12세이용가 판정을 받았다ㅋㅋ





<게임 중 화면>




앱은 아래 링크를 통해 더 볼 수 있다.
링크 : 컴퓨터용 플레이스토어 링크

부추 12일차


하루가 멀다하고 무섭게 자라난다..

이런 속도라면 2주안에 부추전이 가능할지도 모르겠다.

2015. 3. 25.

부추 11일차


겁내 빨리 자란다.. 씨앗을 뿌린 모든 곳에서 발아가 되었다.

성장속도... 엄청나다.

2015. 3. 23.

부추 9일차



  9일차가 되자 여기저기서 부추들이 나오기 시작했다.

원래 심었던 모양 그대로 솟아오르기 시작하는데, 뿌린 씨앗의 발아 수율이 상당하다.


  이제 얼만큼 성장할지 계속 지켜봐야겠다!

2015. 3. 21.

이랑이 산책

  


오랜만에 온 인천.. 털이 엉망진창인 이랑이를 데리고 산책을 나왔다.
나이가 많아져서 그런지 자기주장이 강해졌다. 하긴 자기 생의 절반을 살았으니 그럴만도 하다..ㅎ
이제 들어가서 과제를 해야지.....!!


목욕 후 이랑

2015. 3. 18.

flex and bison - 문법에 관하여..

  이전의 flex and bison - 간단한 계산기 만들기 글에서 썼던 문법에 대해 추가 설명을 하겠다.

표현을 할 때 그냥 아래와 같이 쓰면 안될까?

exp: exp ADD exp
     | exp SUB exp
     | exp MUL exp
     | exp DIV exp
     | ABS exp
     | NUMBER
     ;

안된다.

  왜냐하면 선후행 관계가 없기 때문이다. 곱하기 나누기를 더하기 빼기보다 먼저해야하는데 위와 같은 표현에서는 알수가 없다.






알겠다.. 그럼 더하기 빼기만이라도 아래와 같이 쓰면 안될까?

exp: exp ADD exp
     | exp SUB exp
     | factor
     ;

안된다.

  왜냐하면 이렇게 '모호한' 표현을 해주면 parser에서 충돌이 일어나게 된다.
예를들어 1 - 2 + 3 이 있을 때 (1-2) +3 과 1 - (2+3) 은 전혀 다른 결과가 나오게 된다.
물론 1 + 2 + 3 과 같은 경우는 상관이 없다. 그러나 대부분의 경우 error 가 생긴다.


  보통 bison의 parsing 알고리즘은 token이 input에 대해 어떤 rule과 매칭 될지 예견할 수 있다.
그런데 어떤 문법은 모호하지 않지만 예견하기 위해서 하나 이상의 token이 필요할 때가 있다.
비록 이럴때 보통 token이 충분하도록 문법을 수정할 수 있기는 하지만.. 충돌을 일으킨다.

그리고 이렇게 선후행 관계를 각각 따로 떨어진 rule로 지루하게 만들어야하는가?
아니다! 다른 방법도 있다!

이러한 것들에 대해서는 나중에 배우게 될 것이다.



flex와 bison이 멋진 점은 문법 수정이 아주 쉽다는 것이다!

'괄호'와 '주석' 라는 것을 쓰기 위해 이전 글에 내용을 약간 추가해보자.






flex의 내용에 아래를 추가한다.

"(" { return OP; }
")" { return CP; }
"//".* /* ignore comments */






bison의 내용에 아래를 추가한다.

%token OP CP in the declaration section
...
%%
term: NUMBER
       | ABS term { $$ = $2 >= 0? $2 : - $2; }
       | OP exp CP { $$ = $2; } New rule
       ;


OPCP token을 새로 정의한다.  여기서 OP는 ' ( '를 의미, CP 는 ' ) '를 의미한다.

다시 build를 하게 되면 괄호와 주석까지 쓸 수 있는 계산기가 된다.





출처 :
flex_bison_O'Reilly

flex and bison - 간단한 계산기 만들기

<그림1>

  컴파일을 할때 일단 string으로 적혀 있는 어떤 컴퓨터 언어의 어휘 분석을하여 의미 단위인 토큰을 추출하고(flex), 그 토큰들의 관계가 어떻게 되는지를 따져서 실제로 그런 관계가 되도록 하는 Parsing(bison) 단계가 있다. 그렇게 되면 C코드가 만들어지고 그것을 가지고 어셈블리어를 만들게 되고 이후에 실행가능 파일로 만들게 된다. <그림1>에서 Lexical Analyzer 가 flex고, Parser가 bison이 하는 역할이다.

  역으로 flex와 bison을 알게되면 새로운 컴퓨터 언어를 창조할 수 있다는 이야기!  (어차피 C코드로만 만들게 되면 나머지는 해결)





  자 그럼 계산기 예제를 만들어 보면서 flex와 bison이 어떤 일을 하는 지 알아보자. 먼저 flex예제부터 보자.



fb1-4.1l 예제

//선언부 
%{
enum yytokentype { //token에게 값을 부여해보자. 원래는 자동으로 부여된다.
NUMBER = 258, //token은 자동적으로 258부터 시작하지만 일단 예제이므로 직접 작성해본다.
ADD = 259,
SUB = 260,
MUL = 261,
DIV = 262,
ABS = 263,
EOL = 264
};
int yylval; //token의 return값을 담을 변수
%}

//pattern
%%
"+" { return ADD; } //각 부호 마다 맞는 token을 return한다.
"-" { return SUB; }
"*" { return MUL; }
"/" { return DIV; }
"|" { return ABS; }
[0-9]+ { yylval = atoi(yytext); return NUMBER; } //숫자는 int 타입으로 yylval에 저장하고 token을 return한다.
\n { return EOL; } //newline 이면 EOL을 return한다.
[ \t] { /* ignore whitespace */ } //공백 무시
. { printf("Mystery character %c\n", *yytext); }

//C code
%%
main(int argc, char **argv)
{
int tok; //token값 임시 저장 변수
while(tok = yylex()) { //token의 return값이 있는 경우
printf("%d", tok); //token의 value를 출력
if(tok == NUMBER) printf(" = %d\n", yylval); //만약 token이 NUMBER라면 yylval의 value도 출력
else printf("\n");
}
}


//결과
$ flex fb1-4.l
$ cc lex.yy.c -lfl
$ ./a.out
a / 34 + |45
Mystery character a
262
258 = 34
259
263
258 = 45
264

  결과를 보면 token의 value가 출력되는 것을 알 수 있다. 즉 string 으로 입력된 code들을 scan해서 의미가 있는 단위로 추출했다는 것이다.
또한 yylval 은 scanner 가 token을 return 할때 token의 값이 들어있는 것이다.





 그런데 이제 이 token을 가지고 이들의 관계를 지정해 줘야한다. 밑에 <그림2>을 보자.


<그림2>

  예를들어 1 * 2 + 3 * 4 + 5 라는 계산식이 있을 때 우선적으로 계산되어야 하는 것이 있다. 즉 token마다 의미가 있고 관계가 있다.
위의 <그림2> 처럼 트리를 만들어서 parser가 사용하도록 해줘야하는데 그럴때 쓰는 언어가 바로 context-free grammar(CFG) 이다.
  그 중에서 standard form 은 Backus-Naur Form (BNF)이다. 우리가 쓸 bison은 BNF가 기반이다.


예를 들어 1 * 2 + 3 * 4 + 5 라는 것이 있을 때 아래와 같이 표현한다.

   <exp> ::= <factor>
            | <exp> + <factor>
   <factor> ::= NUMBER
            | <factor> * NUMBER

 각 라인은 parse tree 의 branch를 어떻게 생성할지에 대한 규칙이다. 이때 기호는 아래와 같이 해석한다.

::= 은 is a 나 become 으로 해석
| 는 or 로 해석

  규칙의 왼쪽에 있는 이름은 symbol 혹은 term이다. 자 이제 해석하는 방법으 알아보자.
첫번째 규칙을 보면 exp는 factor 이거나 exp는 exp + factor 형태이다. 그렇담 여기서 factor란 무엇인가? 그것은 두번째 규칙에 있다.
  두번째 규칙에서 factor는 NUMBER이거나 factor는 factor * NUMBER형태이다.

  위 규칙에 의하면 곱하기가 된 것 혹은 숫자들이 factor가 되고 그것들을 더하거나 그 자체가 exp가 된다. 즉 곱하기를 먼저하고 더하기를 하게 되는 것이다.





아래의 간단한 사칙연산 계산기 bison 예제를 보자.

fb1-5.y 예제
/* simplest version of calculator */
//선언부
%{
    #include <stdio.h>
%}

/* declare tokens */
%token NUMBER
%token ADD SUB MUL DIV ABS
%token EOL

%%
//rules
calclist: /* nothing 아무것도 안함 */           //matches at beginning of input   
         | calclist exp EOL { printf("= %d\n", $2); } //EOL is end of an expression //결과 출력
         ;
//더하기, 빼기 규칙
exp: factor //default $$ = $1
     | exp ADD factor { $$ = $1 + $3; }
     | exp SUB factor { $$ = $1 - $3; }
     ;
//곱하기, 나누기 규칙
factor: term //default $$ = $1
        | factor MUL term { $$ = $1 * $3; }
        | factor DIV term { $$ = $1 / $3; }
        ;
//숫자, 절대값 숫자 규칙
term: NUMBER //default $$ = $1
       | ABS term { $$ = $2 >= 0? $2 : - $2; }
       ;

%%
//C code
main(int argc, char **argv)
{
yyparse();
}

yyerror(char *s)
{
fprintf(stderr, "error: %s\n", s);
}

  flex와 마찬가지로 3개의 part로 나뉘어져있다. (선언, 규칙, C code)
BNF와 달리 bison 은 ::= 대신 : 을 사용한다. 그리고 ; 은 rule 의 끝을 의미한다.
Bison은 rule이 match됐다면 자동적으로 parsing을 해줘서 C code에서 각각의 symbol이 값과 연관 되도록 한다.

  맨 처음의 rule의 왼쪽 symbol은 start symbol이라고 한다.
각 symbol 마다 값을 가지고 있는데 target symbol은 action code에서 $$으로 표현된다.
오른쪽에 있는 값들은 차레대로 $1, $2... 순으로 표현된다.


예를들자면!


exp: factor                                    -> exp = $$, factor = $1
     | exp ADD factor { $$ = $1 + $3; }  -> exp = $1, ADD = $2, factor = $3
     | exp SUB factor { $$ = $1 - $3; }   -> exp = $1, SUB = $2, factor = $3
     ;

이런식으로 각각 $$과 $1, $2... 들이 매치되는 것이다.







  자 이제 flex로 만든 예제파일과 bison으로 만든 예제파일을 하나로 합쳐서 계산기를 만들어 보자.

  합치기 전에 parser가 불러올 수 있도록 fb1-4.1l 예제를 약간 수정해야 한다.
특히 우리가 token의 value를 직접 정의하는 것보다 bison이 token number와 yylval의 정의를 생성해주는 헤더파일을 include 하도록 한다.
  parser가 scanner를 호출할 것이기 때문에 우리는 scanner의 세번째 section에 있는 main routine을 제거하도록 한다.
수정결과는 아래와 같다.


 fb1-4.l을 수정한 fb1-5.l 예제

//선언부 
%{
#inclue "fb1-5.tab.h" //헤더파일 include
%}

//pattern
%%
"+" { return ADD; } //각 부호 마다 맞는 token을 return한다.
"-" { return SUB; }
"*" { return MUL; }
"/" { return DIV; }
"|" { return ABS; }
[0-9]+ { yylval = atoi(yytext); return NUMBER; } //숫자는 int 타입으로 yylval에 저장하고 token을 return한다.
\n { return EOL; } //newline 이면 EOL을 return한다.
[ \t] { /* ignore whitespace */ } //공백 무시
. { printf("Mystery character %c\n", *yytext); }

%%





이때 makefile 의 내용은 아래와 같다.

# part of the makefile
fb1-5: fb1-5.l fb1-5.y
 bison -d fb1-5.y
 flex fb1-5.l
 cc -o $@ fb1-5.tab.c lex.yy.c -lfl




<그림3>

  설명하자면 이렇다. 처음에 bison이 -d 옵션(for "definitions" file)에 의해 fb1-5.tab.c와 fb1-5.tab.h를 생성한다.
이때 fb1-5.tab.h에는 bison에서 선언한 token에 대한 value 정보가 들어있고 yylval도 선언되어있다. 그렇기 때문에 flex 코드에서 이 헤더파일을 include하여 쓰게 된다.
그리고 flex가 lex.yy.c를 만들도록 한다. 그 후에 flex library와 함께 컴파일을 한다.

그 후에 실행해본다.




$ ./fb1-5
2 + 3 * 4
= 14
2 * 3 + 4
= 10
20 / 4 - 2
= 3
20 - 4 / 2
= 18

결과는... 잘 된다!!



  우리가 계산기를 만들었다!




출처 :
flex_bison_O'Reilly

2015. 3. 16.

flex and bison 컴파일 기초

flex 와 bison은 리눅스에서 아래의 명령어로 다운 가능하다.


sudo apt-get install flex bison


flex_bison_O'Reilly에 나온 첫번째와 두번째 예제를 해보겠다.
입력한 문장의 줄수, 단어수, 캐릭터 수를 카운트하는 예제를 만들어 보겠다.

fb1-1.l 이란 이름으로 예제를 만든다.
내용은 아래와 같다.



//선언부
%{
    int chars = 0;
    int words = 0;
    int lines = 0;
%}

%% 
//pattern
[^ \t\n\r\f\v]+ { words++; chars += strlen(yytext); } //yytext는 pattern이 match 된 input text를 가리키는 포인터다.
\n        { chars++; lines++; } 
.         { chars++; }

%%
//main
main(int argc, char **argv)
{
    yylex();  //flex가 scanner routine을 준다. token.
    printf("lines : %8d words: %8d chars : %8d\n", lines, words, chars);
}


선언부는 %{   ... %} 안에 넣어서 선언한다.

pattern은 아래 형식으로 작성한다.
pattern { ... }
pattern은 말그대로 matching 될 pattern이고 뒤에 { ... }은 pattern이 match된 경우 실행하는 부분이다.
+ 는 그것 혹은 그 이상의 것을 match할때 쓴다. 여기서는 단어나 string of letters를 의미하게 된다.
. 은 else 같은 기능으로 위에 제시된 pattern에 해당하지 않는 경우에 실행하도록 한다.

그 다음 컴파일을 해보자.


flex fb1-1.l       // flex에게 우리 프로그램을 해석하라고 시킨다.(이때는 에러를 말하지 않는다) 그러면 lex.yy.c 가 생성 된다.
cc lex.yy.c -lfl  // lex.yy.c를 flex library와 링크하여 컴파일, c프로그램을 만든다. a.out이 생성 된다.
./a.out              // 실행한다.

문장 입력후 ctrl-D를 해보자.
아마 카운트 결과가 멋지게 나올 것이다!









fb1-2.l 이란 이름으로 예제를 만든다.
내용은 아래와 같다.


/* English -> American*/
%%
"colour" {printf("color");}
"flavour" {printf("flavor");}

. {printf("%s",yytext);}
%%

실행 결과는.... 영국식 단어로 입력하면 미국식 단어로 출력된다!


엇? 그런데 선언부와 main이 없는데 괜찮나?!

괜찮다.

flex가 기본 form을 제공한다.




출처 :
flex_bison_O'Reilly

2015. 3. 15.

부추 1일차



부추 1일차.

평소 부추전을 좋아해서 자주 해먹는데 생각보다 부추가 쑥쑥 잘 자란다고 한다.


그렇담,,, 길러야지!!



 마트에서 3L물을 부으면 10L 씩이나 흙이 만들어지는 신개념 흙을 사가지고 와서 부추 씨앗을 심었다.

무럭무럭 자라서 부추전이 될 수 있길..

2015. 3. 4.

정적라이브러리와 동적(공유)라이브러리

 라이브러리와 목적파일, 링커에 대해 간단하게 정리를 해보겠다.
먼저 <그림1>과 같은 간단한 .c파일을 생각해보자. main.c에서는 외부함수 swap을 사용하였고 swap.c에서는 외부변수 buf를 사용하였다. 
서로 연관되어 있는 상태이다.

<그림1>





우선 정적 라이브러리, 링킹에 대해서 정리하겠다.

<<정적 링킹>>

<그림2>


gcc -02 -g -o p main.c swap.c 


 <그림2> 와 같이 위 명령어입력하여 실행가능 목적파일 p를 생성한다.
(여기서 -02는 최적화 옵션, -g는 디버깅옵션이다.)


목적파일 p가 만들어지는 자세한 순서는 다음과 같다.

1. 드라이버가 C전처리기(cpp)를 돌려서 C소스파일 main.c를 ASCII 중간파일인 main.i로 번역
2. 드라이버가 C컴파일러(cc1)을 돌려서 main.i를 ASCI 어셈블리 언어파일인 main.s로 번역
3. 드라이버가 어셈블러(as)를 돌려서 main.s를 재배치 가능한 목적파일인 main.o로 번역
4. swap.c에 대해서도 같은 일 반복하여 swap.o 생성
5. 마지막으로 링커 프로그램 ld를 실행하여 실행가능 목적파일 p를 생성하기 위해 main.oswap.o를 연결





<<정적 라이브러리 생성>>

<그림3>

 각각의 목적파일들을 하나의 아카이브로 즉 라이브러리로 만들기 위해 ar도구를 사용한다. 아카이브 파일이름은 .a 접미어로 나타낸다. 
<그림3>에서는 libc.a 라는 정적 라이브러리를 만들었다. 그림이 상세한 내용을 보면 약간 다르긴 하지만 맥락만 이해하면 된다.




<그림4>


gcc -o libvector.a addvec.o multvec.o


(위의 명령어를 사용하여 addvec.o와 multvec.o를 libvector.a로 만들었다.)


<그림3>과 같은 방법으로 만든 라이브러리와 링킹을 하는 과정이 <그림4>에 나와있다. addvec.o와 multvec.o를 가지고 만든 정적 라이브러리 libvector.a와 main2.o와 vector.h로 만든 재배치가능 목적파일 main2.o를 가지고 링커가 p2라는 실행가능 목적파일로 만들고 있다. 이때 중요한 것은 libvector.a에 가지고 있는 모든 목적파일(모듈)을 복사하는 것이 아니라 main2.o에서 쓰여지고 있는 목적파일만 정적 라이브러리에서 복사하게 된다. libc.a에서도 마찬가지로 쓰여진 printf.o만 복사가 된다.

 즉 라이브러리에 있는 모든 목적파일을 복사하는 것이 아니라 라이브러리에 있는 각각의 목적파일에서 정의된 심볼이 main에서 참조되는지 확인하여 참조되는 모듈만 복사하게 된다.


 그러나 정적 라이브러리는 단점이 하나 있다. 만약 라이브러리의 내용이 수정된다면 다시 링크를 해야한다. 따라서 동적 라이브러리가 나오게 되었다.





 <<동적 링크와 라이브러리>>

<그림5>

 동적링크를 하기전에 일단 동적(공유)라이브러리를 만들어야 한다.
<그림4>에서 쓰인 libvector.a는 정적 라이브러리었는데 정적 라이브러리가 아니라 동적 라이브러리로 만들어보자. 아래의 명령어를 입력하여 만든다.


gcc -shared -fPIC -o libvector.so addvec.c multvec.c

(-shared 플래그는 링커가 공유 목적파일을 생성하도록 하는 옵션, -fPIC 플래그는 컴파일러가 위치-독립성 코드를 생성하도록 지시)


라이브러리가 생성되었으므로 이제 링크를 한다.

gcc -o p2 main2.c ./libvector.so

실행가능 목적파일 p2를 '런타임'에 libvector.so 와 링크될 수 있는 형태로 생성한다.
libvector.so로부터의 코드아 데이터 섹션들 중 실제로 p2 실행파일로 복사된 것은 아무것도 없다. 그렇기 때문에 라이브러리가 수정되어도 다시 링크를 할 필요가 없다.

동적링킹은 소프트웨어의 배포, 공성능 웹서버의 개발 등에 적용된다.



위치-독립성 코드 :
  공유 라이브러리를 사용하는 주목적은 다수의 실행되고 있는 프로세스들이 메모리 내에서 동일한 라이브러리 코드를 공유하도록 하는 것이며, 그래서 귀중한 메모리 자원을 절약하는 것이다. 다수의 프로세스들이 하나의 프로그램 사본을 공유하는 방법중에 좋은 접근 방법으로, 라이브러리 코드를 컴파일해서 링커가 수정하지 않고도 어떤 주소에서라도 로드될 수 있고, 실행될 수 있도록 하는 것이다. 이러한 코드는 위치-독립성 코드(PIC)라고 알려져 있다.

출처 :
COMPUTER SYSTEMS A Programmer's Perspective (2nd) (컴퓨터시스템) - DAVID R. O'HALLARON

2015. 3. 3.

Raspberry Pi와 Beremiz 연결하기

  최종목표는 RaspberryPi(RPi)의 wiringPi를 Beremiz에 적용(?)하여 베레미즈에서 라즈베리의 LED를 키는 것이다.
일단은 RaspberryPi와 Beremiz간에 연결부터 해보자.

  베레미즈 홈페이지에 Documentation에서 How to build on Linux에 나와있는 절차대로 Linux가 설치된 컴퓨터와 라즈베리파이 모두에
베레미즈를 설치한다.(출처 참조)

 컴퓨터에서는 Beremiz.py를 실행시킬 것이고 RPi에서는 Beremiz_service.py를 실행할 것이다.
베레미즈는 PYRO라는 것으로 통신을 하게 되는데 RPi와 컴퓨터 모두 리눅스이므로 따로 설정할 것은 크게 많지 않다.

<그림1>

<그림2>

 우선 그림1과 같이 컴퓨터에서 베레미즈 디렉토리로 들어가 베레미즈를 실행시킨다. 명령어는 아래와 같다.

python Beremiz.py

 그런 후에 간단한 프로그램을 만든다. 필자의 경우는 for 루프로 100까지 더한 후 done을 출력하는 프로그램을 만들었다.
그리고 Project의 config에서 URI주소를 아래와 같이 설정한다.

PYRO://RPi의 IP주소:포트

타겟타입은 RPi가 리눅스이므로 리눅스로 하였다. (사실은 라즈베리파이로 만들어 줘야하지만 일단은 리눅스로 하자)
그리고 gcc 옵션을 전에 'Raspberry pi에 Xenomai 설치하기'를 했을때 썼던 크로스컴파일러를 사용하기 위해 아래와 같이 컴파일러와 링커를
수정한다.

arm-bcm2708hardfp-linux-gnueabi-gcc

이때 환경변수 PATH를 설정해주어야 저 gcc를 쓸 수 있는데,
나의 경우는 홈디렉터리에 있는 .bashrc의 파일을 수정하여 arm-bcm2708hardfp-linux-gnueab가 있는 경로를 /usr/bin 앞에 삽입한 내용을
추가하여 저장하였다. 내용은 아래와 같다.

PATH=......./xenomai_workspace/tools-master/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin:..........

그런다음 바로 적용을 하였다.(서버를 이용하기 때문에 재부팅을 하면 안되서 ㅠ)

source .bashrc

자 이제 베레미즈를 build해보자. gcc옵션에 의해 RPi에 맞게 컴파일이 될 것이다.






 여기까지 컴퓨터에서의 준비작업은 끝났다. 이제 RPi에서 준비를 하자.
RPi에서 설치된 베레미즈 폴더에 가서 베레미즈서버를 실행시키자.

python Beremiz_service.py

만약 192.168... 같은 RPi의 ip주소가 안나오고 이상한 ip주소가 생긴다면 다음과 같이 옵션을 추가한다.

python Beremiz_service.py -i RPi 의 ip주소 -p 포트번호(필자는 3001로 하였다)


자 이제 컴퓨터에서 베레미즈로 연결을 하고 PLC에 전송을 누른다.




<그림3>

그러면 <그림3>과 같이 PLCobject가 왔다고 글씨가 나올 것이다. 이제 Run을 누르면 동작을 한다. 

연결이 된 것이다.


다음에는 wiringPi를 쓸 수 있도록 해볼 것이다.




민제형에게 감사드립니다.

출처 :
http://www.beremiz.org/doc - Beremiz 홈페이지

2015. 3. 2.

정동진






바다?? 바다!!

생각났을 때 바로 가는 재미.
날씨도 너무 좋았고 바다가 너무 이뻤던 하루.
이건 Arts로 가야겠지.

이교연님께 감사드립니다.

※사진을 클릭하시면 크게 보실 수 있습니다.