Browse Source

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

xuy 3 years ago
parent
commit
fc81641821
5 changed files with 123 additions and 29 deletions
  1. 2 1
      Inc/CollectMaster485.h
  2. 1 1
      Inc/KeySlave485.h
  3. 1 1
      Src/KeySlave485.c
  4. 90 10
      Src/TerminalSlave485.c
  5. 29 16
      Src/freertos.c

+ 2 - 1
Inc/CollectMaster485.h

@@ -280,10 +280,11 @@ typedef union {
 
 typedef struct
 {
+	uint8_t enable;
 	uint8_t step;  // 构建周期
 	uint8_t nstep; // 上报周期,是step的倍数
 	uint8_t cmd_num;  // 命令数据的总数
-	uint8_t cmd_arr[13] ;  // 挨个具体存放命令代号
+	uint8_t cmd_arr[12] ;  // 挨个具体存放命令代号
 }SensorScanParam_TypeDef; 
 
 

+ 1 - 1
Inc/KeySlave485.h

@@ -243,7 +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_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

+ 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,20220819};
 
 uint8_t flag_exitReset = 0;	 //终止复位命令
 uint8_t flag_Uart4_Busy = 0; //表明打印机占用了总线,暂停语音播报

+ 90 - 10
Src/TerminalSlave485.c

@@ -1248,6 +1248,58 @@ int BuildTimeCmd(uint8_t *pBuf)
 	return send_pos;
 }
 
+/**
+ ***************************************
+ * 构建40命令数据       电子铅封 -- hex制式
+ * 输入:pBuf-构建数据的存放首地址
+ * 返回: 构建数据的字节总数
+ ***************************************
+ */
+int BuildSealTxCmd(uint8_t *pBuf, uint8_t *pEmergy) // 40命令
+{
+	Return_data *ret;
+	int n = 0;
+	uint8_t emergy = 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);
+	}
+
+	emergy = pBuf[0];
+	if(pEmergy) *pEmergy = emergy;
+	return n+2;
+}
+
+/**
+ ***************************************
+ * 构建91命令数据       IO状态 -- hex制式
+ * 输入:pBuf-构建数据的存放首地址
+ * 返回: 构建数据的字节总数
+ ***************************************
+ */
+int Build91Cmd(uint8_t *pBuf, uint8_t *pEmergy) 
+{
+	Return_data *ret;
+	int n = 0;
+	uint8_t emergy = 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);
+	}
+
+	emergy = pBuf[0];
+	if(pEmergy) *pEmergy = emergy;
+	return n+2;
+}
+
 /**
  ***************************************
  * xy,新透传,41串口透传,模拟F3轮询传感器
@@ -1262,25 +1314,49 @@ int BuildTimeCmd(uint8_t *pBuf)
  */
 void DoInternalSensorScanAndPost()
 {
-	uint8_t len=0;
+	int xlen=0, ylen=0;
 	uint8_t emergy=0;
 	uint8_t *pSendBuf = USART1_TX_BUF;
 	static int step = 0;
 	static int nstep = 0;
 
-	if(++step % SensorScanParam.step == 0)
-	{
+	if(++step % SensorScanParam.step == 0){
 		pSendBuf[0] = 1;
-		pSendBuf[1] = 2;
+		pSendBuf[1] = SensorScanParam.cmd_num + 1;
 		pSendBuf += 2;
-		len = BuildA1Cmd(pSendBuf, &emergy); // 目前只实装了A1命令,后续根据新命令设计再行拓展
-		len += BuildTimeCmd(pSendBuf+len);   // 目前总是会附加时间戳命令数据
+		ylen += 2;
+
+		for(int n=0; n<SensorScanParam.cmd_num; n++) {
+			switch (SensorScanParam.cmd_arr[n]){
+			case 0x40:
+				xlen = BuildSealTxCmd(pSendBuf, emergy?NULL:&emergy);
+				pSendBuf += xlen;
+			    ylen += xlen;
+				break;
+			case 0x91:
+				xlen = Build91Cmd(pSendBuf, emergy?NULL:&emergy);
+				pSendBuf += xlen;
+			    ylen += xlen;
+				break;
+			case 0xA1:
+				xlen = BuildA1Cmd(pSendBuf, emergy?NULL:&emergy); 
+				pSendBuf += xlen;
+			    ylen += xlen;
+				break;
+			default:
+				break;
+			}
+		}
+		
+		xlen = BuildTimeCmd(pSendBuf);   // 目前总是会附加时间戳命令数据
+		ylen += xlen;
 		
 		if(emergy) {
-			TerminalSlave485_Send_Data(USART1_TX_BUF,len+2);
+			TerminalSlave485_Send_Data(USART1_TX_BUF,ylen);
 			nstep = 0;
+			emergy = 0;
 		} else {
-			if(++nstep % SensorScanParam.nstep == 0) TerminalSlave485_Send_Data(USART1_TX_BUF,len+2);
+			if(++nstep % SensorScanParam.nstep == 0) TerminalSlave485_Send_Data(USART1_TX_BUF,ylen);
 		}
 	}
 }
@@ -5220,6 +5296,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);
@@ -5528,9 +5608,9 @@ int 	Process_CMD_0x39_RemoteCali(uint8_t dataMode)
       		break;
 
 				case	ADDR_Sensor_Scan_Param:
- 					FM25L16B_Write_N_Bytes(ADDR_Sensor_Scan_Param,T2C_RemoteCaliDat001.PayLoadData,11);
+ 					FM25L16B_Write_N_Bytes(ADDR_Sensor_Scan_Param,T2C_RemoteCaliDat001.PayLoadData,16);
 					InitSensorScanParam();
-					T2C_RemoteCaliDat001.NumberOfRegs = 11; 
+					T2C_RemoteCaliDat001.NumberOfRegs = 16; 
       			break;	
 
 				case	ADDR_TiltAngle_Sensor://倾角补偿参数  ----长度为16字节

+ 29 - 16
Src/freertos.c

@@ -146,26 +146,39 @@ sT2C_ALL_Sensor_Data_Each_Cang *pT2C_ALL_Sensor_Data_Disp = &T2C_ALL_Sensor_Data
 /* USER CODE BEGIN FunctionPrototypes */
 void InitSensorScanParam(void)
 {
-	uint8_t buf[11];
+	uint8_t data[16];
 	
-	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];
-			}
+	FM25L16B_Read_N_Bytes(ADDR_Sensor_Scan_Param, data, 16);
+	if(data[0] == 0x5A){
+		uint8_t *buf = data+1;
+		SensorScanParam.enable = 1;
+		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 = 2;
+				SensorScanParam.cmd_arr[0] = 0x40;
+				SensorScanParam.cmd_arr[1] = 0x91;
+			}	
 		}else{
-			SensorScanParam.cmd_num = 1;
-			SensorScanParam.cmd_arr[0] = 0xA1;
-		}	
+			SensorScanParam.step = 5;
+			SensorScanParam.nstep = 6;
+			SensorScanParam.cmd_num = 2;
+			SensorScanParam.cmd_arr[0] = 0x40;
+			SensorScanParam.cmd_arr[1] = 0x91;
+		}
 	}else{
+		SensorScanParam.enable = 0;
 		SensorScanParam.step = 5;
 		SensorScanParam.nstep = 6;
-		SensorScanParam.cmd_num = 1;
-		SensorScanParam.cmd_arr[0] = 0xA1;
+		SensorScanParam.cmd_num = 2;
+		SensorScanParam.cmd_arr[0] = 0x40;
+		SensorScanParam.cmd_arr[1] = 0x91;
 	}
 }
 
@@ -995,7 +1008,7 @@ void Task_Usart1_Terminal(void const *argument)
 		osDelay(10); //阻塞延时,根据情况调节------保证每秒钟可以接收4帧数据,50*Nms休眠时间
 
 		// xy,新透传,41串口透传,模拟F3轮询传感器,构建数据
-		if(i_task01 % 100 == 99) 
+		if(SensorScanParam.enable && i_task01 % 100 == 99) 
 		{
 			DoInternalSensorScanAndPost();
 		}