Q&A

  • 시리얼/이더넷 프로토콜변환기 이용 복수사용자가 한 장비를 감시할 수 있게 하려면요?
안녕하세요.

간만에 창문에 부딪쳐 흘러내리는 빗줄기를 감상하며
오늘 하루를 시작한 델파이 초보입니다.
비가 내리는 것을 보노라니 마음이 착~ 가라앉으면서 차분해지는것 같아 참 좋아요.

이제 감상은 그만하고, 궁금한거 여쭤봐야겠지요. ^^

제가 궁금~한 건요...  
막상 글로 표현하자니 무지 복잡해질것 같은데, 선배님들께서 복잡한 내용에 질려서(?) 아예 읽기를 포기하실까봐 지금 겁먹고 있습니다. ^^;
지루하시더라도 끝까지 읽어주세요.

자... 이제 시작합니다. 모두들 마음의 준비하세요...

제가 하려고 하는 프로그램 내용은요...

원래 시리얼통신만 지원하던 장비를 원격에서 감시토록 해달라는 사용자의 요구로 Ethernet/Serial Protocol Converter를 이용하여, 기존의 시리얼 지원 장비를 이더넷망에 접속하도록 하였습니다.
그리고 델파이의 기본소켓 ClientSocket을 사용하여 장비의 실시간 계측값을 읽어오고, 장비를 제어하는 프로그램을 작성하여 잘 연동하던 중에 문제가 발생하였습니다.
(참고로, Ethernet/Serial Protocol Converter의 운용모드는 사용자가 설정할수 있는데, 여러 가지 중에서 TCP Server로 설정하였습니다.)

사용자측에서 현재의 장비를 다른 곳에서도 감시할 수 있도록 해달라는 것입니다. 근데 왜 문제가 되냐구요?

비록 장비가 이더넷망에 연결되어 소켓통신을 하지만, 근본적으로는 시리얼 통신으로, 이미 한 사용자가 시리얼쪽을 점유(?)하면 다른 사용자가 그 장비에 접근할 수 없는거라고 생각하거든요.
(비전공자라 제 표현이 올바른지, 그리고 제가 아는 내용이 확실한지도 모르겠습니다. 만약, 잘못 알고 있다면 잘못 알고 있는 내용만이라도 가르쳐주세요....)

그러면, 시리얼기반의 장비를 Ethernet/Serial Protocol Converter를 이용하여 어떻게 복수의 사용자가 감시할 수 있게 할 수 있을까요?

현재는 최대 2명의 사용자라고 하긴 하는데, 사용자가 나중에 늘어날수 있는 것이고, 또 실제 운용하다보면 생각치 못한 문제가 발생할것 같아 프로그램설계 자체도 엄두가 나질 않습니다. (지금 몇주째 이렇게도 저렇게도 해보는데 번번히 실패입니다. T.T)

제가 현재 생각한 방법으로는,
(구현 가능할지 모르지만... 너무 황당하시더라도 비웃지말아주세요. 제발...)

(예) 홍길동이 A장비를 감시하고 있는데, 박지성도 A장비를 감시하려고 한다면, 장비에 접속하여 장비를 감시할 수 있는 우선권을 후발자에게 줘서,
한창 감시하고 있는 홍길동쪽에 다른 사용자가 접속하기를 원하니까,
프로그램을 종료하는 메세지(DISCONNECT)를 보내고 정상응답 메세지(DISCONNECT_OK)가 오면, 정상적으로 장비에 접속하여 감시할 수 있도록 하는 것입니다.

   홍길동                                                                           박지성
      |    '내가 접속할꺼니까 이제 접속끊어줘' (DISCONNECT)       |
      |  <----------------------------------------------------- |
      |      '알았어' (DISCONNECT_OK)                                      |
      |   ----------------------------------------------------->|
      |                                                                                     |
                                ...

프로그램 시작시에, 장비쪽에 telnet으로 접속해서 사용자수에 대한 정보를 읽어보고, 만약, 사용자수 = 0 이면, 바로 장비에 접속하여 감시하면 되고, 사용자수 > 0 이면, 위의 방법대로 후발자에게 권한을 주는 것입니다.

너무 복잡하죠...
(여기까지 읽기 많이 힘드셨죠. 읽어주셔서 감사드립니다.꾸~~벅.
조금만 더 참고 읽어주세요.)

위의 방법이 아니면,
무식하게 데이터를 보낼때마다 접속하여 데이터 보내고, 연결끊고... 다시 접속하여 데이터 보내고, 연결끊고.... 하는 식도 생각해봤는데 그런 방법이라면 차라리 프로그램을 포기하는데 낫다는 생각이 듭니다.

도대체 어떤 방법으로 이 문제를 해결할 수 있는건지 모르겠어요.
도저히 해결될 수 없는 문제인가요?

제가 전에 ClientSocket 사용하여 장비를 감시하는 프로그램은,
선배님들이 올려주신 소켓예제들과 질답란의 내용들을 문제가 생길때마다 교과서(?)삼아 실행시켜가면서 하나하나씩 해나갔습니다.(그때 참 재미있었어요. 가슴이 막 설레고..)

그때는 그래도 시간의 여유가 좀 있어서 하나 하나 해나가는 재미가 있었는데...
지금은 다음주초까지 해야하는데, 문제 해결 방법은 도저히 보이질 않고,
답답한 마음에 아침에 출근하자마자 그동안의 내용을 정리하듯 이렇게 질문하고 있습니다.

사실 델파이를 사용하면서 델파이 기능의 1%도 사용 못하고 있다고 생각하고 있습니다.
제겐 너무 아까운 툴이죠...

그래도 지금의 제가 이런 질문을 할 수 있기까지, 수많은 선배님들의 남모르는 고생과 눈물, 그리고 후배들에 대한 무조건적인 희생이 있었기 때문이라고 생각합니다.

비록 제 질문에 대한 답변이 없더라도, 끝까지 읽어주신 분들께 진심으로 감사드리오며, 마지막으로, 초보자들의 수많은 비슷한 질문과 집요한 답변요구에도 짜증내지않고 묵묵히 성심성의껏 봉사해주시는 선배님들께 진심으로 감사드립니다.

모두들 건강하시고 평안하세요.   @-&~~

p.s: 빗소리가 너무 좋아요.
      모두들 차한잔의 여유와 함께 좋은 하루되세요.
7  COMMENTS
  • Profile
    박의동 2002.08.22 03:13
    안녕하세요. 저는 시리얼/이더넷 프로토콜변환기 등을 만들고 있습니다.
    문제가 되고 있는 다중 접속은 일반적인 시리얼/이더넷 프로토콜변환기에서는 지원되지 않습니다. 왜냐하면, 시리얼 통신인 기본적으로 1:1 통신이기 때문이죠. 즉, 만약 이더넷쪽에 2개의 연결이 동시에 시리얼로 변환을 요구했을 때 시리얼로 제대로 보낼 방법이 없기때문입니다.
    사실 일반적인 시리얼/이더넷 프로토콜변환기의 가장 큰 문제점은 패킷구분이 되지 않는다는데 문제가 있습니다. 대부분의 시리얼 디바이스들은 일정시간 동안 전송이 없을 때 이벤트를 일으켜 그때까지 받은 패킷을 분석하는 방법을 많이 구사하는데 이더넷 통신의 경우 이 시간이 지켜지지 않는거죠. 예를 들면, 시리얼에서 '1234' '5678' 이라는 두개의 패킷을 시간차이를 두고 전송했을 때 TCP로 전송되는 것은 '12' '345678'이나 '12345678'등으로 두 패킷간의 시간차이는 유효하지 않습니다.
    이러한 일반적인 시리얼/이더넷 프로토콜변환기들이 가진 문제점 들을 해결하고자 해서 두가지 제품을 만들었는데요, 하나는 시간 차이를 계산해서 전송하는 방법을 써서 패킷통신을 완벽하게 구현하는 제품(단, 양측에 같은 자사제품을 사용해야만 합니다)과 이더넷쪽에 다중접속이 가능한 서버프로그램을 내장해서 시리얼과 이더넷 프로토콜을 아예 분리한 제품입니다. 이 제품은 이더넷쪽에 무한대의 (사실은 16대까지 ㅎㅎ) 접속을 허용하며, 표준프로토콜인
    MODBUS/TCP를 지원하고 시리얼쪽 프로토콜을 기본으로 사용자가 선택 가능하지만, 특이한 프로토콜인 경우 분석, 개발 탑재가 가능합니다.

    그런데 지금은 팔지 않습니다. 왜냐....망했거던요. 왜 망했냐...비싸니까요...
    아직까지 이러한 제품은 시장에서 본 적은 없습니다.
    더 자세한 자료가 필요하시면 이메일을 주셔도 됩니다.

  • Profile
    진성열 2002.07.19 22:41
    음 변환기를 통하여 읽어온 정보를 한 TCP서버가 가지고 있음 될꺼 같은데요.
    실제 TCP서버 안에 가상의 장비들을 놓고 관리..

  • Profile
    열린마음 2002.07.20 01:39
    안녕하세요.

    제 질문을 읽고 답변해 주셔서 진심으로 감사드립니다.

    좋은 하루되시고, 평안하시길 바랍니다.



  • Profile
    한만교 2002.07.19 21:09
    난해하지만 그렇게 어려운 일은 아니군요...
    어차피 원격감시장비가 서버로 동작중이라면...외부에서 접속하는 클라이언트에게 모두 자료를 던져주면 되겠네요...누가 우선순위라구 할것두 없구...아니면 최근에 접속한 클라이언트에게만 우선권을 주던가....
    서버에는 현재 연결돈 사용자들에게 메세지를 보낼수 있게 하는 메소드가 있잖아요...뭐 어려운 것두 없을거 같은데요...내가 넘 쉽게 생각하는 것인가...
    하여간...서버에 connection을 이용해서 연결돤 사용자들에게 데이터를 그냥 뿌려줘 버리면 되지 않을까하는 생각을 해 봅니다...





  • Profile
    열린마음 2002.07.19 22:39
    안녕하세요.
    우선 지루하고 복잡한 글을 읽어주시고 답변해주셔서 감사드립니다.

    저도 처음에 그런 생각으로 아주 쉽게 구현될줄 알았는데, 막상 테스트보니 그게 아니었습니다.

    한 사용자가 그 장비에 접속되어 있을때, 다른 사용자가 접속을 시도하면 ClientSocket의 Disconnect 이벤트가 발생합니다.

    제 질문이 복잡하고 이해하기 힘드셨으리라 생각됩니다.

    다시 말씀드리면, 시리얼/이더넷 프로토콜 변환기는 시리얼 포트만 지원이
    가능한 장비들을 Ethernet 망에서 원격 제어 및 데이터 송 수신이 가능하도록
    하는 장치일뿐이고, 시리얼신호를 단지 이더넷신호로 변환해주는 기능입니다.
    모드는 TCP_Server로 설정되었을지라도 우리가 보통 생각하는 서버의 의미는 아닌듯 합니다.

    지금 제가 생각하고 있는 상황에선 아무런 해결책이 없는건가요?
    선배님들의 관심과 사랑(?) 부탁드립니다.

    점심 맛있게 드세요.






  • Profile
    한원희 2002.07.19 23:41
    음... 제가 생각할 때는 채팅 서버와 비슷하게 작성하셔야 할 것 같습니다.
    실제 장비를 관리하는 TCP 관리 서버를 두고, 이 관리 서버만 장비에 직접
    접속을 유지하고, 장비를 모니터링하면서 장비에 관련된 정보를 유지하도록
    하는 겁니다.
    그리고, 클라이언트들은 장비에 대한 정보를 얻기 위해서 장비에 직접
    접속하는 것이 아니라, 이 관리 서버에 접속을 하고, 이 관리 서버에서
    현재 유지하고 있던 정보를 클라이언트에게 넘겨 줍니다.
    장비에 대한 정보를 받던중에, 클라이언트에서 장비에 특정 동작을 수행하게
    하기 위해서 어떤 명령을 보내게 되면, 관리 서버에서는 해당 명령을 큐에
    넣어 놓고, 장비의 모니터링이 끝난 후에, 큐에 있던 명령을 장비에 전송합니다.
    그리고, 그 결과를 모니터링하고, 접속된 클라이언트에 모두 전달해 주고...
    뭐 이런 식의 동작이 되겠죠...
    적고 보니, 이미 앞의 분들이 답변하신 내용과 크게 차이가 없는 것 같네요...

    이런 식으로 구현을 하면 되는데, 다른 분들이 짜 놓은 채팅 서버/클라이언트를
    참고 하시면 많은 도움이 되실 거라 생각 됩니다. 채팅 서버를 관리 서버라고
    생각하시고, 그 서버에 장비를 모니터링하고, 명령을 순차적으로 처리할 수
    있는 방법만 제공하신다면 원하는 기능을 구현하실 수 있으리라 여겨집니다.

    그럼, 즐코~~

  • Profile
    열린마음 2002.07.20 01:35
    안녕하세요.

    지금 이것 저것 시험해보느라 이제 답변을 보게 되었습니다.

    성의껏 답변해 주셔서 한원희님께 진심으로 감사드리오며,
    알려주신 방법대로 해보도록 하겠습니다.

    하루종일 비가 내리는데도 기분은 좋습니다.
    어제까지 이 일로 머리가 너무 아퍼서 밤에 퇴근후에도 두통과 어깨근육통에
    시달렸었거든요.

    오늘 비로 다시 시작하는 초심으로 되돌아가 정신을 가다듬고 다시 일을 시작
    할 수 있는 용기가 주어진것 같아요.

    한원희님도 좋은 하루되시고, 평안하시길 바랍니다.




    • 수서니
    • 2002.07.20 20:50
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 한원희
      2002.07.20 23:18
      물론, TfrmPrn 내부에서 자신을 생성한 폼을 알고 싶으신 것이겠죠? 그렇다면, Owner 속성을 이용하시...
    • 수서니
      2002.07.22 19:52
      저기.. 제가 초보라 아는게 없어서요....   if (Self.Owner<>nil) and (Self.Owner is...
    • 김용덕
    • 2002.07.20 20:23
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 홍성락
      2002.07.20 23:31
      hsr/////////////////////////////////////////////////////////// 맞습니다, 이상하게 마우스 왼쪽을 누...
    • 김용덕
      2002.07.22 20:11
    • 빠블로
    • 2002.07.20 20:09
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 임형호
      2002.07.20 20:24
      클라이언트를 일일이 설치하지 않으셔도 됩니다. BDE만 설치하셔도 접속가능하구요. BDE설치하기 싫으...
    • 깨구락지
      2002.07.20 22:37
      명령매뉴얼이 없다면 그야말로 맨땅에 헤딩이군요. 제작회사에 직접 알아보시는게 빠를것 같구요, 영수...
    • real21c
    • 2002.07.20 02:31
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 장희수
    • 2002.07.20 01:59
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 이경문
      2002.08.18 12:59
      MSDN을 보면 Setup API가 있습니다. 자기자신을 rewrite할 수도 있습니다. 리부팅하면 rewrite됩니다. ...
    • 질문맨~
      2002.07.20 20:05
      제가 쓰는 방법으로 설명드리자면여.. 일단 smart update를 위한 별도의 프로그램이 필요합니다. 그...
    • 이현철
      2002.07.20 19:56
      델코,델마당,델그룹 자료실,강좌란을 샅샅히 뒤져보세요.. 구현까지 완성한 것을 제가 많이 보았습니다..
    • 이추형
      2002.07.20 02:52
      UPGrade용 프로그램이 필요합니다. 실행프로그램에서 확인하여 자신을 ReWrite할수 있지만 쉬운 방법은 ...
    • 홍성락
      2002.07.20 02:16
      hsr//////////////////////////////////////////////////////////// 더 좋은 방법도 있겠죠, 스케일이나 ...
    • 델파이사랑
      2002.07.20 18:26
      감사합니다....좋은 답변이네여......(냉무)
    • 송영식
    • 2002.07.20 01:23
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 정형준
      2002.07.20 13:42
      제가 보기엔 아직 파일이 안만들어졌는데 읽으려고 해서 난 Error 같습니다. FileCreate를 하자마자 파...
    • 이추형
      2002.07.20 01:52
      I/O error시에는 try문을 함써보시는게 어떨지요 참고로 저같은 경우는 RichEdit를 사용합니다. RichEdit...
    • 김도형
      2002.07.20 02:04
      FileOpen을 하지 마시구 바루 AssignFile(f1, fName1);   위 부분부터 들어가면 될꺼 같...
    • 강신구
    • 2002.07.20 00:46
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이추형
      2002.07.20 02:58
      function TfrmTest.SQLUPLOAD : Boolean; // 파일을 Client 'c:data' directory에서 서버로 UPLOAD하는 Fu...
    • 강인규
      2002.07.20 05:00
      그냥 일반적인 기능을 생각하신다면 아웃룩바는 프리웨어도 많이 있는데요. =_= 자료실에서 outlook ...
    • 홍성락
      2002.07.20 01:41
      hsr/////////////////////////////////////////////////////// 홈페이지가 아니라 일반 델파이 프로그램에...
    • 김형수
      2002.07.20 02:43
      안녕하세요 . 제 생각엔 speedbutton 을 써서 property 의 flat 을 true로 설정해 주고, 각각에 이미지와 ...
    • 홍성락
      2002.07.20 03:37
      hsr////////////////////////////////////////////////////////// 많이 다듬어야 될건데요, 특히 화면 크...
    • 최용일
      2002.07.20 02:40
      안녕하세요. 최용일입니다. DrawText로 그리시면 정확한 영역의 크기를 알 수 있습니다... 아래와 같...
    • 델파이사랑
      2002.07.20 18:49
      좋은 답변 진심으로 감사드립니다. (냉무)
    • 손창호
    • 2002.07.20 00:21
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 서경환
      2002.07.20 00:52
      혹시 폼에 프로퍼티에 KeyPreview를 True로 안주어서 아닐까요. 혹시...
    • 신태영
    • 2002.07.20 00:16
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 서경환
      2002.07.20 00:49
      컴파일 하면 디렉토리를 지정하지 않은 이상 .dpr 파일이 있는 디렉토리에 생길걸요. ctrl + F9
    • 신연근
      2002.07.20 00:07
      이게 맞는지 모르겠네요 예전에 있던 자료 카피했났던건데..아무쪼록 잘 되길.. MEMO라고 데이터가 ...
    • 박의동
      2002.08.22 03:13
      안녕하세요. 저는 시리얼/이더넷 프로토콜변환기 등을 만들고 있습니다. 문제가 되고 있는 다중 접속은 일...
    • 진성열
      2002.07.19 22:41
      음 변환기를 통하여 읽어온 정보를 한 TCP서버가 가지고 있음 될꺼 같은데요. 실제 TCP서버 안에 가상의 ...
    • 열린마음
      2002.07.20 01:39
      안녕하세요. 제 질문을 읽고 답변해 주셔서 진심으로 감사드립니다. 좋은 하루되시고, 평안하시길 ...
    • 한만교
      2002.07.19 21:09
      난해하지만 그렇게 어려운 일은 아니군요... 어차피 원격감시장비가 서버로 동작중이라면...외부에서 접속...
    • 열린마음
      2002.07.19 22:39
      안녕하세요. 우선 지루하고 복잡한 글을 읽어주시고 답변해주셔서 감사드립니다. 저도 처음에 그런 생...
    • 한원희
      2002.07.19 23:41
      음... 제가 생각할 때는 채팅 서버와 비슷하게 작성하셔야 할 것 같습니다. 실제 장비를 관리하는 TCP 관...
    • 열린마음
      2002.07.20 01:35
      안녕하세요. 지금 이것 저것 시험해보느라 이제 답변을 보게 되었습니다. 성의껏 답변해 주셔서 한원...
    • 김상수
    • 2002.07.19 20:23
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 한원희
      2002.07.19 23:48
      ExtractFileDrive(Application.ExeName); 요렇게 하면 드라이브 명을 얻을 수 있습니다. Application.E...
    • 김상수
      2002.07.20 06:37
      고맙습니다... 유용하게 사용하도록 하겠습니다...
    • 최석기
      2002.07.19 22:45
      TSession에 GetAliasDriverName 메소드를 이용하시면 되겠네요.
    • 이추형
      2002.07.19 20:17
           Progressbar1.Position:=strtoint(E_CH1_1.Text);   도움말을 참...
    • 김수경
      2002.07.19 20:16
      Progressbar1.Position :=  IntToStr( E_CH1_1.Text );
    • 하기
      2002.07.19 20:15
      Progressbar1.Position := StrtoInt(E_CH1_1.Text); ...   ^^;
    • ㄴ ㅏ ㅁ ㅑ
      2002.07.19 20:28
      이렇게 했더니 아예 다운돼 버림니다.... 왜구럴까여....
    • 서경환
      2002.07.20 00:58
      Edit박스에는 숫자만 들어가야 되는거는 아시겠죠. 그리고 값이 Progressbar1의 프로퍼디 min~max까지가 ...