搜尋陣列中不為0的index

大家好,最近寫程式碰到一個想請問大家有沒有方法可以解決。
現在有一個1D陣列的形式是長
0 0 0 0 3 3 3 3 3 3 3 3 0 3 3 3 3 3 3 3 3 3 3 0 3 3 3 3 3 3 3 3 0 0 0 0 0 0 0 0 5 5 5 5 5 5 5 5 5 0 5 5 5 5 5 5 5 5 5 5 5 5 5 5
3跟5是我power supply的電壓值,由於機器莫名的錯誤都會在輸出電壓的狀況下回傳0(一連串3或5中間卡的0,但超過兩個0基本上就代表關電了而非異常),這個問題造成我畫出來的圖形會有瑕疵,在我確定是回傳的問題而不是機器有關電的狀況下我想了個辦法來修正,就是把有開電(持續監控,因此3在第幾個index出現未知)的那個3的index跟關電前的那個3的index取出,直接把這個區間內的0都替換成3,所以我才會需要找出陣列中不為0的index,若有強者看到我的整個狀況也能提供我其他方式修正,我會非常感激。

順帶一提,這個電壓值不一定是3或5,什麼時候開啟結束也不知道。

Demo.vi (7.1 KB)

我猜是數位訊號傳輸時的雜訊造成的讀取錯誤,可能是線材太長、老舊,或是有其他干擾源。不知道你的power supply本身有沒有LED面板顯示目前的power輸出值,可以觀察一下,輸出的power一定是不會突然變成0的。既然power輸出不會突然變成0,那就表示電腦PC讀取這一塊,很有可能讀到了錯誤的資訊。很有可能是訊號的干擾,或是程式架構本身沒有考慮完善所造成的,確切的原因必須要看你程式與儀器才會知道。

當這樣的狀況發生時,可想而知,軟體所讀取到的儀器數值是不可靠的。這種狀況要盡量避免唷~ 因為我們希望我們所開發出來的程式,是具有極高可靠度的。

像是PLC的通訊,因為要控制機台,不可能出現一個雜訊,就導致馬達或機器手臂勿動作,造成財產所師或人員危險。所以都會有檢查碼的機制,就是所謂的Check Sum

下面是三菱PLC的Computer Link指令的格式,注意,這個格式是有包含Check Sum的:

檢查碼的是由「所傳送的命令」的字元相加,所得到的資料。如果PLC要傳送「LabVIEW360」給PC,假設檢查碼是0xE3,那麼總共從PLC傳送給PC的訊息就會是「LabVIEW360+0xE3」。如果PC收到了錯誤的訊息,如,收到「LabVIEW60+0xE3」,那麼PC就會去計算「LabVIEW60」的檢查碼,算出來的檢查碼是「0xB0」,由於「0xE3」不等於「0xB0」。那麼PC就會知道這一次所都級到的資料是錯誤的,應予以捨棄,不應該讓這個錯誤的資訊呈現在螢幕上。這就是檢查碼的用途。

所以,建議治本的方法還是看看會不會是訊號線有雜訊或是接觸不良的問題,並試著使用「檢查碼」,讓自己的程式具有高度可靠度吧! :white_check_mark:

caeru 非常謝謝你寶貴的時間以及代碼,我會好好研究後跟大家分享。

1個讚

Benjamin謝謝你的建議,我會再跟我的leader建議治標的方式(我還是個大四的實習生)。我昨天發現可能是跟PS的廠牌新舊有關,工廠中特定廠牌的PS都會有這樣的狀況。
想詢問一下,我觀察到會有這種狀況發生的PS都會error燈號,但有亮燈不一定會出錯,目前也有再想從這個地方著手觀察。

1個讚

高速或是連續讀取訊號過程中, 為了避免因為雜訊或是其他干擾, 會進行訊號自保持功能, 也就是在訊號讀取過程中, 加入判斷某段時間內(例如:20ms)是不是有其他狀態產生.如果有, 則將此訊號視為雜訊, 反之為可接受的訊號.