以前都是自己寫了個FB塊實現斜坡函數功能。 比如控制一臺機器線速度為150m/Min, 而設定加速度為30m/Min/s , 那么程序控制輸出在5秒時間(150/30)將輸出線性增加。
大家一般怎么做? 用那些指令呢?
回到這個問題本身。 原來論壇上也有過幾個貼子,問起如何計算1500/1200的掃描周期。
其中一個方案就是用RD_SYS_T指令讀取當前系統的時間, 然后兩個掃描周期讀取的時間用T_DIFF指令做減法,就計算出來掃描周期了。
#iTMP_Int0 := RD_SYS_T(OUT=>#ACTUAL_TIME); //讀取當前系統時間
#rDELTA_TIME := 1.0E-3*DINT_TO_REAL(TIME_TO_DINT(T_DIFF(IN1:=#ACTUAL_TIME, IN2:=#LAST_TIME))); //兩次調用之時間差(S)
#LAST_TIME := #ACTUAL_TIME; //為下一次調用做準備
#rDELTA_TIME就是計算出來的掃描周期了(單位:秒)
然后按照我頂樓提出的問題, 加速度度為30,目標速度150。 那么每個掃描周期我的速度增量為30*#rDELTA_TIME, 每個掃描周期將輸出疊加,直到達到目標速度150為止
看起來,思路和程序都*沒問題? 而且這個塊我也用了有幾年了!??! 可是昨天在調一臺小機器的時候,忽然發現不對勁。 我在觸摸屏上有顯示當前目標速度的,觸摸屏對應的變量刷新周期為一秒, 那么原則上我在觸摸屏上觀察到的目標速度應該是以30為增量了,比如*眼看到12,那么第二個數據應該是42,第三下就是72。。。。 可是事實卻是每次增加20多點.....
我吼了幾嗓子,結果沒什么人起哄呀... ...
我本來是想帶節奏的,結果被ZANE版帶溝里去了 ^_^
算了,我還是自己寫出來吧。
#iTemp0 := RD_SYS_T(OUT=>#ACTUAL_TIME); //讀取當前系統時間
#rCycleTime := 1.0E-3*DINT_TO_REAL(TIME_TO_DINT(T_DIFF(IN1:=#ACTUAL_TIME, IN2:=#LAST_TIME))); //兩次調用之時間差(S)
#LAST_TIME := #ACTUAL_TIME; //為下一次調用做準備
對照圖片,DTL數據類型可以讀取到 納秒單位。 而事實上T_DIFF指令是將兩個DTL類型做減法,可是結果卻只保留到 毫秒 單位! 毫秒就毫秒吧,zui“可怕”的卻是它的減法不是四舍五入,而是去尾留整?。?! 比如我的掃描周期為2.1ms,它計算出來的結果顯示為2ms, 掃描周期為2.99毫秒,它也顯示是2ms ! 這就尷尬了.... .... 當我在加速過程中,PLC的掃描周期平均為2.6ms時,計算的zui終結果也還是2ms, 意味著,我的實際加速度就變成了 30 * 2 / 2.6 = 23 ... ...
問題就是這么出來的... ...
嘿嘿,怎么解決???
西門子V901FL6096-1AC61-0LA1代理商
西門子V901FL6096-1AC61-0LA1代理商