사용자 도구

사이트 도구

English

comfilehmi:simplemodbus:index

Simple MODBUS란 무엇인가?

표준 MODBUS-RTU 프로토콜에서 꼭 필요한 부분만을 간추려 만든 프로토콜로써, 저희 컴파일 테크놀로지에서 만든 프로토콜입니다.

ComfileHMI는 마스터가 되고 MCU는 슬레이브가 됩니다. 마스터가 물어보면 슬레이브는 응답을 하는 구조로 되어 있습니다.

Simple MODBUS 펑션코드별 동작

Simple MODBUS는 단 6개의 펑션만 지원합니다.

펑션코드 (10 진) 동작 설명
Code 1 -Read Coil 하나의 비트 읽기
Code 3 -Read Registers 여러 개의 워드 읽기
Code 5 -Write One Coil 1 비트 쓰기
Code 6 -Write One Register 1 워드 쓰기
Code 15 -Write Multiple Coils 여러 개의 비트 쓰기
Code 16 -Write Multiple Registers 여러 개의 워드 쓰기


Simple MODBUS 기억공간과 어드레스 체계

Simple MODBUS에서는 Coil 과 Register, 단 2개의 기억공간을 대상으로 합니다. 이 기억공간은 MCU쪽에 위치하고 있습니다.

기억공간 이름 비트수 어드레싱 (10진수)
Coil 1비트 기억공간 00001 ~ 09999
Register 16비트 (1워드) 기억공간 40001 ~ 49999

어드레스는 총 5자리 (10진수)로 구성되어 있습니다. 맨앞자리는 기억공간을 구분하는 용도입니다.

00001 와 같이 맨앞에 0로 시작하는 것은 Coil (비트 기억공간)을 뜻합니다. 00001은 Coil영역의 첫번째 비트를 뜻합니다. 1부터 시작하는것에 주의하세요. 00000 은 존재하지 않는 영역입니다. 최대 09999 까지 사용가능합니다.

40001 와 같이 맨앞에 4로 시작하는 것은 Register (16비트 워드 기억공간)을 뜻합니다. 40001은 Register영역의 첫번째 워드를 뜻합니다. 1부터 시작하는것에 주의하세요.

Simple MODBUS에서 1이나 3으로 시작되는 어드레스는 사용하지 않습니다. (예: 10001, 30001)




Simple MODBUS 소스프로그램 설명

Simple MODBUS를 사용하는 이유

표준 MODBUS-RTU는 복잡해서 MCU에서 구현하기에 적합하지 않습니다. Simple MODBUS는 단 6개의 펑션코드만 사용하기 때문에 소스가 간단하고 프로그램 메모리도 그만큼 덜 차지합니다. ComfileHMI 에서 Simple MODBUS를 지원하기 때문에, 본 소스로 제작한 MCU와 문제없이 통신할 수 있습니다.

만약 본 소스를 이용해서 만든 MCU와 표준 MODBUS-RTU를 지원하는 타사의 HMI와 연결할 경우, MCU에서 통신응답을 하지 못하는 경우가 발생합니다. Simple MODBUS에서 지원하지 않는 펑션코드를 보내오면 응답하지 않기 때문입니다.


MCU 선정

다음 조건을 만족하는 MCU를 선택해야만, Simple MODBUS 통신을 사용할 수 있습니다.

  1. 하드웨어 USART 페리퍼럴을 갖춘 MCU : 수신인터럽트를 사용하기 때문입니다.
  2. 타이머 인터럽트가 가능한 MCU : 1mS마다 타이머 인터럽트를 발생시켜야 하기 때문입니다.

권장 MCU : ARM Cortax M 코어를 사용하는 칩 (예: STM32), 또는 PIC18, AVRmega 시리즈를 권장합니다.

프로그램 메모리와 램이 충분하지 않은 MCU와 속도가 느린 MCU는 권장하지 않습니다.


배열 선언

먼저 Simple MODBUS에서 사용할 기억공간을 전역변수로 선언해주어야 합니다.

static unsigned char MDcoil[100];       // 비트영역을 8비트 배열로 선언. 8x100 이므로 총 800 비트공간이 확보됨
static unsigned short MDregister[100];  // 워드영역을 16비트 배열로 선언. 100워드의 공간이 확보됨

이 기억공간을 HMI와 데이터교환을 위한 링크영역으로 생각하시면 됩니다.

주의사항

  • MCU에 따라 데이터형의 크기가 다릅니다. (short형이 8비트인 경우도 있습니다.) 이 부분을 반드시 확인하시고 선언하세요.
  • MCU의 RAM용량에서 허용하는 범위내에서 배열의 크기를 정하시기 바랍니다.


코일 (1비트 영역) 배열 사용법

배열의 1번째 바이트에는 어드레스 00001 ~ 00008까지 할당됩니다. 2번째 바이트에는 00009 ~ 00016 까지 할당됩니다. 이런식으로 계속 8 비트씩 증가되면서 할당됩니다.

첫번째 바이트
비트위치 7 6 5 4 3 2 1 0
MODBUS
어드레스
00008 00007 00006 00005 00004 00003 00002 00001
두번째 바이트
비트위치 7 6 5 4 3 2 1 0
MODBUS
어드레스
00016 00015 00014 00013 00012 00011 00010 00009


레지스터 (1워드 영역) 배열 사용법

레지스터 배열은 첫번째 워드가 어드레스 40001 입니다.

배열 위치 첫번째 워드 두번째 워드 세번째 워드 네번째 워드
MODBUS
어드레스
40001 40002 40003 40004


프로그래밍 방법

Simple MODBUS 핸들러가 백그라운드에서 자동으로 RS232C 데이터를 분석하고 데이터를 교환하는 작업을 수행합니다. (USART 수신 인터럽트에서 RS232C데이터를 수집하고 분석합니다. 1mS (AVR은 10mS) 마다 발생하는 타임인터럽트에서 Simple MODBUS 응답처리를 담당합니다.)

따라서 여러분은 Simple MODBUS 의 구체적인 동작에 대해서 신경쓰지 않아도 됩니다. 앞서 선언한 Coil과 Register배열을 참조/관리하는 것만으로도 Simple MODBUS 를 이용할 수 있습니다.

프로그램 실행중 HMI에서 버튼 터치가 발생되면 특정 Coil이 1이 됩니다. (HMI작화 프로그램에서 버튼에 어드레스를 할당하도록 되어 있습니다.) MCU에서는 이 Coil을 참조해서 상응하는 동작을 하도록 프로그래밍하세요.

만약, MCU의 어떤값을 HMI에 표시하고 싶은 경우, 여러분은 HMI로 전달하고 싶은 값을 특정 Register에 기록하도록 프로그래밍 하세요. HMI에서 이 Register를 읽어와서 화면에 표시하게 됩니다. (HMI작화 프로그램에서 숫자표시 위젯에 어드레스를 할당하도록 되어 있습니다.)

앞에서 선언한 배열이 매우 중요한 역할을 수행합니다. 이 배열을 매개체로 해서 HMI와 MCU가 마치 한몸처럼 동작되게 되는 것입니다.


타임 루프 프로그래밍 기법 소개

HMI의 버튼은 언제든지 터치입력이 발생할 수 있기 때문에, 프로그램에서는 항상 Coil 영역을 감시하고 있어야 합니다.

타이머 인터럽트 루틴에서 Coil영역을 감시하는 방법도 있고, <타임 루프 프로그래밍 기법>이라는 코딩방법도 있습니다.

타임루프 프로그래밍 기법

어떤 것이 여러분의 어플리케이션에 더 적합한지 잘 고민하신뒤 결정하시기 바랍니다.

이전 페이지로 가기

comfilehmi/simplemodbus/index.txt · 마지막으로 수정됨: 2023/10/25 04:05 저자 Comfile Technology