질문,답변

안녕하세요

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

미쯔비시 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
번호 제목 글쓴이 날짜 조회 수sort
공지 파일(특히 그림파일)을 올리실 때의 유의사항 운영자 2004-07-16 99241
1620 답변을 주실때 Comment 보다는 답글달기가 좋겠습니다 [4] 운영자 2004-05-20 31112
1619 [re] 예외처리는 어떤방식으로하나요..? [1] 허창원 2008-02-15 22997
1618 이 에러가 도대체 뭐죠? [2] MODSstar 2010-12-09 19038
1617 화면을 그대로 bmp로 저장하는 방법?? file [5] 민경기 2005-06-20 17840
1616 [re] 실수의 소수점 이하 둘째자리까지 자르기 file [2] 허창원 2005-11-22 13877
1615 Re: 그래프 y축을 3개이상 min,max값 변경하고 싶습니다. 야리싸내 2002-12-30 13309
1614 canvas나 graph 컨트롤에서 text 출력시 폰터 바꾸기 되나요? [1] 야리싸내 2011-05-24 13090
1613 TIMER 동작중에 타이틀바를 클릭하면 멈추는 것에 대하여 야리싸내 2010-01-08 12644
1612 [re] comwrt에 대해 간단한 질문좀 드릴게요 야리싸내 2010-07-01 12026
1611 [야리싸내님 부탁드립니다] 엑셀에 데이타 쓰는법에 대한 질문입니다 [2] catchbird 2011-11-10 11645
1610 [re] Timer()함수에서 이벤트가 일어나는 시간이 어떻게 대나요? 야리싸내 2010-07-12 11444
1609 [re] 없는 변수가 나옵니다 왜 그런지 좀 알려주세요. [1] 야리싸내 2010-07-01 11428
1608 디렉토리의 유무를 확인하고 없으면 만드는 방법이 있나요? 박형민 2010-07-15 11400
1607 [re] 테이블 컨트롤 질문이요~ file [1] 야리싸내 2010-05-03 11378
1606 [re] 자답임당~ [1] 정재용 2009-12-03 11325
1605 야라싸내님 감사합니다.^^ 정재용 2009-12-01 11273
1604 [re] TIMER 동작중에 타이틀바를 클릭하면 멈추는 것에 대하여 [1] 정재용 2010-01-08 11111
1603 GPIB 통신과 관련하여 문의드립니다 박형민 2010-07-22 11071
1602 NI-DAQ Analog input, digital input에 대해서 문의드려요.. 오주 2011-03-08 11038