안녕하세요.
간만에 창문에 부딪쳐 흘러내리는 빗줄기를 감상하며
오늘 하루를 시작한 델파이 초보입니다.
비가 내리는 것을 보노라니 마음이 착~ 가라앉으면서 차분해지는것 같아 참 좋아요.
이제 감상은 그만하고, 궁금한거 여쭤봐야겠지요. ^^
제가 궁금~한 건요...
막상 글로 표현하자니 무지 복잡해질것 같은데, 선배님들께서 복잡한 내용에 질려서(?) 아예 읽기를 포기하실까봐 지금 겁먹고 있습니다. ^^;
지루하시더라도 끝까지 읽어주세요.
자... 이제 시작합니다. 모두들 마음의 준비하세요...
제가 하려고 하는 프로그램 내용은요...
원래 시리얼통신만 지원하던 장비를 원격에서 감시토록 해달라는 사용자의 요구로 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: 빗소리가 너무 좋아요.
모두들 차한잔의 여유와 함께 좋은 하루되세요.
문제가 되고 있는 다중 접속은 일반적인 시리얼/이더넷 프로토콜변환기에서는 지원되지 않습니다. 왜냐하면, 시리얼 통신인 기본적으로 1:1 통신이기 때문이죠. 즉, 만약 이더넷쪽에 2개의 연결이 동시에 시리얼로 변환을 요구했을 때 시리얼로 제대로 보낼 방법이 없기때문입니다.
사실 일반적인 시리얼/이더넷 프로토콜변환기의 가장 큰 문제점은 패킷구분이 되지 않는다는데 문제가 있습니다. 대부분의 시리얼 디바이스들은 일정시간 동안 전송이 없을 때 이벤트를 일으켜 그때까지 받은 패킷을 분석하는 방법을 많이 구사하는데 이더넷 통신의 경우 이 시간이 지켜지지 않는거죠. 예를 들면, 시리얼에서 '1234' '5678' 이라는 두개의 패킷을 시간차이를 두고 전송했을 때 TCP로 전송되는 것은 '12' '345678'이나 '12345678'등으로 두 패킷간의 시간차이는 유효하지 않습니다.
이러한 일반적인 시리얼/이더넷 프로토콜변환기들이 가진 문제점 들을 해결하고자 해서 두가지 제품을 만들었는데요, 하나는 시간 차이를 계산해서 전송하는 방법을 써서 패킷통신을 완벽하게 구현하는 제품(단, 양측에 같은 자사제품을 사용해야만 합니다)과 이더넷쪽에 다중접속이 가능한 서버프로그램을 내장해서 시리얼과 이더넷 프로토콜을 아예 분리한 제품입니다. 이 제품은 이더넷쪽에 무한대의 (사실은 16대까지 ㅎㅎ) 접속을 허용하며, 표준프로토콜인
MODBUS/TCP를 지원하고 시리얼쪽 프로토콜을 기본으로 사용자가 선택 가능하지만, 특이한 프로토콜인 경우 분석, 개발 탑재가 가능합니다.
그런데 지금은 팔지 않습니다. 왜냐....망했거던요. 왜 망했냐...비싸니까요...
아직까지 이러한 제품은 시장에서 본 적은 없습니다.
더 자세한 자료가 필요하시면 이메일을 주셔도 됩니다.