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

modbus通訊..有時可以有時不可以

尚未結案
arty0117
一般會員


發表:1
回覆:1
積分:0
註冊:2009-03-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-03-27 16:21:15 IP:218.170.xxx.xxx 訂閱

各位大大:
我用modbus跟伺服器做通訊 ,可是我寫出來的程式有時候按可以通,有時候按又不能通。
麻煩大大指教。

[code cpp]
void __fastcall TForm1::BUF_SV_OFFClick(TObject *Sender)
{
DynamicArray ByteSend,;

Form1->ByteSend.Length=13;
Form1->ByteSend[0]=StrToInt("0x01");//局號
Form1->ByteSend[1]=StrToInt("0x10");//寫入
Form1->ByteSend[2]=StrToInt("0x00");//位址
Form1->ByteSend[3]=StrToInt("0x00");
Form1->ByteSend[4]=StrToInt("0x00");//記錄數
Form1->ByteSend[5]=StrToInt("0x02");
Form1->ByteSend[6]=StrToInt("0x04");//資料位元組數
Form1->ByteSend[7]=StrToInt("0x00");//數據
Form1->ByteSend[8]=StrToInt("0x00");
Form1->ByteSend[9]=StrToInt("0x00");
Form1->ByteSend[10]=StrToInt("0x01");//伺服器_on

//CRC檢查碼
int CRC=0xFFFF;
int Poly=0xA001;
int sft;
for(int dtn=0;dtn<(Form1->ByteSend.Length-2) ;dtn )
{
sft=0;
CRC=CRC^Form1->ByteSend[dtn];
while(sft < 8)
{
if(CRC%2 == 1)
{
CRC = CRC >> 1;
CRC=CRC^Poly;
sft ;
}else if(CRC%2 == 0)
{
CRC = CRC >> 1;
sft ;
}
}
}

Form1->ByteSend[11] =StrToInt("0x" IntToHex(CRC%6,2));//CRC檢查碼
Form1->ByteSend[12] =StrToInt("0x" IntToHex(CRC/256,2));//CRC檢查碼

bool T_EN=false;
T_EN=Form1->OutputByte(Form1->ByteSend);
if(T_EN==true){
Form1->BUF_SV_OFF->Visible=false;
Form1->BUF_SV_ON->Visible=true;
T_EN=false;
}

}

[/code]
foreman
高階會員


發表:3
回覆:124
積分:190
註冊:2004-09-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-03-29 22:08:05 IP:118.171.xxx.xxx 未訂閱
大大:
您的CRC運算不對

[code cpp]
int CRC=0xFFFF;
int Poly=0xA001;
int sft,j;
Byte c;
for(int dtn=0;dtn<(Form1->ByteSend.Length-2) ;dtn )
{
sft=0;
c=Form1->ByteSend[dtn];
while(sft < 8)
{
j=(CRC^c)&1;
c>>=1;
CRC>>=1;
if (j) CRC=CRC^Poly;
sft ;
}
}
Form1->ByteSend[11] =CRC&0xff;//CRC檢查碼
Form1->ByteSend[12] =CRC>>8;//CRC檢查碼
[/code]

編輯記錄
foreman 重新編輯於 2009-03-30 05:45:22, 註解 無‧
arty0117
一般會員


發表:1
回覆:1
積分:0
註冊:2009-03-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-03-30 11:49:42 IP:218.170.xxx.xxx 訂閱
foreman 大大您好: 我試過你貼的crc碼,不是這個問題,因為我是送的出去,伺服器是有收到,也有執行,但是按很多下才會成功,是不是會是comm的問是呢? [code cpp] 請在此區域輸入程式碼 bool __fastcall TRS232::OutputByte(const DynamicArray& ByteData) { DWORD lrc,SendNum; int i; byte ch; if(hComm==0) { ShowMessage("COM Port is not yet!"); return(false); } for(i=ByteData.Low;i<=ByteData.High;i ) { ch=ByteData[i]; WriteFile(hComm,&ch,1,&lrc,NULL); } return(true); } [/code]
李國維
高階會員


發表:42
回覆:287
積分:235
註冊:2003-02-07

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-03-31 01:16:28 IP:118.165.xxx.xxx 訂閱
會不會是com port在設定Baud Rate / Parity / Start bits / Stop bits上面的問題。在Serial Port通訊中,如果兩端的設定不一置,會產生無法預期的錯誤。
===================引 用 arty0117 文 章===================
foreman 大大您好: 我試過你貼的crc碼,不是這個問題,因為我是送的出去,伺服器是有收到,也有執行,但是按很多下才會成功,是不是會是comm的問是呢? [code cpp] 請在此區域輸入程式碼 bool __fastcall TRS232::OutputByte(const DynamicArray& ByteData) { DWORD lrc,SendNum; int i; byte ch; if(hComm==0) { ShowMessage("COM Port is not yet!"); return(false); } for(i=ByteData.Low;i<=ByteData.High;i ) { ch=ByteData[i]; WriteFile(hComm,&ch,1,&lrc,NULL); } return(true); } [/code]
hulihunter
一般會員


發表:0
回覆:1
積分:0
註冊:2002-11-25

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-06-04 01:16:01 IP:125.232.xxx.xxx 訂閱
小弟剛接觸RS232及Modbus,目前對RS232有初步的了解,但對Modbus仍是一知半解的,請問大大可否提供Modbus範例供小弟學習~~感激不盡(小弟已扒過站內的文章了)
系統時間:2017-12-14 12:16:51
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!