본문으로 바로가기

바다야크

프로그래밍

해당되는 글 302
  • thumbnail
    컴퓨터/프로그래밍

    아리송한 MODBUS-RTU 특이점

    MODBUS-RTU 왜 이렇게 만들었을까? 통신으로 장비를 제어하는 시스템을 개발한다면 모드버스(MODBUS) 프로토콜이 편한데요, 다뤄야 할 장비가 모드버스를 지원한다면 반가울 정도입니다. 그런데 이렇게 편한 모드버스 프로토콜을 처음 접했을 때는 정말이지 왜 이렇게 만들었나 이해가 안 되는 부분이 한둘이 아니었습니다. 정리하면 이렇습니다. 시리얼 통신인데 STX·ETX가 없다? 바이트 순서가 CRC만 다르다? 읽기 함수는 레지스터 개수, 응답은 byte 개수? 레지스터와 어드레스의 시작은 0번? 1번? 32bit 데이터의 바이트 전송 순서는? MODBUS-RTU에 STX·ETX가 없다? 모드버스 통신에는 전송하는 바이트 형식에 따라 MODBUS-RTU와 MODBUS-ASCII가 있습니다. 이름에서 예상..
  • thumbnail
    컴퓨터/유틸리티

    라자루스 디버깅 툴 디버그서버 사용 방법

    Lazarus DebugServer 라자루스로 윈도우 프로그램을 작성할 때 아쉬운 점이 있습니다. 디버깅을 위한 문장을 라자루스의 Messages 윈도우에 출력할 수 있다면 좋겠는데 아직 방법을 찾지 못했습니다. 콘솔 프로그램이라면 가능한 것 같은데 윈도우 프로그램은 Messages 창으로 전송할 방법이 없네요. 대신에 라자루스가 설치된 폴더에 tools 폴더가 있는데, 이 안에 DebugServer라는 프로그램이 있습니다. 이 프로그램을 먼저 실행하고 디버깅을 위한 문자를 전송해서 확인할 수 있습니다. ▲ 라자루스로 lazarus/tools/debugserver 안에 있는 debugserver.lpi 프로젝트 파일을 열기 합니다. ▲ 만일 DebugServer를 컴파일해서 실행했을 때 시작하자마자 "d..
  • thumbnail
    컴퓨터/프로그래밍

    나도 프로그래머 라자루스 통합 개발 환경

    오픈소스 통합개발환경(IDE) 라자루스 윈도우 프로그램을 직접 만들고 싶은 분께 오픈 소스 통합 개발 환경(IDE) 라자루스를 권합니다. 프로그래밍은 전문 지식이 필요해서 매우 어렵게 생각되는데요, 라자루스는 프로그램을 쉽게 만들 수 있는 편리한 기능을 제공해서 프로그래밍의 문턱을 낮추어 줍니다. 라자루스에 대한 자세한 얘기는 밑으로 내리고 과연 라자루스로 어떻게 프로그램을 작성하는지 보겠습니다. 라자루스의 첫 번째 프로그램으로 자리를 잠시 비울 때 나를 찾는 분에게 안내 문장을 보여 주는 작은 윈도우 프로그램을 만들어 보겠습니다. 화면 가운데에 메시지를 입력할 수 있는 입력창을 넣고 그 아래에 종료 버튼을 놓겠습니다. 참고로 이 정도의 프로그램이라면 라자루스 설치에서 만들기까지 10여 분도 채 안 걸릴..
  • thumbnail
    컴퓨터/프로그래밍

    MODBUS-RTU 구현 시 주의 사항

    MODBUS-RTU 경험담 MODBUS-RTU 프로그램을 작성하면서 겪었던 경험담을 올립니다. 좀 당황스러운 일인데, 경험에 따라 생각이 다를 수 있어서 반드시 이래야 한다는 것은 아니지만, rs485 라인에 MODBUS-RTU 통신을 하는 분께 도움이 되지 않을까 해서 올립니다. 사건의 발단은 말 많고 탈 많은 rs485 통신 때문입니다. rs485 통신은 현장에 따라 희비가 극명합니다. 똑같은 시스템을 설치하는데도 어느 곳은 오전에 시작해서 오전에 끝나는데, 어떤 곳은 밤늦게까지 속을 썩입니다. rs485 통신은 장거리 통신이 가능하고 노이즈에 강하지만, 어디까지나 rs232와 비교해서입니다. rs485 통신을 이론으로만 따졌다가는 고생을 많이 하게 되는데요, 노이즈에 강한 통신이어도 현장에서는 통신..
  • thumbnail
    컴퓨터/프로그래밍

    rs485 시리얼 통신 구성 방법 및 주의 사항

    rs485 시리얼 통신 구현 방법 비교 요즘처럼 인터넷 시대에도 산업 현장에서는 rs232와 rs485 시리얼 통신을 많이 사용합니다. 거리가 멀거나 1:N 통신이 필요한 경우 rs485 통신을 사용하는데요, 한 개의 통신 라인에 여러 장치와 통신을 해야 하다 보니 다양한 아이디어가 나오고 구현 방식도 여러 가지입니다. rs485 시리얼 통신에서 프로토콜을 어떻게 구현하며 어떤 점을 주의해야 하는지 알아보겠습니다. 마스터·슬래이브 통신 rs485는 두 가닥의 라인에 여러 개의 장치를 연결하고 통신합니다. 그러므로 규칙을 정하지 않으면 장치 두 대를 연결해도 통신이 안 됩니다. 이를 해결하기 위해서는 누가 먼저 통신 라인에 패킷을 올려놓을지 규칙을 정해야 하는데, 가장 쉬운 방법은 어느 한 장치에 주도권을..
  • thumbnail
    컴퓨터/프로그래밍

    tcp udp 차이점과 프로그래밍에서 주의해야할 부분

    tcp/ip와 udp/ip의 다른 점은? 소켓 통신 tcp/ip와 udp/ip를 학습을 통해 어떤 프로토콜인지는 알지만, 정확한 차이점과 특성을 모르면 잘못된 코딩을 하거나 실수하는 경우가 많습니다. 통신은 외부 업체와 협업하거나 장비를 이용해야 해서 어느 한쪽이 엉뚱하게 프로그램을 만들면 간단한 일도 힘든 작업이 될 수 있는데요, tcp/ip와 udp/ip의 차이점과 각 프로토콜을 사용했을 때의 주의해야 할 내용을 알아보겠습니다. 우선 tcp/ip는 연결 지향성이고 udp/ip는 비연결 지향성이라고 합니다. tcp/ip는 스트림 데이터이고 udp/ip는 패킷 단위로 보낸다, 또는 tcp/ip는 데이터 경계가 없지만, udp/ip는 데이터 경계가 있다는 등의 생소한 단어로 어렵게 느껴집니다. 그러나 알고..
  • thumbnail
    컴퓨터/프로그래밍

    C#언어 문자열 숫자 변환 방법

    C#언어 안전하게 문자열을 숫자로 변환하는 방법 새로운 언어를 학습하게 되면 형 변환이 제일 먼저 궁금해지지 않나 생각합니다. C에서는 atoi() 함수나 sscanf() 함수를 이용해서 숫자 문자열을 숫자 변수로 받는데요, C#에서는 어떻게 할까요? 객체지향 언어답게 메서드 방식으로 변환하는데요, 방법은 이렇습니다. int nValue = int.Parse( str); 위 코드는 문자열 str의 값을 정수로 변환해서 nValue에 대입합니다. 방법은 쉽습니다만, 안심할 수 없습니다. 왜냐하면 str이 가지고 있는 문자열이 비었거나 숫자 문자열이 아니면 실행 에러가 발생합니다. 실행 에러라는 말씀은 빌드가 되어도 실행 중에 에러가 발생해서 종료가 된다는 것이죠. 이 문제를 해결하려면 C#의 예외 상황 처..
  • thumbnail
    컴퓨터/프로그래밍

    C#언어 불필요한 이벤트 메서드 함수 제거 방법

    C#언어 이벤트 핸들러 제거 방법 C#을 학습하고 있는데요, 윈도우 폼에 컨트롤을 배치하고 이벤트를 처리하는 메서드 함수를 작성했는데, 필요 없다고 그냥 지워 버리면 에러가 발생하네요. 실행은 돼도 디자이너가 열리지 않습니다. 아마도 디자이너가 참조할 이벤트 메서드 함수가 없어져서 문제가 되는 것 같은데요, 컨트롤이 필요 없다면 컨트롤과 함께 함수도 같이 제거하면 되지만, 이벤트 처리 함수만 삭제하려면 어떻게 해야 할까요? 이벤트 메서드 함수보다는 이벤트 핸들러라고 하는 것이 더 친숙한데요, C# 책에서는 이벤트 메서드 함수 또는 이벤트 메서드로 많이 사용하는 것 같습니다. 델파이에서는 Save 메뉴를 실행할 때 마다 내용이 없는 비어있는 이벤트 메서드 함수 모두를 자동으로 제거되는데요, C#에서는 자동..
  • thumbnail
    컴퓨터/프로그래밍

    E: /var/cache/apt/archives/lock 잠금 파일을 얻을 수 없습니다 - open (11: 자원이 일시적으로 사용 불가능함)

    E: /var/cache/apt/archives/lock 잠금 파일을 얻을 수 없습니다 - open (11: 자원이 일시적으로 사용 불가능함) 우분투에서 apt-get install 로 otf2bdf를 설치하려는데 난해한 문제가 발생하네요. 원인은 모르지만, 구글 신에게 물어 보니 아래의 순서로 차례로 실행하시라고 하셔서 문제를 해결할 수 있습니다.
  • thumbnail
    컴퓨터/프로그래밍

    C언어 strnlen() 문자열 길이 구하기 함수

    C strnlen() 문자열 길이 구하기 함수 strnlen() C언어에서 문자열 길이를 구하는 함수에는 strlen()과 strnlen()이 있습니다. strlen()은 문자열만 인수로 받지만, strnlen()은 최대 길이까지 입력 받습니다. 이유는 인수로 받은 문자열 변수가 초기화가 안 되었고 NULL 문자가 없을 경우 실행 중 위험을 줄이기 위함입니다. 즉, strnlen()은 strlen()처럼 NULL까지의 길이를 찾되 특정 길이 이상은 검색하지 않도록 합니다. 헤더: string.h 형태: size_t strlen( const char *str, size_t maxlen) 인수: char *str 길이를 구할 문자열 size_t maxlen 길이를 구할 최대 길이 반환: 지정한 최대 길이 이..
  • thumbnail
    컴퓨터/프로그래밍

    C언어 문자열에서 서식에 맞춘 변수 값 받기 sscanf()

    C sscanf() 문자열에서 서식에 맞춘 변수 값 받기 함수 문자열로부터 서식을 갖춘 데이터를 입력받습니다. 헤더: stdio.h 형태: int sscanf(const char *str, const char * format, ... ) 인수: char *str 문자열 char *format 서식 문자열 반환: int 입력된 항목 수를 반환하며, 오류가 발생하면 EOF를 반환 서식을 갖춘다는 것은 입력을 어떤 모양에 맞추어 입력을 받는다는 것입니다. 아래의 서식에 사용하는 변환 문자열을 참고하세요. 주의할 점은 서식에 맞추어 입력하질 못하면 다음 scanf까지 모두 에러가 발생하므로 조심하여야 합니다. 예제의 결과를 확인하세요. 변환 문자열 의미 %o 8진 정수 형식으로 입력 %d 10진 정수 형식으로 ..
  • thumbnail
    컴퓨터/프로그래밍

    C언어 파일 열기 함수 fopen()

    C fopen() 파일 열기 함수 C언어 함수 fopen()은 파일을 읽거나 쓰기를 하기 위해서 파일 열기를 합니다. 파일을 사용 후에는 fclose()로 닫습니다. 헤더: stdio.h 형태: FILE *fopen(const char *path, const char *mode) 인수: char *path 열고자하는 파일의 전체 이름 char *mode 파일 열기를 위한 옵션, 사용 형태 반환: FILE * 파일 포인터를 반화하며, 열기에 실패하면 NULL을 반환합니다. mode 상세 설명 mode 설명 "r" 읽기 전용. 파일이 반드시 있어야 합니다. "w" 쓰기 전용. 파일이 없으면 생성되고, 파일이 있다면 기존 내용은 지워집니다. "a" 내용 추가. 파일이 없으면 생성되고, 파일이 있다면 기존 내용..
    이모티콘창 닫기
    울음
    안녕
    감사해요
    당황
    피폐

    이모티콘을 클릭하면 댓글창에 입력됩니다.