发布于 2009-05-18 20:14:57
0楼
VAR_INPUT
Init : BOOL; // Initialize//初始化
ActPos : REAL; // [mm][癩 actual position value//当前实际位置
PT1 : REAL; // [ms] low pass time//低通时间?
Cycle : INT; // [ms] CPU cycle time//CPU循环时间
END_VAR
VAR_IN_OUT
OldPos : REAL; // [mm][癩 last value//上一时刻位置
v : REAL; // [m/s][?s] Speed//速度
END_VAR
VAR_OUTPUT
VOut : REAL; // [mm/s][?s] Speed//速度(mm/s)
END_VAR
VAR_TEMP
v_p : REAL;
v_raw : REAL;
END_VAR
BEGIN
IF Init THEN
OldPos := ActPos;
v := 0.0;//初始化则将当前位置赋值给OldPos,并令v等于0
END_IF;
v_p := ActPos - OldPos;//这句话什么意思?//下个扫描周期,将当前位置减去初始化位置(以后的每个扫描周期都是第N+1个扫描周期位置-第N个扫描周期位置),即可看作物理学中位移信息。
OldPos := ActPos; //这句话什么意思?第1个周期时,v_p=0,第2个周期时v_p=pos2-pos1,然后另oldpos=pos2。。。。。则第N个周期时V_P=pos(N)-pos(N-1),第N+1个周期时,V_P=pos(N+1)-pos(N),依次循环。
// mm/ms deg/ms
v_raw := v_p / Cycle; //这句话什么意思?//一个周期的位移/扫描周期便是上一个周期的速度
// lowpass
v := v + Cycle/PT1 * (v_raw - v );//这句话什么意思?//注意到V是IN_OUT变量。则第N个周期时此出v的值是第N-1个周期的V,即上一个周期的速度值,于是可以这样认为,上个周期的速度v+(本周起计算的速度v_raw-上个周期的计算速度v)*修正系数Cycle/PT1
// only 2 digits
VOut := DINT_TO_REAL (REAL_TO_DINT(v * 100000.0)) / 100.0;//这句话什么意思?
双整型的v转成实型后除以100.0后再转成实型,应该是为保持精度设置的,精度应该是小数点后2位。
其实写plc程序除了逻辑思维好、熟悉各种特性外一定要对微机原理有了解。
你这个程序是ABB的还是哪的啊,西门子的我没见过 IF THEN的语句啊
西门子的FBD和类似汇编的用法很不错,其实熟练的应该是用STL的
最近接触了编程语言发现VACON变频器的NC1131不错,FBD,自然语言,LAD都可以,很灵活的
要做自己开心的事情!