字符串无法转换为整数(PLC不报错)的典型原因与解决
你的截图里用的是 DABIN_U(十进制 ASCII → 无符号 BIN)FB,左侧有SM400常开、M1120上升沿触发;右侧看到ZRST、SM705等。转换失败但无报错,多半落在下面这些“隐性条件”上。
一、先用一条“黄金示例”验证功能是否 OK
-
定义变量:
VAR
S : STRING[8] := '500';
N : INT := 3; // 要转换的位数
R : DINT := 0; // 结果(32位)
END_VAR
-
Ladder / FBD 里调用:
DABIN_U(EN:=M1120, S:=S, N:=N, Q:=R);
-
在线监视R是否变为 500。若这条能成功,说明库函数与固件没问题,后续就是数据/类型/参数的问题。
二、你现在这种“有值但转不出来”的高频原因(按命中率排)
-
目的寄存器类型/对齐不对
-
DABIN_U 输出是 32 位。请把目标定义成DINT/UDINT(双字),并确保存放在偶地址(如D100而不是D101)。
-
如果你把Q绑成WORD/INT或奇地址,表面“无报错”,实际数据写偏了。
-
传入的是 WSTRING(全角/中文环境)或含非数字字符
-
仅支持ASCII '0'..'9'、可选 ± 号。如果项目是 Unicode,变量是WSTRING或输入了全角数字(如 ‘500’),函数会直接返回 0。
-
确保变量是STRING,且内容是'500'这类半角数字。
-
N(长度)与实际不符 / 末尾没有终止
-
N代表要解析的字符个数。你的截图里像是把‘500’与另外一个字符串变量一起并列,容易把N写错。
-
做法:N := LEN(S)或直接填常数 3 测试;确认没有混入空格、回车等不可见字符。
-
字符串来源是结构体/数组的指针偏移错
-
如果S不是独立的STRING,而是某结构里的一段缓冲区,请确认你传的是首地址而不是中间地址。
-
触发条件频繁/并行调用,Q 被后续逻辑覆盖
-
用M1120上升沿只调用一次是对的;检查后面是否立刻ZRST或把R清零。
三、没有“报错”的原因 & 如何判定转换是否成功
-
这类 FB 默认不抛系统报警;失败一般通过ENO/ERR引脚或状态位反映。把 FB 的 ENO/ERR 接到一个监视位(如M1200)观察。
-
若项目里有SM705(演示用),这不是 DABIN 的错误位;不要拿它当转换失败指示。
四、可替代方法(验证更快)
-
Structured Text: R := VAL(S);(VAL 也要求STRING,遇到非数字会停在首个非法字符)
-
带符号处理: 用DABIN(有符号)或先判断首字符是否为'-',再对DABIN_U结果取反。
五、把你的这两处再改一下,基本就能好了
-
把目标变量 好评轮_数量 声明为DINT,并映射到偶数D(如D200)。
-
确认 str开评轮_数量 的类型是STRING(非 WSTRING),内容为半角数字;N=3 或LEN()。
-
FB 输出ENO拉出来监视;在 FB 后面去掉立即清零(ZRST)的影响,再看一次结果。
如果方便,发我:① 变量类型截图(S/N/Q 三个参数的实际类型与 D 地址),② 字符串的在线值(看有没有空格/全角),我可以按你的项目直接改成可运行的那一段。