SPCOMM接收資料的問題 |
尚未結案
|
zxy666666
中階會員 發表:108 回覆:150 積分:86 註冊:2005-01-14 發送簡訊給我 |
大家好!
我用SPCOMM元件與PLC通訊.現有碰到問題,還請各位大大耐心幫忙看一下代碼,謝謝:
class="code">
var
fmMain: TfmMain;
viewstring: string;
rbuf, sbuf: array[0..22] of byte;
sTest : Boolean ; procedure TfmMain.FormCreate(Sender: TObject);
begin
sTest := False ;
end; procedure TfmMain.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
i,p: integer;
a1,b1,a2,b2,a3,b3,a4,b4,a5,b5,a6,b6 : array[1..8] of string ;
sWy1,sWd1,sWy2,sWd2,sWy3,sWd3,sWy4,sWd4,sWy5,sWd5,sWy6,sWd6 :string;
begin
viewstring:='';
move(buffer^,rbuf,bufferlength); //接受buffer中的位元組
for i:=0 to bufferlength-1 do
viewstring:=viewstring inttohex(rbuf[i],2) ' '; //接收到的所有資料集合
//****************第一組位移,溫度*********************
if not(sTest) then
begin
p := 19 ; //第一組 位移
sWy1 := '';
for i := 1 to 8 do
begin
a1[i] := midbstr(viewstring,p,2) ;
p := p 3 ;
b1[i] := Char(StrToInt('$' a1[i]));
sWy1 := sWy1 b1[i] ;
end;
sWy1 := midbstr(sWy1,1,4) '.' rightstr(sWy1,4); //將接收的位移8位,加4位小數 p := 43 ; //第一組 溫度
sWd1 := '';
for i := 1 to 8 do
begin
a1[i] := midbstr(viewstring,p,2) ;
p := p 3 ;
b1[i] := Char(StrToInt('$' a1[i]));
sWd1 := sWd1 b1[i] ;
end;
sWd1 := midbstr(sWd1,1,7) '.' rightstr(sWd1,1); //將接收的溫度8位,加一位小數
iSSAg1.Value := strtofloat(sWy1) ; // 第一組位移
iSSAg2.Value := strtofloat(sWd1); // 第一組溫度
Savedata; // 存位移,溫度資料
end ; if (iSSAg1.Value >=1) then //當位移值大於1時,結束測試
begin
sTest := true ;
Memo1.Lines.Add('第一組測試完成') ;
end; //****************第二組位移,溫度*********************
...
...
...
//****************第六組位移,溫度********************* end; procedure TfmMain.SaveData; //接收PLC的資料存資料檔
var
i : Integer ;
iWd,iWy : Real ; //溫度、位移
begin
iWy := iSSAg1.Value ;
iWd := iSSAg2.Value ;
with Query1 do
begin
Close;
SQL.Clear;
SQL.Add('INSERT INTO Test (Wd,Wy) VALUES (:Wd,:Wy)') ;
ParamByName('Wd').AsFloat := iWd ;
ParamByName('Wy').AsFloat := iWy ;
ExecSQL ;
end;
end;
發表人 - zxy666666 於 2005/04/09 10:51:58
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
1.您可以用一個 TMemo 元件將 sTest 為 True 時的各相關變數記錄下來,
然後再來查為什麼.
2.會不會處理不過來或丟失資料, 您可以實際測一下啊! 外人沒辦法猜測的
3.TiThreadTimers 元件是用來做什麼的?
4.Query1 的 SQL 可以在 design-time 就設定好, 然後將 Prepared 設為 True
執行時只要賦了 Parameter 值就好了(另外, Query1.Close 這行也可以不要) --
分擔可以輕省, 分享帶來喜樂!
|
zxy666666
中階會員 發表:108 回覆:150 積分:86 註冊:2005-01-14 發送簡訊給我 |
|
mephise
高階會員 發表:4 回覆:149 積分:205 註冊:2004-02-09 發送簡訊給我 |
|
zxy666666
中階會員 發表:108 回覆:150 積分:86 註冊:2005-01-14 發送簡訊給我 |
|
zxy666666
中階會員 發表:108 回覆:150 積分:86 註冊:2005-01-14 發送簡訊給我 |
hagar大哥好:
又來麻煩你了,想請問一下:
procedure TForm1.Button1Click(Sender: TObject); begin //比如說設計時期 Query1.SQL.Text:='Select * From test where (TestDate =:TestDate ) and (Zb = :Zb)' Query1.Prepared := true ; //請問這句寫在這個位置對嗎?(不知道什麼意思,測試了一下加不加這行看不出來有什麼區別啊?) Query1.ParamByName('TestDate').AsDate := strtoDate('2005/04/16') ; Query1.ParamByName('Zb').AsString := '1' ; Query1.close; Query1.Open; end; |
whyzn
中階會員 發表:46 回覆:149 積分:54 註冊:2002-06-16 發送簡訊給我 |
Query1.close; //比如說設計時期 Query1.SQL.Text:='Select * From test where (TestDate =:TestDate ) and (Zb = :Zb)'
Query1.ParamByName('TestDate').AsDate := strtoDate('2005/04/16') ;
Query1.ParamByName('Zb').AsString := '1' ; Query1.Prepare;
Query1.Open; ●○○○○○●○○○○○●
竹密不妨水過,山高無礙雲飛 發表人 - whyzn 於 2005/04/18 18:38:35
------
●○○○○○●○○○○○● 竹密不妨水過,山高無礙雲飛 |
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |