線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3823
推到 Plurk!
推到 Facebook!

關於西門子PLC S7-300跟BCB連結問題

尚未結案
steve6912
一般會員


發表:5
回覆:14
積分:3
註冊:2006-07-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-07-12 16:30:18 IP:220.229.xxx.xxx 未訂閱
請問一下各位大大,不知道有沒有人用西門子S7-300這組PLC跟BCB做過連接,
因為我看講義,是用DELPHI做的,可是不管我怎麼試,就是讀不到他的值…
我現在只需要至少能讀到他裡面的值…不知道有沒有人可以幫我一下,感激不盡>"<
以下是我的程式碼…麻煩各位大大能給予指教或是跟我說一下可參考的資料…謝謝了^^
VARIANT* sa;
wchar_t *a=L"S7:[S7_LINK1|VFD1|CP_H1_1:]DB98,CHAR2,1";
long * sb;
long sc=100;
long sd;
sd=S7Data1->ReadVariable(StringToOleStr(a),s,sb,sc);
Edit1->Text=sd;
friendlly
高階會員


發表:22
回覆:144
積分:103
註冊:2003-04-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-07-26 13:27:13 IP:61.64.xxx.xxx 未訂閱

請問你勾通的介面是啥米??? com port??

steve6912
一般會員


發表:5
回覆:14
積分:3
註冊:2006-07-05

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-07-28 08:03:29 IP:220.229.xxx.xxx 未訂閱

是利用網路線,他也讓bcb可以建立一個s7data的元件…利用該元件的函式來連接…

而readvariable(*wchar_t,tagVARIANT*,long*,long)

則是這個元件的內建函式…

friendlly
高階會員


發表:22
回覆:144
積分:103
註冊:2003-04-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2006-07-28 09:06:20 IP:61.64.xxx.xxx 未訂閱

一般PLC連線(Rs232 / 網路)...都有各廠牌特定的potocol....

看你上面的程式..你並沒有傳送出要求回傳的命令......檢查看看...
===================引 用 文 章===================

是利用網路線,他也讓bcb可以建立一個s7data的元件…利用該元件的函式來連接…

而readvariable(*wchar_t,tagVARIANT*,long*,long)

則是這個元件的內建函式…

steve6912
一般會員


發表:5
回覆:14
積分:3
註冊:2006-07-05

發送簡訊給我
#5 引用回覆 回覆 發表時間:2006-07-31 10:27:19 IP:220.229.xxx.xxx 未訂閱

可是我這樣的寫法…是從delphi引用過來的…他在delphi下就可以執行…可以讀取到值…

但是移到了bcb就開始有問題…我不知道到底是哪裡出了問題@@
===================引 用 文 章===================

一般PLC連線(Rs232 / 網路)...都有各廠牌特定的potocol....

看你上面的程式..你並沒有傳送出要求回傳的命令......檢查看看...
===================引 用 文 章===================

是利用網路線,他也讓bcb可以建立一個s7data的元件…利用該元件的函式來連接…

而readvariable(*wchar_t,tagVARIANT*,long*,long)

則是這個元件的內建函式…

steve6912
一般會員


發表:5
回覆:14
積分:3
註冊:2006-07-05

發送簡訊給我
#6 引用回覆 回覆 發表時間:2006-07-31 10:29:44 IP:220.229.xxx.xxx 未訂閱

對了…忘了說…在delphi下還有一個是可寫的函式…那一段程式我把他轉成bcb之後…確定是可執行的…

而且值也有寫進去…可是就是讀不出來…所以我才煩惱很久…

friendlly
高階會員


發表:22
回覆:144
積分:103
註冊:2003-04-08

發送簡訊給我
#7 引用回覆 回覆 發表時間:2006-08-10 16:41:04 IP:61.64.xxx.xxx 未訂閱
建議你把你的code貼出來這樣比較清楚
===================引 用 文 章===================

對了…忘了說…在delphi下還有一個是可寫的函式…那一段程式我把他轉成bcb之後…確定是可執行的…

而且值也有寫進去…可是就是讀不出來…所以我才煩惱很久…

steve6912
一般會員


發表:5
回覆:14
積分:3
註冊:2006-07-05

發送簡訊給我
#8 引用回覆 回覆 發表時間:2006-08-11 08:14:51 IP:220.229.xxx.xxx 未訂閱

===================引 用 文 章===================
建議你把你的code貼出來這樣比較清楚
===================引 用 文 章===================

程式碼嗎…其實上面就是我的程式碼了…

不過我現在有更新過寫法~寫的部份…

這是寫的函式的需求…S7Data1->WriteVariable(wchar_t*,VARIANT,long,long)

TVariant value;
long state;
long result;
value=Edit2->Text;
result=S7Data1->WriteVariable(WideString("S7:[S7_LINK1|VFD1|CP_H1_1:]DB98,CHAR0,1"), value,0);

這個部份是作用正常的…result如果為0,代表連結正確,我有試過改他的路徑…會有錯誤訊息;

再來是讀的部份…函式需求為…S7Data1->ReadVariable(wchar_t*,VARIANT*,long*,long)

我不知道為什麼VARIANT跟long會多"*"…以下是他的程式部份…

TVariant value;
long state;
long result;
result=S7Data1->ReadVariable(WideString("S7:[S7_LINK1|VFD1|CP_H1_1:]DB98,CHAR0,1"), &value, &state, 100);
Label1->Caption=result;

在這個部份…不管我路徑對還錯…result永遠都是零…似乎是沒有動作的跡象…我也試過用VARIANT* value跟long* state來宣告…結果一模一樣…

有可能是bcb不支援這個元件嗎…可是如果不支援…為什麼write又可以呢…我在想是不是需要送一個要求plc回傳的指令…

可是我不知道該怎麼做…plc我是第一次摸…bcb我也是第一次摸…麻煩大家幫我一下…謝謝了^^

friendlly
高階會員


發表:22
回覆:144
積分:103
註冊:2003-04-08

發送簡訊給我
#9 引用回覆 回覆 發表時間:2006-08-14 09:31:17 IP:61.64.xxx.xxx 未訂閱

1.你手上應該有potocol的格式,查一下發送命令的部份(通常都是發送命令到PLC要求回傳).

2.你的程式碼只有片段..這樣很難確認你的問題出現在哪.何況我沒有PLC s7-300


===================引 用 文 章===================


程式碼嗎…其實上面就是我的程式碼了…

不過我現在有更新過寫法~寫的部份…

這是寫的函式的需求…S7Data1->WriteVariable(wchar_t*,VARIANT,long,long)

TVariant value;
long state;
long result;
value=Edit2->Text;
result=S7Data1->WriteVariable(WideString("S7:[S7_LINK1|VFD1|CP_H1_1:]DB98,CHAR0,1"), value,0);

這個部份是作用正常的…result如果為0,代表連結正確,我有試過改他的路徑…會有錯誤訊息;

再來是讀的部份…函式需求為…S7Data1->ReadVariable(wchar_t*,VARIANT*,long*,long)

我不知道為什麼VARIANT跟long會多"*"…以下是他的程式部份…

TVariant value;
long state;
long result;
result=S7Data1->ReadVariable(WideString("S7:[S7_LINK1|VFD1|CP_H1_1:]DB98,CHAR0,1"), &value, &state, 100);
Label1->Caption=result;

在這個部份…不管我路徑對還錯…result永遠都是零…似乎是沒有動作的跡象…我也試過用VARIANT* value跟long* state來宣告…結果一模一樣…

有可能是bcb不支援這個元件嗎…可是如果不支援…為什麼write又可以呢…我在想是不是需要送一個要求plc回傳的指令…

可是我不知道該怎麼做…plc我是第一次摸…bcb我也是第一次摸…麻煩大家幫我一下…謝謝了^^

steve6912
一般會員


發表:5
回覆:14
積分:3
註冊:2006-07-05

發送簡訊給我
#10 引用回覆 回覆 發表時間:2006-08-14 14:34:19 IP:220.229.xxx.xxx 未訂閱

所有的程式碼就只有這樣了…這只是做個測試…我不知道為什麼你會一直堅持我沒有貼完整的程式碼…

那請問一下你所謂的完整是包含哪些部份呢?

我現在在懷疑是元件本身的問題…我會再找看看的…謝謝你了…

===================引 用 文 章===================

1.你手上應該有potocol的格式,查一下發送命令的部份(通常都是發送命令到PLC要求回傳).

2.你的程式碼只有片段..這樣很難確認你的問題出現在哪.何況我沒有PLC s7-300


aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#11 引用回覆 回覆 發表時間:2006-08-15 17:11:01 IP:61.229.xxx.xxx 未訂閱

===================引 用 文 章===================

再來是讀的部份…函式需求為…S7Data1->ReadVariable(wchar_t*,VARIANT*,long*,long)

我不知道為什麼VARIANT跟long會多"*"…以下是他的程式部份…

TVariant value;
long state;
long result;
result=S7Data1->ReadVariable(WideString("S7:[S7_LINK1|VFD1|CP_H1_1:]DB98,CHAR0,1"), &value, &state, 100);
Label1->Caption=result;

在這個部份…不管我路徑對還錯…result永遠都是零…似乎是沒有動作的跡象…我也試過用VARIANT* value跟long* state來宣告…結果一模一樣…

我是不懂PLC等硬體上的東西,但純從程式碼上來看,我覺得有一些些的問題。即然你說在delphi上是可以跑的,那理論上在bcb上也沒問題。但是,從你的function來看,它像是個com元件,而delphi與bcb在實作com有很大的不同,bcb用的是ATL的實作方法,尤其在參數上在delphi用的是OleVariant,在BCB上則是TVariant。在此我提出幾個想法:
1/ 為何會多 * 呢? 因為com元件在作output時規定只能用指標,而你這個read function當然會把一些資料給"帶"回去,故需要傳址。
2/ 當com元件要return一個值的時候,其實也只是把其中的一個傳址指標再用return的方式傳出,所以我認為你所要的那個result應該是&state的值,所以還是請查value的值是否有變化,而非result上比較可靠
3/ VARIANT與TVariant與Variant三者是不同的型別,我記得沒錯的話,VARIANT是tagVARIANT的typedef。我想說的是,依我的實務經驗,無論它的參數是導引你哪種,你都傳入Variant這個型別會比較好。所以可以試著改如下:
Variant value;
並記得include

4/ 你提到「似乎是沒有動作的跡象」,那也只是似乎…我覺得該要查的是value與state的值的變化來決定…


希望有一點點的幫助!

------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
steve6912
一般會員


發表:5
回覆:14
積分:3
註冊:2006-07-05

發送簡訊給我
#12 引用回覆 回覆 發表時間:2006-08-16 08:45:47 IP:211.20.xxx.xxx 未訂閱

謝謝你的回覆…我會試看看的^^

有心得的話我會再po上來的…感謝你^^

系統時間:2024-04-27 9:22:07
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!