You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TwinCAT3 ST变量转字符串需求:解决CSV写入及类型转换问题

解决Beckhoff PLC中变量转字符串及CSV写入问题

问题背景

需将复杂结构体数组写入CSV文件,但Beckhoff自带的INT_TO_STRING()等类型转换函数无法正常调用(执行INT_TO_STRING(20)时提示UNEXPECTED INT_TO_STRING TOKEN),且自带字符串函数仅支持255字符上限。需实现以下任一需求:

  • 支持多类型转字符串的函数/功能块/库
  • 无长度限制的类似sprintf的格式化功能
  • 数字与ASCII字符双向转换函数

方案1:自定义多类型转字符串功能块

自行编写功能块处理常见数据类型的转换,避开自带函数的问题。以下是INT转字符串的示例:

FUNCTION_BLOCK FB_IntToString
VAR_INPUT
    nValue : INT;
END_VAR
VAR_OUTPUT
    sResult : STRING(1024); // 可按需调整字符串长度上限
END_VAR
VAR
    nAbsValue : UINT;
    nDigit : UINT;
    sTemp : STRING(1024);
END_VAR

// 处理负数
IF nValue < 0 THEN
    sTemp := '-';
    nAbsValue := UINT(-nValue);
ELSE
    sTemp := '';
    nAbsValue := UINT(nValue);
END_IF;

// 逐位转换数字
IF nAbsValue = 0 THEN
    sTemp := sTemp + '0';
ELSE
    WHILE nAbsValue > 0 DO
        nDigit := nAbsValue MOD 10;
        sTemp := CHR(48 + nDigit) + sTemp;
        nAbsValue := nAbsValue / 10;
    END_WHILE;
END_IF;

sResult := sTemp;

可基于此拓展,添加DINT、REAL等类型的转换逻辑:比如REAL转字符串时,拆分整数与小数部分分别转换后拼接。

方案2:实现无长度限制的类sprintf功能

利用TwinCAT支持的大长度自定义字符串(最大STRING(65535)),自行实现格式化逻辑:

FUNCTION_BLOCK FB_Sprintf
VAR_INPUT
    sFormat : STRING(255);
    nIntParam : INT; // 可按需添加REAL、STRING等参数
END_VAR
VAR_OUTPUT
    sResult : STRING(4096);
END_VAR
VAR
    nFormatPos : UINT := 1;
    cChar : CHAR;
    fbIntToString : FB_IntToString;
END_VAR

sResult := '';
WHILE nFormatPos <= LEN(sFormat) DO
    cChar := MID(sFormat, nFormatPos, 1);
    IF cChar = '%' THEN
        nFormatPos := nFormatPos + 1;
        cChar := MID(sFormat, nFormatPos, 1);
        CASE cChar OF
            'd': 
                fbIntToString(nValue := nIntParam);
                sResult := sResult + fbIntToString.sResult;
            // 可拓展支持%f、%s等格式符
        END_CASE;
    ELSE
        sResult := sResult + cChar;
    END_IF;
    nFormatPos := nFormatPos + 1;
END_WHILE;

根据需求调整sResult的长度上限即可突破255字符限制。

方案3:数字与ASCII双向转换函数

基于ASCII码值直接实现基础转换:

  • BYTE转CHAR
FUNCTION BYTE_TO_CHAR : CHAR
VAR_INPUT
    bValue : BYTE;
END_VAR
BYTE_TO_CHAR := CHR(bValue);
  • CHAR转BYTE
FUNCTION CHAR_TO_BYTE : BYTE
VAR_INPUT
    cValue : CHAR;
END_VAR
CHAR_TO_BYTE := ORD(cValue);

针对多字节数字转字符串,可基于此逻辑逐位处理数字,转换为对应ASCII字符(0-9对应48-57,负号对应45)后拼接。


结构体数组转CSV补充流程

  1. 遍历结构体数组的每个元素
  2. 对结构体中每个成员调用对应转换函数转为字符串
  3. 用逗号分隔成员字符串,若字符串包含逗号则包裹双引号(如"Data, with comma")
  4. 使用Beckhoff的FB_FileWrite功能块将每行字符串写入CSV文件

内容的提问来源于stack exchange,提问作者Mirek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 04:30:21