通讯协议使用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);
}