소스 검색

新的41串口透传模式的实现代码,初步提交

xuy 3 년 전
부모
커밋
64a8400235
5개의 변경된 파일233개의 추가작업 그리고 5개의 파일을 삭제
  1. 8 0
      Inc/CollectMaster485.h
  2. 1 0
      Inc/KeySlave485.h
  3. 2 1
      Src/CollectMaster485.c
  4. 186 1
      Src/TerminalSlave485.c
  5. 36 3
      Src/freertos.c

+ 8 - 0
Inc/CollectMaster485.h

@@ -278,6 +278,13 @@ typedef union {
 }uni_LeiDaYewei;//雷达液位
 
 
+typedef struct
+{
+	uint8_t step;  // 构建周期
+	uint8_t nstep; // 上报周期,是step的倍数
+	uint8_t cmd_num;  // 命令数据的总数
+	uint8_t cmd_arr[13] ;  // 挨个具体存放命令代号
+}SensorScanParam_TypeDef; 
 
 
 
@@ -352,6 +359,7 @@ extern uint8_t ValStateArr_0x20_Cang02[64],ValStateArr_PoFeng_0x20_Cang02[64];//
 extern uint8_t ValStateArr_0x20_Cang03[64],ValStateArr_PoFeng_0x20_Cang03[64];//破封时的阀门状态
 extern uint8_t ValStateArr_0x20_Cang04[64],ValStateArr_PoFeng_0x20_Cang04[64];//破封时的阀门状态
 
+extern SensorScanParam_TypeDef SensorScanParam;
 
 
 //uint8_t CheckInFrame_Collect485(void);

+ 1 - 0
Inc/KeySlave485.h

@@ -243,6 +243,7 @@
 #define 	ADDR_Zero_Of_TankCapacity	0x0084	//	132		罐容Vt零点
 #define 	ADDR_ManHoLe_Number	0x00A4	//	164		人孔盖卸油阀数量
 #define 	ADDR_OiLType_Data	0x00E4	//	228		油品参数   膨胀系数 0.0008  0.0012
+#define 	ADDR_Sensor_Scan_Param	0x00F4	//	xy, 以此首地址的11字节区域,存放类F3协议终端功能的传感器轮询参数配置
 #define 	ADDR_Zero_Of_TempSensor	0x0104	//	260		温度偏移参数
 #define 	ADDR_TankShape_01	0x0124	//	292	1—4仓	罐车参数1
 #define 	ADDR_TankShape_02	0x0164	//	356	5—8仓	罐车参数2

+ 2 - 1
Src/CollectMaster485.c

@@ -134,7 +134,8 @@ uni_TempToPlatForm uni_TempToPlatForm001,uni_TempToPlatForm002;
 //李伟修改    队尾的3个数据依次为最大值,最小值,峰峰值
 float ArrYeweiForWenyou[NumOf_WenYouPanduan+3];//存储300s的液位数据    打印的时候作为是否稳油判断依据
 float Yewei_max000,Yewei_min000,Yewei_peak000;
- 
+
+SensorScanParam_TypeDef SensorScanParam; 
 	 
 void TestUsart2_Receive(void)
 {

+ 186 - 1
Src/TerminalSlave485.c

@@ -1106,6 +1106,184 @@ void Send_A1_Cmd(unsigned char scrAddr, unsigned char funCode, unsigned char scr
 	*/
 }
 
+/**
+ ***************************************
+ * 构建A1命令数据 -- hex制式
+ * 输入:
+ *    pBuf-构建数据的存放首地址
+ *    pEmergy,如果是数据有变动,表示紧急上报,将标记存于此地址
+ * 返回: 构建数据的字节总数
+ ***************************************
+ */
+int BuildA1Cmd(uint8_t *pBuf, uint8_t *pEmergy)
+{
+	int send_pos=0;
+	unsigned char emergy=0;
+	unsigned char Lrc_temp;
+	unsigned char overflow_flag=0;
+	int i,j;
+	unsigned char temp_i = 0x00;
+	
+	pBuf[send_pos++] = 0xA1;
+	pBuf[send_pos++] = 120;
+	if(StoreNumber>0)
+	{
+		if(memcmp(Cang_IO_tbak[0],Cang01_IO,64))
+		{
+			emergy=0x80;
+		}
+		memcpy(Cang_IO_tbak[0],Cang01_IO,64);
+	}
+	if(StoreNumber>1)
+	{
+		if(memcmp(Cang_IO_tbak[1],Cang02_IO,64))
+		{
+			emergy=0x80;
+		}
+		memcpy(Cang_IO_tbak[1],Cang02_IO,64);
+	}
+	if(StoreNumber>2)
+	{
+		if(memcmp(Cang_IO_tbak[2],Cang03_IO,64))
+		{
+			emergy=0x80;
+		}
+		memcpy(Cang_IO_tbak[2],Cang03_IO,64);
+	}
+	if(StoreNumber>3)
+	{
+		if(memcmp(Cang_IO_tbak[3],Cang04_IO,64))
+		{
+			emergy=0x80;
+		}
+		memcpy(Cang_IO_tbak[3],Cang04_IO,64);
+	}
+	if((overflow_cnt==0) && (overflow_cnt==overflow_cnt_bak))
+	{
+		overflow_flag=0;
+	}
+	else
+	{
+		overflow_flag=1;
+	}
+	overflow_cnt_bak=overflow_cnt;
+	if(overflow_flag_bak!=overflow_flag)
+	{
+		emergy=0x80;	
+	}
+	overflow_flag_bak=overflow_flag;
+
+	pBuf[send_pos++] = emergy;
+	pBuf[send_pos++] = StoreNumber;
+	pBuf[send_pos++] = 0x22;
+	pBuf[send_pos++] = overflow_flag;
+	
+	if((Config_info_all.ManHole_Big_info>0) && (Config_info_all.ManHole_Big_info<8))
+	{
+		pBuf[send_pos++] = 0x72;
+		for (i = 0; i < StoreNumber; i++)
+		{
+			pBuf[send_pos++] = Config_info_all.ManHole_Big_info/StoreNumber;
+			for(j=0;j<Config_info_all.ManHole_Big_info/StoreNumber;++j)
+			{
+				pBuf[send_pos++] = Cang_IO_tbak[i][indexDaGai01+10*j];
+			}
+		}
+	}
+	if((Config_info_all.Dump_info>0) && (Config_info_all.Dump_info<8))
+	{
+		pBuf[send_pos++] = 0x71;
+		for (i = 0; i < StoreNumber; i++)
+		{
+			pBuf[send_pos++] = Config_info_all.Dump_info/StoreNumber;
+			for(j=0;j<Config_info_all.Dump_info/StoreNumber;++j)
+			{
+				pBuf[send_pos++] = Cang_IO_tbak[i][indexXieYouFa01+10*j];
+			}
+		}
+	}
+	if((Config_info_all.HaiDiFa_info>0) && (Config_info_all.HaiDiFa_info<8))
+	{
+		pBuf[send_pos++] = 0x64;
+		for (i = 0; i < StoreNumber; i++)
+		{
+			pBuf[send_pos++] = Config_info_all.HaiDiFa_info/StoreNumber;
+			for(j=0;j<Config_info_all.HaiDiFa_info/StoreNumber;++j)
+			{
+				pBuf[send_pos++] = Cang_IO_tbak[i][indexHaiDiFa01+10*j];
+			}
+		}
+	}
+	while (send_pos<(120+2))
+	{
+		pBuf[send_pos++] = 0;
+	}
+
+	if (pEmergy) *pEmergy = emergy;
+	return send_pos;
+}
+
+/**
+ ***************************************
+ * 构建20命令数据       时间戳 -- hex制式
+ * 输入:pBuf-构建数据的存放首地址
+ * 返回: 构建数据的字节总数
+ ***************************************
+ */
+extern SDateTime m_datetime;
+int BuildTimeCmd(uint8_t *pBuf)
+{
+	int send_pos=0;
+	
+	pBuf[send_pos++] = 0x20;
+	pBuf[send_pos++] = 6;
+
+	pBuf[send_pos++] = m_datetime.year;
+	pBuf[send_pos++] = m_datetime.month;
+	pBuf[send_pos++] = m_datetime.day;
+	pBuf[send_pos++] = m_datetime.hour;
+	pBuf[send_pos++] = m_datetime.min;
+	pBuf[send_pos++] = m_datetime.sec;
+	
+	return send_pos;
+}
+
+/**
+ ***************************************
+ * xy,新透传,41串口透传,模拟F3轮询传感器
+ * 按照周期1构建数据,按照周期2发送数据
+ * 输入:无
+ * 返回: 无
+ *    发送区的格式为:
+ *       数据负载类别,1Byte
+ *       传感器命令数据包数,1Byte
+ *       具体的各个命令数据包,NByte
+ ***************************************
+ */
+void DoInternalSensorScanAndPost()
+{
+	uint8_t len=0;
+	uint8_t emergy=0;
+	uint8_t *pSendBuf = USART1_TX_BUF;
+	static int step = 0;
+	static int nstep = 0;
+
+	if(++step % SensorScanParam.step == 0)
+	{
+		pSendBuf[0] = 1;
+		pSendBuf[1] = 2;
+		pSendBuf += 2;
+		len = BuildA1Cmd(pSendBuf, &emergy); // 目前只实装了A1命令,后续根据新命令设计再行拓展
+		len += BuildTimeCmd(pSendBuf+len);   // 目前总是会附加时间戳命令数据
+		
+		if(emergy) {
+			TerminalSlave485_Send_Data(USART1_TX_BUF,len+2);
+			nstep = 0;
+		} else {
+			if(++nstep % SensorScanParam.nstep == 0) TerminalSlave485_Send_Data(USART1_TX_BUF,len+2);
+		}
+	}
+}
 
 #include "leaf_ota.h"
 //uint32_t data_count=0;
@@ -5348,7 +5526,13 @@ int 	Process_CMD_0x39_RemoteCali(uint8_t dataMode)
 					}
 					T2C_RemoteCaliDat001.NumberOfRegs = 32; 
       		break;
-					
+
+				case	ADDR_Sensor_Scan_Param:
+ 					FM25L16B_Write_N_Bytes(ADDR_Sensor_Scan_Param,T2C_RemoteCaliDat001.PayLoadData,11);
+					InitSensorScanParam();
+					T2C_RemoteCaliDat001.NumberOfRegs = 11; 
+      			break;	
+
 				case	ADDR_TiltAngle_Sensor://倾角补偿参数  ----长度为16字节
  					FM25L16B_Write_N_Bytes(ADDR_TiltAngle_Sensor,T2C_RemoteCaliDat001.PayLoadData,16);
 					T2C_RemoteCaliDat001.NumberOfRegs=16;	
@@ -5380,6 +5564,7 @@ int 	Process_CMD_0x39_RemoteCali(uint8_t dataMode)
 				  ScreenMaster485_Send_Data(time_Set_Dwin,14);
 					//memcpy(TimeBuf+1,T2C_RemoteCaliDat001.PayLoadData,6);
 					ds1302_Write_Time(T2C_RemoteCaliDat001.PayLoadData-1);
+					ds1302_SynTime(&m_datetime);
 					/*for(i001=0;i001<6;i001++)
 					{
 						sprintf((char*)(&USART1_TX_BUF[33+i001]),"%02X",T2C_RemoteCaliDat001.PayLoadData[i001]);

+ 36 - 3
Src/freertos.c

@@ -94,6 +94,7 @@ int formatStr(uint16_t *bufTextCang02_IO000, uint8_t *Cang02_IO000, uint8_t cang
 
 int formatStrCang01(uint16_t *bufTextCang01_IO000, uint8_t *Cang01_IO000, uint8_t cangNum); //可以显示兼容的老式协议
 
+SDateTime m_datetime;
 static int FRAM_cnt = 0;
 uint8_t vt_disp_type=0;
 uint32_t cntUsage = 0; //统计cpu利用率
@@ -143,6 +144,31 @@ sT2C_ALL_Sensor_Data_Each_Cang *pT2C_ALL_Sensor_Data_Disp = &T2C_ALL_Sensor_Data
 
 /* Private function prototypes -----------------------------------------------*/
 /* USER CODE BEGIN FunctionPrototypes */
+void InitSensorScanParam(void)
+{
+	uint8_t buf[11];
+	
+	FM25L16B_Read_N_Bytes(ADDR_Sensor_Scan_Param, buf, 11);
+	if(buf[0] > 1 && buf[1] > 0){
+		SensorScanParam.step = buf[0];
+		SensorScanParam.nstep = buf[1];
+		if(buf[2] > 0 && buf[2] <= 8){
+			SensorScanParam.cmd_num = buf[2];
+			for (int n = 0; n < SensorScanParam.cmd_num; n++){
+				SensorScanParam.cmd_arr[n] = buf[3+n];
+			}
+		}else{
+			SensorScanParam.cmd_num = 1;
+			SensorScanParam.cmd_arr[0] = 0xA1;
+		}	
+	}else{
+		SensorScanParam.step = 5;
+		SensorScanParam.nstep = 6;
+		SensorScanParam.cmd_num = 1;
+		SensorScanParam.cmd_arr[0] = 0xA1;
+	}
+}
+
 void ControllerConfig_Init(void)
 {
 	//	uint8_t t000;
@@ -386,6 +412,9 @@ void ControllerConfig_Init(void)
 
 	vt_disp_type = FM25L16B_ReadByte(ADDR_DISP_VT_TYPE);
 	flag_En_BlankSeal = FM25L16B_ReadByte(ADDR_Enable_BlankSeal);
+
+    // 开机初始化读取,SensorScanParam
+	InitSensorScanParam();
 }
 /* USER CODE END FunctionPrototypes */
 
@@ -965,6 +994,11 @@ void Task_Usart1_Terminal(void const *argument)
 		xEventGroupSetBits(xCreatedEventGroup, TASK_BIT_2);
 		osDelay(10); //阻塞延时,根据情况调节------保证每秒钟可以接收4帧数据,50*Nms休眠时间
 
+		// xy,新透传,41串口透传,模拟F3轮询传感器,构建数据
+		if(i_task01 % 100 == 99) 
+		{
+			DoInternalSensorScanAndPost();
+		}
 	} //while(1)
 	  /* USER CODE END Task_Usart1_Terminal */
 }
@@ -976,7 +1010,6 @@ void Task_Usart1_Terminal(void const *argument)
 * @retval None
 */
 /* USER CODE END Header_Task_GetCPU_Usage */
-SDateTime m_datetime;
 void Task_GetCPU_Usage(void const *argument)
 {
 	/* USER CODE BEGIN Task_GetCPU_Usage */
@@ -993,10 +1026,10 @@ void Task_GetCPU_Usage(void const *argument)
 		//DispRunInfo();//显示运行信息
 		cntUsage++;
 		osDelay(500); //阻塞延时,根据情况调节
-		if(m_datetime.min!=min)
+		if(m_datetime.hour!=min)
 		{
 			ds1302_SynTime(&m_datetime);
-			min = m_datetime.min;
+			min = m_datetime.hour;
 		}
 		uxBits = xEventGroupWaitBits(xCreatedEventGroup, /* 事件标志组句柄 */
                                      TASK_BIT_ALL,       /* 等待TASK_BIT_ALL被设置 */