技术论坛

 回复:用SCL语言写的子程序,循环20次需要10多毫秒,帮我看一下程序有什么不合理之处

返回主题列表
作者 主题
xiaoweny
游士

经验值:264
发帖数:132
精华帖:0
楼主    2012-02-23 11:04:01
主题:用SCL语言写的子程序,循环20次需要10多毫秒,帮我看一下程序有什么不合理之处
用SCL写了一个子程序, 子程序内部循环20次, 子程序本身在一个扫描周期内被调用3次, 也就是说一个扫描周期循环60次. 执行此子程序后扫描周期从20MS不到增加到60多毫秒. 源程序如下, 请各位大帮忙分析一下程序哪里有不合理之处, 先行谢过!

FUNCTION fc17 : VOID

// 此程序计算电容投入次数,每投入一次相应寄存器增1,输出容量相应增加;每切除一个,输出容量相应减少
VAR_INPUT
BitInStart1 : INT ; //需检测位字节起始地址
BitInStart2 : INT ; //需检测位位起始地址
BitTemp : INT ; //中间存储变量起始地址
BitTempL : INT ; //下降沿检测中间变量起始地址
length : INT ; //数据长度
SwitchNumP : INT ; //投入次数寄存器起始地址
TrueValueP : INT ; //真实电容值起始地址

END_VAR

VAR_IN_OUT
TotalOut : INT ; //总输出值
END_VAR

VAR_OUTPUT
//TotalOut : INT := 0; //总输出值

END_VAR


VAR_TEMP
BitOut : ARRAY [1..20] OF BOOL ; //当检测到上升沿时此位为1
BitOutL : ARRAY [1..20] OF BOOL ; //当检测到下降沿时此位为1
i,j : INT ;

END_VAR
IF start THEN
TOTALOUT := 0;
END_IF;
j := 0;
FOR i := 0 TO 19 BY 1 DO
////////////电容投入时次数加1,同时电容输出总容量增加
j := j + 1; //数据指针先偏1
bitout [ j ] := q[bitinstart1,BitInStart2 + i] AND NOT db5.dx[bittemp,i];
db5.dx[bittemp,i] := q[bitinstart1,BitInStart2 + i]; //此两行为检测上升沿
IF bitout [ j ] THEN
db1.dW[SwitchNumP + i * 4 + 2 ] := INT_TO_WORD(WORD_TO_INT(db1.dW[SwitchNumP + i * 4 + 2]) + 1) ; //投入次数增1
totalout := totalout + WORD_TO_INT (db1.dw[TrueValueP + i * 4 +2 ]); //电容输出总容量相应增加
IF totalout > 32767 THEN
totalout := 32767;//限制最大值
END_IF;
END_IF;
IF WORD_TO_INT(db1.dW[SwitchNumP + i * 4 + 2]) < 0 THEN
db1.dW[SwitchNumP + i * 4 + 2] := 0; //如果小于0,则将其清0
END_IF;
IF WORD_TO_INT(db1.dW[SwitchNumP + i * 4 + 2]) > 32767 THEN
db1.dW[SwitchNumP + i * 4 + 2] := 0; //超出范围清0
END_IF;
///////////电容切除时次数不变,同时电容输出总容量减少
BitOutL[ j ] := NOT q[ bitinstart1 , BitInStart2 + i ] AND NOT db5.dx[BitTempL, i];
db5.dx[BitTempL, i] := NOT q [ bitinstart1 , BitInStart2 + i ]; //此两行检测下降沿
IF bitoutl[j] THEN
totalout := totalout - WORD_TO_INT (db1.dw[TrueValueP + i * 4 + 2]); //电容输出总容量相应减少
//db1.dW[SwitchNumP + i * 4 + 2 ] := INT_TO_WORD(WORD_TO_INT(db1.dW[SwitchNumP + i * 4 + 2]) + 1) ; //投入次数增1

END_IF;
IF totalout < 0 THEN
totalout := 0;//限制最小值为0
END_IF;



END_FOR;





END_FUNCTION
Never too old to learn
我心依旧555
奇侠

经验值:6657
发帖数:769
精华帖:9
3楼    2012-02-25 18:45:37
精华帖  主题:回复:用SCL语言写的子程序,循环20次需要10多毫秒,帮我看一下程序有什么不合理之处
用STL编写吧,避免来回的在两个数据块之间打开,隐式数据类型的转换也会花掉一些时间的
一切皆有可能
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。