조대현.Clau 님 감사 합니다.
한가지 요청 할것이 있습니다.
밑에 보면 CheckCRC() 함수를 적어 주셨는데 그 함수를 추가로 써 주실수 있습니까?
인터넷에 찾아보면 델파이용으로 한개 찾았는데 컴파일이 안 되더군요.
조대현.Clau 님이 쓰신 글 :
: modbus가 rtu와 ascii로 나뉘는데 소스를 보니 rtu 이겠네요.
: 이 기준으로 modbus랑 통신하려면 다음 단계가 필요합니다.
:
: 1. cport_rxchar에서 데이터 수신
:
: 2. 전역 변수 버퍼에 수신 char 저장
:
: 3. 버퍼에서 "정상적인 modbus rtu 프레임 " 검출
: -stx, dataccount, crc코드확인
:
: 4. 반복
:
: 2번 단계는 간단합니다.
:
procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
: var
: Str: String;
: begin
: ComPort.ReadStr(Str, Count);
: recv_data := recv_data + Str;
: end;
:
:
: 3번 단계에서 수신된 버퍼의 char 값을 보고 modbus rtu 프레임과 비교합니다.
: 테스트되지 않은 간략 코드이므로 참고만 하세요.
:
:
: i := 0;
: while i < length(recv_data)
: begin
: if recv_data[i] = $01 then
: if (recv_data[i + 1] = MyAddr) then
: if (recv_data[i + 2] = MyFunc) then
: if (CheckCRC(recv_data, i)) = true) then
: begin
: ExtractData(recv_data, i);
: break;
: end;
:
: i := i + 1;
: end;
:
: procedure TForm1.ExtractData(buf String; begin:integer);
: begin
: h1_temp := BufToHex(Copy(recv_data, 4 + begin, 1));
: h1_sum := HexToInt(copy(h1_temp,2 + begin,1)) * 16 + HexToInt(copy(h1_temp,3 + begin,1));
:
: Edit1.Text := IntToStr(h1_sum);
:
: Memo.Text := '';
: recv_data := '';
: recv_count := 0;
: end;
:
: 박진오 님이 쓰신 글 :
: : 안녕 하세요.
: :
: : 시리얼로 modbus 통신을 할려고 하는데 어떻게 해야 할지 고수님들 의견 듣고 싶습니다.
: :
: : 장비는 오토닉스 온도콘트롤러 입니다. TK4L-TR44 이고요. modbus 485 통신을 합니다.
: : 장비 국번은 '1'번이고 현재 온도값을 호출 해서 받는 것입니다.
: :
: : 응답을 하면 7개의 데이터가 수신이 되고 그 중에서 5번 값이 온도 값입니다.
: :
: : << 문제점 >
: : cport에서 한번에 전체값을 읽어 오지 못합니다.
: :
: : < 도움 사항 >
: : 7개의 데이터가 장비에서 출력이 되는데 일정 하게 7개를 받고 싶습니다.
: : 그래야지 5번째 값이 온도 값이니 변환을 할수 있으니까요?
: : modbus 통신이라서 start 값이 없어서 어떻게 일정 하게 받을 수 있는지 도움 부탁 드립니다.
: :
: : // 데이터 송신 함수
: : procedure TForm1.Button_SendClick(Sender: TObject);
: : var
: : Str: String;
: : begin
: : Str := chr(1) + chr(4) + chr(3) + chr(232) + chr(0) + chr(1) + chr(177) + chr(186);
: : ComPort.WriteStr(Str);
: : end;
: :
: : // 데이터 수신 함수
: : procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
: : var
: : Str: String;
: :
: : h1_temp : String;
: : h1_sum : Integer;
: : begin
: : ComPort.ReadStr(Str, Count);
: : recv_data := recv_data + Str;
: : inc(recv_count);
: : Edit_Data.Text := IntToStr(recv_count);
: :
: : if (recv_count = 7) then
: : begin
: : h1_temp := BufToHex(Copy(recv_data, 4, 1));
: : h1_sum := HexToInt(copy(h1_temp,2,1)) * 16 + HexToInt(copy(h1_temp,3,1));
: :
: : Edit1.Text := IntToStr(h1_sum);
: :
: : Memo.Text := '';
: : recv_data := '';
: : recv_count := 0;
: :
: : end;
: : end;