232통신으로 받은 값들을 타이머를 이용하여 TChart에 FastLineSeries로
그리려고 합니다.
그런데 그래프의 X축값을 타이머의 주기와 경과시간으로 쓸려고 하는데 어찌해야 하나요?
Timer의 Interval의 20ms로 줘서 20ms마다 232로 수신된 데이터를 그래프에 그릴려고 합니다.
제가 해본건
var Voltage_F,Current_F,Speed_F : Single;
//232로 받은 데이터들을 integer로 바꿔서 연산식을 거쳐 나온 값을 저장하는 변수
TimeValue : integer;
procedure TfrmMain.Timer1Timer(Sender: TObject);
begin
TimeValue := TimeValue + Timer1.Interval;
DrawGraph;
end;
procedure TfrmMain.DrawGraph;
begin
if Timer1.Enabled = True then begin
Chart1.Series[0].AddXY(TimeValue,Voltage_F);
Chart1.Series[1].AddXY(TimeValue,Current_F);
Chart1.Series[2].AddXY(TimeValue,Speed);
end;
end;
procedure TfrmMain.btnOpenClick(Sender: TObject);
begin
Chart1.Series[0].Clear;
Chart1.Series[1].Clear;
Chart1.Series[2].Clear;
Timer1.Enabled := True;
TimeValue :=0;
end;
근데 X축을 Timer의 시간으로 잡는건 어떻게 하는건지...
20ms마다 그래프를 그리고 X축의 MAX 값은 5초로 해야 하는데요...
<!--CodeS-->
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, TeEngine, Series, TeeProcs, Chart, Math, StdCtrls,
dxfLabel;
type
TForm1 = class(TForm)
Chart1: TChart;
Series1: TFastLineSeries;
Timer1: TTimer;
Panel1: TPanel;
btStart: TButton;
btPause: TButton;
pnTime: TPanel;
dxfTimView: TdxfLabel;
procedure Timer1Timer(Sender: TObject);
procedure btStartClick(Sender: TObject);
procedure btPauseClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
vCheckCnt : Integer; // 제한카운트(그래프에 표시될 자료의 갯수) = 그래프의 X축 범위 div 타이머의 주기
vRealCnt : Integer; // 타이머 체크 카운트, 제한카운트에 도달하면 증가하지 않고,
// 첫번째 자료를 지운 후, 나머지 모든 자료의 X값을 1씩 앞으로 이동한 다음,
// 그래프의 마지막에 자료를 추가한다.
vStartTime : TDateTime; // 그래프 시작 시간
procedure InitChart; // 그래프 그리기 시작하는 프로시저
end;
var
Form1: TForm1;
const
TimerInterval = 20; // 타이머의 주기 = 밀리세컨드
GraphRange = 5000; // 그래프의 X축 범위 = 세컨드 * 1000
implementation
{$R *.dfm}
procedure TForm1.InitChart;
begin
Timer1.Enabled := False; // 타이머 정지
vRealCnt := 0; // 타이머 체크 카운트 초기화
vCheckCnt := GraphRange div TimerInterval; // 제한 카운트 계산
vStartTime := Now; // 그래프 시작시간 저장
Timer1.Interval := TimerInterval; // 타이머 주기 설정
dxfTimView.Caption := ''; // 시간표시 라벨 초기화
Chart1.Series[0].Clear; // 그래프 초기화
Chart1.BottomAxis.Minimum := 0; // 그래프 X축 최소값 초기화
Chart1.BottomAxis.Maximum := vCheckCnt; // 그래프 X축 최대값 초기화
Timer1.Enabled := True; // 타이머 시작
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
i : integer;
begin
if (vRealCnt = vCheckCnt) then // 제한카운트에 도달
begin
Chart1.Series[0].Delete(0); // 그래프의 첫번째 자료 삭제
for i := 0 to vCheckCnt - 2 do // 나머지 자료의 X값을 1씩 감소
begin
Chart1.Series[0].XValue[i] := i-1;
end;
end;
// 그래프에 자료 추가 - 타이머 체크 카운트가 X값임.
Chart1.Series[0].AddXY(vRealCnt, sqrt(RandomRange(-10, 10) + 100), FormatDateTime('HH:MM:SS.ZZZ', Now - vStartTime));
// 상단 타이틀에 시간 표시
dxfTimView.Caption := FormatDateTime('HH:MM:SS.ZZZ', Now - vStartTime);
// 제한카운트에 도달하지 않았으면 타이머 체크 카운트 증가
if (vRealCnt < vCheckCnt) then inc(vRealCnt);
end;
procedure TForm1.btStartClick(Sender: TObject);
begin
InitChart; // 그래프 그리기 시작
end;
procedure TForm1.btPauseClick(Sender: TObject);
begin
Timer1.Enabled := False; // 타이머 정지
end;
end.
<!--CodeE-->