Kaynağa Gözat

Squashed commit of the following:

commit fcfc9e065906cfddf573ece3c2a5c8779bdf0735
Author: xuy <xy010101@163.com>
Date:   Tue Sep 13 09:35:05 2022 +0800

    1.新增了一些变动的代码注释; 2.修正了变量错别字之emergy改为emergencyflag;

commit b7b8ef6b2b4f6b2f607527fe08659638f10c8b03
Author: xuy <xy010101@163.com>
Date:   Mon Aug 29 16:18:48 2022 +0800

    v20220829,这里只修改了版本号,用于平台上测试IAP需要多个不同的版本号

commit 29f13fc2135e5736e6a6d5707c9dddaeee361356
Author: xuy <xy010101@163.com>
Date:   Fri Aug 26 17:21:24 2022 +0800

    v20220826

commit 951b0ff3bc62eb1d3e2858decf66c54cf72464be
Author: xuy <xy010101@163.com>
Date:   Thu Aug 25 16:03:27 2022 +0800

    41新透传的远程标定链路处理

commit a114da5423e53fdbf763701e18ec85c55a83cab8
Author: xuy <xy010101@163.com>
Date:   Thu Aug 25 11:44:57 2022 +0800

    在A1命令实装新设计的流水号与时间戳子命名数据包

commit fc8164182148675b4d56106ed40be2779d33354a
Author: xuy <xy010101@163.com>
Date:   Mon Aug 22 11:08:13 2022 +0800

    新的41串口透传模式的实现代码,传感器参数构建

commit 64a840023514ae2442979eaa2af40b7b9b4bd1d5
Author: xuy <xy010101@163.com>
Date:   Fri Aug 19 11:45:30 2022 +0800

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

# Conflicts:
#	Inc/KeySlave485.h
#	Src/TerminalSlave485.c
#	Src/freertos.c
libo 3 yıl önce
ebeveyn
işleme
ade98be92d
5 değiştirilmiş dosya ile 327 ekleme ve 17 silme
  1. 11 0
      Inc/CollectMaster485.h
  2. 12 11
      Inc/KeySlave485.h
  3. 2 1
      Src/CollectMaster485.c
  4. 1 1
      Src/KeySlave485.c
  5. 301 4
      Src/TerminalSlave485.c

+ 11 - 0
Inc/CollectMaster485.h

@@ -278,6 +278,16 @@ typedef union {
 }uni_LeiDaYewei;//雷达液位
 
 
+typedef struct
+{
+	uint8_t enable; // 对应存储区首地址字节内容为0x5A,表示使能开启
+	uint8_t step;  // 构建周期
+	uint8_t nstep; // 上报周期,是step的倍数
+	uint8_t cmd_num;  // 命令数据的总数
+	uint8_t cmd_arr[12] ;  // 挨个具体存放命令代号
+
+	uint8_t rx_buf[5]; // 通过41串口透传uart口接收头部内容的缓存区
+}Pass41SensorScanParam_TypeDef; 
 
 
 
@@ -352,6 +362,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 Pass41SensorScanParam_TypeDef Pass41SensorScanParam;
 
 
 //uint8_t CheckInFrame_Collect485(void);

+ 12 - 11
Inc/KeySlave485.h

@@ -236,17 +236,18 @@
 #define 	ADDR_Version_ContBoard				0x0004	//	4	STM32F746VGT6+2021v1.06	版本号
 #define 	ADDR_AutoSealed_Time					0x0024	//	36		自动施封时长
 #define 	ADDR_DataSource_LiquidoMeter	0x002C	//	44		液晶屏数据显示来源——液位参数
-#define 	ADDR_DataSource_ElecSeal			0x0030	//	48		液晶屏数据显示来源——铅封参数
-#define 	ADDR_V20_Point								0x0034	//	52		V20计算温度点的选择
-#define 	ADDR_CarPlate_Number					0x0044	//	68		车牌号
-#define 	ADDR_Zero_Of_LiquidMeter			0x0064	//	100	兼容8仓	液位计零点
-#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_Zero_Of_TempSensor				0x0104	//	260		温度偏移参数
-#define 	ADDR_TankShape_01							0x0124	//	292	1—4仓	罐车参数1
-#define 	ADDR_TankShape_02							0x0164	//	356	5—8仓	罐车参数2
-#define 	ADDR_SampIntervaL_Collector		0x01A4	//	420	单位为毫秒。取值范围为	同采集板的采样间隔
+#define 	ADDR_DataSource_ElecSeal	0x0030	//	48		液晶屏数据显示来源——铅封参数
+#define 	ADDR_V20_Point	0x0034	//	52		V20计算温度点的选择
+#define 	ADDR_CarPlate_Number	0x0044	//	68		车牌号
+#define 	ADDR_Zero_Of_LiquidMeter	0x0064	//	100	兼容8仓	液位计零点
+#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, 以此首地址的16字节区域,存放类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
+#define 	ADDR_SampIntervaL_Collector	0x01A4	//	420	单位为毫秒。取值范围为	同采集板的采样间隔
 #define 	ADDR_CommuIntervaL_ScreenDwin	0x01B4	//	436		同迪文屏的通信间隔
 #define 	ADDR_SleepTime_ScreenDwin			0x01C4	//	452		屏幕休眠时间
 #define 	ADDR_RTC_ScreenDwin						0x01CC	//	460		屏幕RTC标定

+ 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;
- 
+
+Pass41SensorScanParam_TypeDef Pass41SensorScanParam; 
 	 
 void TestUsart2_Receive(void)
 {

+ 1 - 1
Src/KeySlave485.c

@@ -37,7 +37,7 @@ uint8_t product_code[20] = "JL-SIMS-CJ-V2.1";				 //
 uint8_t product_ID[20] = "20210730001";						 //产品ID
 
 char Version_software[30] = "KZB09A0_20220210_Temp1";
-uint32_t Version_Soft[8] = {2,2,3,13,1,1,0,20220810};
+uint32_t Version_Soft[8] = {2,2,3,13,1,1,0,20220829};
 
 uint8_t flag_exitReset = 0;	              //终止复位命令
 uint8_t flag_Uart4_Busy = 0;              //表明打印机占用了总线,暂停语音播报

+ 301 - 4
Src/TerminalSlave485.c

@@ -565,7 +565,18 @@ void TerminalSlave485_Send_Data(uint8_t *buf,uint16_t len)
 	TerminalSlave485_TX_Set(1);			//设置为发送模式
   	//HAL_UART_Transmit(&huart1,buf,len,1000);//串口1发送数据  
 //	TerminalSlave485_TX_Set(0);			//设置为接收模式	
-	memcpy(terminal_buf,buf,len);
+
+	// 如果来自41串口的报文回应,需要粘合原样5字节头部,其中将长度内容适配下即可
+	if(Pass41SensorScanParam.rx_buf[0] > 0){
+		memcpy(terminal_buf,Pass41SensorScanParam.rx_buf,5);
+		terminal_buf[2] = len;
+		memcpy(terminal_buf+5,buf,len);
+		len += 5;
+		Pass41SensorScanParam.rx_buf[0] = 0;
+	}else{
+		memcpy(terminal_buf,buf,len);
+	}
+
 	if(HAL_UART_Transmit_IT(&huart1,terminal_buf,len)!=HAL_OK)
 	{
 		TerminalSlave485_TX_Set(0);			//设置为接收模式	
@@ -1111,6 +1122,271 @@ void Send_A1_Cmd(unsigned char scrAddr, unsigned char funCode, unsigned char scr
 	*/
 }
 
+/**
+ ***************************************
+ * 构建A1命令数据 -- hex制式
+ * 输入:
+ *    pBuf-构建数据的存放首地址
+ *    pEmergy,如果是数据有变动,表示紧急上报,将标记存于此地址
+ *    flowID, 流水id值
+ * 返回: 构建数据的字节总数
+ ***************************************
+ */
+int BuildA1Cmd(uint8_t *pBuf, uint32_t flowID, uint8_t *pEmergencyflag)
+{
+	int send_pos=0;
+	unsigned char emergencyflag=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))
+		{
+			emergencyflag=0x80;
+		}
+		memcpy(Cang_IO_tbak[0],Cang01_IO,64);
+	}
+	if(StoreNumber>1)
+	{
+		if(memcmp(Cang_IO_tbak[1],Cang02_IO,64))
+		{
+			emergencyflag=0x80;
+		}
+		memcpy(Cang_IO_tbak[1],Cang02_IO,64);
+	}
+	if(StoreNumber>2)
+	{
+		if(memcmp(Cang_IO_tbak[2],Cang03_IO,64))
+		{
+			emergencyflag=0x80;
+		}
+		memcpy(Cang_IO_tbak[2],Cang03_IO,64);
+	}
+	if(StoreNumber>3)
+	{
+		if(memcmp(Cang_IO_tbak[3],Cang04_IO,64))
+		{
+			emergencyflag=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)
+	{
+		emergencyflag=0x80;	
+	}
+	overflow_flag_bak=overflow_flag;
+
+	pBuf[send_pos++] = emergencyflag;
+	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];
+			}
+		}
+	}
+
+	// 2022-8-25, 新增加的子命令
+	// 01, 流水号
+	// 02, 时间戳
+	do {
+		pBuf[send_pos++] = 0x01;
+		pBuf[send_pos++] = (flowID>>24) & 0xff;
+		pBuf[send_pos++] = (flowID>>16) & 0xff;
+		pBuf[send_pos++] = (flowID>>8) & 0xff;
+		pBuf[send_pos++] = (flowID>>0) & 0xff;
+	}while(0);
+	
+	send_pos += BuildTimeCmd(pBuf+send_pos);
+	
+	while (send_pos<(120+2))
+	{
+		pBuf[send_pos++] = 0;
+	}
+
+	if (pEmergencyflag) *pEmergencyflag = emergencyflag;
+	return send_pos;
+}
+
+/**
+ ***************************************
+ * 构建20命令数据       时间戳 -- hex制式
+ * 输入:pBuf-构建数据的存放首地址
+ * 返回: 构建数据的字节总数
+ ***************************************
+ */
+extern SDateTime m_datetime;
+int BuildTimeCmd(uint8_t *pBuf)
+{
+	int send_pos=0;
+	
+	pBuf[send_pos++] = 0x02;
+
+	pBuf[send_pos++] = HEXtoBCD(m_datetime.year);
+	pBuf[send_pos++] = HEXtoBCD(m_datetime.month);
+	pBuf[send_pos++] = HEXtoBCD(m_datetime.day);
+	pBuf[send_pos++] = HEXtoBCD(m_datetime.hour);
+	pBuf[send_pos++] = HEXtoBCD(m_datetime.min);
+	pBuf[send_pos++] = HEXtoBCD(m_datetime.sec);
+	
+	return send_pos;
+}
+
+/**
+ ***************************************
+ * 构建40命令数据       电子铅封 -- hex制式
+ * 输入:pBuf-构建数据的存放首地址
+ * 返回: 构建数据的字节总数
+ ***************************************
+ */
+int BuildSealTxCmd(uint8_t *pBuf, uint8_t *pEmergencyflag) // 40命令
+{
+	Return_data *ret;
+	int n = 0;
+	uint8_t emergencyflag = 0;
+
+	*pBuf++ = 0x40;
+	ret = Seal_Tx_Readvalue(0,0);
+	*pBuf++ = ret->length/2; // 调用返回的数据是asii制式的,所以真实的hex数是其一半
+	
+	for(n=0; n < ret->length/2 && n < 100; n++) {
+		pBuf[n] = MODBUS_ASCII_AsciiToHex(ret->data + 2*n);
+	}
+
+	emergencyflag = pBuf[0];
+	if(pEmergencyflag) *pEmergencyflag = emergencyflag;
+	return n+2;
+}
+
+/**
+ ***************************************
+ * 构建91命令数据       IO状态 -- hex制式
+ * 输入:pBuf-构建数据的存放首地址
+ * 返回: 构建数据的字节总数
+ ***************************************
+ */
+int Build91Cmd(uint8_t *pBuf, uint8_t *pEmergencyflag) 
+{
+	Return_data *ret;
+	int n = 0;
+	uint8_t emergencyflag = 0;
+
+	*pBuf++ = 0x91;
+	ret = IO_Tx_Readvalue(0,0);
+	*pBuf++ = ret->length/2; // 调用返回的数据是asii制式的,所以真实的hex数是其一半
+	
+	for(n=0; n < ret->length/2 && n < 100; n++) {
+		pBuf[n] = MODBUS_ASCII_AsciiToHex(ret->data + 2*n);
+	}
+
+	emergencyflag = pBuf[0];
+	if(pEmergencyflag) *pEmergencyflag = emergencyflag;
+	return n+2;
+}
+
+/**
+ ***************************************
+ * xy,新透传,41串口透传,模拟F3轮询传感器
+ * 按照周期1构建数据,按照周期2发送数据
+ * 输入:无
+ * 返回: 无
+ *    发送区的格式为:
+ *       数据负载类别,1Byte
+ *       传感器命令数据包数,1Byte
+ *       具体的各个命令数据包,NByte
+ ***************************************
+ */
+void DoInternalSensorScanAndPost()
+{
+	int xlen=0, ylen=0;
+	uint8_t emergencyflag=0;
+	uint8_t *pSendBuf = USART1_TX_BUF;
+	static int step = 0;
+	static int nstep = 0;
+	static uint32_t flowID = 0;
+
+	if(++step % Pass41SensorScanParam.step == 0){	
+		for(int n=0; n<Pass41SensorScanParam.cmd_num; n++) {
+			switch (Pass41SensorScanParam.cmd_arr[n]){
+			case 0x40:
+				xlen = BuildSealTxCmd(pSendBuf, emergencyflag?NULL:&emergencyflag);
+				pSendBuf += xlen;
+			    ylen += xlen;
+				break;
+			case 0x91:
+				xlen = Build91Cmd(pSendBuf, emergencyflag?NULL:&emergencyflag);
+				pSendBuf += xlen;
+			    ylen += xlen;
+				break;
+			case 0xA1:
+				xlen = BuildA1Cmd(pSendBuf, flowID, emergencyflag?NULL:&emergencyflag); 
+				pSendBuf += xlen;
+			    ylen += xlen;
+				break;
+			default:
+				break;
+			}
+		}
+		
+		if(emergencyflag) {
+			TerminalSlave485_Send_Data(USART1_TX_BUF,ylen);
+			nstep = 0;
+			emergencyflag = 0;
+			flowID++;
+		} else {
+			if(++nstep % Pass41SensorScanParam.nstep == 0) {
+				TerminalSlave485_Send_Data(USART1_TX_BUF,ylen);
+				flowID++;
+			}
+		}
+	}
+}
 
 #include "leaf_ota.h"
 //uint32_t data_count=0;
@@ -1126,6 +1402,18 @@ void Data_analysis(void)
 		usart1_rx_flag=0;
 		usart_timesec=0;
 		f3_flag=0;
+
+		// xy,匹配到0x0139为首的5字节的头,表示是41串口透传下行的数据
+		// 5字节的头定义为:
+		//     [0][1] -- 01 39
+		//     [2] -- 透传有效数据长度
+		//     [3][4] -- 流水号
+		if( (USART1_RX_BUF[0]==0x01) && (USART1_RX_BUF[1]==0x39)){
+			memcpy(Pass41SensorScanParam.rx_buf,USART1_RX_BUF,5);
+			memcpy(USART1_RX_BUF,USART1_RX_BUF+5,rx1_len-5);
+			rx1_len -=5;
+		}
+		
 		if((USART1_RX_BUF[0]==':') && (USART1_RX_BUF[1]==0xa5) && (USART1_RX_BUF[1]==0xa5))
 		{
 			memcpy(USART1_RX_BUF,USART1_RX_BUF+1,rx1_len-5);
@@ -5048,6 +5336,10 @@ int 	Process_CMD_0x39_RemoteCali(uint8_t dataMode)
  					FM25L16B_Read_N_Bytes(ADDR_OiLType_Data,T2C_RemoteCaliDat001.PayLoadData,32);
 					T2C_RemoteCaliDat001.NumberOfRegs = 32;
 					break;
+				case	ADDR_Sensor_Scan_Param:
+ 					FM25L16B_Read_N_Bytes(ADDR_Sensor_Scan_Param,T2C_RemoteCaliDat001.PayLoadData,16);
+					T2C_RemoteCaliDat001.NumberOfRegs = 16; 
+      			break;	
 				default:
 
 					//memset(&USART1_TX_BUF[33], '=', sizeof(USART1_TX_BUF) - 33);
@@ -5356,7 +5648,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,16);
+					InitSensorScanParam();
+					T2C_RemoteCaliDat001.NumberOfRegs = 16; 
+      			break;	
+
 				case	ADDR_TiltAngle_Sensor://倾角补偿参数  ----长度为16字节
  					FM25L16B_Write_N_Bytes(ADDR_TiltAngle_Sensor,T2C_RemoteCaliDat001.PayLoadData,16);
 					T2C_RemoteCaliDat001.NumberOfRegs=16;	
@@ -5389,14 +5687,13 @@ int 	Process_CMD_0x39_RemoteCali(uint8_t dataMode)
 					//memcpy(TimeBuf+1,T2C_RemoteCaliDat001.PayLoadData,6);
 #if	0
 					ds1302_Write_Time(T2C_RemoteCaliDat001.PayLoadData-1);
+
 #else
 					uint8_t Time_buf[16];
 					memset(Time_buf,0x00,sizeof(Time_buf));
 					memcpy((void*)&Time_buf[1],(void*)T2C_RemoteCaliDat001.PayLoadData,sizeof(Time_buf) - 1);
 					ds1302_Write_Time(Time_buf);
 #endif
-					
-					
 					/*for(i001=0;i001<6;i001++)
 					{
 						sprintf((char *)(char*)(&USART1_TX_BUF[33+i001]),"%02X",T2C_RemoteCaliDat001.PayLoadData[i001]);