先分數學定義與製程限制
工程值換算出錯時,不要只讓畫面顯示零。零可能是合法結果,也可能是程式把錯誤隱藏起來。本篇用平方根與除法說明如何在運算前判斷條件、運算後核對結果,並把數值和有效性一起交給後續流程。
若使用實數平方根,輸入必須大於或等於零;零的平方根就是零,負數在這個實數模型中沒有結果。除法的分母不能為零,但分子為零、分母非零是合法零結果;分母為負也不一定有數學錯誤,需要看製程是否允許。
先寫運算契約:輸入型別、工程單位、有效範圍、結果範圍與錯誤時處置。例如比值A/B沒有理由通用禁止負分母;但若B代表實際容積,B小於或等於零可能都不符合製程。將數學條件與工程條件分欄,才能清楚回報原因。
本文只採實數模型,不討論複數平方根。PLC的數學指令、錯誤碼、溢位和CPU反應依平台而異,不能從Python或其他產品的例外行為推定Q06UDVCPU會怎樣。以下狀態名稱都是教學設計,不是原廠特殊裝置。
介面至少包含原始輸入、結果值、結果有效性、原因與本次計算識別。結果無效時即使畫面保留上次值,也要顯示其時間與過期狀態。讓使用者能分辨本次合法零、沒有新結果和上次結果被保留三種情況。
平方根不要用取絕對值掩蓋問題
先用四個值練習:sqrt(9)=3、sqrt(0)=0、sqrt(0.01)=0.1;輸入−0.01則回報DomainError而不計算實數結果。若直接改成sqrt(abs(x)),負輸入會變成0.1,看似合理卻把輸入方向與錯誤原因抹掉。
以平方根型流量換算作純數學情境,假設正規化壓差x在0到1之間,流量百分比為100×sqrt(x)。x=0.25時是50%,x=1時是100%。這只是明示公式,不代表所有流量計都應自行開根號;有些設備已輸出線性流量,再開根號會錯。
對x=−0.001,先查零點偏移、資料有號性、感測器狀態與量程,而不是自動取絕對值。如果製程設計允許在小負值容差內視為零,要明確定義容差、有效性和狀態,例如NearZeroClamped;保留原始負值,不能改寫成正常量測零。
本篇主案例採嚴格拒絕所有負輸入,容差夾限只作另一版策略。驗收時輸入−0.001必須得到無效,不能有人按主規格拒絕、另一人按口頭容差接受。對超過工程上限的正值也要另判斷,平方根有定義不代表量程合法。
若輸入來自前一步相減,檢查是否在窄整數中溢位或無號回捲。真實−1被誤解成65535後,平方根能順利計算,卻是錯誤來源資料。數學函式前的型別與品質檢查,和函式本身的定義域同樣重要。
除法要區分零分母和過小分母
驗收A/B時,10/2=5、0/2=0、10/(−2)=−5在實數數學中都合法;10/0和0/0則不能產生有效實數商。本例回報ZeroDenominator,保留A與B,不把零分母替換成一後繼續,也不把商假設為零。
分母非零仍可能不適合工程計算。例如A=1、B=0.000001,結果1000000,可能超出允許範圍或對分母誤差極敏感。先依輸入單位和用途定義最小允許幅度,不能通用寫一個0.001,套到秒、公升與壓力都當正確。
若本例另定分母單位秒,允許B至少0.01秒,B=0.005秒應回報BelowMinimum;B=0才是ZeroDenominator。原因分開後,操作員知道是時間太短還是沒有時間資料,也能從事件紀錄看出設定問題的比例。
整數除法還可能截斷分數。5/2的數學商為2.5,目標若只允許整數,需要明訂取整規則,不能直接把2當成完整精確結果。對負值也要測,例如−5/2是−2.5,向零與向負無窮會產生不同整數。
有號整數的最小值除以−1也值得測:十六位元最小值−32768,數學結果32768超出同型別正上限。即使分母非零,仍有結果不可表示的問題。中間型別與最後縮小位寬都要檢查,不能只加一個分母不等零接點就完成。
當分母來自時間差,還要確認時間沒有倒退或混用單位。十毫秒若誤當十秒,雖然除法可以執行,速率會差一千倍。先把原始時間差、轉換後秒數和單位保存,再計算,讓數學檢查與資料來源檢查各自有證據。
用狀態表驗收並找到失敗位置
建議順序是先確認資料有效,再確認型別與工程範圍,接著檢查數學定義域,然後執行運算,最後判斷結果是否可表示且落在允許範圍。每個失敗出口都提供原因,避免後續程式讀到舊結果卻誤認本次已成功。
平方根表列9、0、0.01、−0.01;除法表列10/2、0/2、10/0、0/0、10/(−2)及最小有號整數除−1。每列同時寫預期值與預期狀態,錯誤列的值欄標無有效結果,不用數字零代替。
失敗時先找第一個不成立的前置條件。如果來源資料已無效,先排查通訊或感測器;若raw正確但轉成負數,查有號性;若只有很小分母出事,查門檻、單位與結果範圍。不要先放寬所有限制讓數學指令繼續執行。
後續控制只能使用符合該功能條件的有效結果。資料不可用時的設備反應,依系統設計採保持、拒絕啟動或其他已驗證處置,不能由通用文章決定全部輸出歸零。一般數值防呆也不替代專門安全功能。
完成後應能清楚區分合法零、負數定義域錯誤、零分母、過小分母與結果超界。本文提供驗收向量;實際錯誤碼與指令完成條件需查目標手冊。
練習可安排有效、無效、再有效三次呼叫,確認第二次失敗時狀態立即失效,第三次成功才更新結果與時間。這能抓到錯誤分支只跳過計算、卻忘記清除上次成功旗標的問題;單獨測一筆零分母通常看不出這種狀態殘留。
常見問題
問:平方根輸入零會出錯嗎?答:實數平方根的零是合法輸入,結果零。
問:除法輸入負數都應拒絕嗎?答:數學上可有負商,是否允許需看該欄位工程意義;零分母則不可。
問:小負值直接取絕對值好嗎?答:會掩蓋方向和來源問題,本例拒絕;如需容差夾限要另訂規格並保留原值。
問:分母非零就代表除法安全嗎?答:還要查最小幅度、型別溢位、結果範圍及輸入品質。
參考:Python math官方文件,sqrt及數學函式定義;引用僅供數學概念,PLC錯誤行為需另查。