티스토리 뷰
안녕하세요 드레이크입니다^^
이번에 modbus tcp를 연동하는 프로젝트를 진행하게 되어 modbus를 처음 접하게 되었는데요
처음에는 아래 사이트를 통해 개념을 숙지하였구요
이후 생짜로 짜려고 했었는데 구글링 중 좋은 C 라이브러리가 있어 사용하게 되었고 소개하려고 합니다.
정보가 없어 저처럼 헤매는 분들이 없도록 정리해보았습니다.
저는 일단 Crosss Compile 환경이구요 개발 환경은 우분투 16.04 이구요 타켓보드 환경은 CentOS7입니다.
1. 라이브러리 파일 다운로드
아래 사이트에서 안정화된 버전의 라이브리리 파일을 다운받습니다.
저는 libmodbus-3.1.6.tar.gz 파일을 다운로드 받았습니다.
https://libmodbus.org/download/
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, 33440, 1, &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, 4141, 1, &tab_coil) == -1) {
printlog("시설 장비 : modbus_read_bits fail @@");
}
printlog("Address 4142 Coils Value = %d", tab_coil);
}
|
cs |
'프로그래밍 > C, C++' 카테고리의 다른 글
리눅스 네트워크 디바이스명 알아오는 함수 (0) | 2021.10.19 |
---|---|
localtime_r로 어제 날짜 구하기 (0) | 2021.08.05 |
도메인 이름만으로 서버 접속하기 (0) | 2019.08.09 |
윈도우 TCP 서버 소켓 생성 (0) | 2019.08.09 |
TCP 서버 타임 아웃 설정 (0) | 2019.08.09 |
- Total
- Today
- Yesterday