1. 变量类型转换技巧

1.1. TwinCAT 3当中,将实数转换成字符串的科学计数法格式改成小数格式的函数

FUNCTION ConvertScientificToDecimal : STRING

VAR_INPUT

num   : LREAL; 

END_VAR

VAR

    count  : INT := 0;  // 循环次数,记录在num大于等于1之前乘以10的次数

    strNum  : STRING;  // 用于保存转换后的字符串

    strNumNoDot  : STRING;  // 不带小数点的字符串

iDotPos  : INT; // 小数点的位置

    dotIndex   : INT;  // 小数点的索引位置

    i   : INT;  // 用于循环

zeros  : STRING; // 0的个数

END_VARIF ABS(num) < 1.0 THEN


    // 通过循环将小数点右移,直到num大于等于1

    WHILE ABS(num) < 1.0 DO

        num := num * 10;

        count := count + 1;

    END_WHILE;

    

    // 将num转换为字符串

    strNum := LREAL_TO_STRING(num);

IF num <0 THEN 

strNum := DELETE(strNum, 1, FIND(strNum,'-'));

ELSE

strNum := strNum;

END_IF

iDotPos := FIND(strNum, '.');

IF  ((FIND(strNum, '.0') <>0  AND ( LEN(strNum) - iDotPos) = 1)) THEN   

     strNumNoDot :=DELETE(strNum,2,iDotPos);

  ELSE

   // 找到小数点的索引位置

     dotIndex := FIND(strNum,'.');

    

     // 删除小数点

     strNumNoDot := DELETE(strNum, 1, dotIndex);

END_IF

    


    // 构建由零组成的字符串

    zeros := '';

    FOR i := 1 TO count - 1 DO

        zeros := CONCAT(zeros, '0');

    END_FOR

IF num > 0 THEN

     // 构建最终的字符串

       strNum := CONCAT('0.', CONCAT(zeros, strNumNoDot));

 

ELSIF num < 0 THEN

strNum := CONCAT('-0.', CONCAT(zeros, strNumNoDot));

ELSE

strNum := '0';

END_IF

ELSE

    // 如果num不小于1,直接转换为字符串

    strNum := LREAL_TO_STRING(num);

END_IF


// 返回最终的字符串

ConvertScientificToDecimal := strNum;


余洋 2024.3.11 编辑