#制作一个在可视化界面可用于标准计算器功能详细案例#
前言:
我用PLC做了一套标准计算器算法,数学都是从1+1开始的,很遗憾关于此案例的前几篇文章没有多少人浏览,但是这个在CODESYS中运行的“计算器”程序代码功能,我是思考和研究了好几天的(个人总体觉得较难处理)。目前修复了已知的BUG和完善了其它功能,基本可以做到与电脑和手机的计算器同样的功能。后续有机会我会移植到博途TIA等其它PLC软件中。当然这个功能我已经做成了库文件,随时可以调用。
库文件下载连接:
https://download.csdn.net/download/weixin_44166380/90013314
先看调用后的运行效果:
CODESYS可视化标准计算器制作详细案例(四)
库文件的使用环境如下:
————————————————————————————————————————————
四、检测功能
https://blog.csdn.net/weixin_44166380/article/details/143812009?spm=1001.2014.3001.5502
结合之前如上连接的文章中的代码,具有检测的详细代码公布如下:
1.首字符处理
根据计算器功能,我们在输入字符的时候,首字母不允许出现运算符号,代码如下:
//获取等式的总长度
equationLength:=LEN(STR:=equationInput);
IF equationLength=0 THEN
IF equationTemp2='+' OR equationTemp2='*' OR equationTemp2='/' THEN
equationTemp2:='';
END_IF;
END_IF;
2.“.”字符处理
☕在一个数值中有且仅有一个小数点,不可以出现,比如"0.5.5";
☕部分计算器支持小数点可以作为前置字符,比如".5"相当于"0.5"(本程序也默认支持哈);
☕另外,小数点后面必须跟数字,不可以出现,比如"0.+"等等
综合以上,那么对于连续的公式,字符是怎么处理的呢?
//.后面必须跟数字
IF equationTemp1='.' THEN
IF equationTemp2='.' OR equationTemp2='*' OR equationTemp2='/' OR equationTemp2='+' OR equationTemp2='-' THEN
equationTemp2:='';
END_IF;
END_IF;
IF equationTemp2='.' THEN
(*关于'.',从最右边逐个搜索,如果检测到符号,则退出循环,表示可以加'.',如果检测到'.',将'.'去掉,退出循环,避免一个数值出现两个'.'*)
FOR k:=1 TO equationLength DO
equationTemp4:=MID(STR:=equationInput , LEN:=1 , POS:=equationLength-k );
IF equationTemp4='+' OR equationTemp4='-' OR equationTemp4='*' OR equationTemp4='/' THEN
EXIT;
END_IF;
IF equationTemp4='.' THEN
equationTemp2:='';
EXIT;
END_IF;
END_FOR;
END_IF;
关于避免两个"."的处理,有很多种方法,但是结合这个PLC程序,我试了很多种,基本上是最优解了,仔细看下,都是一些小细节。
3.运算字符处理
关于加减乘除的运算符号处理比较简单了,代码如下:
//加减后处理
IF equationTemp1='+' OR equationTemp1='-' THEN
IF equationTemp2='+' OR equationTemp2='-' OR equationTemp2='*' OR equationTemp2='/' THEN
equationTemp2:='';
END_IF;
END_IF;
//乘除后处理
IF equationTemp1='*' OR equationTemp1='/' THEN
IF equationTemp2='+' OR equationTemp2='*' OR equationTemp2='/' THEN
equationTemp2:='';
END_IF;
END_IF;
4.负号字符处理
重要!很重要!非常重要!
上几篇的文章中,我们虽然实现了计算器功能,但是有一套公式没有尝试,比如2*-3*-3,于是出现了BUG(计算出现了错误),关于乘号后面的负号处理,我也是研究了好久