1. Anaconda 다운로드

 

2. 명령어 입력

설치
$ bash [다운로드 받은 *.sh 파일]

계속 enter 누르다가

yes 입력

 

 

3. bashrc 실행

$ source ~/.bashrc

 

4. Anaconda 설치 확인

$ conda --version

conda: command not found 에러가 발생했을 경우

=> .bashrc 파일 수정

 

1. vi 열기

$ vi ~/.bashrc

2. 경로 추가

export PATH = ~/anaconda3/bin:$PATH

 

3. bashrc 실행

4. Anaconda 설치 확인

01. 한글 키보드 설치

출처 : https://snowdeer.github.io/linux/2018/01/21/ubuntu-16p04-install-korean-keyboard/

한글 키보드 설치

Ubuntu 16.04 LTS 버전 기준으로 한글 키보드를 설치하는 방법입니다.

먼저 아래의 명령어를 수행해서 fcitx-hangul 패키지를 설치합니다.

sudo apt-get install fcitx-hangul

그리고 아래의 절차를 진행합니다.

  • System Settings 실행
  • Language Support 아이콘 실행
  • 언어팩을 설치하라는 팝업창이 뜨면 ‘설치’ 선택
  • ‘Keyboard input method system’ 항목을 fcitx로 변경
  • 재부팅

오른쪽 한/영키(Alt 키)를 이용한 한/영 전환

Unbuntu에서는 기본적으로 오른쪽 Alt 키가 커맨드 실행 기능으로 맵핑이 되어 있습니다. 한/영 전환 키로 활용하고 싶으면 다음과 같이 세팅하시면 됩니다.

  • System Settings에서 Keyboard 실행
  • Shortcuts 탭 선택한 후 Typing 항목 선택
  • 모든 항목(Switch to next source, Switch to previous source, Alternative Characters Key)을 Disabled로 설정(Back 키를 누르면 Disabled가 됨)
  • Compose Key 항목을 Right Alt로 변경
  • Switch to next source를 선택한 다음 오른쪽 Alt 키(한/영 키)를 누르면 Multikey라는 항목으로 값이 설정됨

 

fcitx 설정

  • 설정의 system setting 선택
  • Text Entry 선택
  • 추가 버튼을 이용하여 Hangul(Fcitx)와 English(US)를 추가

02. vim 설치

$ sudo apt-get install vim

vim은 리눅스의 메모장 같은 프로그램이다. 여러가지 단축키를 이용하여 텍스트 파일을 편집할 수 있다.

처음 ubuntu를 깔게 되면 vim을 실행시킬 수는 있지만 방향키를 눌렀을 때 동일한 글자가 반복되는 등의 문제가 발생할 수 있다.

그럴 때를 대비하여 미리 설치해놓으면 나중에 편하다.


03. root 계정 암호 설정

$ sudo passwd [사용자계정]
$ sudo passwd root

개발을 진행하다보면 관리자로 로그인해야 하는 경우가 생긴다. 그 때 비밀번호를 치라그러는데 비밀번호 설정이 안되있으면... 좀 그렇다 ㅋㅋㅋ

그래서 미리 설정해주자

 

plc와 pc 연동을 C#, python으로 구현해보고, npm에 modbus-serial 모듈이 있는 것을 알고 난 후 nodejs를 활용하여 plc와의 연동을 테스트해보았다.

 

예제 코드도 가지고 있었던 터라 아무 문제 없이 해결할 수 있을 줄 알았지만 예상치 못한 문제가 발생하였다.

 

Issue

콜백 함수의 향연으로 Thread를 신경쓰지 않아도 되는 nodejs 특성상 어떤 놈이 먼저 실행이 될 지 알 수가 없다...ㅋ

그러다 보니 serial 통신을 이용해서 하나의 데이터만 가져오는 것은 아무 상관이 없었는데, read를 두 번 이상 하니 이 함수 놈이 요청하고, serial통신 버퍼에 있는 데이터를 몽땅 가져오는 바람에 뒤에 실행되는 read함수에서 데이터가 없다며 에러를 토해내는 것이 아닌가..

 

그렇다면 내가 할 수 있는 최선은 이 중구난방으로 실행되는 비동기 함수들을 순차적으로 실행시켜주면 되는 일..

 

그래서 Async.series를 사용해서 문제를 해결하였다.

 

p.s. series는 단순 순차 실행, waterfall은 순차 실행인데 결과를 다음 콜백 함수에 전달 할 수 있다고 한다더라.

 

해결

개발 환경 : Ubuntu 64bit 16.04

IDE : vscode

nodejs version : v13.11.0

npm package : modbus-serial, async

 

더보기

코드

const ModbusRTU = require("modbus-serial")
var async = require("async");

var client = new ModbusRTU();
var timeoutConnectRef = null

function connect(){
    console.log("Connecting..!!");
    clearTimeout(timeoutConnectRef);

    if(client.isOpen){
        console.log('Already connected!!');
        run();
    }

    client.connectRTUBuffered("/dev/ttyUSB0", {dataBits: 8, stopBits: 1, baudRate: 115200})
    .then(setClient)
    .then(function() {console.log("Connected");})
}

function setClient(){
    console.log("Set client ID..!!");
    client.setID(1);
    client.setTimeout(3000);

    run();
}

var task = [
    function(callback) {
        client.readDiscreteInputs(1,4, function(err, res_read){
            console.log("L1: " ,res_read.data[0], res_read.data[1], res_read.data[2], res_read.data[3])
            callback()
        })
    },
    function(callback){
        client.readHoldingRegisters(1,4, function(err, res_read){
            console.log("L1Q: " ,res_read.data[0], res_read.data[1], res_read.data[2], res_read.data[3])
            callback()
        })
    }
]

function run(){
    var setLoop = setInterval(function(){
        async.series(task, function(err, results){
            console.log("done")
        })
    }, 1000)
}

connect()

 

출력 결과

ㅣ1은 bit를, L1Q는 word를 읽는 것.

github : https://github.com/Mistive/-js-modbusRTU.git

 

task 변수를 생성하여 순차적으로 동작시킬 task를 설정해주고, 1초에 한번씩 위의 동작을 반복하여 내가 필요한 값을 읽어들이는 작업을 수행하였다.

 

처음에 callback()을 function(callback){} 안에 넣지 않고 밖에 넣었더니 순차적으로 진행이 되지 않는 실수를..ㅎ;;

1번의 콜백 함수가 호출이 된 후, 콜백 함수가 수행이 되고, 1의 결과를 출력하고 그 다음 콜백 함수를 수행하는 형식으로 동작한다.

 

이거야 함수가 2개밖에 안되서 콜백에 콜백을 써도 되겠지만..... 한 3~4개만 되도 보는 사람 빡치게 만들기 충분한 코드가 될 것이라고 확답할 수 있다..ㅎㅎ

 

python으로 구현할 때는 thread timer를 이용하여 일정 주기로 Read&Write를 수행했는데, 흠.... js가 좀 더 깔끔한거 같기도 하고...ㅎㅎ

 

무튼 재밌다 코딩 ㅋㅋ

'PLC' 카테고리의 다른 글

[PLC, Python]PLC를 통한 PC 동영상 제어  (9) 2020.02.28

+ Recent posts