| 作者 | 主题 |
|---|---|
|
xiaoweny 游士
经验值:264 发帖数:132 精华帖:0 |
楼主
主题:用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楼
主题:回复:用SCL语言写的子程序,循环20次需要10多毫秒,帮我看一下程序有什么不合理之处
用STL编写吧,避免来回的在两个数据块之间打开,隐式数据类型的转换也会花掉一些时间的
一切皆有可能
|