반응형

예전 PLC와 컴퓨터 python을 연결할 때 아두이노로 대신 테스트 했다.

아두이노가 PLC역할을 하고,

Python은 PC로 돌리게 된다.

 

컴퓨터와 아두이노간의 연결하는 코드이다.

아두이노에 스위치를 달고 LED를 달고 테스트

아두이노의 시리얼 포트로 115200 비트로 통신한다.

 

아두이노에서 ready신호를 보내면, PC의 python코드가 작동하고

PC에서 1번 (합격), 2번 (불합격) 신호를 보내면

아두이노에서 그에 맞는 동작을 하는 코드이다.

 

아두이노 코드

const int buttonPin1 = 8;      //  8 번핀 스위치 입력 테스트 (PLC의 ready신호)
char LEDpin1 = 12;    //  OK LED 포트 설정
char LEDpin2 = 13;    //  NG

int flag = 0;
int NGflag = 0;
int OKflag = 0;

// LED확인용 함수.
void OK(void)
{
    digitalWrite(LEDpin1, HIGH);
    digitalWrite(LEDpin2, LOW);
}
void NG(void)
{
    digitalWrite(LEDpin2, HIGH);
    digitalWrite(LEDpin1, LOW);
}


void setup() {
  Serial.begin(115200);              //  시리얼 통신의 시작, 보레이트 입력
  pinMode(buttonPin1, INPUT_PULLUP);  //  스위치 내부풀업저항 입력포트로 셋팅.
  
  pinMode(LEDpin1, OUTPUT);           //  OK, NG LED 출력포트 지정.
  pinMode(LEDpin2, OUTPUT);
}

void loop() {
  char c = Serial.read();           //  PC로부터온 값을 읽음.
  int buttonValue1 = digitalRead(8); //  8번 핀에서 읽음.
  
  if(buttonValue1 == LOW )           //  스위치가 눌릴때 ready신호를 보냄. (PLC -> PC)
  {
    flag = 1;
  }
  if(flag == 1)
  {
      Serial.println("ready");      //  준비가 되었다고 PC에 신호를 보냄.
      delay(500);
      flag = 0;
  }

  // 아스키코드 0x31 들어올때, OK
  if( c == '1')
  {
      OKflag = 1;
  }

  // 아스키코드 0x32 들어올때, NG
  else if( c == '2')
  {
      NGflag = 1;
  }

  

  if(OKflag == 1)
  {
    OK();
    OKflag = 0;
  }
  if(NGflag == 1)
  {
    NG();
    NGflag = 0;
  }

}

 

반응형

 

파이썬 코드

import serial

ser = serial.Serial(
    port='COM3',
    baudrate=115200,
    parity=serial.PARITY_NONE,\
    stopbits=serial.STOPBITS_ONE,\
    bytesize=serial.EIGHTBITS,\
)


while True:
    if ser.readable():
        res = ser.readline()                 # 시리얼로 날라온 bytes 값이 저장됨.
        ready = res.decode()[:len(res)-2]    # bytes를 decode 해서 str로 변환, 자동으로 포함되어있는 개행을 제거하기 위해 [:len(res)-2] 를 추가함 : 즉, \r\n 을 제거함.

        print(ready)        # 아두이노(PLC)에서 날라온 프로토콜.

        judge = input()             # 유저가 입력 '1' 또는 '2' 테스트 하기 위해.

        OK = chr(0x31)              # '1' 일때 OK
        NG = chr(0x32)              # '2' 일때 NG

        # 프로토콜을 받고 판독 시작.
        if ready == 'ready':
            if judge == OK:

                OK = OK.encode()     # OK일때 char 를 bytes로 인코딩
                ser.write(OK)        # 아스키코드 0x31 전송

            elif judge == NG:

                NG = NG.encode()     # NG일때 아스키코드 0x32 전송
                ser.write(NG)
            else:
                pass

 

반응형

'Arduino' 카테고리의 다른 글

Arduino Uno로 인체 감지 쓰레기통 만들기  (0) 2019.09.27

+ Recent posts