以下程序,執(zhí)行過程中發(fā)生無規(guī)律的通訊中斷且不自行恢復(fù),STOP后RUN,再次M0.0置1后恢復(fù)通訊。將INT0中的ATCH挪到ENI前面后有改善,未再出現(xiàn)。但是不知道是不是根源。如何監(jiān)視和分析自由口通訊的過程。請指教,是否有指令,寄存器或者程序,能夠監(jiān)視自由口通訊過程,如何使用的。源程序來自下面鏈接的發(fā)送程序,http://www.ad.siemens.com.cn/service/article/S7-200/S7-200freeport/Default.aspx#1_3。
ENI是開中斷指令。
一般常規(guī)編寫程序的做法是先定義,定義通訊控制字節(jié),定義通訊頻率、定義通訊數(shù)據(jù)等,最后開中斷。
如果把ENI寫在前面,從理論上是不符號西門子編程環(huán)境的,西門子的思想是先定義后使用的原則,符合歐洲人的思維邏輯。
程序大致含義是:
首先定義通訊(自由口通訊參數(shù))
定義通訊數(shù)據(jù),由M0.0上升沿觸發(fā)發(fā)送指令,即把上面定義好的數(shù)據(jù)發(fā)送出去
當(dāng)發(fā)送完成進入發(fā)送完成中斷,執(zhí)行接收并再次定義接收完成中斷(實際上這個完全可以在初始化程序段中編輯),你的問題是重新定義接收完成中斷后,仍然需要定義ENI指令一次。
當(dāng)接收完成后進入接收完成中斷,你重新又再次定義定時中斷_0 = 20,(mS)這里同樣沒有再次定義ENI。
當(dāng)定時中斷激活后,會在20mS的間隔發(fā)送你第一次定義好的數(shù)據(jù)。
我感覺你整體的程序架構(gòu)不嚴(yán)謹(jǐn),應(yīng)該是初始化時,先定義好發(fā)送完成中斷、接收完成中斷,開中斷,不需要定義定時中斷的原因是自由口通訊是半雙工通訊,一條通訊鏈路上只能有唯一的一條指令有效,而定義定時中斷(它又不管你到底那條指令正常運行,或者指令沒有運行,到點一定會發(fā)送一條指令的),這樣會造成錯誤的幾率會大。
正常應(yīng)該是先定義通訊數(shù)據(jù),完成后執(zhí)行發(fā)送,在發(fā)送中斷中編輯接收指令,在接收中斷中再次編輯需要的發(fā)送指令,如此循環(huán)進行。
上述僅僅只是我是一點看法。
提問者對于答案的評價:
謝謝指教。收益匪淺。改過后偶爾會卡在發(fā)送中斷,如何跳出,并恢復(fù)通訊?謝謝 。
最佳答案作者回復(fù):
按我的思路,在發(fā)送完成中斷中編寫接收程序,在接收完成中斷寫發(fā)送程序,這個是我在編輯自由口通訊的工作經(jīng)歷,按此方法可以,不會產(chǎn)生指令之間的沖突。
電話:13818569113 15721373211
郵箱:fushidianji@139.com
網(wǎng)址:http://xiangtai88.cn
地址:上海青浦區(qū)北青公路7171號111-112室