i/o - 輸入輸出,大家都非常熟悉,自動(dòng)化系統(tǒng)中無處不在。我們通過操縱一系列的i/o來達(dá)到預(yù)期的控制目標(biāo)。然而調(diào)試中卻經(jīng)常會(huì)出現(xiàn)一些不按預(yù)設(shè)邏輯工作的輸出,如圖1中所顯示的,q0.0~q0.3已經(jīng)接通了,但實(shí)際模板卻沒有輸出,在變量表中監(jiān)視這些地址,發(fā)現(xiàn)這些地址確實(shí)為斷開狀態(tài)。到底是誰動(dòng)了我的輸出呢?
通常大家首先會(huì)考慮,可能程序的其他地方也使用了這些輸出從而導(dǎo)致不正常,我們可以使用go to location功能來查找整個(gè)項(xiàng)目中哪些地方都使用了q0.0,如圖2。
在圖3的go to location中選中“overlapping access to memory access”可以查找項(xiàng)目中包含地址q0.0的所有變量,但是發(fā)現(xiàn)除了在ob1的network1有對(duì)q0.0進(jìn)行寫操作的指令,即目前監(jiān)視的位置外,再?zèng)]有其他的地方使用這個(gè)地址。查到這可能很多人就不淡定了,認(rèn)為自己的程序完全沒有問題,接著開始抱怨模板問題,cpu問題。。。
其實(shí)對(duì)程序的排查并沒有完成,go to location功能只能搜索離線的程序,無法搜索實(shí)際在plc中運(yùn)行的程序。一臺(tái)plc可能被下載過很多套程序,而我們拿來后,未經(jīng)任何處理,就直接下載自己的項(xiàng)目到plc,可能會(huì)遇到plc在執(zhí)行一些離線項(xiàng)目中并不存在的ob塊的情況。例如曾經(jīng)下載到plc的程序中包含ob35,但目前的離線項(xiàng)目中卻并沒有使用ob35,plc依然會(huì)周期執(zhí)行ob35里的指令,如果ob35里包含對(duì)q0.0的復(fù)位指令,也會(huì)出現(xiàn)圖1所示的故障。step 7提供了一個(gè)簡(jiǎn)單的方法來排除這種情況:使用simatic manager 窗口下plc菜單中的“download user program to memory card”功能重新下載項(xiàng)目程序,此功能會(huì)先刪除plc中所有的內(nèi)容,然后再下載離線項(xiàng)目到plc中,這樣就能避免“隱藏”在plc中程序的干擾。
另外還有一種情況是程序中使用了間接尋址,go to location功能只能搜索到已使用的靜態(tài)地址,而無法確定需要在運(yùn)行中動(dòng)態(tài)計(jì)算出的地址。
例如:
clr
= q [md100 ]
md100不同的值將導(dǎo)致不同的q點(diǎn)被復(fù)位
md100 = 16#0 ,q0.0 = 0
md100 = 16#1 ,q0.1 = 0
對(duì)于自己編寫的程序,大家都確切的知道在哪使用了間接尋址,可以單獨(dú)把這些程序段拿出來進(jìn)行單步調(diào)試,以避免對(duì)地址的誤操作,而調(diào)試由其他人編寫的或廠家提供的功能塊,甚至這些塊被加密保護(hù)了,則只能使用排除法,先將這些塊都刪掉,然后再一點(diǎn)點(diǎn)添加到程序中,來判斷是哪些程序段造成的錯(cuò)誤輸出。例如fm350-1 lib提供的功能塊fc2,如果硬件組態(tài)時(shí)忘記將fm350-1的模板地址設(shè)置到指定的db中,由于db初始值默認(rèn)都是0,就會(huì)影響qb0~qb15的輸出。
最后為了快速定位到底是不是程序問題,一個(gè)簡(jiǎn)單的方法就是在線刪掉plc中所有ob塊,然后在硬件組態(tài)窗口中啟用模板的監(jiān)視/修改(monitor/modify)功能,通過此對(duì)話框直接修改輸出,如圖4所示,輸出顯示都正常,說明問題還是出在程序上。