C 언어 임베디드 시스템을 기반으로 modbus TCP 통신 구현 예제 코드

무료무료 기술 자료

이 글은 바로 읽을 수 있으며 기초 학습과 검색 유입에 적합합니다.

C 언어 임베디드 시스템을 기반으로 modbus TCP 통신 구현 예제 코드

# include st dio . h ><
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

# de fine 포 트 50 2

192.168.0.100 #define SERVER_IP "
# define DE V ICE _ ID 1

# de fine BU FF ER _ S IZ E 10 24

int main () {
    TCP 연결 만들기
    int so ck f d ;
    struct so ck add r _ in server _ add r ;

    so ck f d = so cket (AF _ IN ET , SO CK _ ST RE AM , 0);
    if (so ck f d == - 1) {
        print f (" 소 켓 을 생성 하지 못했습니다 : % s \ n ", str er ror (err no));
        1 을 반환 합니다 ;
    }

    server _ add r . sin _ family = AF _ IN ET ;
    server _ add r . sin _ port = ht ons (P OR T)
    server _ add r . sin _ add r . s _ add r = in et _ add r (S ER VER _ IP);

    if (connect(sockfd, (struct sockaddr *)
        print f (" 서 버 에 연결 할 수 없습니다 : % s \ n ", str er ror (err no));
        close (so ck f d);
        1 을 반환 합니다 ;
    }

    print f ( " C onne cted to the server success fully . \ n ")

    / / mod bus 요청 준비
    서명 되지 않은 char 요청 [ BU FF ER _ S IZ E ];
    un sig ned char 응답 [ BU FF ER _ S IZ E ];
    int request _ length , response _ length ;

    레 지 스터 읽기 및 유지
    int register _ 주소 = 0
    int register _ count = 4
    request _ length = mod bus _ build _ request (re quest , DE V ICE _ ID , MO DB US _ FC _ READ _ H OL D ING _ REG IS TER S , register _ 주소 , register _ count);

    Mod bus 요청
    if (s end (so ck f d , request , request _ length , 0) == - 1) {
        print f (" Re quest 를 보내 지 못했습니다 : % s \ n ", str er ror (err no));
        close (so ck f d);
        1 을 반환 합니다 ;
    }

    print f (" 요청 이 성공적으로 전송 되었습니다 . \ n ")

    / / Rece ive mod버스 응답
    response _ length = rec v (so ck f d , response , BU FF ER _ S IZ E , 0);
    if (res ponse _ length == - 1) {
        print f (" 응 답 을 수신 하지 못했습니다 : % s \ n ", str er ror (err no));
        close (so ck f d);
        1 을 반환 합니다 ;
    }

    print f ( " 응 답 을 성공적으로 받았습니다 . \ n ")

    Mod bus 응답 을 분석 합니다 .
    int register _ value = mod bus _ get _ response _ value (res ponse , response _ length)

    print f (" Reg ister 값 : % d \ n ", register _ value);

    TCP 연결 종료
    close (so ck f d);

    0 을 반환 합니다 ;
}

위의 예 제 코 드는 mod bus 프로토 콜 의 읽기 유지 레 지 스터 기능을 사용하여 TCP 연결 을 통해 요청을 보내고 응답 을 수신 하고 분석 한 다음 TCP 연결 을 닫 습니다 .코드 에서 SER VER _ IP 및 DE V ICE _ ID 와 같은 매 개 변 수 뿐만 아니라 읽 은 레 지 스터 주소 및 수 를 수정 할 수 있습니다 .

# include st dio . h ><
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

# de fine 포 트 50 2

192.168.0.100 #define SERVER_IP "
# define DE V ICE _ ID 1

# de fine BU FF ER _ S IZ E 10 24

int main () {
    TCP 연결 만들기
    int so ck f d ;
    struct so ck add r _ in server _ add r ;

    so ck f d = so cket (AF _ IN ET , SO CK _ ST RE AM , 0);
    if (so ck f d == - 1) {
        print f (" 소 켓 을 생성 하지 못했습니다 : % s \ n ", str er ror (err no));
        1 을 반환 합니다 ;
    }

    server _ add r . sin _ family = AF _ IN ET ;
    server _ add r . sin _ port = ht ons (P OR T)
    server _ add r . sin _ add r . s _ add r = in et _ add r (S ER VER _ IP);

    if (connect(sockfd, (struct sockaddr *)
        print f (" 서 버 에 연결 할 수 없습니다 : % s \ n ", str er ror (err no));
        close (so ck f d);
        1 을 반환 합니다 ;
    }

    print f ( " Co서버 에 성공적으로 연결 했습니다 . \ n ")

    / / mod bus 요청 준비
    서명 되지 않은 char 요청 [ BU FF ER _ S IZ E ];
    un sig ned char 응답 [ BU FF ER _ S IZ E ];
    int request _ length , response _ length ;

    레 지 스터 읽기 및 유지
    int register _ 주소 = 0
    int register _ count = 4
    request _ length = mod bus _ build _ request (re quest , DE V ICE _ ID , MO DB US _ FC _ READ _ H OL D ING _ REG IS TER S , register _ 주소 , register _ count);

    Mod bus 요청
    if (s end (so ck f d , request , request _ length , 0) == - 1) {
        print f (" Re quest 를 보내 지 못했습니다 : % s \ n ", str er ror (err no));
        close (so ck f d);
        1 을 반환 합니다 ;
    }

    print f (" 요청 이 성공적으로 전송 되었습니다 . \ n ")

    / / mod bus 응답
    response _ length = rec v (so ck f d , response , BU FF ER _ S IZ E , 0);
    if (res ponse _ length == - 1) {
        print f (" 응 답 을 수신 하지 못했습니다 : % s \ n ", str er ror (err no));
        close (so ck f d);
        1 을 반환 합니다 ;
    }

    print f ( " 응 답 을 성공적으로 받았습니다 . \ n ")

    Mod bus 응답 을 분석 합니다 .
    int register _ value = mod bus _ get _ response _ value (res ponse , response _ length)

    print f (" Reg ister 값 : % d \ n ", register _ value);

    TCP 연결 종료
    close (so ck f d);

    0 을 반환 합니다 ;
}
실제 프로젝트에 이 자료를 활용하시겠습니까?

도구 센터에서 프레임 분석, CRC 검증, 장비 디버깅을 진행하거나 요청을 제출하여 선정 및 연동 제안을 받아보세요.

엔지니어 회원

이 글을 실행 가능한 디버깅 자료로 활용하세요

가입하면 고급 프레임 분석, 자료 패키지 다운로드, 코드 예제, 엔지니어링 사례, 우선 기술 지원을 이용할 수 있어 실제 프로젝트 납품에 적합합니다.

고급 도구 무제한 이용
자료 패키지와 코드 패키지
완전한 엔지니어링 사례 라이브러리
우선 기술 지원 채널

답글 작성

이메일 주소는 공개되지 않습니다. 必填项已用 * 标注