调试看着还行。
//Main
netwrok1
LD Always_On
TON T60, +10
network2
LD T60
O First_Scan_On
R T60, 1
CALL SBR_0, 1.0, 1, 60, 1, MD0, MD4, MD8
//
//
//SBR_0
//PID公式
// Mn = MPn + MIn + MDn
// Output = proportional term + integral term + differentiat term
//其中
//
//比例:
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// MPn = Kc * ( SPn - PVn )
//
// MPn 比例输出
// Kc 增益
// SPn 设定
// PVn 当前采样值
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
//积分:
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// MIn = Kc * Ts / Ti * ( SPn - PVn ) + MX
//
// MIn 积分输出
// Kc 增益
// Ts 循环时间
// Ti 积分时间
// SPn 设定
// PVn 当前值采样值
// MX 前一次积分输出
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
//微分:
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// MDn = Kc * Td / Ts * ( PVn-1 - PVn )
//
// MDn 微分输出
// Kc 增益
// Ts 循环时间
// Td 微分时间
// SPn 当前设定
// SPn-1 前一次循环设定
// PVn 当前值采样值
// PVn-1 前一次采样值
//
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
network1//算出Ts/Ti、Td/Ts,Mx 置零
//
LD First_Scan_On
ITD #Ts, AC0
DTR AC0, #TsDivTi
ITD #Td, AC0
DTR AC0, AC0
MOVR AC0, #TdDivTs
/R #TsDivTi, #TdDivTs
ITD #Ti, AC0
DTR AC0, AC0
/R AC0, #TsDivTi
MOVR 0.0, #Mx
//
network2//PVn - Sp 差值(符号跟公式里相反)
//
LD Always_On
MOVR #PVn, #Diff
-R #SP, #Diff
//
network3//积分部
//
LD Always_On
LPS
MOVR #TsDivTi, AC0
*R #Diff, AC0
*R #Kc, AC0
+R AC0, #Mx
AR> #Mx, 1.0
MOVR 1.0, #Mx
LPP
AR< #Mx, -1.0
MOVR -1.0, #Mx
//
network4//线性及微分部
//
LD Always_On
MOVR #TdDivTs, AC0
+R 1.0, AC0
*R #Kc, AC0
*R #Diff, AC0
//
network5//PID输出
//
LD Always_On
LPS
MOVR AC0, #Mn
+R #Mx, #Mn
AR> #Mn, 1.0
MOVR 1.0, #Mn
LPP
AR< #Mn, -1.0
MOVR -1.0, #Mn
请各位不吝赐教!