안녕하세요?


이번 포스팅에서는 지난주 목요일에 드디어 처음으로 PLC라는 것을 진짜로 만져 보고, 이에 대한 이론에 대해서 정리를 하고서, 실제로 했었는 수업 내용으로 나누어서 포스팅을 하고자 합니다. 우선은 이론에 관해서 들어가야 겠습니다.



위 사진은 카탈로그에 있는 고급형 이라고 해야 할까요? 그런 PLC입니다. 무언가 조그만하다는 생각이 들면 정답인게, 이게 손바닥에 들어가는 크기라고 할까요? 일단 제가 다양한 PLC를 보지는 않았지만, 아무리 커도, 양손안에는 들어가는 크기라는 생각이 들었습니다.




먼저 PLC의 모델명을 읽는 법입니다. XGB와 같은 말은 다 기종이며, 그 앞에는 CPU가 붙어 있습니다. 한마디로 연산을 처리하기 위한 CPU인 것이죠. 중요한 것은 그 뒤인데, DC입력을 의미하는 D는 바로, 교류를 공급하라는 의미이며, R과 N은 PLC가 릴레이 타입인지 트렌지스터 타입인지 나타내는 것입니다.


그리고 뒤에 붙는 숫자는 핀의 숫자인데, 입/출력핀의 숫자를 나타냅니다. 그리고 마지막 뒤에 붙는 S와 H는 기본형이냐 고급형이냐 이런 것을 나타낸다고 볼 수 있습니다.



다음은 릴레이 PLC의 내부입니다. 듣자니 CPU는 5V의 전압에서만 작동해야 하기에, 손상을 막기 위해 입력과 출력에는 절연체로 격리되어 있습니다. 그리고 입력과 출력핀에는 Com이라고 해서 공통의 접점이라고 해야 할까요? 모든 핀이 공유를 하는 접점이 있습니다. 이렇게 PLC내부에서 CPU는 입력되는 핀과 절연체로 분리되어 있는데, 어떻게 입력의 신호를 감지하느냐고 하실 것인데, 그 원리는 아래와 같습니다.



먼저 입력되는 단자에서 전압이 걸리면, 양방향 다이오드라는 것이 입력핀의 안에 장착이 되어 있습니다. 그래서 -극이든 +극이든 걸려도, 다이오드에는 불이 들어오게 됩니다. 그럼 다이오드에 불이 들어오는 것을 광 감지센서가 내부에서 빛을 감지하고, CPU에 신호를 보내는 식으로 신호를 감지하게 됩니다.



다음으로 문제는 NPN형식의 PLC입니다. 이게 왜 문제냐고 하면, NPN 트렌지스터가 출력부에 내장이 되어 있는데, +극과 -극을 위 그림에서 보는 것처럼 입력핀은 +극, Com에는 -로 제대로 연결을 해야만 합니다. 왜 이렇냐고 하면 그 이유는 아래에 나와 있는 트렌지스터의 특성과 관계가 있습니다.


이처럼 NPN트렌지스터는 콜렉트에서 이미터로 전류가 흐르는데, PNP 트렌지스터는 반대로 흐르는 것을 볼 수 있습니다. 그래서 고압전류로 인한 노이즈에 취약하다는 이유로 현장에서는 PNP 트렌지스터를 쓰는 PLC는 드물지만, 사용해야 한다고 하면, -극과 +극을 반대로 설정해 주어야 합니다. 당연 B라고 적혀 있는 베이스에서는 NPN은 +극을 걸어줘야 하며, PNP는 반대로 -극을 걸어줘야 합니다.



마지막으로 이론적으로 중요한 것이 NPN센서인데, 출력이 언제나 -로만 나오기 때문에, 이에 유의해서 PLC와 연결을 해야 한다는 점이 주의사항입니다. 왜냐하면 PLC의 입력쪽에 있는 Com에 -극을 걸어주면, 전혀 전류가 흐르지 않아서, PLC가 입력 신호를 인식할 수 없기 때문입니다.





이제 수업을 위해서 먼저 XG5000이라는 프로그램을 설치합니다. 안정적인 구동을 위해서 4.06 버젼을 LS산전 홈페이지에서 다운로드 받아서 설치를 하였습니다.



다음은 XG5000을 실행시킨 화면입니다.



테스트를 위해서 새 프로젝트를 생성하도록 합니다.



그리고 도구의 사용자 정의 항목에 들어가서 단축키가 지정되지 않은 것을 단축키를 지정 하도록 합니다.



범주의 도구 항목에 시뮬레이터 시작 항목에 Alt+Q를 지정해서 시뮬레이선 시작을 지정하도록 합니다.



온라인 Run항목에는 Alt + R을 단축키로 지정 하도록 합니다.



그리고 정지는 Alt+S로 지정을 하도록 합니다.



F5 버튼을 눌러서 A접점에 관한 것을 불러 오도록 합니다.



F6를 눌러서 이번에는 b 접점에 대해서 불러 오도록 합니다.



위 스크린샷은 PLC를 구동하기 위해서 XG5000에서 프로그램을 짜는 화면이라고 해야 할까요? 여기서는 주로 레더라고 합니다.



위 스크린샷은 프로그램을 짜는 것을 다 마쳐서 일종의 자가 유지 회로를 완성한 모습니다. 마치 사다리를 타고 내려간다는 느낌이 들었기에 이래서 레더구나 하는 것을 여기서 느낄 수 있었습니다.


이외에도 스크린샷을 찍은 내용이 많기는 하지만, 그 내용들 보다 더 중요한 것은 일단 XG5000에서는 아래에 있는 단축키 모음이 더 유용해 보인다는 생각이 듭니다.



F3 

 A접점

Ctrl + L 

 라인삽입

F4

 B접점

Ctrl + D 

 라인삭제

F5 

 가로줄

Ctrl + I 

 셀 삽입

F6 

 세로줄

Ctrl + T 

 셀 삭제

F9 

 출력

 

 

F10 

 응용명령

 

 


마지막으로 중요한 것은 입력에는 동일한 이름을 쓸 수 있지만, 출력에는 동일한 이름을 사용하면 이를 '이중코일'이라고 해서 에러를 일으키는 중요한 원인이 됩니다. 특히 의도하지 않은 스위치를 ON시킬 수 있는 가능성이 있기 때문에 사고를 부를 수 있다고 합니다.


그리고 이번 수업시간에서 계속 P와 M으로 이름을 지정하는 것을 볼 수 있었는데, 그 이유가 있는게 P는 실제로 입/출력을 담당하는 핀을 의미하면, m은 보조 릴레이 영역이라고 해서 따로 있는데 이를 구분하기 위해서 였다고 합니다. 마지막으로 F3와 F4로 불러 올수 있는 부분은 입력이지만, F9과 F10은 출력에 해당한다고 합니다.

저작자 표시
신고

안녕하세요?


어제 포스팅에서 언급을 했다시피, 비트 연산이라는 것이 상당히 낯선 것인데, 다른 포스팅 안에서 묻어가면서 설명하기에는 내용이 너무 길어서 이렇게 따로 떼어내서 포스팅을 하게 되었습니다. 막상 이렇게 포스팅을 떼어내면 얼마 안되는 것 같기도 하지만, 그래도 엄청나게 짧은 것은 아니기는 합니다.



지난번 포스팅에서 위 스크린샷에 나와 있는 것처럼, 아두이노의 통합 개발환경 IDE인 스케치에서 위와 같이 코딩을 하고서 아두이노 보드에 업로딩해서 아래와 같은 결과가 나왔습니다.



일단 이와 같은 결과가 왜 나왔는지 설명을 하기 위해서는 byte라는 변수에 대해서 먼저 설명을 해야만 하는 필요성이 있습니다. 일단 byte라고 변수를 선언하게 되면, 8비트(bit) 단위의 연산을 시작하게 됩니다. 그래서 모든 변수-특히 10진수의 수는 2진수의 수로 변환이 가능합니다.




그래서 먼저 AND라는 형식으로 나오는 &에 대해서 먼저 어떤 식으로 연산이 이루어 졌는지를 그림으로 그려서 설명을 해야 겠다는 생각이 듭니다.



위 그림을 보시면 먼저 9와 5는 8자리의 2진수로 변환이 되게 됩니다. 그리고 여기서 중요한 것은 비트연산이라는 것은 절대로 산수나 수학의 덧셈 뺄셈이 아니라는 것입니다. AND 이기 때문에 둘다 1일 때만 1이라는 값이 나오는 연산입니다. 그리고 비교가 되는 것은 2진수 수의 자리수가 같은 곳이 1이냐 0이냐 하는 것을 비교하는 것입니다.


9 = 0000 1001

5 = 0000 0101


이렇게 해서 같은 자리수에 위와 아래를 비교, 이전에 했었던 디지털 회로를 연결해서 0과 1의 결과를 만들어 냈던 것처럼 둘다 1일대만 1이라는 결과가 나옵니다. 그래서 위 그림을 보시면 제일 마지멕에는 1 하나만 나오고, 2진수를 10진수로 변경할 시에, 1이라는 결과만 나오게 되는 것입니다.



위 그림은 OR에 해당하는 | 의 결과입니다. 당연 위와 아래에 있는 2진수의 8자리 숫에서 둘중 하나라도 1이라면 1이라는 결과가 나오기 때문에, 맨 아래에 보시면 00001101이라고 나오고, 10의 진수로 변형시에 13이라는 결과가 나오게 되는 것입니다.




조금은 재미있다고 해야 할까요? ^는 승수라고만 할 수도 있으나 비트 연산자로서는 Exclusive OR이라고 해서, A와 B, 둘중 하나라도 다르면 1이라는 결과가 출력되는 비트 연산자라고 할 수 있습니다. 이 ^이 중요한 이유는 신호의 입,출력에 사용이 되는 그레이 코드를 2진수로 변환할 때 사용되는 것이 Exclusive OR인 것을 생각하면 정답이 나온다고 할 수 있습니다.



그래서 비트 연산자의 계산결과가 00001100이라고 하는 8자리의 2진수 숫자가 나오며, 스케치의 시리얼 모니터상에서 10진수로 변환되어 나와야 하기 때문에, 12라는 숫자가 표시가 되는 것입니다. 



다음은 X<<3이라는 것은 왼쪽으로 3번 shift라고 해서, 3칸이동이라고 해야 할까요? 1이라는 값을 왼쪽으로 3자리 강제로 이동시키라는 비트 연산자입니다. 그래서 위 그림에서 보시면 왼쪽으로 서서히 3번 이동하는 것이 나와 있으며, 자리수가 커진 만큼 숫자도 늘어나서 결과값이 상당히 커진것을 볼 수 있었습니다.




그런데 여기서 한가지 몇일 전에 했던 포스팅에서 CiMon이라는 Scada에서 지원하는 비주얼 베이직은 비트 연산을 하지 못한다는 내용을 들었습니다.


링크 : 워드 데이터와 비트 연산, 그리고 while문 활용의 예시



그래서 이번에는 >> 라고 우측으로 shift라고 해서 쉬프트에 대해서 연산을 했고, 결과물은 2가 나왔습니다. 여기서 한가지 나왔는 것이, 좌측으로 쉬프트를 할 경우에는 한번 쉬프트당 2씩 곱하고, 우측으로 쉬프트를 할 경우에는 2씩 나눈다는 것입니다. 생각해 보면 2진수에서는 자릿수가 하나 올라가면, 2를 곱하는 것이기 때문에, 사실상 2곱하고 2를 나눈다고 볼 수 있다는 생각이 듭니다.


다만 그런것을 고려해도 아직은 제가 능력이 모자라서 이러는 것일 까요? 지난번 포스팅에서 올렸는 비주얼 베이직 기반의 스크립트 코딩 내용이 아직은 이해가 되지 않기는 않는다는 생각이 듭니다.


저작자 표시
신고

안녕하세요?


이번 포스팅에서는 이번주 수요일에 있었던 수업의 내용인, 아두이노 보드와 이를 제어하기 위한 C언어 문법을 수업했는데, 그 내용을 올리고자 합니다. 


먼저 언급해야 할 것은, 크로스 컴파일이라고 해야 할까요? 여기서 나오는 모든 C언어로 씌여진 연산은 모두 'PC'가 아니라 '아두이노 보드'에서 처리한 것이라는 것을 알려드려야 겠습니다. 그래서 여기서는 컴파일이라고 하는 것이 아니라 정확히는 '크로스 컴파일'이라고 해서, 기계어로 변환한 언어가 PC가 아니라 아두이노 보드로 건너가(cross)된다고 해서 크로스 컴파일 이라고 합니다.



먼저 먼저 아두이노 보드에는 모니터가 없으니, 결과를 보기 위해서 Serial.begin이라는 함수를 사용합니다. 여기서 Serial이라는 것은 C언어에서 객체라고 하고, . 이후에 오는 내용인 begin이벤트라고 합니다.



1씩 증가하는 코드를 loop쪽에 했으니, 아두이노 통합개발 환경인 스케치의 시리얼 모니터에서 제대로 1씩 증가하는 것을 볼 수 있었습니다.



먼저 1byte는 8bit이며, float라는 실수를 선언하는 변수는 4바이트로 설정이 됩니다. 그렇게 실수를 선언하고 Serial.println(변수, 숫자); 라고 하면, 실수로 선언된 변수를 소숫점 몇 자리까지 표시하겠다는 의미가 됩니다. 이 경우에는 소수점 3자리까지 나타내겠다고 했습니다.



무언가 코딩이 꼬인것 같기는 하지만, 일단 소수점 3자리까지는 나오는 것을 볼 수 있었습니다.



다음은 10이라고 정수로 선언된 변수를 다양한 진수로 나타내고자 합니다. DEC : 10진수, HEX : 16진수, OCT : 8진수, BIN : 2진수 이렇게 변환이 되게 됩니다.



Serial.println(변수, DEC); 라는 형식으로 코딩을 하여서, 제 의도되로 10이라는 숫자를 다른 진수로 바꾸는 데는 성공하였습니다.




다음은 사소한 것일지는 모르지만, \t라는 것을 문자로 표현이라고 할까요? 정확히는 이 기호를 쓰면 탭키를 쓴 간격만큼 띄워지는 효과를 볼 수 있습니다.



그 결과입니다. 시리얼 모니터 상에서 띄워지는 것을 볼 수 있습니다.



다음은 \t대신에 \n이라는 것을 사용하고자 합니다.



이번에는 아랫줄로 줄 바뀜이 일어나는 것을 볼 수 있습니다.



먼저 ++변수 라는 연산자와 변수++라는 연산자가 있습니다. 둘의 차이점은 1씩 증가를 하는데, 전자는 먼저 1을 더해놓고 나서, 연산에 들어갑니다. 하지만 후자의 경우에는 변수를 먼저 연산하고 나서 1씩 증가를 한다는 차이점이 있습니다. --변수변수-- 도 마찬가지 입니다.


그런데, 변수 +=숫자; 이렇게 증감 연산자를 사용하게 되면, 숫자만큼 더해지면서 변수를 증가시키라는 의미가 되게 됩니다. 물론 *와 -, /도 적용이 가능합니다.



2씩 증가가 되는 것을 제대로 볼 수 있었습니다.




이번에는 %를 사용해서 나머지를 구하는 연산자인데, 문제는 변수 = 변수 % 숫자; 이것은 상당히 중요한 구문입니다. 왜냐하면 아래의 결과를 먼저 봐 주시기 바랍니다.



0에서 9까지의 숫자만 반복된다. 즉, 10의 진수로 바꿀 수 있는데, 이걸 달리 말하면 숫자로 지정한 진수만큼 바꿀 수 있다는 의미가 됩니다. 그래서 5라는 숫자를 집어 넣으면 5진법, 이런 식으로 다른 공식을 사용하지 않고도 간단하게 코딩을 할 수 있다는 것입니다.



실제로 시도해 보면



그러한 결과가 나온다는 것을 알 수 있습니다.



다음은 관계 연산자입니다. 여기서 주의해야 할 것은 3가지 인데, 우선 첫째는 비주얼 베이직에서는 if문에서 같다는 표시가 = 하나라서 C언어인 아두이노에서 == 인 것과 헷갈릴 수 있다는 것입니다. 그리고 둘째는 != 이 같지 않다는 의미라는 것을 잊어 버리는 안된다는 것이며, 마지막으로 이상과 이하라는 의미를 나타내는 >=와 <=에서 괄호가 먼저 나온다는 것을 잊으면 안된다는 것입니다.



다음은 논리 연산자입니다. 일반적으로 관계 연산자가 2개 이상 복합적으로 나오게 되면, 이 위 스크린샷에서 보이는 논리 연산자가 나오게 되는 것입니다. && 는 AND, || 는 OR, ! 는 Not이라는 것입니다. 그리고 ^는 exclusive OR이라는 것으로 ^이 왜 중요한가 하면, 입출력에 사용이 되는 그레이 코드를 연산이 가능한 2진수로 바꾸기 위해서는 ^만 잘 활용하면 된다는 것입니다.




다음은 비트 연산자입니다. 이에 대해서도 자세히 설명을 해야 하기는 하겠지만, 문제는 설명이 너무 길어집니다.



왜 이런 결과가 나왔는지에 대해서 설명하자면, 이것도 한개의 포스팅 꺼리가 되기에 하는 수 없이 이번 포스팅에서는 이런 비트 연산자가 있다는 것을 언급하고 끝내야 겠습니다.



다음은 for문입니다. for문은 반복문으로서, 제어문에 속하고 있으며, 다음과 같은 구성이 되어 있습니다.


For(초기식; 조건식; 증강식)

{                              

                             }


여기서 중요한 것이 { } 괄호인데, 무조건 for믄의 아래에서 부터 시작해야 하며, 이 { }가 없으면 for문 바로 아래의 문장만을 반복한다고 합니다. 결국 { } 안의 공간은 바로 제어문이 제어하는 공간입니다. 그리고 또 중요한 것이 조건식으로, 조건식이 충족되지 않으면, For문은 끝나고 나가야만 합니다.



일단은 제 의도대로 반복문에 따라 i값이 1에서 부터 5까지 증가하는 것을 볼 수 있었습니다. 여기서 비주얼 베이직과 다른 차이점이 또 하나 나옵니다. 바로 비주얼 베이직에서는 for문을 시작할 때 조건식에 사용할 i와 같은 값을 미리 선언하지 않았어도 되었습니다. 하지만, 아두이노 통합 개발환경인 스케치에서는 int i;라고 void setup() 이전에 변수 선언을 해야만 했습니다.



다음은 아날로그 출력입니다. 일단 아날로그는 아두이노 우노의 경우에는 물결무늬가 있는 3,5,6,9,10,11만이 아날로그 출력이 가능하다고 합니다. 일단 void setup()부분에서 pinMode를 설정하지 않아도 됩니다. 그리고 아두이노 보드이다 보니, 최대 출력이 5V에 그치며, 그 출력의 범위를 프로그램에서는 0에서 255까지 설정할 수 있습니다.


당연하지만 당연하게도, 255라고 설정을 하면, analogWrite에서 5V 최대로 출력이 되게 됩니다. 만약에 127정도로 설정을 하면 아마 약 2.5V의 출력이 나오게 됩니다. 그래서 이를 이용하면 LED의 밝기를 서서히 올리거나 내리는 역할도 가능하게 됩니다.



일단 브레드 보드를 이용해서 실습을 한 화면입니다. 다만 여기서는 회로의 선을 만드는 데는 그렇게 까지 깊숙한 실습을 하지 않았습니다만, 앞으로는 실습이 점점 복잡해 질 것이 기대가 된다고 해야 할까요?

저작자 표시
신고

안녕하세요?


어제 언급한 대로, 이번주 화요일 PLC 자동제어 수업의 남은 부분을 포스팅 하고자 합니다. 수업의 내용은 간단하게도 CiMon을 이용해서 한쪽은 서버로 만들도록 하고, 나머지 한쪽은 클라이언트가 되어서 원격으로 CiMon의 패널을 조작하는 것을 시도하고자 합니다.



우선 새로운 작업을 해야 하기 때문에, 새 프로젝트를 만들도록 합니다.



다음으로는 I/O 디바이스라는 메뉴에 들어가도록 합니다.



당연 여기서 새 디바이스를 추가하는 작업에 먼저 들어가 보고자 합니다.



여기서는 MODICON Modbus TCP Slave라는 것을 '서버'로 지정될 컴퓨터의 CiMon에서 지정을 하도록 합니다. 참고로 서버라는 것은 다른 말로 slave로서, 그냥 정보를 제공해 주는 기능만 합니다. 그래서 여기서는 Modbus slave를 선택한 것입니다.




우선 Modbus-모드버스라는 것에 대해서 간략하게 설명을 해야 겠다는 생각이 듭니다. 이 모드버스는 가장 보편적인 표준인 통신 프로토콜이라고 합니다. 그래서 거의 모든 PLC는 이 모드버스를 지원하고 있다고 하며, 이를 통해서 PLC와 통신을 한다고 합니다.



이제 서버라고 해서 뭐가 하나 생긴것을 볼 수 있습니다.



종료하고 나와보면, 위 스크린샷과 같이, 전에는 없던 것이 나와있는 것을 볼 수 있습니다.



다음으로는 윈도의 cmd 도스창을 통해서 내가 CiMon으로 서버로 설정한 컴퓨터의 IP주소가 어떻게 되는지를 알아 보고자 합니다. 그걸 위해서는 명령어로 ipconfig라고 입력하면 위와 같은 내용이 나오는 것을 확인할 수 있습니다.



I/O 디바이스 메뉴를 열면 나오는 slave항목을 더블클릭해서 통신포트 설정이 있습니다. 여기서 제가 현재 사용중인 IP주소를 입력하도록 합니다.



다음으로는 서버가 된 CiMonD에서 램프라고 하는 디지털 태그-가상태그를 하나 만들고 나서, 그 다음에는 전등 역할을 하는 원의 색변화에 사용을 하도록 합니다.



이제 여기서 조금은 복잡한 내용이 나왔습니다. I/O 디바이스에서 slave로 설정되어 있는 디바이스에 접혀있는 표시를 열면, 이렇게 Coil register나 holding register라는 것이 나오게 되는데, 이게 무슨 이야기냐 하면, 모드 버스는 워드와 비트라는 단위로 통신이 나누어져 있습니다.




일단 제가 이해하기로는 일반적인 통신은 글자 하나하나를 보내는데, 이런 역할을 하는 것이 아스키 코드라고 합니다. 이 아스키코드는 8비트=1바이트인데, 일반적으로 아날로그 데이터는 비트로 보내기 힘들어서 2바이트=1워드로 보낸다고 합니다. 결국 Modbus는 워드 단위로 데이터를 보낸다고 합니다.


아무튼 Coil register = 비트 단위 데이터처리 = 디지털 태그 라는 공식이 나오고, Holding register는 아날로그 태그와 관계가 되었다고 생각이 듭니다. 여기서는 디지털 태그를 서버가 되는 제 CiMon상에서 설치했기 때문에, Coil에다가 램프라는 태그를 등록하도록 합니다.



그리고 주소는 1번이라고 등록이 된 것을 볼 수 있습니다.



다음은 서버 스테이션 설정인데, 이름은 어찌되었건 좋지만 Unit ID라는 것에서는 1번이고 고치도록 합니다.



이제 여기서 위 스크린샷에 나와 있는 것처럼 modbus에서 slave가 없는 것을 고르면, 여기서는 클라이언트로 가는 것을 설정할 수 있습니다.



여기서는 스테이션 설정에서 IP설정이라고 있는데, 중요한 것은 여기 IP설정에서 접속하고자 하는 서버의 IP주소를 입력해야 한다는 것입니다.



그 다음에는 통신블록 추가라는 메뉴를 클릭하도록 합니다.



여기서 다른 것은 중요하지 않은데, 가장 중요한 것이 바로 어드레스입니다. 일단 비트의 경우에는 읽고, 쓰기가 가능한 주소라면 0으로 시작을 하고, 읽기만 하는 것이라면 1로 주소가 시작되게 됩니다. 그리고 아날로그 태그와 관계된 워드의 경우에는 주소가 읽고, 쓰기가 되는 주소는 4로 시작하고, 읽기만 되는 주소는 3으로 시작을 하게 됩니다.




다음으로는 이 HMI Modbus라는 이 안드로이드 앱을 이용해서 컴퓨터간의 통신이 아니라 모바일 기기에서 CiMon Scada를 조종하는 실습을 시도는 했는데, 일단 와이파이를 공유기를 사용하다 보니, 너무 많은 사용자 때문에 잘 되지가 않았습니다. 일단 안드로이드 기기상에서 다음과 같은 설정을 하기는 했습니다.



먼저 앱에서 새로운 프로젝트를 생성하도록 합니다.



먼저 해야 할 일은 Edit Server list라는 것을 들어가서 서버로 설정된 CiMon이 있는 PC에 대한 정보를 입력해야 합니다.



많은 정보를 요구하지는 않고, 여기서는 서버가 된 PC의 IP주소만 입력하면 됩니다.



다음은 안드로이드 앱에서 체크박스와 같은 모양의 아이콘을 하나 추가해 놓고서, 다음은 Element settings에 들어가 보도록 해야 합니다.



일단 여기서는 디지털 태그의 읽고 쓰기에 정했으니 Communication address는 0, PLC number는 위에서 서버로 설정할 때, 1이라는 Unit id를 썼으니까, 1울 지정합니다. 그리고 서버에 값을 쓴다. 즉, 조작을 해야하는 일을 하기에 Allow write request라는 것을 적도록 합니다. 그리고 request type과 function code는 위 그림에서 나와 있는 것처럼 rea bit state와 read coil statue 0X01이라는 것을 선택하도록 합니다.


일단 이번 수업 시간에서는 수박 겉핥기 식이라서, 제가 이를 직접 시도해서 보강을 해야 하는데, 이에 대해서는 이번 주 안에서는 힘들고, 주말에 시간이 나면, 한번 실험을 해봐야 겠는데, 그때 가서 다른 내용으로 만나봐야 겠습니다. 이것으로 화요일의 수업 내용은 마치도록 하겠습니다.

저작자 표시
신고

안녕하세요?


어제는 수업내내 CAD를 이용해서 회로 도면만 그렸기 때문에 따로 포스팅을 할만한 내용이 없었습니다만, 오늘은 내용이 많아서 수업의 내용을 2개의 파트로 나누어야 했습니다. 일단 첫 파트는 DAQ라는 장비를 이용해서 데이터 수집장비를 이용하는 경우가 있다고 합니다. 그런데 DAQ에서는 CiMon으로 워드 데이터라는 것이 오게 됩니다. 그리고 이 워드 데이터를 비트 데이터로 바꾸어야 하는 일이 있는데, 먼저 하는 과제는 이를 위해서 변환하는 과제입니다.



먼저 새로운 프로젝트를 생성 하도록 합니다.



일단 태그를 만드는데, DAQ에서는 아날로그 데이터가 오기 문에 이에 대한 아날로그 태그를 하나 만들도록 합니다. 그리고 비트 데이터로 처리하기 위해서 16개의 태그를 만들도록 합니다.




그리고 이번에는 워드 데이터를 비트로 변환하는 스크립트를 작성하도록 합니다. 여기서는 format이라는 함수가 나오는 것을 볼 수 있는데, 이 format은 다음과 같은 식으로 사용을 할 수 있습니다.


format(a,b)


a라는 것은 b라는 형식을 따라서 만들어라 하는 의미가 됩니다. 여기서는 "00"이라고 했으니, 01, 02, 03.... 이런 식으로 나오게 되는 것입니다.



이번에는 비트 데이터를 계산하는 방법입니다. 일단 비주얼 베이직에서는 듣자니 비트 데이터를 그대로 계산할 수 없습니다. 그래서 곱하기와 나누기를 하고서, 이런 식으로 계산을 한다고 합니다. 일단 이번 시간에서는 비트 연산에 대해서 깊이는 들어가지는 않았지만, 여기서는 AND라고 해서 +나 -연산이 아니라는 것에 주의를 해야 하니다.


즉, 우리가 익히 알고 있는 대로 AND라면 A와 B 둘다 1일 때 1이라는 값이 나오고, 그 외에는 모두 0이라는 값이 나온다는 것을 명심해야 한다는 것입니다.



다음으로는 아날로그 태그에 태그동작을 지정해서 워드 데이터를 비트 데이터로 바꾸어 주는 스크립트를 실행 시키도록 합니다. 



다음이 일일히 노가다 이기는 했지만 16개나 되는 디지털 태그에 태그동작을 지정 하고서, 여기다가 비트 데이터를 워드 데이터로 바꾸어 주는 스크립트가 실행되도록 지정을 합니다.



맨 처음에 모두 지정을 하고 CiMonX에서 실행을 해 보았습니다만, 스크립트에서 에러가 났다고 하면서 실행이 되지 않았습니다. 왜 그런가 하고 스크립트를 잘 보니....



오타로 인한 휴먼에러가 하나 났었던 것이였습니다.


 

이제서야 제대로 의도대로 작동하는 것을 볼 수 있었습니다. 아직까지는 이 비트라는 것과 워드라는 데이터가 매우 멀게만 느껴지는 중입니다만, 아두이노 보드를 볼때, 아마도 출력하는 핀과 이런 것을 연동하는 데, 이 워드 데이터를 비트 데이터로 바꾸어 주는 것이 연동되지 않을까 하는 생각이 듭니다.




이제 새로운 프로젝트로 뭐라고 해야 할까요? 저는 세차장이라고 했는데, 일단 차량이 컨베이어 밸트를 따라서 움직이다가, 세차터널이라고 해야 할까요? 여기 입구의 문이 열리면 들어가서 잠시 멈추고, 다시 나가는 출구가 열리고 나간 다음 출구의 문을 닫는 것을 구현해 보는 것입니다.



디자인 까지는 큰 문제가 없기는 없었습니다. 일단 차량은 라이브러리에 있는 운송이라는 항목에서 가져왔고, 컨베이어 밸트 역시 라이브러리에 있는 베이어 밸트 항목에서 가져왔습니다. 다소 헤메었던 부분은 컨베이어 밸트의 바퀴를 구성하는 것을 회전시키기 위해서, 여러번 그룹해제를 해야만 한다는 것을 몰라서 좀 헤메이기는 했습니다.



일단 태그는 아날로그 태그 3개에 디지털 태그가 2개 사용되었습니다. 그리고 여기서서 아날로그 태그는 각각 차량과 입구와 출구를 여닫는 용도로 쓰이며, 디지털 태그는 전체적인 운전과 컨베이어 밸트의 작동여부에 사용이 되었습니다.



먼저 스크립트입니다. main이라는 스크립트는 CiMonX가 처음 시작할 때 실행이 되는데, 이때 runscript를 이용해서 While문으로 계속 반복이 되는 스크립트를 작동시키도록 하는 것입니다. 




여기서 중요한 것은 하나인데, while문이 시작하기 전에 일단 아날로그 태그의 값을 변화시키기 위해서 사용하기 위한 변수는 while이 시작하기 바로 전에 선언을 하도록 합니다. 물론 처음부터 의도하지도 않게 아날로그 태그의 값이 변하는 것을 막기 위해서 0이라고 선언을 해야 합니다. 그렇지 않고 while아래에 변수=0 이라고 선언하면, 아무리 if문에서 변수의 값을 +로 바꾸어도 도로 0이 되어 버리고 맙니다.


변수1=0


while1

변수2=gettagval ("아날로그 태그의 이름")

if구문들

변수2=변수2+변수1

settagval "아날로그 태그의 이름",변수2

sleep(100)

wend


이런 형태로 코딩을 하여서, 하는 것이 기본이라고 할 수 있습니다. 이래저래 이것으로 오전에 했던 수업의 내용은 다 포스팅을 했는데, 조금은 어려운 내용을 조만간에 포스팅에서 올리도록 해 보겠습니다.

저작자 표시
신고

안녕하세요?


이번 포스팅의 내용은 지난주 금요일에 있었단 CiMon Scada에서 어떻게 하면 메세지 박스에 관한 내용을 실습해 보았고, 예시하나를 통해서 새로운 CiMon Scada에서 사용할 수 있는 개발 방법이라고 해야 할까요? 이 한가지에 대해서 한번 포스팅을 하고자 합니다.



일단 새로운 프로젝트를 생성하도록 합니다.



메세지 박스를 띄우기 위한 버튼을 하나 만든다음, 버튼을 누르면, 위 스크린샷에서 보이는 것과 같이 스크립트가 실행이 되도록 만들도록 합니다.



먼저 위 그림을 보시면 Const 라는 것으로 시작하는 것을 하나 있는 것을 보실 수 있으실 것입니다. 이것은 상수를 지정하는 것인데, Const 바로 뒤에는 어떤 문자열이 와도 상관은 없습니다. 중요한 것은 chr$(13)+chr$(10) 이라는 것입니다. 그래서 전체적으로 아래와 같은 방식을 사용하게 됩니다.




Const 아무글귀=chr$(13)+chr$(10)


여기서 중요한 것은 $마크로, 이걸 빼 놓으면 에러가 나며, 13과 10이라는 것은 아스키 코드에서 13번, 줄을 바꾸어라, 그리고 10번 맨 첫머리로 돌아가라 라는 의미가 있습니다. 이런 의미를 가지고서, 맨 처음으로 돌리는 것을 하는 것입니다.



CiMonX에서 실행을 시켜 보고



제대로 뜨는 것을 확인할 수 있었습니다.



다음은 새로운 박스 테스트에 들어가 보도록 합니다.



비주얼 베이직에서 $표시는 문자열 변수를 선언하는 것이라고 들었습니다. 그리고 이번에는 문자열 변수를 선언하면서 AskBox$("문자열") 이런 식으로 입력박스를 만들어 낼 수 있게 되는 것입니다.



이제 CiMonX에서 실행을 시키도록 합니다.



위 스크린샷처럼 문자열은 이렇게 나오고, 입력란은 따로 뜨는 것을 볼 수 있습니다.



이후에 따로 2번째 메세지 박스를 만들 수도 있었습니다.



다음은 위 스크린샷을 보시면, Exit sub이라는 것이 있는 것을 보실 수 있습니다. 즉 위 스크린샷의 코드는 다음과 같은 구조를 띄고 있다고 할 수 있습니다.


if 조건문1 then

  실행문1

  실행문2

  Exit sub

end if 

if 조건문2 then 

  실행문3

  실행문4

end if


위 조건에서 조건문1에 맞는 것이 나오면, 바로 끝나야만 하지만, 문제는 그러고 나서도 조건문2에 해당하는 사항이 있어서 원하지 않게 추가로 실행문3과 실행문4가 나올 수 있는 상황을 막아야 하는데, 이럴 때 등장하는 것이 Exit sub 이라는 명령어를 써서, 그냥 스크립트 전체를 종료시켜야 합니다.



다음 실습을 위해서 새로운 버튼을 만들 도록 합니다.



다음은 MsgBox의 형식에 관해서 인데, 이에 대해서는 아래의 형식을 봐 주셨으면 합니다.


MsgBox("메세지 박스에 들어갈 글귀",ebYesNo,"메세지 박스위 상단에 표시될 글귀")


여기서 가장 중요한 것이 ebYesNo라는 것인데, Yes를 선택하면 6이라는 값이 저장이 되고, No라는 것을 선택하면 7이라는 값이 저장이 되는 특징이 있습니다. 이게 왜 그런지는 모르지만, 비주얼 베이직이 자체적으로 이런 결정을 했다고 합니다. 이 외에 내용은 비주얼 베이직의 레퍼런스 북이라는 공식 PDF파일에 있다고 들었습니다.




일차적으로 Yes와 No를 선택할 수 있는 메세지 박스가 뜨는 것을 볼 수 있습니다.



다음은 과제를 위해서 코딩을 한 것입니다. 위 코드에서는 예/아니오를 선택해야 하는 메세지박스를 출력할 수 있게 하며, 그 결과에 따라서 마지막 메세지 박스에 뜨는 내용이 바뀌는 것을 만든 것입니다. 일단 일련의 코딩을 완료 했습니다.



역시 버튼하나 만들어서 실행시킬 준비를 합니다.



최종 결과입니다. 제 의도대로 성공적으로 나온 것을 볼 수 있었습니다.



다음은 임의의 랜덤한 변수를 생성하는 것을 코딩하고자 합니다. for문을 써서 10번 반복을 하게 되는데, 각각 0에서 100사이의 수 중에 하나씩을 선택하도록 만드는 것입니다. 그래서 For문은 다음과 같습니다.


for x=1 to 10


y=random(0,100)

message=y+dash


next x


위 구문에서 random(a,b) 로 하자면, a에서 b사이에 있는 숫자 중에 아무거나 하나를 집을 수 있다는 것을 의미합니다. 그리고 나서 MsgBox "글귀" & dash & 변수 라고 하면, 여기서는 &를 써주면, 이어서 붙여서 메세지 박스에서 변수의 값과 상수를 처리할 수 있습니다. 위에 올라온 스크린샷을 잘 보시면, dash는 줄 바꿈을 위한 상수라는 것을 아실 수 있습니다.



이번에도 성공적으로 제 의도대로 잘 나온 것을 볼 수 있었습니다.



이제 새로운 프로젝트를 실행할 차례입니다. 이번에는 화장실 밸브라고 해서, 화장실 소변기에 사람이 서서 일정 시간이 지나면 잠시 물이 내려오고, 그 다음에 다시 멀어지면 물이 내려오게 하는 것입니다.



디자인을 하는 작업은 그런데로 쉬웠습니다.



하지만 가지가지 시도를 해 보았지만, 그다지 여의치는 않았습니다.




여기서의 정답은 아날로그 태그에 태그값 변경시 태그 동작을 실행함이라고 태그 동작을 지정하는 것이 핵심이라고 할 수 있었습니다. 이럴 경우 조금이라도 변할 때 마다 스크립트를 실행하거나 감지해서 값을 변화시키는 등의 일이 가능하다는 것입니다.



다음으로 중요한 것은, 디지털 태그의 값이 변할때 스크립트를 실행되도록 지정하는 것입니다. 이게 왜 중요하냐 하면.....



먼저 아날로그 태그의 값이 변할 때 실행되는 스크립트 안에서 디지털 태크의 값을 바꿔서 settagval 함수로 쓰면



따로 버튼이나 도형을 클릭하지 않아도, 저절로 태그동작에서 지정한 스크립트를 실행시킬 수 있다는 것입니다. 이전까지는 버튼이나 도형을 건드릴 때만 runscript가 되는 것으로 생각을 했지만, 그래도 이렇게 스크립트 내에서 디지털 태그의 값을 변화시키는 것으로 또 다른 스크립트를 작동시킬 수 있다는 것이 바로 핵심이라고 할 수 있습니다.


이래저래 수업의 내용이 풀로 이어져서 포스팅의 내용이 너무 함축적이라는 생각이 드실 건데요, 실제로 수업의 내용도 상당히 압축되어 있는 면이 있기는 있습니다. 그래도 어떻게 지금은 따라는 가고 있는데, 쉽지는 않지만, 그래도 불가능은 아니라는 생각이 듭니다. 조금 머릿속이 복잡하기는 하지만, 그래도 그럭저럭 정리를 하나하나 하면서 진도를 나아가는 중입니다.


저작자 표시
신고

안녕하세요?


이제 슬슬 지난주에 했었던 PLC 자동제어반의 수업을 다 포스팅 해 가는 것 같은데, 아무튼 이제는 목요일에 했던 시퀀스 제어 수업의 내용에 대해서 포스팅을 하고자 합니다.



먼저 인터록 회로를 디자인 하기는 했습니다. 그런데 이번에는 타이머를 추가해서 정지 버튼을 누른 이후에 3초간은 DC모터의 정회전이나 역회전을 전혀 일어나지 않도록 만드는 것입니다.



다음은 DC모터를 가지고서 이제 정회전과 역회전에 대해서 연결을 시도 합니다. 간단합니다. DC모터의 +와 -를 정확하게 연결해서 12V의 전류를 흘려주면 정회전, 반대로 흘려주면 역회전을 하게 됩니다. 그리고 여기서 왜 릴레이를 사용하는 지에 대해서 이유가 나오게 됩니다.




릴레이는 24V에서 작동을 하지만, DC모터는 12V에서 작동을 합니다. 지금처럼 얼마 차이가 나지 않는 경우만 하더라도 한개의 전원만 가지고는 ON/OFF를 하는 데 문제가 있는데, 220V와 같은 것이 나오면 그냥은 어렵습니다. 그래서 릴레이를 통해서 일부만 다른 전압의 전류를 흘리는 경우, ON/OFF를 할 수 있는 것입니다.



일단 과제로, CAD를 가지고서 회로도를 설계하는 것입니다. 일단 단순작업이라고 하면 단순작업이라고 할 수는 있는데, 이번 포스팅에서 CAD에 대해서 포스팅을 하는 이유라면, 딱 하나 바로 이것입니다.



먼저 옵션이라는 항목으로 들어가서, 화면표시라는 탭에 들어가도록 해 봅니다. 여기서 색상이라는 것을 들어가서, 한번 바꾸도록 합니다.



여기서 색상이라는 항목이 원래는 검정색으로 되어 있는데, 이걸 흰색으로 바꾸도록 합니다.



이렇게 하면 화면이 하얗게 바뀌고, 선의 색상을 검정색으로 바뀌는 것을 볼 수 있습니다. 이렇게 해서, 사소하지만 좀 큰 변화를 줄 수 있습니다. 목요일의 수업 내용은 주로 실습이라고 해야 할까요? 드라이버와 나사를 이용해서 이래저래 실기를 한다고 이래저래 많이 시간이 걸렸습니다. 하지만 마지막에는 아쉽게도 회로의 결선에는 무언가 에러가 나와서 역회전이나 정회전이나 같은 방향으로 회전을 하는 문제가 생겼는데, 이 문제는 다음 시간에 해결해야 겠습니다.

저작자 표시
신고

안녕하세요?


이번 포스팅에서는 조금은 복잡하다면 복잡한 내용인데, 일단 Mux라고해서 multiplex라는 선택기에 대한 내용부터 먼저 설명을 해야 겠다는 생각이 듭니다.



우선 4X1 Mux의 경우인데, 선택선에 들어오는 신호에 따라서, 입력되는 A,B,C,D에서 한개를 선택한 다음 출력을 한다고 합니다. 이 Mux가 어디에 쓰이는가 하면, 바로 USB허브나 인터넷 공유기 허브에서 사용이 된다고 합니다. 선택선이 신호를 굉장히 빠르게 변환하기 때문에, 우리는 잘 모르지만, 실제로는 이런 원리로 입력은 상당히 많은데, 출력은 하나만 한다고 합니다.



다음은 deMux라는 것에 대해서 설명을 하고자 합니다. 입력이 된 것은 오로지 하나인데, 선택선에 따라서 출력이 여러개 된다고 합니다. 이 때문에 Mux와 deMux를 뗄레야 뗄 수가 없다고 합니다.




다음으로는 74LS153이라는 IC칩의 논리회로라고 해야 할까요? 일종의 개념도 입니다. 위 그림을 보시면 1번과 15번 핀 중에 하나를 GND로 연결하면, 1번 Mux냐 2번 Mux냐 하면서 선택을 할 수 있게 됩니다. 그리고 선택선에 들어오는 신호에 따라서 출력인 Z에 어느 입력이 출력되느냐를 결정할 수 읶게 됩니다. 이런 74LS153이 74LS93과 같이 사용이 되면, 이게 바로 주파수 선택기가 된다고 합니다.



위 그림은 proteus상에서 이전에 했는 74LS93을 가지고서 16진수 카운터를 발생시키면서, 이 4개의 출력이 74LS153의 입력에 들어가도록 디자인을 하고자 했는데, 위 그림에서는 다소 오류가 있습니다.



그래서 오류없이 제대로 그리는 데 성공한 모습입니다. 이렇게 그리는 데 성공을 하였고, 스위치로 선택선에 보내는 신호를 다르게 했고, 그에 따라서 출력되는 파동이라고 해야 할까요? 주파수가 달라지는 것을 확인할 수 있었습니다.



일단 74LS153 IC칩의 사용 설명서에서 가져온 그림입니다. 일단 이렇게 보시면 얘도 당연하게도 제대로 된 5V 정원을 공급되어야 해야 겠고, 선택선에 따로 신호를 입력하는 것으로 출력과 입력을 관리할 수 있습니다.



다음 스크린샷은 74LS86이라는 exclusive OR를 사용해서 '그레이 코드'라는 것으로 바꾸는 작업을 하고자 합니다. 이 그레이 코드(gray code)라는 것은 오차가 적기 때문에 입출력 장치로 많이 사용이 된다고 합니다. 그 만큼 중요한 코드로서 absolute encoder에 사용이 된다고 합니다. 이처럼 중요하기는 하지만, 계산에는 적합하지가 않아서 이럴 때는 2진수로 변환을 해야 한다고 합니다.




위 도표는 그레이 코드를 나타낸 것입니다. 위 도표를 보시면 하나의 숫자가 올라가기 위해서는 1비트의 변환만 있으면 되기에, 오차가 적다는 특징이 있습니다. 이런 특징 때문에, 입출력 장치에 많이 사용이 되는 특징이 있는 것입니다.



다만 74LS93과 74LS153이 따로 없기 때문에, 아두이노 통합 개발 환경에서 일일히 그레이 코드가 되도록 입력을 한 다음에 4개의 아두이노 우노의 핀에서 출력이 나오도록 했습니다.



다음은 한번더 exclusive-OR을 이용해서 그레이 코드를 2진수의 16진 카운터로 바꾸는 것을 proteus상에서 시뮬레이션을 해 보기는 했습니다. 이렇게 하는 데 성공했으니, 이제 본격적으로 아두이노 우노에서 이를 구현해 보는 일이 남아 있습니다.



실제로 74LS86을 사용해서 그레이 코드가 나오도록 프로그램한 입력신호가 2진수의 16진 카운터로 변환이 되는 것을 확인할 수 있었습니다.



다음은 아두이노 개발환경에서 제대로 작동하는 지를 확인하기 위해서 먼저 Serial.begin(통신속도); 라는 명령어를 setup에서 설정을 해서 모니터링이라고 해야 할까요? 통합 개발환경 우측 상단에 보시면 돋보기 마크가 있는데, 이게 모니터링을 하는 화면을 여는 메뉴입니다. 여기서 무언가가 뜨게 하기 위해서 Serial.begin(통신속도); 이라는 명령어를 입력 해야 한다고 합니다.



먼저 print("글귀"); 라고 입력을 하면, 줄을 바꾸지 않고 계속 옆으로 이어지는 것을 볼 수 있습니다. 이러한 것이 보기 불편하다면, 이럴 때는 println("글귀"); 라는 함수를 이용해야 합니다.



이렇게 실험을 해 보자, 제대로 줄이 바뀌어서 모니터링 화면에서 나오는 것을 확인할 수 있었습니다. 이것으로 일단 지난주에 수업했던 실습 내용은 다 정리를 하였고, 이제부터 진짜로 중요하다고 해야 할까요? 앞으로 회로를 결선하면서 핵심이 되는 내용에 대해서 들어가고자 합니다.




먼저 컴퓨터는 2진수로 수를 표현합니다. 그래서 상위라고 하면, 자릿수가 큰 숫자인데, 2의 자리수가 커지는 것을 보여주게 됩니다. 그리고 당연 자리수가 큰 자리에 있는 1과 0을 상위라고 하며, 아래로 갈 수록 하위라고 합니다. 이게 왜 중요한가 하면, 다음과 같이 중요하게 일이 진행되기 때문입니다.



일반적인 상황이라면 상위라고 해서 A가 최상위로 생각을 하겠지만, 실제로는 A라는 입력핀에서는 1의 자리라고 해야 할까요? 이런 제일 작은 숫자의 자리에 해당하는 비트가 입력이 되게 됩니다. 그리고 D라는 입력핀에서는 가장 큰 2의 3승에 해당하는 가장 큰 숫자에 해당하는 값이 들어가게 되는 것입니다.



당연히 출력에서도 제일 낮은 출력과 제일 높은 자리수의 출력과 제일 높은 자리수의 출력이 위 그림과 같이 나오는 것을 볼 수 있습니다. 일단 여기서는 뭐든지 간에 제일 처음으로 나오는 것이 입력이든 출력이든 가장 낮은 자리수가 나오는 것 같습니다. 이것으로 전에 조금은 알것 같기는 했지만, 확실하게 이미지가 잡히지는 않았는 것이 이제서야 잡힌다는 것을 알 수 있었습니다.

저작자 표시
신고

안녕하세요?


최근에 과학동아 2017년 11월호를 읽다보니, 때아닌 '처녀생식(parthenogenesis)'가 논란이 되고 있는 현장이 있다는 것을 알았습니다. 여기 이 블로그에서도 바퀴벌레가 처녀생식을 한다는 것을 이야기 한 적이 있었습니다.


링크 : 바퀴벌레 박멸이 어려운 이유?


처녀생식, 혹은 단성생식이라고도 불리는 현상은 간단히 말을 하자면, 아버지쪽의 유전자 없이-정자의 도움이 없이, 외부의 자극에 의해서만 난자 혹은 알이 혼자서 분열하는 현상입니다.



아마 이 처녀생식이라는 단어를 처음 접하는 사람들에게는 위 내용이 무슨 소리인지 아리송 하실 건데요, 그래서 처녀 생식과 비교가 되는 일반적인 '정자'와 '난자'의 수정 과정과 비교를 해서 설명에 들어가 보도록 해 보겠습니다.




위 그림을 보시면, 먼저 우측에서는 정상적인 난자의 수정이 일어나는 것을 묘사하고 있습니다만, 좌측에서는 정자와 만나는 것 대신에 외부의 자극이 오는 것을 묘사하고 있습니다. 이게 무슨 차이가 있으며, 왜 중요하냐고 하실 분들이 계실 듯 한데, 이후의 발달 과정이라고 해야 할까요? 포유동물의 '태아'로 발달되어 가는 과정을 거친다는 점에서 똑같습니다.


문자 그대로 가자면, 정자의 도움이 없이 난자 혼자만으로 '다음세대'가 태어 난다고 해야 겠지만, 실제로는 완전한 태아로 되지는 못하는 몇 가지 이유가 있다고 합니다. 일단 이 이유를 당장 몇 줄의 문장만으로 설명하기에는 너무 양이 방대하기에 이 포스팅에서 다루지 않고, 나중에 다른 포스팅에서 다루도록 하겠습니다. 그럼 많은 분들이 궁금해 하실 것으로, 도대체 어떤 자극을 주었기에 정자가 들어가지도 않은 난자가 이렇게 되느냐 하실 것인데, 대표적으로 아래와 같은 자극을 준다고 합니다.


주로 전기 충격이 많이 사용되기는 하는데, 이 방법이 정확하게 어떻게 작용하는 지는 알려져 있지는 않습니다. 다만 일반적으로 난자-그것도 성숙해서 수정될 준비를 마친 난자는 정자와 만나는 시점에서 내부에 대량의 칼슘 이온의 농도가 증가하는 현상이 일어난다고 합니다. 그래서 전기 자극은 난자의 표면에 '구멍'을 뚫어서 세포 외부의 칼슘 이온이 난자 속으로 들어오게 하는 것입니다.


다만 난자의 표면에 구멍을 뚫는다는 점에서, 이 방법이 난자에 '손상'을 주기 때문에 잘못하면 난자만 터트리는 꼴이 날 수도 있습니다. 이런 위험성 때문에 구멍을 뚫는 방법으로 '초음파'를 사용하는 것을 논문에서 보았던 적도 있었습니다. 그럼 화학 약품을 사용하는 경우에는 전기 충격과는 약간은 다른 방식으로 작용을 합니다.



위 그림에서 묘사하고 있는 것처럼, 난자의 내부-주로 ER같은 곳ㄷ에서 칼슘이온을 저장하고 있습니다. 실제로 정자와 만나서 수정이 되면, 여기에 저장이 되어 있는 칼슘이 난자의 세포질로 흘러 나와서, 세포질 내의 칼슘 이온 농도를 증가 시켜 주는 역할을 한다고 합니다. 물론 이방법은 직접 난자에 물리적인 손상을 주지 않는 것 같으나, 그래도 어느정도 손상을 주는 것으로도 알려져 있습니다.




그리고 처녀 생식으로 세포 분열에 들어간 난자가 개체로 발전하지 못하는 가장 큰 이유는 '각인'이라고 알려진 imprinting의 문제가 있다고 합니다. 이게 어머니 쪽 유전자와 아버지 쪽 유전자의 각인이 다른데, 문제는 부모의 한쪽 유전자만 가지고서는 개체로 온전히 발달하지 못한다고 합니다.


다만 이 각인에 대한 내용을 시작하면, 이것 역시 한개의 온전한 포스팅만으로 다 다룰 수 없을 정도로 방대한 양입니다. 그래서 하는 수 없이 이쯤에서 포스팅을 마치도록 하며, 앞서 소개한 각인에 대해서는 언제 기회가 되면 다음번 다시 포스팅을 하도록 하겠습니다.

저작자 표시
신고

안녕하세요?


이번 포스팅은 이번주 화요일에 있었던 수업이라기에는.... 일단 과제를 직접 부딧쳐서 해결해 보고자 했는 것인데, 그 내용을 포스팅 하는 것에 가깝다고 해야 겠습니다. 일단 일일히 시행착오를 했는 내용을 다 포스팅 하기에는 너무 복잡하기에, 이번에는 중요하다 싶은 내용만 될 수 있으면 간추렸는데, 너무 간추린 것이 아닌가 하는 생각이 듭니다.



일단 처음으로 하는 과제는 위 그림에서 나오는 것처럼 파란색의 피스톤을 최대한으로 빼었다가, 그 다음에 도로 되돌아 오는 작업을 자동으로 하게 만드는 것입니다.



일단 해결하기는 해결을 했는데, 먼저 move라는 스크립트를 짜서, 조건에 따라서 piston이라는 스크립트의 실행여부를 제어 하도록 합니다. 그리고 piston이라는 스크립트에서는 while문 안에 while문을 또 써서 처음에는 피스톤의 위치값에 해당하는 아날로그 태그의 값을 증가시키도록 합니다.




일단 while문 바로 옆에는 '반복문이 계속되는 조건'이라는 것이 붙을 수 있습니다. 그래서 아래와 같은 구조를 가지고서, while문을 2중으로 사용하였습니다.


while 1

피스톤에 관계된 아날로그 태그값을 가지고 오기

if 아날로그 태그<최대값 then

증가하는 공식

else

while 아날로그 태그>0

감소하는 공식

아날로그 태그에 값 쓰기

sleep( )

wend

end if

아날로그 태그에 값을 쓰기

sleep( )

wend


대략 이런 구조라고 보시면 됩니다. 일단 if문만으로 어떻게 하려고 했지만, 일이 생각만큼 잘 되지는 않았습니다. 그래서 하는 수 없이, 제 경우에는 이렇게 while문을 이중으로 구성해서 어떻게 왕복 운동을 하는 데는 성공하기는 했습니다.



다음은 새로운 프로젝트를 생성해서 작업에 다시금 들어 가도록 해 보겠습니다.



이번에는 조금 더 복잡하게도, 자동, 수동을 조절하는 스위치가 있으며, 자동운전에 관계된 스위치 2개와 수동운전에 관계된 스위치가 2개 있습니다. 여기서 스스로 학습하면서 알게된 한가지 사실인데, 스위치/램프 설정에서 램프설정이라는 항목이 있습니다. 전에는 이게 왜 있는지 몰랐지만, 이 설정을 안 해주면, CiMonX에서 실행 중일 때, 마우스 커서를 떼면 도로 상태0으로 돌아가 버린다는 것입니다. 즉, 토글이든 이런 방식이든 스위치의 상태를 상태1이나 이런 것으로 유지시키고 싶으면, 이 램프설정을 해줘야 한다는 것입니다.



이런저런 방식으로 프로그램을 짜면서 실행을 하는 그림입니다. 수동운전으로 전진이나 후진으로 움직이는 것도 되었으며, 자동으로 왕복운동을 하는 것까지는 어떻게 되기는 되었습니다.




하지만, 정말 중요한 것이였는 실린더가 왕복 운동을 했는 횟수를 기록하는 기능과, 횟수를 지정하면 이 횟수만큼 왕복운동을 하는 기능은 어떻게 구현을 하지 못했습니다.



위 스크린샷이 정답이라고 할 수 있는 것입니다. 일단 여기서 중요한 것은 while문을 무조건 실행 시키라는 것으로 사용을 했다는 것이고, 이 스크립트는 페이지를 열면 실행을 시키라고 되어 있다는 것입니다. 그리고 가장 핵심이라고 해야 할까요? 카운터는 다음과 같은 것을 사용하고 있습니다.


if 자동운전에 관한 태그=1 and 아날로그 태그가 최대값일 때 then settagval "카운터에 관한 태그", 카운터에 대한 변수 +1


여기서는 settagval이라는 함수가 then 조건 바로 뒤에 올 수 있다는 것입니다. 그리고 여기서 아날로그 태그가 최대값일 때, 즉 최대한으로 피스톤이 뻗어 나왔을 때, 카운터에 관한 태그의 값을 +1 한다는 것입니다. 그리고 이 문장은 if문으로 처리를 한다는 것입니다.


그리고 마지막으로 어떻게 하면 지정된 횟수에 도달하면, 완전히 피스톤이 들어간 상황에서 완전히 멈출 수 있느냐 하는 것인데, 이것도 핵심은 다음의 if문 조건을 형성 함으로서 간단히 해결이 되기는 되었습니다.


if 반복 지정 횟수>0 and 카운터 횟수=반복 지정 횟수 and 피스톤의 운동에 대한 아날로그 태그값 반영 변수=0 then

카운터를 0으로 지정, 이후 태그에 반영

반복 지정 횟수를 0으로 지정, 이후 태그에 반영

자동운전을 하는 것에 대한 태그값을 0으로 지정(OFF선언을 하는 것)

end if


이러한 구문을 사용한다고 보시면 됩니다. 조금은 어려울 수도 있는데, 아마 제가 100% 이해를 아직은 하지 않아서 발생한 현상이라는 생각이 듭니다. 그래서 가장 핵심은 카운터 횟수=반복 지정 횟수피스톤 운동에 대한 아날로그 태그값 반영 변수=0 이라는 이 두개의 조건을 if문에 적는 것이라는 생각이 듭니다.



이 과제는 뒤로 하고서, 이전에 했던 적이 있는 계단의 전등을 만드는 것에 대한 프로젝트를 새로 하고자 합니다.




상당수가 스크립트를 짜는 작업이라기 보다는, 디자인을 하는 작업에 좀 더 가까운 작업이 되었습니다. 아무튼 이 작업을 어떻게 완료하기는 하였습니다.




마지막으로 오늘의 하이라이트라고 해야 할까요? 저는 While문 안에 while문을 2중으로 사용해서 피스톤의 자동 왕복 운동을 하게 했지만, 실제로는 더 간단하게 하는 방법이 여기에 있는 것입니다. 


while 1


실린더에 관한 태그값을 반영하는 변수

전진이라는 신호값을 반영하는 변수

후진이라는 것을 반영하는 변수

자동/수동을 반영하는 셀렉터 스위치를 반영하는 변수


if 피스톤이 뻗어 나오는 조건문 then aaa=5

if 피스톤이 수축하는 경우의 조건문 then aaa=-5

settagval "실린더에 관한 태그",실린더에 관한 태그값을 반영하는 변수+aaa

sleep( )

wend


이런 구조를 가지고 사용한다는 것입니다. 일단 이게 제가 생각한 문장 보다는 더 깔끔하고 보기 좋다는 생각이 듭니다. 문제는 이 조건문을 짜는 것인데, 이 부분에 대해서는 아마 다시금 실습을 해야하는 일이 조만간에 생길 듯 한데, 그때 가서 더 이해가 되었다면, 다음 포스팅에서 다루도록 하겠습니다.

저작자 표시
신고

+ Recent posts

티스토리 툴바