/// <summary> /// Event with callend when raced a Fetch-Event by a other Peer. /// For testing it must be filled with pseudo data be tested in the UNIT tests. /// </summary> /// <param name="data"></param> public void OnFetchData(JToken data) { string path = data["path"].ToString(); string Event = data["Event"].ToString(); lock (_dataBuffer) { switch (Event) { case "add": _dataBuffer.Add(path, data["value"]); break; case "fetch": _dataBuffer[path] = data["value"]; break; case "change": _dataBuffer[path] = data["value"]; break; } if (IsConnected) { this.UpdateData?.Invoke(this, new EventArgs()); } CommunicationLog?.Invoke(this, new LogEventArgs(data.ToString())); } }
private async Task <ushort[]> ReadModbusRegistersAsync() { AllData = await _master.ReadHoldingRegistersAsync(WTX_SLAVE_ADDRESS, WTX_REGISTER_START_ADDRESS, WTX_REGISTER_DATAWORD_COUNT); CommunicationLog?.Invoke(this, new LogEventArgs("Read all: " + string.Join(",", AllData.Select(x => x.ToString("X")).ToArray()))); return(AllData); }
/// <summary> /// Event will be called when device sends new fetch events /// </summary> /// <param name="data">New device data from jet peer</param> private void OnFetchData(JToken data) { string path = data["path"].ToString(); lock (AllData) { switch (data["event"].ToString()) { case "add": AllData.Add(path, data["value"].ToString()); break; case "fetch": AllData[path] = data["value"].ToString(); break; case "change": AllData[path] = data["value"].ToString(); break; } if (IsConnected) { this.UpdateData?.Invoke(this, new EventArgs()); } CommunicationLog?.Invoke(this, new LogEventArgs(data.ToString())); } }
/// <summary> /// Closes the Modbus/TCP connection /// </summary> public void Disconnect() { if (_client != null) { _client.Close(); } IsConnected = false; CommunicationLog?.Invoke(this, new LogEventArgs("Disconnected")); }
private void OnSet(bool success, JToken token) { if (!success) { _localException = new JetBusException(token); } _successEvent.Set(); CommunicationLog?.Invoke(this, new LogEventArgs("Set data" + success)); }
private void OnSet(bool success, JToken token) { if (!success) { JetBusException exception = new JetBusException(token); _localException = new Exception(exception.ErrorCode.ToString()); } _successEvent.Set(); CommunicationLog?.Invoke(this, new LogEventArgs("Set data" + success)); }
/// <inheritdoc /> public async Task <int> WriteAsync(object command, int value) { ModbusCommand _command = (ModbusCommand)command; ushort registerAddress = (ushort)Convert.ToInt16(_command.Register); await _master.WriteSingleRegisterAsync(0, registerAddress, (ushort)(value << _command.BitIndex)); CommunicationLog?.Invoke(this, new LogEventArgs("Write register " + _command.Register + " to " + value.ToString())); return(value); }
private void OnConnectAuthenticate(bool connected) { if (connected) { _peer.Authenticate(_user, _password, OnAuthenticateFetchAll, _timeoutMs); CommunicationLog?.Invoke(this, new LogEventArgs("Connection successful")); } else { _localException = new Exception("Connection failed"); _successEvent.Set(); } }
private void OnSet(/*bool success, */ JToken token) { /* * if (!success) * { * JetBusException exception = new JetBusException(token); * _mException = new Exception(exception.Error.ToString()); * } */ _mSuccessEvent.Set(); CommunicationLog?.Invoke(this, new LogEventArgs("Set data" + true)); }
private void OnConnected(bool connected) { if (connected) { FetchSelective(); CommunicationLog?.Invoke(this, new LogEventArgs("Connection successful")); } else { _localException = new Exception("Connection failed"); _successEvent.Set(); } }
private void OnAuthenticateFetchAll(bool authenticationSuccess, JToken token) { if (authenticationSuccess) { CommunicationLog?.Invoke(this, new LogEventArgs("Authentication successful")); FetchAll(); } else { JetBusException exception = new JetBusException(token); _localException = new Exception(exception.Message); _successEvent.Set(); } }
private void WaitOne(int timeoutMultiplier = 1) { if (!_successEvent.WaitOne(_timeoutMs * timeoutMultiplier)) { throw new Exception("Jet connection timeout"); } if (_localException != null) { CommunicationLog?.Invoke(this, new LogEventArgs(_localException.Message)); Exception exception = _localException; _localException = null; throw exception; } }
/// <inheritdoc /> public bool WriteInteger(object command, int value) { bool result = true; ModbusCommand _command = (ModbusCommand)command; ushort[] _dataToWrite = new ushort[2]; switch (_command.DataType) { case DataType.U32: case DataType.S32: _dataToWrite[0] = (ushort)((value & 0xffff0000) >> 16); _dataToWrite[1] = (ushort)(value & 0x0000ffff); _master.WriteMultipleRegisters(WTX_SLAVE_ADDRESS, _command.Register, _dataToWrite); break; case DataType.BIT: _master.WriteSingleRegister(WTX_SLAVE_ADDRESS, _command.Register, (ushort)(value << _command.BitIndex)); break; case DataType.U08: case DataType.S16: case DataType.U16: default: _master.WriteSingleRegister(WTX_SLAVE_ADDRESS, _command.Register, (ushort)value); break; } if (_command.Register == WTX_REGISTER_EXECUTION_COMMANDS) { if (DoHandshake()) { CommunicationLog?.Invoke(this, new LogEventArgs("Write register " + _command.Register + " to " + value.ToString() + "successful")); } else { CommunicationLog?.Invoke(this, new LogEventArgs("Write register " + _command.Register + " to " + value.ToString() + "error")); result = false; } } else { CommunicationLog?.Invoke(this, new LogEventArgs("Write register " + _command.Register + " to " + value.ToString())); } return(result); }
/// <summary> /// Connect a Modbus/TCP device /// </summary> public void Connect(int timeoutMs = 20000) { try { _client = new TcpClient(IpAddress, MODBUS_TCP_PORT); var factory = new ModbusFactory(); _master = factory.CreateMaster(_client); IsConnected = true; CommunicationLog?.Invoke(this, new LogEventArgs("Connection successful")); } catch (Exception) { IsConnected = false; CommunicationLog?.Invoke(this, new LogEventArgs("Connection failed")); } }
private void OnFetch(bool success, JToken token) { if (success) { IsConnected = true; } else { JetBusException exception = new JetBusException(token); _localException = new Exception(exception.ErrorCode.ToString()); } _successEvent.Set(); this.UpdateData?.Invoke(this, new EventArgs()); CommunicationLog?.Invoke(this, new LogEventArgs("Fetch-All success: " + success + " - Buffer size is " + AllData.Count)); }
public async Task <ushort[]> SyncData() { ushort[] value = new ushort[1]; await Task.Run(() => { switch (behavior) { case Behavior.ReadFail: // If there is a connection fail, all data attributes get 0 as value. for (int i = 0; i < _dataWTX.Length; i++) { _dataWTX[i] = 0x0000; } _logObj = new LogEventArgs("Read failed : Registers have not been read"); CommunicationLog?.Invoke(this, _logObj); break; case Behavior.ReadSuccess: // The most important data attributes from the WTX120 device: _dataWTX[0] = 0x0000; _dataWTX[1] = 0x4040; _dataWTX[2] = 0x0000; _dataWTX[3] = 0x4040; _dataWTX[4] = 0x0000; _dataWTX[5] = 0x0000; _logObj = new LogEventArgs("Read successful: Registers have been read"); CommunicationLog?.Invoke(this, _logObj); break; case Behavior.NetGrossValueStringComment_0D_Success: _dataWTX[5] = 0x0000; break; case Behavior.NetGrossValueStringComment_0D_Fail: _dataWTX[5] = 0x60; break; case Behavior.NetGrossValueStringComment_1D_Success: _dataWTX[5] = 0x10; break; case Behavior.NetGrossValueStringComment_2D_Success: _dataWTX[5] = 0x20; break; case Behavior.NetGrossValueStringComment_3D_Success: _dataWTX[5] = 0x30; break; case Behavior.NetGrossValueStringComment_3D_Fail: _dataWTX[5] = 0x00; break; case Behavior.NetGrossValueStringComment_4D_Success: _dataWTX[5] = 0x40; break; case Behavior.NetGrossValueStringComment_5D_Success: _dataWTX[5] = 0x50; break; case Behavior.NetGrossValueStringComment_6D_Success: _dataWTX[5] = 0x60; break; // Simulate for testing 'Unit': case Behavior.t_UnitValue_Success: _dataWTX[5] = 0x100; break; case Behavior.t_UnitValue_Fail: _dataWTX[5] = 0x0000; break; case Behavior.kg_UnitValue_Success: _dataWTX[5] = 0x0000; break; case Behavior.kg_UnitValue_Fail: _dataWTX[5] = 0xFFFF; break; case Behavior.g_UnitValue_Success: _dataWTX[5] = 0x80; break; case Behavior.g_UnitValue_Fail: _dataWTX[5] = 0x0000; break; case Behavior.lb_UnitValue_Success: _dataWTX[5] = 0x180; break; case Behavior.lb_UnitValue_Fail: _dataWTX[5] = 0x0000; break; // Simulate for testing 'Limit status': case Behavior.LimitStatusStringComment_Case0_Fail: _dataWTX[4] = 0xC; break; case Behavior.LimitStatusStringComment_Case1_Fail: _dataWTX[4] = 0x8; break; case Behavior.LimitStatusStringComment_Case2_Fail: _dataWTX[4] = 0x0000; break; case Behavior.LimitStatusStringComment_Case3_Fail: _dataWTX[4] = 0x4; break; case Behavior.LimitStatusStringComment_Case0_Success: _dataWTX[4] = 0x0000; break; case Behavior.LimitStatusStringComment_Case1_Success: _dataWTX[4] = 0x4; break; case Behavior.LimitStatusStringComment_Case2_Success: _dataWTX[4] = 0x8; break; case Behavior.LimitStatusStringComment_Case3_Success: _dataWTX[4] = 0xC; break; // Simulate for testing 'Weight moving': case Behavior.WeightMovingStringComment_Case0_Fail: _dataWTX[4] = 0x0010; break; case Behavior.WeightMovingStringComment_Case1_Fail: _dataWTX[4] = 0x0000; break; case Behavior.WeightMovingStringComment_Case0_Success: _dataWTX[4] = 0x0000; break; case Behavior.WeightMovingStringComment_Case1_Success: _dataWTX[4] = 0x0010; break; // Simulate for testing 'Weight type': case Behavior.WeightTypeStringComment_Case0_Fail: _dataWTX[4] = 0x0080; break; case Behavior.WeightTypeStringComment_Case1_Fail: _dataWTX[4] = 0x0000; break; case Behavior.WeightTypeStringComment_Case0_Success: _dataWTX[4] = 0x0000; break; case Behavior.WeightTypeStringComment_Case1_Success: _dataWTX[4] = 0x0080; break; // Simulate for testing 'Scale range': case Behavior.ScaleRangeStringComment_Range1_Fail: _dataWTX[4] = 0x200; break; case Behavior.ScaleRangeStringComment_Range2_Fail: _dataWTX[4] = 0x0000; break; case Behavior.ScaleRangeStringComment_Range3_Fail: _dataWTX[4] = 0x100; break; case Behavior.ScaleRangeStringComment_Range1_Success: _dataWTX[4] = 0x0000; break; case Behavior.ScaleRangeStringComment_Range2_Success: _dataWTX[4] = 0x100; break; case Behavior.ScaleRangeStringComment_Range3_Success: _dataWTX[4] = 0x200; break; case Behavior.LogEvent_Fail: _logObj = new LogEventArgs("Read failed : Registers have not been read"); CommunicationLog?.Invoke(this, _logObj); break; case Behavior.LogEvent_Success: _logObj = new LogEventArgs("Read successful: Registers have been read"); CommunicationLog?.Invoke(this, _logObj); break; } if (_dataWTX[5] == 0x0000) { _dataWTX[5] = 0x4000; } else if (_dataWTX[5] == 0x4000) { _dataWTX[5] = 0x0000; } this.UpdateDictionary(); // Update data in data classes : this.UpdateData?.Invoke(this, new EventArgs()); return(_dataWTX); }); this.UpdateDictionary(); // Update data in data classes : this.UpdateData?.Invoke(this, new EventArgs()); return(_dataWTX); }
protected JToken ReadObj(object index) { switch (this.behavior) { case Behavior.CalibrationSuccess: if (_dataBuffer.ContainsValue(1801543519)) { _dataBuffer["6002/02"] = 1634168417; // = command 'on go', in exection. } else if (_dataBuffer.ContainsValue(1634168417)) { _dataBuffer["6002/02"] = 1801543519; // = command ok, done. } return(_dataBuffer["6002/02"]); case Behavior.CalibrationFail: if (_dataBuffer.ContainsValue(1801543519)) { _dataBuffer["6002/02"] = 1634168417; // = command 'on go', in exection. } else if (_dataBuffer.ContainsValue(1634168417)) { _dataBuffer["6002/02"] = 1801543519; // = command ok, done. } return(_dataBuffer["6002/02"]); case Behavior.MeasureZeroSuccess: if (_dataBuffer.ContainsValue(1801543519)) { _dataBuffer["6002/02"] = 1634168417; // = command 'on go', in exection. } else if (_dataBuffer.ContainsValue(1634168417)) { _dataBuffer["6002/02"] = 1801543519; // = command ok, done. } return(_dataBuffer["6002/02"]); case Behavior.MeasureZeroFail: if (_dataBuffer.ContainsValue(1801543519)) { _dataBuffer["6002/02"] = 1634168417; // = command 'on go', in exection. } else if (_dataBuffer.ContainsValue(1634168417)) { _dataBuffer["6002/02"] = 1801543519; // = command ok, done. } return(_dataBuffer["6002/02"]); default: break; } if (IsConnected) { this.UpdateData?.Invoke(this, new EventArgs()); } CommunicationLog?.Invoke(this, new LogEventArgs(index.ToString())); return(_dataBuffer[index.ToString()]); }