C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[72305] Re:나머지 바이트 채우기
박영목.월천 [gsbsoft] 4349 읽음    2015-01-29 01:37

잘 생각이 안나 다른 것 찾으려고 왔는데....

처음 QnA에 보이길래 클릭 PLC....  저도

약간 고생한 것이 있어서.. 답변을 막 적고 있는데;;;

먼저 답을 올리신 분이 있어서 안올리려고 하다가...

질문하신 분 글을 보니 프로그램도 PLC도 잘 모르시는 분 같아서...

그냥 올려드립니다. 도움이 되었으면  감사하겠습니다.


질문의 답은 아래의 것이고...

그 다음 함수는 제가 사용하는 PLC 전송 부분의 일부분...

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  //8개 char or unsigned char 배열

  char cSend[8+1];    //+1은 안전을 위해... overflow
  char cValue[5+1] = { 0x31, 0x32, 0x33, 0x34, 0x35, 00 };

  //먼저  위의 것을 초기화 해버리죠 그렇게 넣고자 하는 0x00 으로
  memset( cSend, 0x00, 9 );
              
  memcpy( cSend+3, cValue, 5 );  // 이 부분을 자동으로 해야겠지요 8-5 = 3 ㅋㅋㅋ

  AnsiString asHex = "";

  //확인하는 부분... 이런 것을 메모장 하나 띄워 보면서 하세요... 그래야 쉽게 됩니다
  int i=0;
  while( i<8 )
  {
    asHex += IntToHex( cSend[i],2 );
    i++;
  }

  ShowMessage( asHex );  //Memo1->Lines->Add( asHex );

}


void __fastcall TForm1::Button2Click(TObject *Sender)
{
  AnsiString asDevice = "M000";

  int n = asDevice.Length();

  if( 7<n )
    asDevice = asDevice.SubString( 1, 7 );

  n = asDevice.Length();

  int na = 8 - n;

  for(int i=0; i<na; i++)
    asDevice.Insert( "0", asDevice.Length()+1 );

  ShowMessage( asDevice );

  //제가 PLC에 전송하는 Data의 크기는 프로그램 실행시 크기가 결정됩니다.
  //그래서 sbuff명으로 char 배열 잡아 두고 사용합니다.
  //위에서 M000는  PLC의 전송할 주소(Address) 입니다. 이게 대부분 8개 입니다.
  //이 번지가 PLC 프로그래머와의 개념이 달라 항상 약간의 분재이 있음...
  //서로 웃으며 처리하지만... 일을 잘 처리하려면 사람과 친해져야 함
  //PLC쪽을 알아야 하는데 PLC하시는 분은 PLC만 압니다.
  //응용프로그래머는 둘 다 알아야 합니다. 처음 시작하면 PLC를 잘 모르기 때문에..
  //PLC 하시는 분에게 기본적인 PLC Ladder 프로그램 사용하는 법을 익혀야 합니다.
  //메모리에 전송되는 것 모니터링 하는 것 등....
  //그리고 메뉴얼을 보고 정확한 프로토콜을 보내야 정상적인 응답을 합니다.
  //조금이라도 틀리면 Error 입니다. 그런데 문제는 이 메뉴얼이라는 것이
  //아무리 잘 보아도 누락된 부분이 있더군요... 그것 때문에 몇일을 고민하고...
  //제일 확실한 방법은 간단한 실행파일과 소스가 있는 것을 구합니다.
  //PLC 회사 자료실에 있을 것입니다. 없으면 전화하세요...
  //약간 모르는척 정말 힘들어 죽겠다. 몇일 동안 이러고 있다 하면서...
  //그리고 그것으로 보내봅니다. 아 정말 Loader 프로그램에 값이 들어오면
  //이제 그 소스를 보고,,,와 메뉴얼을 동시에 참고하여  똑같이 프로토콜을 정의하면 됩니다.
  //물론 제공하는 소스는 최적화가 안되어 있더군요... VB가 많고...
  //자신의 업무에 맞게 고속으로 동작하도록 최적화 하시기 바랍니다.
  //여기서 고속이란 자신이 사용하는 포멧을 미리 정의해 두고
  //필요한 값만 바꾸어 넣는 것을 말한다. 물론 끝부분의 CHECKSUM은 보내기 직전에
  //계산하도록 해야겠지요... 이 CHECKSUM 부분이 안맞아도 동작 안합니다.

  //memcpy(sbuff+14, asDevice.c_str(), 8);
}
//---------------------------------------------------------------------------


제임스 님이 쓰신 글 :
: PC와 PLC소켓통신중입니다.  어떤 헥사값을 계산해서 5바이트 값을 얻었는데 8바이트로 처리를 해야되서
: 나머지 앞에 자리를 0x00으로 처리하여 8바이트를 얻고 싶습니다.
: 어떻게 해결할 수 있을까요? 계산값이 4바이트 이거나 3바이트 이여도 나머지 앞자리를 0x00으로 채워야 하는 상황입니다.
: 답변 부탁드리겠습니다. 헥사값 0x00은 NULL문자라 PLC장비에서는 입력 받을 수 없는 건가요?

+ -

관련 글 리스트
72303 나머지 바이트 채우기 제임스 3856 2015/01/28
72307     Re:나머지 바이트 채우기 제임스 3919 2015/01/29
72305     Re:나머지 바이트 채우기 박영목.월천 4349 2015/01/29
72304     Re:나머지 바이트 채우기 StarWagon 4384 2015/01/29
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.