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
[23658] Re:[Q] 어씽크 프로 하고 PLC해보신분 ??
김정모 [jeongmo] 1000 읽음    2003-01-15 02:30
님의 예상이 적중하셨습니다.
님의 컴퓨터보다 PLC의 작업 속도는 현저하게 느립니다.
저도 비슷한 경험을 한적이 있는데 PLC뿐만 아니라 어떠한 통신 프로그램에서도 마찬가지 입니다.
받는쪽 생각 안하시고 죽어라 데이터를 날리시면(?) 받는쪽은 허걱대기 마련이죠
님이 전략을 바꾸기로 하신 방법이 제일 좋은 방법입니다. Response를 기다렸다가
확인 사살하신 후에 데이터를 날리시기 바랍니다.
문제는 프로그램이 지저분해지는데
for문에서 Response가 왔는지 계속 검사하면서 보낼면 아무래도 Packet갯수가 많으면
프로그램이 잠시 뻣는것처럼 보이거나 느리다는 느낌을 지울수가 없으실 껍니다.
제 경험으로는 Thread를 사용하는 방법을 활용하시는게 좋을듯 합니다.
직접 Port에 쏘지 마시고 Thread에 버퍼를 만드시고 데이터를 그곳에 넣는 것입니다.
그리고 Thread가 계속 돌고 있으면 CPU점유율이 이빠이(이런단어 쓰면 안되는데. ^^) 되니까
이벤트 하나 만드신 다음에 WaitForSingleObject로 기다리시고 데이터를 써 넣는 곳에서
데이터를 버퍼에 채워 넣으시고 SendMessage 하시면 CPU점유율도 내려가고 좋습니다.
물론 Response받는곳에서도 SendMessage를 날리셔야 됩니다.
Response를 받으면 쓰레드에게 보낼 Packet이 있으면 보내달라는 요청이겠죠..
Thread문제는 님도 거론 하셨는데 전 Async Pro 를 사용해보지 않아서
모르겠지만 구지 동적으로 할당이 안되면
Component 올려놓의고 Thread에는 그냥 Pointer만 가져다 놓으세요
그리고 Pointer에 Component를 대입하시면 그만이죠 ^^
성공하시길 빕니다. 즐프하세요..



왕대박 님이 쓰신 글 :
: 안녕하세요. 꾸벅~~
: 처음으로 Async Pro 4.0을 사용해서 PLC와 시리얼 통신프로그램을 만들려고 합니다.
: 헌데 문제가 생겼습니다... --;;
:
: g_Packet의 갯수가 10개이하에서는 문제없이 DataPacket이 자료를 수집해오는데,
: g_Packet의 갯수가 30개로 늘어나면서 2-3개의 Response만 있고 감감 무소식입니다.
:
: 원인을 분석해보니..
: PLC가 for문을 통해서 들어오는 계속되는 g_Packet 데이터를 감당하지 못하고,
: 쌩까~~ 버리는 현상 같습니다. -___-;;;  아마도...
: 즉, 1st 데이터를 보내고, Response가 들어오는 것을 기다렸다가,
: 2st데이터를 보내는 전략으로 바꿔줘야 할 것 같아서,
:
: TApdComport용 Thread1 과  TApdDataPackt용 Thread2 를 별도로 돌려서
: WaitForSingleObject로 끝내버릴려고 했는데...
: 그게 잘 않되더군요.(TApdDataPackt가 동적으로 생성되지않음.) 결국... 실폐.......
:
: 어떻게 하면 될까요?
: 사소한 것이라도 좋으니 힌트라도 주시면 감사하겠습니다.
:
:
: 대략의   Source입니다.
: //프로토콜 선언..
: AnsiString g_Packet[] =
: {
:   "00RSS0106%MW008",
:   "00RSS0106%MW018",
:    ......
: }
:
: //데이터 요청하기~
: void __fastcall TForm1::Button1Click(TObject *Sender)
: {
:     AnsiString packet;
:     for(int i = 0; i < PacketCount ; i++)
:     {
:        packet = Char(5);
:        packet += asData;
:        packet += Char(4);
:
:        if(ComPort1->OutBuffFree >= packet.Length())
:           ComPort1->PutString(packet);
:     }
: }
:
: // DataPacket으로 받기
: void __fastcall TForm1::DataPacket1StringPacket(TObject *Sender,
:       AnsiString Data)
: {
:     Memo1->Lines->Add(Parsing(Data, 4));
: }
:

+ -

관련 글 리스트
23657 [Q] 어씽크 프로 하고 PLC해보신분 ?? 왕대박 807 2003/01/14
23658     Re:[Q] 어씽크 프로 하고 PLC해보신분 ?? 김정모 1000 2003/01/15
23661         Re:Re:[Q] 어씽크 프로 하고 PLC해보신분 ?? 왕대박 663 2003/01/15
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.