질문,답변

안녕하세요

몇일째 해결 안되는 문제가 생겨 이렇게 문의 드립니다. 

미쯔비시 PLC 이더넷 통신프로그램 중 어려움이 생겼습니다. 

 

ClientTCPWrite 명령을 사용하여 상대 장치 측으로 데이터를 보내려고 합니다. 

 

ASCII 로 전송에 문제가 없는데, 바이너리 형태로 전송시 문제가 됩니다. 

 

바이너리 코드는 다음과 같습니다. 

50h 00h 00h ffh ffh 03h 00h 0ch 00h 10h 00h 01h 04h 00h 00h 64h 00h 00h 90h 02h 00h

 

전송을 위한 데이터 버퍼에 위 데이터를 입력 할 경우 00h(Null) 때문에 이하 문자들을 처리 못하고,

ClientTCPWrite 전송데이터는 Null을 포함 할수 없다는 도움말을 확인 했습니다. 

 

가능한 방법이 있는지 문의 드립니다.!

 

 


김준홍

2018.03.30 17:16:46
*.130.60.190

안녕하세요. 

저의 경우에는 ClientTCPWrite를 사용하여, 바이너리로 데이터 전송시

아무런 문제가 없습니다. 0x00 도 정상적으로 전송됩니다.

dataPointer void * Pointer to the data to write. NULL is not allowed. 

라는 도움말을 말씀하시는 거라면 , 해당 내용은 pointer값을 줘야 한다는 말일 뿐,

데이터 내용은 null 일 수 있습니다.

 

허창원

2018.04.03 00:25:04
*.177.11.192

네, 김준홍님께서 정확히 말씀해 주셨네요.

저도 MITSHBISHI PLC와의 이더넷 통신을 ASCII 모드나 Binary 모드 모두 잘 쓰고 있습니다.

쓰는 함수는 TCP 예제 프로그램에서 본 ClientTCPWrite() 이것 맞구요.

 

PLC와의 통신은 한번만 잘 뚫어두면 다음부터는 수월합니다.

(저는 주로 MC프로토콜로 통신합니다.)

 

제가 wrapping해서 사용하는 함수 내에 다음과 같이 하고 사용하고 있네요.

다음은 제가 사용한 소스인데요,

구조체로 지정한 것이 복잡해 보여도 핵심은 쉽게 아실 수 있을 겁니다.

 

 

        if(p_obj->flag_BinAsc == 0)     // 통신방식 0:Binary(Default), 1:ASCII

        {

            // Binary 방식으로 통신할 경우

                index = 0;

                p_obj->device.SendBuff[0] = 0x50;   // 0: 서브헤더(2바이트)

                p_obj->device.SendBuff[1] = 0x00;

                

                p_obj->device.SendBuff[2] = 0x00;   // 2: 네트워크 번호(1바이트)

                

                p_obj->device.SendBuff[3] = 0xFF;   // 3: PLC 번호(1바이트)

                

                p_obj->device.SendBuff[4] = 0xFF;   // 4: 요구상대모듈 I/O 번호(2바이트)

                p_obj->device.SendBuff[5] = 0x03;

 

                p_obj->device.SendBuff[6] = 0x00;   // 6: 요구상대모듈 국번호(1바이트)

                

                p_obj->device.SendBuff[7] = 0x0C;   // 7: 요구데이터길이(2바이트)

                p_obj->device.SendBuff[8] = 0x00;

                

                p_obj->device.SendBuff[9] = 0x10;   // 9: CPU감시타이머(2바이트)

                p_obj->device.SendBuff[10] = 0x00;

 

                    //p_obj->device.SendBuff[9] = 0x00;   // 9: CPU감시타이머(2바이트)

                    //p_obj->device.SendBuff[10] = 0x0A;

                

                p_obj->device.SendBuff[11] = 0x01;  // 11: 커맨드(2바이트) 워드단위 일괄읽기: 0x0401 

                p_obj->device.SendBuff[12] = 0x04;

 

                    //p_obj->device.SendBuff[11] = 0x04;  // 11: 커맨드(2바이트) 워드단위 일괄읽기: 0x0401 

                    //p_obj->device.SendBuff[12] = 0x01;

                

                p_obj->device.SendBuff[13] = 0x00;  // 13: 서브커맨드(2바이트)

                p_obj->device.SendBuff[14] = 0x00;

                

                addr_ul = (unsigned long)(wordBuff->baseAddress + offsetAddr);

                p_obj->device.SendBuff[15] = LOBYTE(LOWORD(addr_ul));  // 15: 선두디바이스(3바이트)

                p_obj->device.SendBuff[16] = HIBYTE(LOWORD(addr_ul));

                p_obj->device.SendBuff[17] = LOBYTE(HIWORD(addr_ul));

 

                    //p_obj->device.SendBuff[15] = LOBYTE(HIWORD(addr_ul));  // 15: 선두디바이스(3바이트)

                    //p_obj->device.SendBuff[16] = HIBYTE(LOWORD(addr_ul));

                    //p_obj->device.SendBuff[17] = LOBYTE(LOWORD(addr_ul));

                

                p_obj->device.SendBuff[18] = 0xA8;  // 18: 디바이스코드(1바이트): D

                

                lenWord_us = (unsigned short)lengthWord;

                p_obj->device.SendBuff[19] = LOBYTE(lenWord_us);  // 19: 디바이스점수(2바이트)

                p_obj->device.SendBuff[20] = HIBYTE(lenWord_us);

                

                    //p_obj->device.SendBuff[19] = HIBYTE(lenWord_us);  // 19: 디바이스점수(2바이트)

                    //p_obj->device.SendBuff[20] = LOBYTE(lenWord_us);

                

                index = 21;

                

                //p_obj->device.SendBuff[21] = 0x00;  // 21: 데이터....

                //p_obj->device.SendBuff[22] = 0x00;

                //p_obj->device.SendBuff[23] = 0x00;

                

               

        // 문자열 길이

            // ASCII 교신시

                //p_obj->device.lenSendBuff = strlen(p_obj->device.SendBuff);

                

            // Binary 교신시

                p_obj->device.lenSendBuff = index;    //strlen(p_obj->device.SendBuff);

     

        }

        else //if(p_obj->flag_BinAsc == 1)     // 통신방식 0:Binary(Default), 1:ASCII

        {

            addr_ul = (unsigned long)(wordBuff->baseAddress + offsetAddr);

            lenWord_us = (unsigned short)lengthWord;

                    

            sprintf(p_obj->device.SendBuff, "%04X%02X%02X%04X%02X%04X%04X%04X%04XD*%06d%04X", 0x5000, 0x00, 0xFF, 0x03FF, 0x00, 0x0018, 0x0010, 0x0401, 0x0000, addr_ul, lenWord_us);

            p_obj->device.lenSendBuff = strlen(p_obj->device.SendBuff);

        }

 

이렇게 만들어서 ClientTCPWrite() 함수로 넘깁니다.

그럼, 좋은 하루 되세요.

 

List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 파일(특히 그림파일)을 올리실 때의 유의사항 운영자 2004-07-16 98967
1615 Tab 컨트롤러의 Label 변경 [1] sebi 2019-10-29 14
1614 utf-8 디코딩 관련하여 질문드립니다. cvi초보! 2019-07-11 29
1613 libMPSSE.dll 파일로드 에러 질문 입문 2019-06-12 31
1612 CVI 232통신 질문 드려요 [1] 길꾸리 2019-04-17 125
1611 pns 파일은 어떻게 확인할 수 있는지요? file [2] 쉬리0103 2018-11-09 106
1610 두개의 랜포트중 한개 사용방법? [2] 이중훈 2018-09-18 148
1609 rtsp 프로그램 해보신분 계신가요...? [3] 루키니아 2018-08-06 339
1608 데이터량이 많을경우... [2] 루키니아 2018-07-05 154
1607 한글 IME 강좌편 tree 컨트롤에서 에러 file [4] 개발닥발 2018-07-04 71
1606 LabWindows/CVI 2017에서 RC1109 에러가 나는데요... file [1] 허창원 2018-05-25 147
» TCP 통신 질문입니다. client로 binary데이터 전송방법 문의드립니다. [2] 토키토키 2018-03-26 1221
1604 예제 Tmer [1] 깔쌈신 2018-03-19 124
1603 activex control 설치 관련 땡글이 2018-03-16 324
1602 디버그 모드와 릴리즈 모드에 대해 질문드립니다. [1] cvi초보! 2018-01-02 138
1601 하위 폴더 안의 데이터 검색하는 방법 문의 드립니다. [1] 토키토키 2017-12-28 89
1600 C++ 이용 관련 문의드립니다. file [2] cvi초보! 2017-12-15 163
1599 그래프 그리는 것 관련 질문드립니다. [1] cvi초보! 2017-11-15 115
1598 히스토그램 [1] 김승준 2017-10-13 116
1597 'Error Code -94' 해결방법이... [2] 요돌이 2017-10-10 102
1596 cvi 에서 cmd창 없애는 방법 [2] 김승준 2017-09-11 138