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

如何得知暫存器在電腦裡的位址?

答題得分者是:tcSweey
sea112001
一般會員


發表:4
回覆:6
積分:2
註冊:2007-10-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-03-28 16:24:43 IP:163.18.xxx.xxx 訂閱
各位前輩們好:
小弟現在想寫一個BCB的程式,這個程式是要透過RS232接收觸碰式人機介面所傳送值,但是人機介面他只認得要將值傳送到的目的地的位址,因此小弟想了解說在下面BCB程式裡紅色框的地方的暫存器,要如何知道這個暫存器在電腦裡的位址?
另外小弟想了解Modbus RTU的通訊格式,請問可以介紹相關的書籍嗎?
謝謝


void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
String Temp,str;
char inbuff[1024];
DWORD nBytesRead,dwEvent, dwError;
COMSTAT cs;
ClearCommError(hComm,&dwError,&cs);
if (cs.cbInQue > sizeof(inbuff))
{
PurgeComm(hComm, PURGE_RXCLEAR);
return;
}
ReadFile(hComm, inbuff,cs.cbInQue,&nBytesRead,NULL);
inbuff[cs.cbInQue]='\0';
str=inbuff;
if (str.IsEmpty())
{
mReceive->Text = 0;
Distance->Text = 0;
}
else
{
mReceive->Text = inbuff;
Distance->Text = mReceive->Text*0.491;
}
}
------
阿秤
tcSweey
一般會員


發表:7
回覆:19
積分:15
註冊:2005-01-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-03-28 19:40:02 IP:60.249.xxx.xxx 訂閱
如下:
unsigned char temp[100];
unsigned char *p;
p= &(temp[0]);
Edit1->Text=AnsiString( (unsigned int) p);

RTU 代表是以值來傳送,例如我要送 0x70 ,在傳送上是以 0x70 去傳送,基本上RTU 的data格式是8bit
外加start bit(1) Even or Odd or None stop bit ,例如 8 ,E ,1的格式為
start bit(1) Data bit(8) Even (2) stop bit(1) = 12 bit / 每單位資料

sea112001
一般會員


發表:4
回覆:6
積分:2
註冊:2007-10-30

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-03-29 08:34:31 IP:163.18.xxx.xxx 訂閱
感謝tcSweey大大的指導,我瞭解了,但還想請教一個問題,如果我想把暫存器指定在一個固定的記憶體位址的話,該如何做呢? 謝謝。
------
阿秤
tcSweey
一般會員


發表:7
回覆:19
積分:15
註冊:2005-01-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-03-31 09:46:25 IP:60.249.xxx.xxx 訂閱
你好,我不太清楚你的意思,如果你是指的是local 和 global  變數的話,我想就差在你宣告時的的地方,例如如果是宣告在程式的開頭地方,指的是global  變數,也就是大家都能用,如果是local 變數的話,你只需宣告在函式裡就只能此函式能用。另外可以請教一下你的用意在哪裡嗎?
sea112001
一般會員


發表:4
回覆:6
積分:2
註冊:2007-10-30

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-04-02 23:08:40 IP:163.18.xxx.xxx 訂閱
tcSweey大大您好:
謝謝您這麼的幫忙,我是要用在擷取人機介面的訊號,我用的人機介面是富士的UG330系列的觸碰式人機介面,我想在人機介面上畫一個地圖,然後只要在地圖上按一下,人機介面就會將該處的座標利用RS232傳至電腦,電腦在做後續的計算,但是人機介面傳輸方式是將人機介面裡的暫存器的值移動至電腦的記憶體裡,如:

MOV F0=F1

F0:電腦的記憶體位址
F1:人機介面的暫存器位址
而目前我的問題是要將座標的值從F1移到F0,我知道F1的位址,但是不知道F0的位址,也就是說不知道要將F1移到電腦的哪一個記憶體位址去存放,例如:
在BCB上宣告
int a;
在人機介面上
MOV a=F1
但人機介面他不知道a是甚麼,他只認的a在電腦裡的記憶體位址,因此要如何知道a的記憶體位址,且要能指定a的記憶體位址,而不是電腦自己分配的記憶體位址,這就是我的問題,謝謝。
------
阿秤
tcSweey
一般會員


發表:7
回覆:19
積分:15
註冊:2005-01-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-05-14 13:32:58 IP:60.249.xxx.xxx 訂閱
不好意思,這麼久才回,因為最近比較忙。想請教你一下,你所指的電腦應該是PC 吧,那樣的話跟你的人機介面應該沒有關係,一般而言,人機介面會傳送固定的格式,例如 :(表頭) 01(站號) 03(讀) 0100(Address) 0001(筆數) CRC(check sum) ,而若你要讀取人機上某個按鈕的狀態(0 表示 OFF 1表示 ON),如果此按鈕的位址是0100 的 bit3則你只需下上面所描述的字串,人機就會回應位址0100 的bit 0 ~ bit15 的值,格式為 01 03 0100 XXXX(值)  CRC ,此時你再讀取你所對應的記憶體區段,就可以了。大概是這樣。
sea112001
一般會員


發表:4
回覆:6
積分:2
註冊:2007-10-30

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-05-16 00:08:55 IP:59.113.xxx.xxx 訂閱
tcSweey大大謝謝您隔了這麼久還願以回答我的問題,您說的沒錯,人機介面有它傳輸資料的格式,因此只要按照人機介面的通訊格式即能做資料的傳送,而人機介面是以Modbus RTU的格式做資料的傳輸,但我目前的問題是如何以BCB建構可以擷取Modbus RTU資料的程式 ,希望是有相關的資料可以參考,另外目前我是以機械式的開關來代替人機介面的這個功能,因此整個系統還是可以運作,但是我還是希望能學到在BCB上建構可以擷取Modbus RTU資料的程式,希望tcSweey大大在有空閒的時候能給予指導,謝謝。
------
阿秤
tcSweey
一般會員


發表:7
回覆:19
積分:15
註冊:2005-01-04

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-05-19 12:39:34 IP:60.249.xxx.xxx 訂閱
你好,你說要以PC 取代人機,那請教一下你的被控制端是什麼,例如PLC、伺服器或變頻器。如果是伺服器或變頻器的話你可以大概看一下說明書,應該會有關於通訊的說明,如果是PLC的話,這可能比較麻煩了,因為我不太清楚PLC廠家是否會願意給你他們的通訊協定,你如果可以的話,接給我型號等等,我可以大概了解一下藥怎麼送,另外想請問你一下,你對PC的232 送收了解嗎?如果不清楚可以給我你的Mail,我可以寄個簡單的範例給你看看(通訊偵測)。
sea112001
一般會員


發表:4
回覆:6
積分:2
註冊:2007-10-30

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-05-30 00:30:35 IP:218.164.xxx.xxx 訂閱
tcSweey您好:
我的信箱是 mo_jom@yahoo.com.tw ,謝謝!
------
阿秤
系統時間:2017-10-20 0:39:21
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!