全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3211
推到 Plurk!
推到 Facebook!

用BCB連歐姆龍的PLC怎麼下指令就是不會動

答題得分者是:pedro
chang1981
一般會員


發表:31
回覆:28
積分:11
註冊:2008-09-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-12-16 20:25:32 IP:61.230.xxx.xxx 訂閱
各位前輩好~ 小弟最近寫了一個BCB程式,
希望能跟歐姆龍的CQM1系列PLC溝通,
該系列PLC的指令格式為
@ | 機台號碼 | head code | (要下的relay) | FCS |* | CR |

小弟手邊有一支同事用VB寫的測試程式可以成功連結
最後送出去的地方如下
Form1.MSComm1.Output = SXD$ Chr$(13)
其中SXD$跟我用BCB下的指令一模一樣,假設都是 @00WR0036000141*
而我的BCB也是使用MSComm1元件,參數的設定都檢查過跟PLC一致

問題來了.... 我實在是不知道C 要怎樣表現最後這個CR (VB-->Chr$(13))
嘗試過很多方式如
@00WR0036000141*\r
@00WR0036000141*\13
@00WR0036000141*\0xd
@00WR0036000141*\\0xd
PLC就是不理我(我另外一邊有開PLC程式軟體監控36號ch是否有被寫入)
只好上來向各位前輩求救~!!!!

請問各位前輩我最後這個送給MSComm1.Output的字串到底應該寫成怎樣呢??
感謝!!!!!!

pedro
尊榮會員


發表:152
回覆:1177
積分:865
註冊:2002-06-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-12-16 22:44:53 IP:59.112.xxx.xxx 未訂閱
我想可能您的指令格式有問題,或是鮑率協定設錯
我在2003年曾用delphi開發類似的專案
當時我有寫一支測試工具可用,應該可確定PC-->PLC指令是否接受
http://delphi.ktop.com.tw/download.php?download=upload/4947bccf53ef3_ComExample.exe
目前我已經很久沒碰此領域,沒有環境可測,而且很久沒有用BCB的語法,
或許有熱心人士願意幫你轉譯BCB的語法,
提供這核心的部份給您參考
我使用CPort這個元件組2.64版

[code delphi]
// 9600:e,7,2 @00RD01000002*#13
procedure WriteCommand(cmd:string);
begin
cmd:=MakeFCS(cmd);
FPortDevice.WriteStr(cmd #13);
end;

function MakeFcs(cmd: string): string;
var
l: Integer;
q: Byte;
star: Char;
lengs: Integer;
i: Integer;
fcsd: string;
begin
l:=Length(cmd);
star:=cmd[l];
lengs:=l-1;
q:=0;
for i:=1 to lengs do
q:=ord(cmd[i]) xor q;
fcsd:=IntToHex(q,2);
if length(fcsd)=1 then fcsd:='0' fcsd;
delete(cmd,l,1);
Result:=cmd fcsd '*';
end;

procedure WriteCh(addr:Integer;value:WORD);

const
cmd='@00WR0100F000*';
var
send:string;
address:string;
hex:string;

begin
if assigned(FPortDevice) then
if FPortDevice.Connected then
begin
FBusy:=True;
FbGetIt:=False;
FResponseLength:=8;
FCommandType:=ctWriteCh;
FResponseMsg:='';
// if addr>255 then exit;
send:=cmd;
FAddr:=Addr;
address:=format('%0.4d',[addr]);
send[6]:=address[1];
send[7]:=address[2];
send[8]:=address[3];
send[9]:=address[4];
hex:=IntToHex(value,4);
send[10]:=hex[1];
send[11]:=hex[2];
send[12]:=hex[3];
send[13]:=hex[4];
WriteCommand(send);
FAddr:=Addr;
end;
end;

[/code]

===================引 用 chang1981 文 章===================
各位前輩好~ 小弟最近寫了一個BCB程式,
希望能跟歐姆龍的CQM1系列PLC溝通,
該系列PLC的指令格式為
@ | 機台號碼 | head code | (要下的relay) | FCS |* | CR |

小弟手邊有一支同事用VB寫的測試程式可以成功連結
最後送出去的地方如下
Form1.MSComm1.Output = SXD$ Chr$(13)
其中SXD$跟我用BCB下的指令一模一樣,假設都是 @00WR0036000141*
而我的BCB也是使用MSComm1元件,參數的設定都檢查過跟PLC一致

問題來了.... 我實在是不知道C 要怎樣表現最後這個CR (VB-->Chr$(13))
嘗試過很多方式如
@00WR0036000141*\r
@00WR0036000141*\13
@00WR0036000141*\0xd
@00WR0036000141*\\0xd
PLC就是不理我(我另外一邊有開PLC程式軟體監控36號ch是否有被寫入)
只好上來向各位前輩求救~!!!!

請問各位前輩我最後這個送給MSComm1.Output的字串到底應該寫成怎樣呢??
感謝!!!!!!


chang1981
一般會員


發表:31
回覆:28
積分:11
註冊:2008-09-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-12-25 16:08:28 IP:61.230.xxx.xxx 訂閱
感謝P大的指導~ 小弟已經找到解決的辦法

正確的整條指令應該寫成

@00WR0036000141*\r

且存成String格式, 並送進PLC, 就可以順利讓PLC動做了
過去我是用 char*來存
我想這樣可能只送了第一個字母進去吧 > < ~
謝謝P大

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