|
잘 생각이 안나 다른 것 찾으려고 왔는데....
처음 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장비에서는 입력 받을 수 없는 건가요?
|