diff --git a/Anjiehui7_DTU/User/dwin_form.c b/Anjiehui7_DTU/User/dwin_form.c index 6dba7e9..1167934 100644 --- a/Anjiehui7_DTU/User/dwin_form.c +++ b/Anjiehui7_DTU/User/dwin_form.c @@ -39,7 +39,7 @@ loopbuff_t Form_DataM; uint8_t Form_DataM_Data[sizeof(form_data_t) * (FORM_DATA_COUNT + 1)] = {0}; SemaphoreHandle_t Form_DataQ = NULL; SemaphoreHandle_t Form_DataLock = NULL; - +static int16_t topPtr=0; // 屏幕读取结果队列 #define FORM_READ_COUNT 3 loopbuff_t Form_ReadM; @@ -359,7 +359,19 @@ void Form_RefreshGrid2(form_grid2_t *grid) // 加入队列 LoopBuff_PutItem(&Form_DataM, (uint8_t *) &formData); } - + //boxCnt.count=12; + formData.oper = DWIN_OPER_WRITE; + formData.Addr = 0x9002; + formData.count = 2; + formData.word[0] = htons((boxCnt.count/30)+1); + LoopBuff_PutItem(&Form_DataM, (uint8_t *) &formData); + formData.oper = DWIN_OPER_WRITE; + formData.Addr = 0x9000; + formData.count = 2; + formData.word[0] = htons((topPtr/30)+1); + LoopBuff_PutItem(&Form_DataM, (uint8_t *) &formData); + + // 再将备份缓冲作为显示缓冲 for(i = 0; i < 30; i++) { @@ -675,6 +687,13 @@ void Form_Task(void *p_arg) "BOX ", "PSN "," BOX ", "PSN "," BOX ", "PSN "); data.count = strlen(data.str); DWIN_Refresh(&data); + +// data.oper = DWIN_OPER_WRITE; +// data.Addr = gridBox.hdrAddr+0x1000; +// sprintf(data.str, "%6s", +// "00"); +// data.count = strlen(data.str); +// DWIN_Refresh(&data); // 设置曲线的纵坐标 // 绿轴:液位(百分比) @@ -2483,15 +2502,21 @@ void Form_En_About() Form_RefreshGrid(&gridAboutEn); } -static int16_t topPtr=0; + void Form_BOX_PSN() { +// static form_data_t data2; int i=0; uint8_t row = 0; int16_t rowCount=0; topPtr=0; + gridBox.rowCount=boxCnt.count;// rowCount=gridBox.rowCount; - if(rowCount>30)rowCount=30; + if(rowCount>30) + { + rowCount=30; + gridBox.rowCount=30; + } for(i=0; iInstance->DR; + uint8_t u8DTU = (uint8_t) huart->Instance->DR; - /* Handle received data */ - ReadModbus_Task(u8DTU); + /* Handle received data */ + ReadModbus_Task(u8DTU); } void Modbus_Open() { - // 创建消息队列 - LoopBuff_Create(&Modbus_SendM, sizeof(ext_data_t), MODBUS_SENDM_DATA_COUNT, 0, (uint32_t) Modbus_SendM_Data); + // 创建消息队列 + LoopBuff_Create(&Modbus_SendM, sizeof(ext_data_t), MODBUS_SENDM_DATA_COUNT, 0, (uint32_t) Modbus_SendM_Data); - // 创建信号量 - Modbus_SendQ = xSemaphoreCreateBinary(); + // 创建信号量 + Modbus_SendQ = xSemaphoreCreateBinary(); } uint8_t pack_heart_send_data() { - uint8_t i; - uint16_t crc; - - // 打包上报数据(按modbus从机响应的格式) - memset(Heart_sendBuff, 0, HEART_SENDBUFF_SIZE); - i = 0; - - // PSN - memmove(Heart_sendBuff + i, dcBuff.configBottle.PSN, 6); - i += 6; - - Heart_sendBuff[i++] = 0x02; // 命令码:心跳 + uint8_t i; + uint16_t crc; - // 数据长度:先预设为0,最后再修改,位置为Heart_sendBuff[7] - Heart_sendBuff[i++] = 0; - - // 硬件版本 - Heart_sendBuff[i++] = dcBuff.powerInfo.hardVer.minor; - // 软件版本 - Heart_sendBuff[i++] = dcBuff.powerInfo.softVer.minor; - // 软件日期 - Heart_sendBuff[i++] = dcBuff.powerInfo.softDate.year; - Heart_sendBuff[i++] = dcBuff.powerInfo.softDate.month; - Heart_sendBuff[i++] = dcBuff.powerInfo.softDate.day; + // 打包上报数据(按modbus从机响应的格式) + memset(Heart_sendBuff, 0, HEART_SENDBUFF_SIZE); + i = 0; - // 射频自检状态 - Heart_sendBuff[i++] = RF_initStatus; - // 网口自检状态 - Heart_sendBuff[i++] = Ethernet_initStatus; - // 网络连接状态 - Heart_sendBuff[i++] = Ethernet_IsConnected(); - // GPRS入网状态 - Heart_sendBuff[i++] = dcBuff.dtuData.networked; - // GPRS信号强度 - Heart_sendBuff[i++] = dcBuff.dtuData.rssi; - // GPRS连接状态 - Heart_sendBuff[i++] = dcBuff.dtuData.connected; - - // 保留备用 - i += 41; - - // 修改数据长度 - Heart_sendBuff[7] = i - 8; - - // 校验码 - crc = MODBUS_RTU_CRC16((uint8_t *) Heart_sendBuff, i); - *(uint16_t *)(Heart_sendBuff + i) = htons(crc); - i += 2; - // 结束符 - Heart_sendBuff[i++] = 0x0d; - Heart_sendBuff[i++] = 0x0a; - - return i; + // PSN + memmove(Heart_sendBuff + i, dcBuff.configBottle.PSN, 6); + i += 6; + + Heart_sendBuff[i++] = 0x02; // 命令码:心跳 + + // 数据长度:先预设为0,最后再修改,位置为Heart_sendBuff[7] + Heart_sendBuff[i++] = 0; + + // 硬件版本 + Heart_sendBuff[i++] = dcBuff.powerInfo.hardVer.minor; + // 软件版本 + Heart_sendBuff[i++] = dcBuff.powerInfo.softVer.minor; + // 软件日期 + Heart_sendBuff[i++] = dcBuff.powerInfo.softDate.year; + Heart_sendBuff[i++] = dcBuff.powerInfo.softDate.month; + Heart_sendBuff[i++] = dcBuff.powerInfo.softDate.day; + + // 射频自检状态 + Heart_sendBuff[i++] = RF_initStatus; + // 网口自检状态 + Heart_sendBuff[i++] = Ethernet_initStatus; + // 网络连接状态 + Heart_sendBuff[i++] = Ethernet_IsConnected(); + // GPRS入网状态 + Heart_sendBuff[i++] = dcBuff.dtuData.networked; + // GPRS信号强度 + Heart_sendBuff[i++] = dcBuff.dtuData.rssi; + // GPRS连接状态 + Heart_sendBuff[i++] = dcBuff.dtuData.connected; + + // 保留备用 + i += 41; + + // 修改数据长度 + Heart_sendBuff[7] = i - 8; + + // 校验码 + crc = MODBUS_RTU_CRC16((uint8_t *) Heart_sendBuff, i); + *(uint16_t *)(Heart_sendBuff + i) = htons(crc); + i += 2; + // 结束符 + Heart_sendBuff[i++] = 0x0d; + Heart_sendBuff[i++] = 0x0a; + + return i; } // 任务主体 void Modbus_Task(void *p_arg) { - uint8_t i; - uint32_t heartTick = 0; - ext_data_t Gprs; + uint8_t i; + uint32_t heartTick = 0; + ext_data_t Gprs; - while(TRUE) - { - // 本任务读取发送队列的记录 - // 这条语句用于任务切换(让其它任务有机会得到执行) - xSemaphoreTake(Modbus_SendQ, 1000); + while(TRUE) + { + // 本任务读取发送队列的记录 + // 这条语句用于任务切换(让其它任务有机会得到执行) + xSemaphoreTake(Modbus_SendQ, 1000); - if(IsTickOut(heartTick)) - { - heartTick = GetDelayTick(30000); // 30秒以后再发 - - // TODO: 发送心跳到上位机,不等待返回 + if(IsTickOut(heartTick)) + { + heartTick = GetDelayTick(30000); // 30秒以后再发 + + // TODO: 发送心跳到上位机,不等待返回 // i = pack_heart_send_data(); // RS485_SendDataByte(Heart_sendBuff, i); - } - - if(LoopBuff_GetCount(&Modbus_SendM)) - { - // 取数据 - memmove(&Gprs, LoopBuff_GetDataPtr(&Modbus_SendM, Modbus_SendM.info.rdPtr), sizeof(ext_data_t)); - LoopBuff_RemoveItems(&Modbus_SendM, 1); - i = pack_modbus_tran_data(&Gprs); + } - // TODO: 发送数据到上位机,不等待返回 - RS485_SendDataByte(Modbus_sendBuff, i); - } - } + if(LoopBuff_GetCount(&Modbus_SendM)) + { + // 取数据 + memmove(&Gprs, LoopBuff_GetDataPtr(&Modbus_SendM, Modbus_SendM.info.rdPtr), sizeof(ext_data_t)); + LoopBuff_RemoveItems(&Modbus_SendM, 1); + i = pack_modbus_tran_data(&Gprs); + + // TODO: 发送数据到上位机,不等待返回 + RS485_SendDataByte(Modbus_sendBuff, i); + } + } } // 处理modbus rtu命令(已经验证过长度和CRC的包) void MODBUS_RTU_CMD(modbus_request_t *req) { - static uint8_t BUFF[100]; // 响应包 - uint8_t err = 0; // 错误代码 - uint8_t len = 0; // 发送数据长度 + static uint8_t BUFF2[100]; // 响应包 + uint8_t err = 0; // 错误代码 + uint8_t len = 0; // 发送数据长度 - uint16_t id; // 通信地址 - uint16_t reg; // 数据地址 - uint16_t cnt; // 数据个数 - uint16_t crc; - - // 检查通信地址 - if(req->id != dcBuff.configBottle.addr && req->id != 0) - return; - - // 清空发送帧 - memset(BUFF, 0, sizeof(BUFF)); - - BUFF[len++] = dcBuff.configBottle.addr; // 从机地址 - BUFF[len++] = req->cmd; // 命令代码 - -// reg = ntohs(req->reg); // 数据寄存器 -// if(req->cmd == 0x03 || req->cmd == 0x06) -// reg += 40001; -// else if(req->cmd == 0x04) -// reg += 30001; -// else -// err = MODBUS_ERR_ILF; // 无效功能码 -// - if(err == 0) - { - if(req->cmd == 0x03) // 读保持数据 - { -// cnt = ntohs(req->cnt); // 参数个数 -// if(reg != MODBUS_ADR_REG || cnt != 1) -// err = MODBUS_ERR_NAK; // 命令无法执行 -// else -// { -// // 用最新的通讯地址刷新缓冲 -// id = htons(dcBuff.configBottle.addr); -// BUFF[len++] = 2; // 数据长度 -// memmove(BUFF + len, (uint8_t *) &id, 2); -// len += 2; -// } - } - } -// -// if(err != 0) + uint16_t count; // 通信地址 +// uint16_t reg; // 数据地址 + uint16_t cnt; // 数据个数 + uint16_t crc; + ext_box_t boxRec; + char* psn; +// // 检查通信地址 + // 添加记录 +// boxCnt.count = 5; +// for(i = 0; i < boxCnt.count; i++) // { -// BUFF[1] |= 0x80; // 错误指示 -// BUFF[len++] = err; // 错误代码 -// } +// memset(&boxRec, 0, sizeof(ext_box_t)); +// boxRec.PSN[0] = 26; +// boxRec.PSN[3] = (0 + i * 1) / 1000; +// boxRec.PSN[4] = ((0 + i * 1) % 1000) >> 8; +// boxRec.PSN[5] = ((0 + i * 1) % 1000) & 0xFF; +// strcpy(boxRec.TGGU, "TGGU2000000"); +// boxRec.TGGU[7] = '0' + (0 + i) / 100; +// boxRec.TGGU[8] = '0' + (0 + i) % 100 / 10; +// boxRec.TGGU[9] = '0' + (0 + i) % 10; +// FRAM_BufferWrite(FRAM_BOX_DATA_BASE + sizeof(ext_box_t) * i, (uint8_t *) &boxRec, sizeof(ext_box_t)); +// } +// FRAM_SaveInfo(FRAM_BOX_INFO_BASE, (uint8_t *) &boxCnt, sizeof(ext_count_t)); - // 计算CRC - crc = MODBUS_RTU_CRC16(BUFF, len); - crc = htons(crc); + + + if(req->cmd == 0x02) // 读保持数据 + { + cnt = req->index; // 参数个数 + memset(&boxRec, 0, sizeof(ext_box_t)); + boxRec.PSN[0] = req->PSN[0]; + boxRec.PSN[1] = req->PSN[1]; + boxRec.PSN[2] = req->PSN[2]; + boxRec.PSN[3] = req->PSN[3]; + boxRec.PSN[4] = req->PSN[4]; + boxRec.PSN[5] = req->PSN[5]; + for(int i=0; i<11; i++) + boxRec.TGGU[i]=req->BOX[i]; + boxRec.TGGU[11]=0; + if(req->index>0)count=req->index-1; + + FRAM_BufferWrite(FRAM_BOX_DATA_BASE + sizeof(ext_box_t) * count, (uint8_t *) &boxRec, sizeof(ext_box_t)); +// // 更新索引信息 +// strcpy(boxTGGU[count].TGGU, boxRec.TGGU); +// memmove(boxTGGU[count].PSN, boxRec.PSN, 6); +// boxTGGU[count].recNo = count; +// strcpy(boxPSN[count].TGGU, boxRec.TGGU); +// memmove(boxPSN[count].PSN, boxRec.PSN, 6); +// boxPSN[count].recNo = count; - memmove(BUFF + len, &crc, 2); - len += 2; + if(req->index==req->all) + { + boxCnt.count=req->all; + FRAM_SaveInfo(FRAM_BOX_INFO_BASE, (uint8_t *) &boxCnt, sizeof(ext_count_t)); + } + + + } + memset(BUFF2, 0, sizeof(BUFF2)); + BUFF2[len++]='L'; + BUFF2[len++]='S'; + BUFF2[len++] = dcBuff.configBottle.addr; // 从机地址 + BUFF2[len++] = 2;//req->cmd; // 命令代码 + BUFF2[len++] = 0; + BUFF2[len++] = 1; //LEN + BUFF2[len++] = 1; + + // 计算CRC + crc = MODBUS_RTU_CRC16(BUFF2, len); + crc = htons(crc); + + memmove(BUFF2 + len, &crc, 2); + len += 2; + RS485_SendDataByte(BUFF2, len); - if(req->id != 0) - { - // 发送应答 - RS485_SendDataByte(BUFF, len); - } } // 任务主体 +uint8_t BUFF[1000] = {0}; void ReadModbus_Task(uint8_t c) { - static uint8_t BUFF[sizeof(modbus_request_t)] = {0}; - static uint8_t len = 0; - // 取数据 - BUFF[len++] = c; - - // 验证长度和CRC值 - if(len == sizeof(modbus_request_t)) - { - if(MODBUS_RTU_CRC16(BUFF, sizeof(modbus_request_t)) == 0) - { - MODBUS_RTU_CMD((modbus_request_t *) BUFF); - len = 0; - } - else - { - // 丢掉第一个字节 - memmove(BUFF, BUFF + 1, --len); - } - } + static uint8_t len = 0; + static uint16_t data_len = 0; + static uint16_t data_len2 = 0; +// // 取数据 +// if((len==0)&&(c=='L')) len++; +// else return; +// if((len==1)&&(c=='S')) len++; +// else return; +// +// BUFF[len++] = c; +// +// // 验证长度和CRC值 +// if(len == sizeof(modbus_request_t)) +// { +// if(MODBUS_RTU_CRC16(BUFF, sizeof(modbus_request_t)) == 0) +// { +// MODBUS_RTU_CMD((modbus_request_t *) BUFF); +// len = 0; +// } +// else +// { +// // 丢掉第一个字节 +// memmove(BUFF, BUFF + 1, --len); +// } +// } + switch(len) + { + case 0: + BUFF[len]=c; + if(c=='L') len++; + else len=0; + break; + case 1: + BUFF[len]=c; + if(c=='S') len++; + else len=0; + break; + case 2: + BUFF[len++]=c; + break; + case 3: + BUFF[len]=c; + if(c==2) len++; + else len=0; + break; + case 4: + BUFF[len]=c; + data_len=c<<8; + len++; + break; + case 5: + BUFF[len]=c; + data_len|=c; + len++; + break; + case 6: + BUFF[6+data_len2++]=c; + if(data_len2+1>data_len) + len++; + break; + case 7: + BUFF[6+data_len2++]=c; + len++; + break; + case 8: + BUFF[6+data_len2]=c; + len=0; + break; + default: + len=0; + } + if((len==0)&&(data_len2>1)) + { + if(MODBUS_RTU_CRC16(BUFF, 7+data_len2) == 0) + { + MODBUS_RTU_CMD((modbus_request_t *) BUFF); + + } + data_len2=0; + } }