写了个变频器频率输入转化为模拟量输出控制的SCL控制 由于刚开始写SCL语言 编译老错误不知道问题在哪 哪位师傅帮忙看看。
问题补充:
感谢各为帮助 现在编译没错误了 但有个问题,我现在编译的也没用BEGIN 和结束FC返回,有了反而编译错误,现在是按照我心飞翔工程师的方法写的
图片说明:
最佳答案
SCL语言中,FC返回值不为VOID时,要求FC 必须返回一个值,你可以在 最后END FUNCTION前加个 FC30:=0;
第二,END_VAR 下一行,加个 BEGIN
第三,你程序中DB30.DBW0*10*27648 肯定超过了65535 ,也就是超过整形的表示范围,建议在计算时,AI1采用 浮点数,避免四舍五入。
第四,:在SCL 中DB30.DBW30 应该用DB30.DW30 来表示
所以你的程序可以这样来编
FUNCTION FC30:INT
VAR_TEMP
AI1:REAL;
END_VAR
BEGIN
AI1:=INT_TO_REAL(WORD_TO_INT(DB30.DW0))*10.0*27648.0/50.0;
PQW26:=INT_TO_WORD(REAL_TO_INT(AI1));
FC30:=0;
END_FUNCTION
你程序截图,编译是没有问题的,但是运行时可能出错
第一,标准SCL程序是以BEGIN开始的,没有错误 我也不知道为什么了。
第二,DB30.DBW0的值如果大于2,你的运算就会出错,INT类型的数据最大为32767,建议你用双整形或者符点数。
第三,FC 默认的是有返回值,你原来的程序中
FC 的定义是FUNCTION FC30:INT,表明必须返回一个值给调用者,所以 在最后 必须返回一个值
FC30:=x; 这个语句就是FC返回值,赋值语句X为任意的INT类型数据,
你新的程序中为什么不要类似FC30:=0;这样的语句了,因为你在定义FC时,声明了FC不需要返回之前,就以关键字VOID来表示,则FC的声明就是
FUNCTION FC30:VOID 了,说了这么多 希望你明白些。
提问者对于答案的评价:
感谢我心飞翔工程师的详细解答
专家置评
已阅,最佳答案正确。
原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc229449.html