您好想詢問各位前輩們,目前剛嘗試用Producer/Consumer方式撰寫程式,以下想把控制程式跟監控程式的迴圈分開,有去爬國外NI論壇資料,並且參考修改成目前的程式,讓兩個迴圈都可以平行運作,只是發現下面Monitor的Deq會卡initialize沒辦法跑Monitor的程式,然後Stop的時候ReleaseQ會跳錯誤。
想請問是哪邊需要修改呢?
程式碼的部分
labview.7z (89.5 KB)
您好想詢問各位前輩們,目前剛嘗試用Producer/Consumer方式撰寫程式,以下想把控制程式跟監控程式的迴圈分開,有去爬國外NI論壇資料,並且參考修改成目前的程式,讓兩個迴圈都可以平行運作,只是發現下面Monitor的Deq會卡initialize沒辦法跑Monitor的程式,然後Stop的時候ReleaseQ會跳錯誤。
想請問是哪邊需要修改呢?
程式碼的部分
labview.7z (89.5 KB)
稍微看一下,至少有下面三個問題
1.不要隨便漏接線,除非你120%確定不接沒事,不然請不要使用"Use Default If Unwired",Labview已經使用特別的接點圖案提示線沒接了,請想辦法消除所有未接線的提示。
2.當resource一分為N之後,想要close前,請記得等大家集合完畢再結束。
3.Mnitor loop在隨便觸發一個event後就不可能再收enqueue的element,因為producer resource早就不見了,所以永遠只能在timeout後被迫執行Default,而不是你認為的initialIntialize,原因是因為你沒接線加上使用shift register。
建議先熟悉Labview的資料流怎麼流?先後順序怎麼看?什麼時候才該用shift register?什麼是race condition?再來挑戰多個迴圈,不然永遠會有你想不到的錯誤產生,因為你還無法預期程式會怎麼執行,這是需要由簡到繁的練習累積的,除非天賦異稟。
下面是標準如何在多個迴圈下release queue的模型,必須由producer發起,consumer收到,再等待同時結束並release,如果要使用其他方式,除非你非常清楚你的程式如何運作。
問題一:Stop會跳錯誤是因為你在Event Loop迴圈後面直接接Release,你可以用燈泡去看,很有可能你的子迴圈根本還沒有離開Loop你的Event後面的Realse就把Queue給釋放掉了
問題二:
問題三:還有一點我覺得怪怪的是,你Monitor的狀態只有在Event Timeout的迴圈會下,那其他指令在執行時,你的Monitor迴圈應該在執行不同Event時都會被判斷在Default,因為都沒有對應的狀態可言
以上是我覺得可能有問題的狀況,如果有講錯可以跟我說XD,然後我覺得如果之後程式需要控制儀器跟同步儲存資料的話,可以考慮用Notifier跟Queue再搭配FGV去做編程,或是有的程式類型我覺得Notifier控制比Queue方便,另外一點是要寫多平行程式建議你可以去看看FGV要怎麼寫,我覺得對於寫程式蠻有幫助的。
問題一:我在stop event裡面給另一個迴圈也下達Stop指令後,Release就不會跳錯誤,看來是子迴圈結束才Release。
問題三:我也覺得很奇怪,主要是才剛接觸Labview算一個月多吧,所以爬了很多文章都說新手建議不要使用Variable破壞資料流,我目前對資料流的型態也還沒有到真的很熟悉,所以要求自己都先不要使用Variable,關於Notifier我會再參考看看,不過目前的程式上是Monitor的子迴圈都不會運作還沒抓到是哪裡出了問題。
謝謝你的建議
我來雞婆一下XD
針對Q3 local variable 其實不是不能用,
資料流這概念跟高鐵沒兩樣,
要從高雄到台北一定會經過台中站(不換車的條件下)
所以資料沒有到台中就不可能到台北,
相對的 variable 就像影分身之術,
定義好後,不管台中有沒有到站,台北一定就會有資料,
用起來很方便,但常常很多資料都要丟給台北站,沒搞好先後順序才會有race condition,
重點在於定義誰可以用variable,先後順序…等~
希望以上可以給你有所幫助