自己用SCL編寫了一個流量累計塊,實現功能如下:
毫秒流量累積值計數達到Hz 時(比如循環中斷為100ms,Hz=10時,把毫秒流量累積值傳送給秒累計值,同時清零),秒流量累計值到達60時,傳送給分鐘流量累計值,以此類推計算最終的流量累積輸出。程序如下,執行時總是不能正確輸出,請大俠們指教!    
Input                                
     AIW_IN    Int        流量計瞬時流量模擬值
     Reset           Bool            為1時,累積值清零
     Hz            Int            每秒采樣次數
     Unit_V    Real       流量計最大流量值
Output                                
     Accu_Valu  Real             流量累積輸出
     Unit_C    Real        瞬時流量值工程量
InOut                                
     ms_V          Real        毫秒累積流量
     s_V          Real        秒累積流量
     min_V       Real        分鐘累積流量
     h_V          Real        小時累積流量
     d_V          Real        天累積流量
Static                                
   ms      Int        毫秒計數
      s      Int        秒計數
   min      Int        分鐘計數
      h      Int        小時計數
      d      Int        天計數
Unit_C_S  Real        采樣時間流量值
//瞬時模擬量值轉換為瞬時工程量值
#Unit_C:=SCALE_X(MIN:=0.0, VALUE:=NORM_X(MIN := 0, VALUE := #AIW_IN, MAX := 27648), MAX:=#Unit_V);
//瞬時工程量值轉為采樣時間流量值
#Unit_C_S := #Unit_C / 36000.0;
//毫秒流量累積
#ms_V := #ms_V+#Unit_C_S;
#ms += 1;
IF #ms =#Hz
THEN
    #s += 1;
    #s_V := #ms_V;
    #ms := 0;
    #ms_V := 0.0;
END_IF;
//秒流量累積
#s_V := #s_V+ #ms_V;
IF  #s = 60
THEN
    #min += 1;
    #min_V := #s_V;
    #s := 0;
    #s_V := 0.0;
END_IF;
//分鐘流量累積
#min_V := #min_V +#s_V;
IF #min = 60
THEN
    #h += 1;
    #h_V := #min_V;
    #min := 0;
    #min_V := 0.0;
END_IF;
//小時流量累積
#h_V := #h_V+#min_V;
IF #h = 24
THEN
    #d += 1;
    #d_V := #h_V;
    #h := 0;
    #h_V := 0.0;
END_IF;
#d_V += #h_V;
//清零
IF #Reset = 1
THEN
    #ms := 0;
    #ms_V := 0.0;
    #s := 0;
    #s_V := 0.0;
    #min := 0;
    #min_V := 0.0;
    #h := 0;
    #h_V := 0.0;
    #d_V := 0.0;
    #Accu_Value := 0.0;
END_IF;
//流量累積輸出
#Accu_Value := (#ms_V + #s_V + #min_V + #h_V+ #d_V);
[ 此帖被zxsxy8在2023-06-10 16:45重新編輯 ]