티스토리 뷰

반응형

안녕하세요 드레이크입니다^^

 

이번에 modbus tcp를 연동하는 프로젝트를 진행하게 되어 modbus를 처음 접하게 되었는데요

 

처음에는 아래 사이트를 통해 개념을 숙지하였구요

http://comfilewiki.co.kr/ko/doku.php?id=tcpport:modbus-tcp_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C%EC%9D%B4%EB%9E%80:index

 

tcpport:modbus-tcp_프로토콜이란:index [Comfile Technology's Online Documentation]

MODBUS-TCP란 MODBUS-TCP는 산업용 필드버스 분야에서 자주 사용되는 통신 프로토콜 입니다. TCP/IP 네트워크 상에서 상위장치와 하위장치간의 인터페이스를 위하여 고안된 통신방법입니다. MODBUS-TCP 통신규격에는 마스터(Client)와 슬레이브(Server)의 역할이 나누어져 있습니다. 슬레이브(Server)는 마스터(Client)가 요청하는 데이터에 대해 응답을 해줍니다. 주로 마스터(Client)에는 산업용터치 HMI 기기, 또는

comfilewiki.co.kr

이후 생짜로 짜려고 했었는데 구글링 중 좋은 C 라이브러리가 있어 사용하게 되었고 소개하려고 합니다. 

 

정보가 없어 저처럼 헤매는 분들이 없도록 정리해보았습니다.

 

저는 일단 Crosss Compile 환경이구요 개발 환경은 우분투 16.04 이구요 타켓보드 환경은 CentOS7입니다.

 

1. 라이브러리 파일 다운로드

아래 사이트에서 안정화된 버전의 라이브리리 파일을 다운받습니다. 

 

저는 libmodbus-3.1.6.tar.gz 파일을 다운로드 받았습니다. 

 

https://libmodbus.org/download/

 

libmodbus

Download July 29, 2019 Two branches of libmodbus are currently maintained: development release v3.1.6 , released on 2019-07-31. See the release notes. This development version is very stable and will be marked as stable very soon. old release v3.0.8 . See

libmodbus.org

2. 개발 환경은 우분투 16.04 라이브러리 설치

- 파일을 넣어주고 압축을 아래와 같이 풀어 줍니다.

- root 계정 상태에서 폴더로 진입 후 ./configure && make && make install 명령으로 라이브러리 파일 설치를 진행합니다. 정상적으로 설치가 되면 아래와 같이 어떤 폴더에 라이브러리 파일이 생성되었는지 보여줍니다.

3. 개발 환경 세팅

저는 개발툴로 eclipse를 사용하고 있어 아래와 같이 헤더와 라이브러리 파일 경로를 설정하였습니다.

 

헤더파일 경로 설정

라이브러리 파일 경로 설정

3. 타켓보드 라이브러리 설치

- 파일을 넣어주고 압축을 아래와 같이 풀어 줍니다.

- root 계정 상태에서 폴더로 진입 후 ./configure && make && make install 명령으로 라이브러리 파일 설치를 진행합니다. 정상적으로 설치가 되면 아래와 같이 어떤 폴더에 라이브러리 파일이 생성되었는지 보여줍니다.

아래 내용은 우분투와 동일하여 같은 이미지로 대체하였습니다.

- 라이브러리 경로 환경 설정

CentOS에서는 우분투와 다르게 자동으로 라이브리러 폴더가 지정이 되지 않아 설정을 해주어야만 했습니다^^;

 

[경로 설정]

[root@localhost ~]# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

 

[파일 수정]

위와 같이 /usr/local/lib  경로를 설정 후 wq!로 저장하고 빠져나옵니다.

 

수정한 파일을 확정하는 명령을 아래와 같이 입력해줍니다.

 

4. 샘플 소스 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <modbus.h>
 
void main()
{
     modbus_t *mb;
     uint16_t tab_reg;
     uint8_t tab_coil;
 
     tab_reg = 0;
     tab_coil = 0;
 
     mb = modbus_new_tcp(Ip, Port);
 
     if(mb == NULL){
     log("시설 장비 : modbus_new_tcp fail @@");
 
      return;
     }
 
     if(modbus_set_slave(mb, 1== -1)   // Slave ID
     {
     log("시설 장비 : modbus_set_slave fail @@");
 
     return;
     }
 
     if(modbus_connect(mb) == -1) {
      log("시설 장비 : modbus_connect fail @@");
 
      return;
     }
 
     // 16진수 값 가져오기
     // 시작 번지(33440), 데이터 길이(1), 데이터 변수(tab_reg)
 
     // 이부분이 제일 헤깔려는데요~ addr은 가져오고자 원하는 바로전의 주소를 입력하고
 
     // 이후 데이터를 얼마만큼 가져올지는 다음에 nb로 입력합니다!!
     if(modbus_read_registers(mb, 334401&tab_reg) == -1) {
     printlog("시설 장비 : modbus_read_registers fail @@");
    }
     printlog("Address 33441 Holding Registers Value = %d", tab_reg);
 
     // 1비트 값 가져오기
     // 시작 번지(4141), 데이터 길이(1), 데이터 변수(tab_coil)
     if(modbus_read_bits(mb, 41411&tab_coil) == -1) {
     printlog("시설 장비 : modbus_read_bits fail @@");
    }
     printlog("Address 4142 Coils Value = %d", tab_coil);
}
cs
반응형
댓글
반응형
최근에 올라온 글
Total
Today
Yesterday