C#中依赖Twincat ADS的BOOL读取方法异常捕获及续行问题
解决Twincat ADS读取BOOL值的异常处理问题
你的核心问题是值类型bool无法返回null,导致读取失败时没法在不终止程序的情况下处理结果。下面给两种实用的解决方案:
方案一:返回可空布尔类型bool?
把方法返回类型改成bool?(可空值类型),成功时返回true/false,失败时返回null,同时在catch块输出对应提示:
public bool? ReadBool(string address) { try { return (bool)tcAds.ReadValue(address, typeof(bool)); } catch (TcAdsException ex) // 优先捕获ADS专属异常,避免吞掉其他未知错误 { if (ConnectionState == ConnectionStates.Connected) { Trace.WriteLine($"{address} 未找到"); } else { Trace.WriteLine("请尝试连接PLC"); } return null; // 读取失败返回null } catch (Exception ex) // 可选:捕获其他意外异常 { Trace.WriteLine($"读取发生未知错误:{ex.Message}"); return null; } }
调用时的处理逻辑:
bool? result = ReadBool("MyPlcVariable"); if (result.HasValue) { // 读取成功,使用result.Value Console.WriteLine($"读取结果:{result.Value}"); } else { // 读取失败,已输出提示,可做额外处理 }
方案二:使用输出参数+返回状态
如果不想用可空类型,用out参数返回实际值,方法返回bool表示读取是否成功:
public bool TryReadBool(string address, out bool result) { result = false; // 初始化默认值 try { result = (bool)tcAds.ReadValue(address, typeof(bool)); return true; // 读取成功返回true } catch (TcAdsException ex) { if (ConnectionState == ConnectionStates.Connected) { Trace.WriteLine($"{address} 未找到"); } else { Trace.WriteLine("请尝试连接PLC"); } return false; // 读取失败返回false } catch (Exception ex) { Trace.WriteLine($"读取发生未知错误:{ex.Message}"); return false; } }
调用示例:
if (TryReadBool("MyPlcVariable", out bool value)) { Console.WriteLine($"读取结果:{value}"); } else { // 读取失败,执行对应逻辑 }
额外提示
- 尽量不要用空catch块,优先捕获
TcAdsException这类具体异常,避免误吞严重错误(比如内存溢出、线程异常)。 - 若必须捕获所有异常,保留外层
catch (Exception)时一定要记录错误信息,方便后续排查。
内容的提问来源于stack exchange,提问作者CG33
相关产品推荐
相关产品推荐

