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

freeFree Technical Resource

This content is free to read, suitable for basic learning and search traffic.

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 _ address = 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 _ address , 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 _ address = 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 _ address , 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 을 반환 합니다 ;
}
Put this resource to use in a real project?

Go to the Tool Center for message parsing, CRC verification and device debugging, or submit your requirements for selection and integration advice.

Engineer Membership

Turn this article into actionable debugging resources

After activation, you can use advanced message parsing, resource pack downloads, code examples, engineering cases and priority technical support, suitable for real project delivery.

Unlimited Advanced Tools
Resource & Code Packs
Complete Engineering Case Library
Priority Technical Support

Leave a Reply

Your email address will not be published. Required fields are marked *.