好久沒有寫些什么了,最近在出差也沒做關(guān)于Linux的東西。由于是做自動化的因此最近做了一塊單片機(jī)的板子要作為MODBUS從站來與上面的觸摸屏進(jìn)行顯示功能還不是很完善但是MODBUS功能的模塊程序已經(jīng)寫好經(jīng)過測試基本可以用。
具體要求是下面有2個AI和4個DO量需要檢測和控制,我使用的是90C52單片機(jī)模擬量采集部分用的OP07的放大器電路,這里就不詳細(xì)說明了(有需要的可以留言,有圖紙),最麻煩的就是MODBUS通訊部分。
一開始我根據(jù)MODBUS標(biāo)準(zhǔn)協(xié)議規(guī)定來做了程序但是不能通訊經(jīng)過總結(jié)主要問題出在二個地方
第一:crc校驗(yàn)計算不正確
第二:發(fā)送的程序太大導(dǎo)致發(fā)送時間過長主站端認(rèn)為超時(我自己認(rèn)為的原因)
經(jīng)過仔細(xì)研究發(fā)現(xiàn)CRC校驗(yàn)的程序我根本寫不出來也理解不了網(wǎng)絡(luò)上有很多現(xiàn)成的可以直接拿來來用就很好了,經(jīng)過精簡程序是可以進(jìn)行通信了但是還有一個很重要的問題是超時判斷的問題一直沒能處理所以進(jìn)行了以下時間問題的總結(jié)
Modbus字符與數(shù)據(jù)幀間隔時間問題
1、MODBS協(xié)議中的規(guī)定如下
在RTU模式,報文有時間長至少3.5個字符時間的空間間隔區(qū)分如下圖
目前成都創(chuàng)新互聯(lián)已為近千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、網(wǎng)站托管運(yùn)營、企業(yè)網(wǎng)站設(shè)計、衛(wèi)東網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
整個報文必須以連續(xù)的字符流發(fā)送,如果兩個字符之間的空閑大于1.5個字符時間,則報文幀認(rèn)為不完整,應(yīng)該被接收點(diǎn)丟棄。
需要注意的是RTU接收驅(qū)動程序的實(shí)現(xiàn),由于1.5T和3.5T的定時,隱含著大量對中斷的管理。在高通信速率下,導(dǎo)致CPU負(fù)擔(dān)加重,因此在<=19200pbs時這兩個定時必須嚴(yán)格遵守;對于>19200pbs的情形應(yīng)該使用2個定時的固定值,建議字符間的超時時間t1.5為750us;幀間超時時間為1.75ms
上面是MODBUS協(xié)議中的規(guī)定,但在實(shí)際使用中1.5T都沒有必要關(guān)注。而幀與幀之間的3.5T則需要程序處理一下。由于RTU模式?jīng)]有起始符和結(jié)束符,兩個數(shù)據(jù)包之間只能靠時間間隔來區(qū)分。在儀表在工廠實(shí)際使用過程中一般都是間隔40ms、50ms甚至更長時間讀一次數(shù)據(jù),這個間隔完全超過了T3.5;
假設(shè)現(xiàn)在波特率是9600bps要發(fā)送取數(shù)據(jù)的請求:
01 03 00 01 00 01 D5 CA (格式為8個數(shù)據(jù)位1個停止位)
那么每個字節(jié)包含一個起始位一個停止位也就是10位
那么發(fā)送這串命令要花費(fèi)時間為:8×10/9600×1000=8.3ms
即第一幀發(fā)送時間為8.3ms而3.5T的時間為3.5×10/9600×1000=3.65ms
所以第二幀數(shù)據(jù)開始發(fā)送的時間至少是第12ms開始(8.3+3.65=11.95ms)
之后修改程序后終于可以達(dá)到預(yù)期的效果但是我用三個軟件進(jìn)行調(diào)試都可以讀到數(shù)據(jù)(串口調(diào)試助手,MODBUSSIM,modscan)其中只有modscan接收數(shù)據(jù)的時候閃一下紅但是能讀到數(shù)據(jù)不知道為什么調(diào)節(jié)了他的poll時間還是不行其他兩個軟件正常也可以寫數(shù)據(jù)。想了一下覺得這兩天也就干了這么些事。程序是用keil寫的有需要的可以聯(lián)系我,可以直接用。