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补充流程
- 遍历结构体数组的每个元素
- 对结构体中每个成员调用对应转换函数转为字符串
- 用逗号分隔成员字符串,若字符串包含逗号则包裹双引号(如
"Data, with comma") - 使用Beckhoff的
FB_FileWrite功能块将每行字符串写入CSV文件
内容的提问来源于stack exchange,提问作者Mirek
相关产品推荐
相关产品推荐

