질문,답변

안녕하세요

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

미쯔비시 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 98987
1615 답변을 주실때 Comment 보다는 답글달기가 좋겠습니다 [4] 운영자 2004-05-20 31110
1614 [re] 예외처리는 어떤방식으로하나요..? [1] 허창원 2008-02-15 22986
1613 화면을 그대로 bmp로 저장하는 방법?? file [5] 민경기 2005-06-20 17836
1612 이 에러가 도대체 뭐죠? [2] MODSstar 2010-12-09 17738
1611 [re] 실수의 소수점 이하 둘째자리까지 자르기 file [2] 허창원 2005-11-22 13477
1610 canvas나 graph 컨트롤에서 text 출력시 폰터 바꾸기 되나요? [1] 야리싸내 2011-05-24 13079
1609 TIMER 동작중에 타이틀바를 클릭하면 멈추는 것에 대하여 야리싸내 2010-01-08 12644
1608 [re] comwrt에 대해 간단한 질문좀 드릴게요 야리싸내 2010-07-01 12020
1607 [야리싸내님 부탁드립니다] 엑셀에 데이타 쓰는법에 대한 질문입니다 [2] catchbird 2011-11-10 11636
1606 [re] Timer()함수에서 이벤트가 일어나는 시간이 어떻게 대나요? 야리싸내 2010-07-12 11437
1605 [re] 없는 변수가 나옵니다 왜 그런지 좀 알려주세요. [1] 야리싸내 2010-07-01 11427
1604 [re] 테이블 컨트롤 질문이요~ file [1] 야리싸내 2010-05-03 11373
1603 디렉토리의 유무를 확인하고 없으면 만드는 방법이 있나요? 박형민 2010-07-15 11314
1602 [re] 자답임당~ [1] 정재용 2009-12-03 11314
1601 야라싸내님 감사합니다.^^ 정재용 2009-12-01 11266
1600 [re] TIMER 동작중에 타이틀바를 클릭하면 멈추는 것에 대하여 [1] 정재용 2010-01-08 11107
1599 NI-DAQ Analog input, digital input에 대해서 문의드려요.. 오주 2011-03-08 11030
1598 야리는 이렇게...^^;;;;; [1] 야리싸내 2003-01-08 10951
1597 [re] TIMER 동작중에 타이틀바를 클릭하면 멈추는 것에 대하여 [1] 허창원 2010-01-08 10842