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