luoyingdong
级别: 略有小成
精华主题: 0
发帖数量: 158 个
工控威望: 306 点
下载积分: 1203 分
在线时间: 103(小时)
注册时间: 2011-06-27
最后登录: 2024-11-22
查看luoyingdong的 主题 / 回贴
楼主  发表于: 2017-03-13 08:55
QCPU的PID指令用ST语言做成功能块使用, 有兴趣的请参考, 下方程序是2个LOOP例子。
1. 做成2个功能块,一个是PID_Initial, 另一个是PID_Control
2. PID_Initial 只要执行一次, PID_Control每一个LOOP执行一次。
3. PID_Initial 程序
    DB_PID_2.Loops_Number:=2;
    DB_PID_2.Loops_Execute:=1;
    SD794:=HFFFF;    SD795:=HFFFF;    (* No Limit *)    
    DB_PID_2.Loop1_Operation:=1;            (* 1=Reverse *)
    DB_PID_2.Loop1_Ts:=10;            (* Cycle Time *10ms *)
    DB_PID_2.Loop1_Kp:=100;            (* *0.01 *)
    DB_PID_2.Loop1_Ti:=100;            (* *0.1s *)
    DB_PID_2.Loop1_Td:=100;            (* *10ms *)
    DB_PID_2.Loop1_Filter:=10;
    DB_PID_2.Loop1_MVLL:=-32767;
    DB_PID_2.Loop1_MVHL:=32767;
    DB_PID_2.Loop1_DMVL:=100;
    DB_PID_2.Loop1_DPVL:=100;
    DB_PID_2.Loop1_sys1:=0;
    DB_PID_2.Loop1_Kd:=800;            (* *0.01 *)
    DB_PID_2.Loop1_sys2:=0;
    DB_PID_2.Loop1_sys3:=0;
    BMOV( 1 , DB_PID_2.Loop1_Operation , 14 , DB_PID_2.Loop2_Operation );
    S_PIDINIT( 1 , DB_PID_2.Loops_Number );
    DB_PID_2.Loop1_SV:=0;
    DB_PID_2.Loop1_PV:=0;
    DB_PID_2.Loop1_MVman:=0;
    DB_PID_2.Loop1_Auto:=0;
    DB_PID_2.Loop1_Alarm:=0;
    DB_PID_2.Loop2_SV:=0;
    DB_PID_2.Loop2_PV:=0;
    DB_PID_2.Loop2_MVman:=0;
    DB_PID_2.Loop2_Auto:=0;
    DB_PID_2.Loop2_Alarm:=0;

4. PID_Control程序
nAuto:=0;
IF Auto_Man THEN nAuto:=1; END_IF;
CASE Loop_Num OF
    1:
        DB_PID_2.Loop1_SV:=SV;
        DB_PID_2.Loop1_PV:=PV;
        DB_PID_2.Loop1_MVman:=MV_Man;
        DB_PID_2.Loop1_Auto:=nAuto;
        MV:=DB_PID_2.Loop1_MV;
    2:
        DB_PID_2.Loop2_SV:=SV;
        DB_PID_2.Loop2_PV:=PV;
        DB_PID_2.Loop2_MVman:=MV_Man;
        DB_PID_2.Loop2_Auto:=nAuto;
        MV:=DB_PID_2.Loop2_MV;
END_CASE;
Fred Lo
luoyingdong
级别: 略有小成
精华主题: 0
发帖数量: 158 个
工控威望: 306 点
下载积分: 1203 分
在线时间: 103(小时)
注册时间: 2011-06-27
最后登录: 2024-11-22
查看luoyingdong的 主题 / 回贴
1楼  发表于: 2017-03-20 12:00
我整理一下,再发出来。
Fred Lo