|
|||||||||||
| 技術交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng) 驅動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
Modbus PC機軟件難題:串口RTS定時無法精確控制 |
| 作者:ztb 欄目:通信技術 |
我是使用VB編程的新手,用了MsComm控件也試驗了PComm控件但是對于時間的控制都低于10mS.而RTS用于RS485的方向控制不能準確定時就會導致封閉下位機回答的數(shù)據(jù).那位有好辦法望不吝賜教! * - 本貼最后修改時間:2007-3-23 10:06:43 修改者:ztb |
| 2樓: | >>參與討論 |
| 作者: chunyang 于 2007/3/23 11:38:00 發(fā)布:
不能用RTS做方向控制 外接232-485轉換器就可以了,自己做的話用個MCU實現(xiàn),也極簡單,PC與MCU交互,MCU再控制485即可。 |
|
| 3樓: | >>參與討論 |
| 作者: ztb 于 2007/3/23 15:03:00 發(fā)布:
難道就沒有直接控制的方法了? 謝謝您的回答.我也曾經(jīng)想到過這個方法,它可以得到最高性能!只是成本太高了.這個方法是萬不得已的方法.難道就沒有直接控制的方法了?有許多廠家做的Modbus通訊軟件難道都需要外掛一個單片機? |
|
| 4樓: | >>參與討論 |
| 作者: chunyang 于 2007/3/25 13:33:00 發(fā)布:
成本高嗎? 幾塊錢就搞定的事! |
|
| 5樓: | >>參與討論 |
| 作者: ztb 于 2007/3/26 15:18:00 發(fā)布:
謝謝!是否可以提供您的方案所使用的器件列表,我核算一下 |
|
| 6樓: | >>參與討論 |
| 作者: daguang72 于 2007/3/26 15:23:00 發(fā)布:
必須通過自動轉換技術 我有嵌入式UART轉RS-485轉換器,歡迎你和我聯(lián)系
|
|
| 7樓: | >>參與討論 |
| 作者: chunyang 于 2007/3/26 18:15:00 發(fā)布:
在原基礎上增加一兩片IC就可搞定 一片232接口芯片,用于與PC串口連接,一片485接口芯片,這兩片IC不是額外的,不用這類方案也必須,直接轉除這兩片IC外也得有其它邏輯IC或晶體管。真正增加成本的是一片MCU和一片模擬開關或數(shù)據(jù)分配器/選擇器之類的邏輯芯片,用于選擇MCU的串口通路,MCU用任何帶串口的型號即可,如51、AVR、PIC、68HC08系列等都行,二者價格之和是6元,再考慮PCB、人工等,自己做10塊錢足矣。 * - 本貼最后修改時間:2007-3-26 18:17:11 修改者:chunyang |
|
| 8樓: | >>參與討論 |
| 作者: ztb 于 2007/3/26 21:05:00 發(fā)布:
如果有MCU和串口參加進來那方案不確定性就更大了! 例如: 1.僅僅用一路串口,識別PC發(fā)出的數(shù)據(jù)控制485的方向.因為Windows最不擅長控制RTS了.這樣做還是不能使得Windows的通訊效率與下面的單片機匹配.因為我看到用VB執(zhí)行串口的收發(fā).兩次收發(fā)的間隔幾乎沒有辦法小于50mS(無論速率多快). 2.用兩路串口.作協(xié)議翻譯.大多數(shù)事情又這個MCU來做.與Windows的通訊使用更適合VB處理的大數(shù)據(jù)包格式.這樣就有通訊的最大效率.但是復雜程度增加很多,并且會喪失通用行.成本就增加的更多了! 我這里死認VB也主要是為用戶著想.畢竟更多的應用程序要他們來完成嘛. 是不是我把問題復雜化了? |
|
| 9樓: | >>參與討論 |
| 作者: chunyang 于 2007/3/27 13:48:00 發(fā)布:
你的理解根本沒有依據(jù) 一路串口就夠了,何來兩路?看來你還是缺乏串口通訊和MCU應用的基本概念,建議還是買成品吧,232—485的智能型互轉器市場上大把,直接用吧。 |
|
| 10樓: | >>參與討論 |
| 作者: ztb 于 2007/3/28 23:39:00 發(fā)布:
找到了一篇文章:232-485智能轉換器 MAXIM北京辦事處 劉武光寫的,很詳細的講述232/485轉換器軟硬件設計的好文章.與同樣和我一樣"缺乏串口通訊和MCU應用的基本概念"的電工共享. http://www.mculib.com/files/tele/te1146.pdf 另外,還是拜托樓上的:看在我從83年就開始學Z80的老臉上,把我的觀點仔細看看,再想想,再評論. |
|
| 11樓: | >>參與討論 |
| 作者: fiann 于 2007/3/29 9:14:00 發(fā)布:
一般的modbus方案在pc端都會做轉換 485轉232 485轉usb 接著你的上位機軟件實現(xiàn)就很容易了 成本很小了,幾十快錢! |
|
| 12樓: | >>參與討論 |
| 作者: fiann 于 2007/3/29 9:15:00 發(fā)布:
樓主還是大牛阿 從83年就開始學Z80 |
|
| 13樓: | >>參與討論 |
| 作者: 21ele 于 2007/3/29 10:05:00 發(fā)布:
如果下位機也是自己做的,可以控制他們適當延時再回應數(shù)據(jù). 如果下位機也是自己做的,可以控制他們適當延時再回應數(shù)據(jù),pc主機有足夠時間切換為接收,從modbus協(xié)議上講是沒有問題的,但是延時太長會使響應變慢,總線效率下降. 如果下位機是現(xiàn)成的設備,那響應的延時大致是無法改變的,那最好是用單片機監(jiān)視pc有無發(fā)送數(shù)據(jù),因為這里并不關心數(shù)據(jù)內(nèi)容,本質(zhì)上只是在一個字符周期內(nèi)是否起始位和停止位,如果沒有,視為暫無數(shù)據(jù)發(fā)送,所以不一定用有串口的mcu,隨便什么mcu都可以的.軟件定時檢測起始位和停止位即可. 我正在做modbus程序,pc上用Modbus Poll調(diào)試,非常好用,Simply Modbus 6.0.1這個軟件也不錯,只是沒有注冊版可用. |
|
| 14樓: | >>參與討論 |
| 作者: computer00 于 2007/3/29 12:17:00 發(fā)布:
應該不關VB的時,主要是操作系統(tǒng)調(diào)度的原因. 如果你的軟件優(yōu)先級足夠高,控制它應該是可以反應很快的。 |
|
| 15樓: | >>參與討論 |
| 作者: ztb 于 2007/3/30 0:36:00 發(fā)布:
我前面手懶了,再"詳細"解釋一遍 首先感謝各位的回帖. 回chunyang:講話直是好事,搞技術的最煩拐彎抹角!我非常贊同你的這段話:"一個行業(yè)里的“大牛”換個“山頭”一問三不知也屬正常".我在意的是在看清楚問題以前上來就批! 回到技術問題.我的問題要是在DOS實模式下根本不是問題,因為所有程序都可以很簡單的用匯編直接控制.猶如探囊取物.問題的起因就來自于方便易用的Windows+VB.(其它的方法我不會,不敢臆測) 我做通訊試驗時是架著雙蹤示波器進行的.在VB下時間的分辨率無法優(yōu)于20mS(大約).而每次正常發(fā)送間隔不能小于50mS(大約).這樣對于已經(jīng)不快的9600pbs來講,通訊線上2/3的時間在等待.而對于38400bps來說88%的時間在等待.(以上計算基于ModBus協(xié)議最常用的雙向報文長度8字節(jié)+4字節(jié)間隔).這個問題在子站數(shù)量少的情況下不易被注意到,而子站多了就不能忽視了.如果采用簡單的232轉485方案,只要VB的50mS無法去掉這個問題就只能如此!這就我前面提到的第一個方案即單串口的方案. 我說得第二個方案就是要徹底解決這個問題--采用雙串口設計.這里MCU已經(jīng)不是簡單的僅控制485芯片的收/發(fā)線,而是負責更復雜的協(xié)議轉換.即把VB直接控制下效率低的ModBus協(xié)議轉換為更適合Vb控制的效率更高的其它協(xié)議. 例如,既然間隔不能在縮小就加大報文長度,把需要上百個短報文完成的巡檢命令變成批巡檢命令.由MCU翻譯成高效的ModBus命令. 我想肯定有第三種方案;修改Windows,加入實時內(nèi)核,把它變得即有Windows的易用又有DOS下的準確.網(wǎng)上看到過由于不常用擔心比第二種方案的成本還要高(這的確是臆測的).感嘆,技術進步了我卻低能了,我已經(jīng)沒有能力像當年把CP/M修改成實時多任務那樣駕馭Windows了. 突然想起一個故事:說一個小孩子上學去,第1天學了一個字"一",第2天又學了一個字"二",第3天也學了一個字"三".第4天他就不來了,說: ......! 回21ele:千萬不要打標準協(xié)議的歪主意,修改標準就是向眾多專家的經(jīng)驗提出挑戰(zhàn)!眼前站點便宜以后會有很多麻煩.(傳出去,名聲也不好呀!).遵守協(xié)議就是為了交流,自成體系就是自我封閉! 好心人,你那個非常好用Modbus Poll調(diào)試軟件是否可以共享!我早已是垂涎三尺啦. |
|
| 16樓: | >>參與討論 |
| 作者: cfanandham 于 2007/3/30 11:40:00 發(fā)布:
vb如果調(diào)用多媒體定時器好像速度就會高點 記得能達到1ms,具體就不確定了。 |
|
| 17樓: | >>參與討論 |
| 作者: chunyang 于 2007/3/30 14:40:00 發(fā)布:
還是接著就事論是,順便總結一下 串口的收發(fā)是可以同時進行的,這一點無論PC還是MCU都相同,PC在硬件上還有緩沖存儲,又可實現(xiàn)多任務調(diào)度,關鍵是軟件平臺的處理,兩次通訊間的間隔長達50mS不可怕,只要在編程上注意發(fā)完即收就行,這樣可以保證一個信息幀的通訊可靠性。PC內(nèi)存中開的緩沖區(qū)收發(fā)要獨立,某些現(xiàn)成的使用簡單的控件可能不能滿足,但可以自己重寫控件。前貼中提到當年我的一個設計曾用VB做上位平臺,收發(fā)間無延時(MCU的軟件是我寫的,源代碼現(xiàn)在還在我的機器里,收到PC指令后就立刻開始上傳數(shù)據(jù)了,未做延時處理),VB平臺操作正常。當然,早期版本的VB和現(xiàn)在的VB差別明顯,但那已經(jīng)是Windows平臺下的32位系統(tǒng)了而非For DOS的版本。 如采用MCU系統(tǒng)做485/Modbus主機,采用雙串口MCU當然方便,成本會因此上升10元左右(雙串口MCU與單串口MCU的差價),工控系統(tǒng)應該也是能夠接受的,好處是可以處理485和PC同時發(fā)起的通訊,但485是單向的,所以若不考慮485和PC同時發(fā)起通訊請求的極端情況,普通單串口MCU就足以滿足,根據(jù)優(yōu)先級或應用的特性選擇靜態(tài)時MCU偵聽PC還是485即可,前帖中提到的“一片模擬開關或數(shù)據(jù)分配器/選擇器之類的邏輯芯片,用于選擇MCU的串口通路”的設計思想就是基于此點,MCU在此不作協(xié)議處理僅做轉發(fā)的緩沖即可,這樣的MCU編程是很簡單的。當然,用MCU做485主機也是可以的,與PC可以采用另一套自定協(xié)議交互。 MCU的引入可以有3類做法:1、做485主機,同時偵聽PC和485的話才用雙串口MCU,否則單串口MCU就可以了,這類做法MCU上要跑協(xié)議。2、MCU僅擔當485方向控制和數(shù)據(jù)的緩沖、轉發(fā),本身與總線的協(xié)議和數(shù)據(jù)內(nèi)容無關,PC是真正的485主機只是不直接參與總線通訊,協(xié)議在PC平臺上運行。這種做法PC平臺軟件的運行時間、收發(fā)轉換時間和波特率等均與485節(jié)點無關,缺點是最大幀長度受MCU片內(nèi)RAM的限制,但現(xiàn)在256Byte的MCU很多,帶片內(nèi)XRAM的MCU也很多,且不必花費額外的成本開銷,如STC的89C51內(nèi)存配置為128+128+256,89C54及以上規(guī)格的配置為128+128+1024。3、MCU僅做方向控制,這是最廉價的方案,MCU采用最簡單的型號即可,但PC平臺的響應速度要相應足夠,只要處理得當,VB平臺下的單次收發(fā)應該也不會有問題。 |
|
| 18樓: | >>參與討論 |
| 作者: xjb37 于 2010/9/10 13:24:27 發(fā)布:
兄弟,你用win api來寫串口就可以。 DCB控制字設置一下就可以 dcb.fRtsControl=RTS_CONTROL_TOGGLE; 以下是用VC6.0寫的,我想VB里也類似;我用示波器量過,很準確。我是in2000xp的系統(tǒng)。 DCB dcb; dcb.DCBlength = sizeof( DCB ); GetCommState( m_hHandle, &dcb ); dcb.BaudRate = m_Options.nBaudRate; dcb.fAbortOnError=1; dcb.fBinary=1; dcb.ByteSize = m_Options.ByteSize; dcb.fParity=m_Options.fParity; dcb.Parity= m_Options.Parity; dcb.StopBits= m_Options.StopBits; dcb.fRtsControl=RTS_CONTROL_TOGGLE;//xjb |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |