예제 #1
0
        /// <summary>处理Modbus消息</summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        protected virtual ModbusEntity Process(ModbusEntity entity)
        {
            // 如果是广播消息,则设置主站ID,便于其他人知道我的主站ID
            if (entity.Host == 0)
            {
                entity.Host = Host;
            }
            try
            {
                switch (entity.Function)
                {
                case MBFunction.ReadCoils:
                case MBFunction.ReadInputs:
                    entity = ReadCoils(entity);
                    break;

                case MBFunction.ReadHoldingRegisters:
                case MBFunction.ReadInputRegisters:
                    entity = ReadRegisters(entity);
                    break;

                case MBFunction.WriteSingleCoil:
                    entity = WriteSingleCoil(entity);
                    break;

                case MBFunction.WriteSingleRegister:
                    entity = WriteSingleRegister(entity);
                    break;

                case MBFunction.WriteMultipleCoils:
                    entity = WriteMultipleCoils(entity);
                    break;

                case MBFunction.WriteMultipleRegisters:
                    entity = WriteMultipleRegisters(entity);
                    break;

                case MBFunction.Diagnostics:
                    entity = Diagnostics(entity);
                    break;

                case MBFunction.ReportIdentity:
                    entity = ReportIdentity(entity);
                    break;

                default:
                    // 不支持的功能码
                    return(entity.SetError(Errors.FunctionCode));
                }

                return(entity);
            }
            catch (Exception ex)
            {
                //WriteLine(ex.Message);
#if MF
                Microsoft.SPOT.Debug.Print(ex.Message);
#else
                Ding.Log.XTrace.WriteLine(ex.ToString());
#endif

                // 执行错误
                return(entity.SetError(Errors.ProcessError));
            }
        }