我正在尝试编写 C# 应用程序,当应用程序与 PLC 失去连接或将下载新版本的 PLC 程序时,ADS 客户端将自动重新连接/更新读取/写入值和订阅。
我正在使用来自 NuGet 的TwinCAT.Ads.Reactive v4.4.0库。
我的程序流程是:
连接ADS服务器(连接成功)=>
- 使用ValueSymbolExtensions.WhenValueChanged创建反应式通知
创建反应循环写入值ValueSymbolExtensions.WriteValues
- 3[a] 创建响应式循环轮询值AnyTypeExtensions.PollValues.T
- 3[b] 我也尝试过 ValueSymbolExtensions.PollValues,这在 Beckhoff 网站上尚未记录
到目前为止,我发现即使我拔下以太网电缆或将新程序下载到 PLC,1. 和 2. 也能正常工作 -> WriteValues() 和 WhenValueChanged() 在内部自我更新
代码:
// WhenValueChanged()
TreeViewSymbols = SymbolLoaderFactory.Create(_client, SymbolLoaderSettings.Default).Symbols; // Load symbol tree from plc
IValueSymbol boolVal = (IValueSymbol)TreeViewSymbols["SomeBoolValue"];
boolVal.WhenValueChanged().Subscribe(Observer.Create<object>(val => ArchiveData((bool)val)));
// WriteValues()
IValueSymbol toggleBit = (IValueSymbol)TreeViewSymbols["toggle_bit"];
toggleBit.WriteValues(
Observable.Interval(TimeSpan.FromSeconds(1.0)).Select(x => x % 2 == 0 ? false : (object)true),
e => Debug.WriteLine($"Error writing toggle bit")
);
我每隔一秒读取一次PollValues()自定义数据结构。在正常运行期间,这工作正常,但是在我更改 PLC 程序并将更改下载到 PLC 或连接丢失(拔下以太网电缆)后,此订阅在内部失败,并且不会像上面的那样恢复。
IValueSymbol state = (IValueSymbol)TreeViewSymbols[Cfg.ModuleStateTag];
state.PollValues(TimeSpan.FromSeconds(1.0))
.Subscribe(Observer.Create<object>(
val => // val comes as byte[] array
{
var a = new ModuleStateData((byte[])val);
Debug.WriteLine($"Status values Machine Mode:{a.MachineMode}");
},
e => Debug.WriteLine($"Error reading status"),
() => Debug.WriteLine($"OnComplete???? reading status"))
).AddDisposableTo(_disposables);
_client.PollValues<ModuleStateData>(
Cfg.ModuleStateTag,
TimeSpan.FromSeconds(1.0)
).Subscribe(Observer.Create<object>(
val =>
{
Debug.WriteLine($"Status values Machine Mode:{val.MachineMode});
},
e => Debug.WriteLine($"Error reading status - {e.Message}"),
() => Debug.WriteLine($"OnComplete???? reading status"))
).AddDisposableTo(_disposables);
ConnectionStateChanged
此外,仅当我在广告客户端上调用 Connect()/Disconnect() 时才会触发连接状态更改事件,而不是在连接问题时触发。知道如何找出连接问题吗?