调用pyads的get_all_symbols()报symbol not found (1808)错误原因是什么
首先明确:报错中的1808不是你请求的符号编号,是ADS协议的标准错误码,含义为「指定符号未找到」。该报错是get_all_symbols()方法内部读取PLC符号表元数据时触发的,和你代码中没有主动请求特定符号无关。
排查步骤
- 检查PLC符号上传权限:打开Twincat XAE中的PLC项目,进入项目属性→Build选项卡,确认已勾选Create symbol file和Download symbol file两个选项,将修改后的项目重新下载到PLC,重启PLC运行后再测试脚本。
- 验证符号读取权限:使用Twincat官方的ADS Scope或者PLC符号浏览器工具,输入相同的AMS Net ID和端口,确认能否正常拉取当前运行PLC的全量符号列表,排除账号权限不足的问题。
- 确认版本兼容性:pyads 3.3.8对部分较高版本的Twincat 3固件(Build版本≥4024)存在符号表读取兼容问题,旧版封装的符号表读取地址和新版PLC的实际元数据地址不匹配,就会触发该报错。
解决方法
- 方案1:调整pyads版本,卸载当前3.3.8版本,测试安装兼容性更广的pyads 3.2.11版本,或者最新的pyads 3.4.0版本,大部分场景下更换版本即可解决该问题。
- 方案2:如果已知需要读取的符号名列表,跳过全量符号表拉取逻辑,直接通过
plc.read_by_name(符号名, 数据类型)方法读取对应值,不会触发该报错。 - 方案3:手动调用ADS低级接口读取符号表,跳过
get_all_symbols()的封装逻辑,直接读取索引组0xF002、索引偏移0x0000的符号表元数据,自行解析二进制返回结果得到所有符号信息。
内容的提问来源于stack exchange,提问作者mmachenry
相关产品推荐
相关产品推荐

