From e1f35018c4dec304b00f50d9dbe12204fd57a623 Mon Sep 17 00:00:00 2001
From: QuakeGod <QuakeGod@sina.com>
Date: 星期四, 29 九月 2022 15:35:10 +0800
Subject: [PATCH] update infoblock step 1

---
 Src/main.c |  187 ++++++++++++++++++++++++++++++++++++----------
 1 files changed, 144 insertions(+), 43 deletions(-)

diff --git a/Src/main.c b/Src/main.c
index 90bd4e5..4648ad1 100644
--- a/Src/main.c
+++ b/Src/main.c
@@ -49,22 +49,23 @@
 #include "KLink.h"
 #include "string.h"
 #include "BSP.h"
+#include "ModbusRTU.h"
 
 /* USER CODE END Includes */
 
 /* Private variables ---------------------------------------------------------*/
-
+#define ADCrefAddr 0x1FFFF7BA
 /* USER CODE BEGIN PV */
 /* Private variables ---------------------------------------------------------*/
 
-#define RXBUFSIZE 128
-#define TXBUFSIZE 128
+#define RX2BUFSIZE 128
+#define TX2BUFSIZE 128
 
 unsigned char Uart1RxBuf[256];
 unsigned char Uart1TxBuf[512];
 
-unsigned char Uart2RxBuf[RXBUFSIZE];
-unsigned char Uart2TxBuf[TXBUFSIZE];
+unsigned char Uart2RxBuf[RX2BUFSIZE];
+unsigned char Uart2TxBuf[TX2BUFSIZE];
 
 //unsigned char buf1[128];	
 
@@ -92,6 +93,7 @@
 int LastCircleStartTime=0;
 int CircleTime=0;
 
+stBinProg1 * pProgs = (stBinProg1 *)STORE_PRG_BASE;
 //volatile unsigned int nRunCount=0;
 volatile int nCount2=0;
 
@@ -109,6 +111,12 @@
 
 /* USER CODE BEGIN PFP */
 /* Private function prototypes -----------------------------------------------*/
+
+const unsigned char LEDSEGTAB[]={
+0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,	//0-F
+0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1,  //0.-F.
+0x00,0x40,			//  ,-,_,~,o,n,N,<,>,J,r,
+};
 
 /* USER CODE END PFP */
 
@@ -254,12 +262,12 @@
 		
 		PutStr(str1,len1);
 
-	InitTimer(0,0);
-	InitTimer(1,1);
-	InitTimer(2,2);
-	InitTimer(3,3);
+//	InitTimer(0,0);
+//	InitTimer(1,1);
+//	InitTimer(2,2);
+//	InitTimer(3,3);
 	
-	StartTimer(0,1000);
+//	RunTimer(0,1000);
 //	StartTimer(2,1000);
 	Locate(13,1);LineCount=3;
 	return 0;
@@ -269,9 +277,24 @@
 
 int ADCProcess()
 {
-					uint16_t ADC_ConvertedValue=0;
+	// ADC channels
+	//  0 -- 24V  --> 0
+	//  1 -- 5V   --> 2
+	//	2 -- 
+	//  3 -- 
+	//  4 -- 
+	//  5 -- 
+	//  6 -- 
+	//  7 -- 
+	//  8 -- 
+	//						 --> 5
+	// 16 -- Temp  --> 6
+	// 17 -- Vref  --> 7
+
+	uint16_t ADC_ConvertedValue=0;
 static int CurChannel=LL_ADC_CHANNEL_0;
 //static int waitcount = 0;
+	
 				if (!LL_ADC_REG_IsConversionOngoing(ADC1))
 				{
 					//waitcount++;
@@ -285,8 +308,8 @@
 					if ((channels & LL_ADC_CHANNEL_0) == LL_ADC_CHANNEL_0)
 					{
 						KMem.ADCValues[0] = ADC_ConvertedValue;
-						nextchannel = LL_ADC_CHANNEL_7;
-					}else if ((channels & LL_ADC_CHANNEL_7) == LL_ADC_CHANNEL_7)
+						nextchannel = LL_ADC_CHANNEL_8;
+					}else if ((channels & LL_ADC_CHANNEL_8) == LL_ADC_CHANNEL_8)
 					{
 						KMem.ADCValues[2] = ADC_ConvertedValue;						
 						nextchannel = LL_ADC_CHANNEL_TEMPSENSOR;
@@ -304,6 +327,8 @@
 					}else if ((channels & LL_ADC_CHANNEL_17) == LL_ADC_CHANNEL_17)
 					{
 						KMem.ADCValues[7] = ADC_ConvertedValue;						
+						KMem.ADCValues[5] = *((unsigned short *)ADCrefAddr);
+						
 						nextchannel = LL_ADC_CHANNEL_0;
 					}else
 					{
@@ -372,10 +397,10 @@
 				timeus2=GetuS();
 				sprintftime = timeus1 - theUs;
 				putstrtime = timeus2 - timeus1;
-				if (IsTimerOn(0)) {StartTimer(1,1000);StopTimer(3);}
-				if (IsTimerOn(1)) {StartTimer(2,100);StopTimer(0);}
-				if (IsTimerOn(2)) {StartTimer(3,10);StopTimer(1);}
-				if (IsTimerOn(3)) {StartTimer(0,10000);StopTimer(2);}
+				if (IsTimerOn(0)) {RunTimer(1,1000);StopTimer(3);}
+				if (IsTimerOn(1)) {RunTimer(2,100);StopTimer(0);}
+				if (IsTimerOn(2)) {RunTimer(3,10);StopTimer(1);}
+				if (IsTimerOn(3)) {RunTimer(0,10000);StopTimer(2);}
 		  }
 			if ((nRunCount2 & 0xff) == 0x2f && 0)
 			{
@@ -395,21 +420,22 @@
 	
 			int len1=0;
 
-			if ((MasterRecved && thisuS-SendTimeuS>50) || thisuS-SendTimeuS>1500u)
+			if ((MasterRecved && MasterRecvOK && thisuS-SendTimeuS>50) || thisuS-SendTimeuS>1000u)
 			{
-				if (!MasterRecved) 
+				if (!MasterRecvOK) 
 				{
 					TimeOutCount++;
 					Uart2Stat.TimeOutErr++; 
 					ChnStats[nCurPollId].LostPackets++;
 					ChnStats[nCurPollId].CtnLstPkts++;
+					if (!MasterRecved) {ChnStats[nCurPollId].TimeOutErr++;}
 					if (ChnStats[nCurPollId].CtnLstPkts>ChnStats[nCurPollId].MaxCtnLstPkts)
 					{ChnStats[nCurPollId].MaxCtnLstPkts=ChnStats[nCurPollId].CtnLstPkts;}
 					if (ChnStats[nCurPollId].CtnLstPkts>3)
 					{
 						ChnStats[nCurPollId].Stat=0;
 						KMem.ErrStat=200;
-						
+						 
 						{BufferIn[nCurPollId]=0;}
 					}
 				//	LL_GPIO_SetOutputPin(GPIOA,LL_GPIO_PIN_7);
@@ -426,7 +452,16 @@
 					LastCircleStartTime=thisuS;
 					nSeq++;
 					nCurPollId=1;
-				}				
+				}
+				if (KMRunStat.WorkMode==0)
+				{
+					KMem.WX[0]= GetInput();
+					KMem.WY[1]=KMem.WX[0]&0xff;
+					KMem.WY[2]=(KMem.WX[0]>>8)&0xff;		
+				}
+				BufferOut[1]=KMem.WY[1];
+				BufferOut[2]=KMem.WY[2];		
+				
 				Datas[0]=BufferOut[nCurPollId];
 				Datas[1]=BufferOut[nCurPollId+1];;
 				Datas[2]=ChnStats[nCurPollId].Stat;
@@ -446,6 +481,7 @@
 				SendTime=tick1;
 
 				MasterRecved=0;
+				MasterRecvOK=0;
 			//	LL_GPIO_TogglePin(GPIOA,LL_GPIO_PIN_5);		
 				//ToggleErrLed();
 //				ToggleOut8();
@@ -464,17 +500,17 @@
 		int thisRecvTime=RecvTimeuS;
 		if (SlaveRecved)
 		{
-			KMem.RunStat=100;
+			KMem.RunStat=8000;
 			SlaveRecved=0;
 		}else if ((ThisuS - thisRecvTime) >12000u)
 		{
-			KMem.ErrStat=200;
+			KMem.ErrStat=8000;
 			KMem.SDD[17]=1;
 			KMem.SDD[18]=ThisuS;
 			KMem.SDD[19]=RecvTimeuS;
 		}else if ( ThisuS > (thisRecvTime + 12000u))
 		{
-			KMem.ErrStat=200;
+			KMem.ErrStat=8000;
 			KMem.SDD[17]=2;
 			KMem.SDD[18]=ThisuS;
 			KMem.SDD[19]=RecvTimeuS;
@@ -544,7 +580,7 @@
   /* USER CODE BEGIN SysInit */
 	TickFreq=10000;		//Tick频率
 	InituS(TickFreq);	
-  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/TickFreq);	//重新定义SysTick的频率�
+ // HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/TickFreq);	//重新定义SysTick的频率�
 
   /* USER CODE END SysInit */
 
@@ -565,7 +601,8 @@
 	if (KMem.EffJumperSW == 0x00) Uart1Baud = DefaultUart1Baud;
   MX_USART1_UART_Init();
   MX_USART2_UART_Init();
-//	MX_SPI1_Init();
+	MX_SPI1_Init();
+	
 	MX_SPI2_Init();
   MX_ADC_Init();
 	MX_IWDG_Init();
@@ -575,7 +612,8 @@
 	LL_USART_EnableIT_IDLE(USART1);
 	LL_USART_EnableIT_TC(USART1);
 
-	LL_USART_EnableIT_RXNE(USART2);
+//	LL_USART_EnableIT_RXNE(USART2);
+	Uart2RecvDMA(Uart2RecvBuf1,sizeof(Uart2RecvBuf1));	
 	LL_USART_EnableIT_IDLE(USART2);
 	LL_USART_EnableIT_TC(USART2);
 	
@@ -605,8 +643,34 @@
 			EnableDisIn(1);				//Input Diaplay Enable 595 
 		}
 	SetOutStat(0);			//OK Good, signal
-//	ShowInitInfo();
+	ShowInitInfo();
 	KMem.LastScanTime = GetuS();
+/*		
+	int time1=GetuS();	
+	PutOutput(0x01);
+	int x;
+	while (1)
+	{
+		x = GetInput();
+		if (x&0x1) break;
+	}
+	int time2=GetuS();
+	
+	KMem.SDD[17]=time2-time1;
+	PutOutput(0x00);
+	while (1)
+	{
+		x = GetInput();
+		if ((x&0x1) == 0) break;
+	}	
+	int time3=GetuS();
+	
+	KMem.SDD[18]=time3-time2;	
+*/	
+	InitPLC();
+	StartPLC();
+	KMRunStat.WorkMode=1;
+	KMem.WX[5]=0x5a;
   while (1)
   {
 		//int MyKeyStat1,MyKeyStat2;
@@ -620,15 +684,17 @@
 		us1=GetuS();
 		int haltick=HAL_GetTick();
 		
-		int CurJumperSW=ReadJumperSW();		
-		KMem.CurJumperSW=CurJumperSW;
+//		int CurJumperSW=ReadJumperSW();		
+//		KMem.CurJumperSW=CurJumperSW;
 		KMem.haltick=haltick;
 //		KMem.TotalRunTime=TotalRunTime;
 //		KMem.ThisRunTime=ThisRunTime;		
 		
 //		*((unsigned int *)&(PLCMem.SDT[2]))=nChilds;
-		
-		KMem.WX[0]= GetInput();
+//		KMem.SDD[13]=PendSvCount;
+//		KMem.SDD[14]=RCC->CSR;		
+
+		KMem.WX[0]= GetInput();		
 		
 		if (GetBoardType() == 7 || GetBoardType() ==8 
 			|| GetBoardType() == 9 || GetBoardType() ==10 ) 
@@ -636,13 +702,27 @@
 			displayInput(KMem.WX[0]);
 		}
 		us2=GetuS();
-
-//		ProcessPLCPROG(prog1, nSizeProg1);
-//		ScanTimeuS=us2-LastScanTime;
-//		LastScanTime = us2;
+		
+		
+//		pProgs = (stBinProg1 *) STORE_PRG_BASE;
+		if (	KMRunStat.WorkMode==1)
+		{
+			
+		if (KMRunStat.nBinProgBank == 0){
+			pProgs=(stBinProg1 *)STORE_PRG_BASE;
+		}else {
+			pProgs=(stBinProg1 *)ALT_PRG_BASE;
+		}
+		nSizeProg1=KMRunStat.nBinProgSize;
+		
+		ProcessPLCBinProg(pProgs, nSizeProg1);
+		}
+		KMem.ScanTimeuS=us2-KMem.LastScanTime;
+		KMem.LastScanTime = us2;
 		if (KMem.ScanTimeuS < KMem.MinScanTimeuS) {KMem.MinScanTimeuS = KMem.ScanTimeuS;}
 		if (KMem.ScanTimeuS > KMem.MaxScanTimeuS) {KMem.MaxScanTimeuS = KMem.ScanTimeuS;}
-		if (repeater)		{	RepeaterFunc();	}
+//		if (repeater)		{	RepeaterFunc();	}
+
 		us3=GetuS();
 		if ((KMem.nRunCount &0x1f) == 0x02)
 		{
@@ -667,11 +747,11 @@
 		}
 		if (bMaster)		
 		{
-			BufferOut[1]=KMem.WX[0]&0xff;
-			BufferOut[2]=(KMem.WX[0]>>8)&0xff;
+//			BufferOut[1]=KMem.WX[0]&0xff;
+//			BufferOut[2]=(KMem.WX[0]>>8)&0xff;
 			MasterFunc();
 			
-			KMem.WY[0]=BufferIn[1]+(BufferIn[2]<<8);
+//			KMem.WY[0]=BufferIn[1]+(BufferIn[2]<<8);
 
 			if (haltick&0x00002000) SlowFlicker=1;
 			else SlowFlicker=0;
@@ -681,7 +761,7 @@
 		}
 		if (bSlave)		
 		{
-			BufferOut[0]=KMem.WX[0];
+//			BufferOut[0]=KMem.WX[0];
 			SlaveFunc();	
 			if (! KMem.RunStat) {BufferIn[0]=0;}
 			KMem.WY[0]=BufferIn[0];
@@ -738,7 +818,12 @@
 //		SDT[48]=55;
 		if (Uart1RecvBuf1DataLen >0 && Uart1Stat.bPacketRecved)
 		{
-			KLParsePacket(Uart1RecvBuf1,Uart1RecvBuf1DataLen);
+			int res1 = -1;
+			res1 = ModBusSlaveParsePkg(Uart1RecvBuf1,Uart1RecvBuf1DataLen);
+			if (res1 !=0)
+			{
+				KLParsePacket(Uart1RecvBuf1,Uart1RecvBuf1DataLen);
+			}
 			Uart1RecvBuf1DataLen=0;
 			Uart1Stat.bPacketRecved=0;
 		}
@@ -752,7 +837,23 @@
 				clearscreen();
 			}
 		}
-*/		
+*/	
+		unsigned char pos,seg;
+		unsigned short val;
+		pos=((KMem.nRunCount)&0x3);
+		//val=(KMem.nRunCount)&0xfff;
+		val=KMem.ErrStat;
+		char buf5[20];
+		sprintf(buf5,"%4d",val);
+		val=buf5[3-pos];
+		if (val <'0' || val >'9') {seg=0;}
+		else {seg=LEDSEGTAB[val-'0'];}
+		
+		pos=1<<pos;
+		//pos=1;
+		//seg=2;
+		seg=~seg;
+		PutOutputSPI1(pos|(seg<<8));
 	 LL_IWDG_ReloadCounter(IWDG);
 		
   }	//while (1) ;

--
Gitblit v1.9.1