예제 #1
0
        /// <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()));
            }
        }
예제 #2
0
        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);
        }
예제 #3
0
        /// <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"));
 }
예제 #5
0
        private void OnSet(bool success, JToken token)
        {
            if (!success)
            {
                _localException = new JetBusException(token);
            }

            _successEvent.Set();

            CommunicationLog?.Invoke(this, new LogEventArgs("Set data" + success));
        }
예제 #6
0
        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));
        }
예제 #7
0
        /// <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);
        }
예제 #8
0
 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();
     }
 }
예제 #9
0
        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));
        }
예제 #10
0
 private void OnConnected(bool connected)
 {
     if (connected)
     {
         FetchSelective();
         CommunicationLog?.Invoke(this, new LogEventArgs("Connection successful"));
     }
     else
     {
         _localException = new Exception("Connection failed");
         _successEvent.Set();
     }
 }
예제 #11
0
 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();
     }
 }
예제 #12
0
        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;
            }
        }
예제 #13
0
        /// <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);
        }
예제 #14
0
 /// <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"));
     }
 }
예제 #15
0
        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));
        }
예제 #16
0
        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);
        }
예제 #17
0
        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()]);
        }