配置系统参数的方法

通讯协议使用modbus,modbus表存入RAM,系统参数使用上位机软件通过modbus协议进行参数的修改,修改后的参数存在modbus表区,下位机的逻辑是通过修改的地址进行预判是否修改参数,例如通过读取RAM-modbus表区获取基本参数和无线参数、有限参数,复写到我们的FRAM系统参数区进行掉电保护。

void
xMemConfigurationFromModbus(u16 address)
{
	u8	i;
	u16	cmd;
	typMemGlobal	mem1;
	typMemWLan		mem2;
	typMemLan		mem3;
	typMemModbusRegister	*pModbus;

	/** 读Modbus数据		*/
	pModbus = (typMemModbusRegister*)malloc(sizeof(typMemModbusRegister));
	if (pModbus == RF_NULL) {
		APP_TRACE(INFO_ERROR|APP_DBG_HALT, ("MEMORY_80\n"));
	}
	xMemGetModbusRegister(pModbus);
	switch (address) {
	case MBH_REMOTE_CMD: {
		cmd = mb_4xxxx_read_word(MBH_REMOTE_CMD);
		mb_4xxxx_write_word(MBH_REMOTE_CMD, 0u);
		switch (cmd) {
		case MBC_SYSTEM_RESET: {						/* 复位系统 									*/
			APP_TRACE(INFO_SYSTEM, ("Resest System!\n\n\n\n"));
			BSP_SystemRestart();
			break;
		}
		case MBC_PARAM_RESET: {							/* 复位基本参数 								*/
			APP_TRACE(INFO_SYSTEM, ("Resest Parameter!\n"));
			xMemSetDefaultConfig(1);
			break;
		}
		case MBC_ZB_PARAM_RESET: {						/* 复位zigbee参数								*/
			APP_TRACE(INFO_SYSTEM, ("Resest zigbee!\n"));
			xMemSetDefaultConfig(3);
			ZB_ReInit();
			break;
		}
		default:
			break;
		}
		break;
	}
	case MBH_REC_ENABLE: {								/* 历史记录开关									*/
		if (mb_4xxxx_read_word(MBH_REC_ENABLE) != 0u) {
			pMem->write_flag(FLAG_HIS_ENABLE, 1u);
		} else {
			pMem->write_flag(FLAG_HIS_ENABLE, 0u);
		}
		break;
	}
	case MBH_REC_CLEAN: {								/* 清除历史记录									*/
		if (mb_4xxxx_read_word(MBH_REC_CLEAN) == 1u) {
			pMem->write_flag(FLAG_HIS_CLR, 1u);
		}
		break;
	}
	case MBH_ZIGBEE_RESET: {							/* 复位zigbee模块								*/
		cmd = mb_4xxxx_read_word(MBH_ZIGBEE_RESET);
		if (cmd == MBC_ZB_RESET) {
			ZB_ReInit();
			mb_4xxxx_write_word(MBH_ZIGBEE_RESET, 0u);
		}
		break;
	}
	case MBH_READ_DIAG: {
		/** 判断无线功图命令	*/
		cmd = mb_4xxxx_read_word(MBH_READ_DIAG);
		mb_4xxxx_write_word(MBH_READ_DIAG, 0u);
		if ((cmd&0xFF00) == 0xCE00) {
			master_read_remote_diag(cmd&0x00FF);
		}
		break;
	}
	default:
		/** 必须在解锁位写入0x1234之后才有效修改参数	*/
		cmd = mb_4xxxx_read_word(MBH_KEY);
		if (cmd == MBS_KEY) {
			/** 修改RTC			*/
			if (address <= MBH_RTC_DAY) {
				u8	tmp[6];
				tmp[0]	= pModbus->hour;
				tmp[1]	= pModbus->minute;
				tmp[2]	= pModbus->second;
				tmp[3]	= pModbus->year;
				tmp[4]	= pModbus->month;
				tmp[5]	= pModbus->day;
				BSP_RTC_Write(tmp);
				return;
			} else if (address <= MBH_BASE_END) {		/* 修改基本参数									*/
				/** 读取配置参数并修改	*/
				pMem->read_global((u8*)&mem1, sizeof(typMemGlobal));
				for (i=0; i<3; i++) {
					mem1.rs485[i].baud	= pModbus->RS485_Param[i].baud;
					mem1.rs485[i].parity= pModbus->RS485_Param[i].parity;
				}
				for (i=0; i<4; i++) {
					mem1.ip[i]	= pModbus->ip[i];
					mem1.mask[i]= pModbus->mask[i];
					mem1.gw[i]	= pModbus->gw[i];
				}
				mem1.tcp_port	= pModbus->TcpPort;
				mem1.timeout	= pModbus->Timeout;
				mem1.retry		= pModbus->RetryTimes;
				/** 无线设备设备号存储	*/
				for (i=0u; i
   
   
    
    read_wlan(CFG_WLAN_LEN*i, (u8*)&mem2, sizeof(typMemWLan));
					if (D_U16_HIGH(pModbus->wlanStatus[i]) == 1) {
						mem2.device = D_U16_LOW(pModbus->wlanStatus[i]);
						pMem->write_wlan(CFG_WLAN_LEN*i, (u8*)&mem2, sizeof(typMemWLan));
					}
				}
				/** 有线设备设备号存储	*/
				for (i=0u; i
    
    
     
     read_lan(CFG_LAN_LEN*i, (u8*)&mem3, sizeof(typMemLan));
					if (D_U16_HIGH(pModbus->lanStatus[i]) == 1) {
						mem3.device = D_U16_LOW(pModbus->lanStatus[i]);
						pMem->write_lan(CFG_LAN_LEN*i, (u8*)&mem3, sizeof(typMemLan));
					}
				}
				pMem->write_global((u8*)&mem1, sizeof(typMemGlobal));
			}
		}
		break;
	}
	free(pModbus);
}
    
    
   
   

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值