ソースを参照

[Add][Modularization][DcMeter]

2021.07.21 / Yuanda Tsai

Actions:
1.DCBM 經測試可正常讀取電壓電流1.此版表經測試可正常讀取 DCBM 電表上的電壓電流
2.經測試 DCM 從 sharememery 可正常取得電表上的訊息
3.最大支持 4 槍

Files:
1. As follow commit history

Image version: D0.00.XX.XXXX.XX
Image checksum: XXXXXXXX

Hardware PWB P/N : XXXXXXX
Hardware Version : XXXXXXX
Yuanda_Tsai 3 年 前
コミット
cfb3f91bd8

+ 148 - 92
EVSE/Modularization/DcMeter/Module_DcMeter.c

@@ -45,6 +45,22 @@ int InitShareMemory()
     else
     {}
 
+   	//Initialize ShmStatusCodeData
+   	/*
+   	if ((MeterSMId = shmget(ShmMeter_info, sizeof(struct METER_INFO),  0777)) < 0)
+    {
+   		DEBUG_ERROR("shmget ShmStatusCodeData NG\n");
+   		result = FAIL;
+	}
+    else if ((ShmMeter_info = shmat(MeterSMId, NULL, 0)) == (void *) -1)
+    {
+    	DEBUG_ERROR("shmat ShmMeter_info NG\n");
+    	result = FAIL;
+   	}
+    else
+    {}
+    */
+    
     return result;
 }
 
@@ -54,10 +70,10 @@ int InitShareMemory()
 int main(void)
 {
 	ParsingRatedCur modelnameInfo = {0};
-	Meter_Info meter_info = {0};
+	Meter_Info meter_info[4];
 	uint8_t pollingIndex = 0;
 	uint8_t	meterIndex = 0;
-	uint8_t failCount = 0;
+	uint8_t failCount[4];
 
 #ifndef DEBUG_STANDALONG
 	// Initialize share memory
@@ -74,14 +90,22 @@ int main(void)
 	}
 
 	RatedCurrentParsing((char*)ShmSysConfigAndInfo->SysConfig.ModelName, &modelnameInfo);
+
+#else
+	modelnameInfo.GetGunCount = 4;
+
 #endif//DEBUG_STANDALONG
 
+	
 	// Initialize DC meter model
 	/*
 	 *	TODO:
 	 *		1. Maybe need to parse configuration by model name
 	 */
 	meterInitialize(METER_MODEL_LEM_L18005A);
+	
+	
+	DEBUG_INFO("modelnameInfo.GetGunCount %d \n", modelnameInfo.GetGunCount);
 
 	// Main loop
 	for(;;)
@@ -90,118 +114,150 @@ int main(void)
 		{
 			if(gun_index == 0)
 				meterIndex = 0;
+			meterIndex = gun_index;
 
 			if(modelnameInfo.ParsingInfo[gun_index].GunType != Gun_Type_AC)
 			{
 				meterApiAssign(meterIndex);
-				switch(pollingIndex)
+				
+				for(pollingIndex=0;pollingIndex<4;pollingIndex++)
 				{
-					case 0:
-						if(readCurrent(&meter_info))
-						{
-							#ifndef DEBUG_STANDALONG
-							/*
-							 *	TODO:
-							 *		1. Synchronize data to share memory
-							 */
-							#else
-							DEBUG_INFO("Output current: %.3f A\n", meter_info.presentCurrent);
-							#endif//DEBUG_STANDALONG
-							pollingIndex++;
-							failCount = 0;
-						}
-						else
-						{
-							if(failCount < 10)
-								failCount++;
-						}
-						break;
-					case 1:
-						if(readVoltage(&meter_info))
-						{
-							#ifndef DEBUG_STANDALONG
-							/*
-							 *	TODO:
-							 *		1. Synchronize data to share memory
-							 */
-							#else
-							DEBUG_INFO("Output voltage: %.3f V\n", meter_info.presetVoltage);
-							#endif//DEBUG_STANDALONG
-							pollingIndex++;
-							failCount = 0;
-						}
-						else
-						{
-							if(failCount < 10)
-								failCount++;
-						}
-						break;
-					case 2:
-						if(readPower(&meter_info))
-						{
-							#ifndef DEBUG_STANDALONG
-							/*
-							 *	TODO:
-							 *		1. Synchronize data to share memory
-							 */
-							#else
-							DEBUG_INFO("Output power: %.3f kw\n", meter_info.presentPower);
-							#endif//DEBUG_STANDALONG
-							pollingIndex++;
-							failCount = 0;
-						}
-						else
-						{
-							if(failCount < 10)
-								failCount++;
-						}
-						break;
-					case 3:
-						if(readEnergy(&meter_info))
-						{
-							#ifndef DEBUG_STANDALONG
-							/*
-							 *	TODO:
-							 *		1. Synchronize data to share memory
-							 */
-							#else
-							DEBUG_INFO("Totalize import energy: %.3f kwh\n", meter_info.totlizeImportEnergy);
-							DEBUG_INFO("Totalize export energy: %.3f kwh\n", meter_info.totlizeExportEnergy);
-							#endif//DEBUG_STANDALONG
-							pollingIndex++;
-							failCount = 0;
-						}
-						else
-						{
-							if(failCount < 10)
-								failCount++;
-						}
-						break;
-					default:
-						pollingIndex = 0;
-						break;
+					switch(pollingIndex)
+					{
+						case 0:
+							if(readCurrent(&meter_info[meterIndex]))
+							{
+								#ifndef DEBUG_STANDALONG
+								/*
+								 *	TODO:
+								 *		1. Synchronize data to share memory
+								 */
+								 
+								 ShmSysConfigAndInfo->SysInfo.DcMeterInfo[meterIndex].presentCurrent = meter_info[meterIndex].presentCurrent;
+								 #ifdef DEBUG_STANDALONG
+								 DEBUG_INFO("shm Output current %d : %.3f A\n", meterIndex, ShmSysConfigAndInfo->SysInfo.DcMeterInfo[meterIndex].presentCurrent);
+								 #endif
+								 
+								#else
+								DEBUG_INFO("Output current %d : %.3f A\n", meterIndex, meter_info[meterIndex].presentCurrent);
+								#endif//DEBUG_STANDALONG
+								//pollingIndex++;
+								failCount[meterIndex] = 0;
+							}
+							else
+							{
+								if(failCount[meterIndex] < 10)
+									failCount[meterIndex]++;
+							}
+							break;
+						case 1:
+							if(readVoltage(&meter_info[meterIndex]))
+							{
+								#ifndef DEBUG_STANDALONG
+								/*
+								 *	TODO:
+								 *		1. Synchronize data to share memory
+								 */
+								 
+								ShmSysConfigAndInfo->SysInfo.DcMeterInfo[meterIndex].presetVoltage = meter_info[meterIndex].presetVoltage;
+								#ifdef DEBUG_STANDALONG
+								DEBUG_INFO("shm Output voltage %d : %.3f V\n", meterIndex, ShmSysConfigAndInfo->SysInfo.DcMeterInfo[meterIndex].presetVoltage);
+								#endif
+								#else
+								DEBUG_INFO("Output voltage %d : %.3f V\n", meterIndex, meter_info[meterIndex].presetVoltage);
+								#endif//DEBUG_STANDALONG
+								//pollingIndex++;
+								failCount[meterIndex] = 0;
+							}
+							else
+							{
+								if(failCount[meterIndex] < 10)
+									failCount[meterIndex]++;
+							}
+							break;
+						case 2:
+							if(readPower(&meter_info[meterIndex]))
+							{
+								#ifndef DEBUG_STANDALONG
+								/*
+								 *	TODO:
+								 *		1. Synchronize data to share memory
+								 */
+								 
+								ShmSysConfigAndInfo->SysInfo.DcMeterInfo[meterIndex].presentPower = meter_info[meterIndex].presentPower;
+								#ifdef DEBUG_STANDALONG
+								DEBUG_INFO("shm Output power %d : %.3f kw\n", meterIndex, ShmSysConfigAndInfo->SysInfo.DcMeterInfo[meterIndex].presentPower);
+								#endif
+								#else
+								DEBUG_INFO("Output power %d : %.3f kw\n", meterIndex, meter_info[meterIndex].presentPower);
+								#endif//DEBUG_STANDALONG
+								//pollingIndex++;
+								failCount[meterIndex] = 0;
+							}
+							else
+							{
+								if(failCount[meterIndex] < 10)
+									failCount[meterIndex]++;
+							}
+							break;
+						case 3:
+							if(readEnergy(&meter_info[meterIndex]))
+							{
+								#ifndef DEBUG_STANDALONG
+								/*
+								 *	TODO:
+								 *		1. Synchronize data to share memory
+								 */
+								 
+								ShmSysConfigAndInfo->SysInfo.DcMeterInfo[meterIndex].totlizeImportEnergy = meter_info[meterIndex].totlizeImportEnergy;
+								#ifdef DEBUG_STANDALONG
+								DEBUG_INFO("shm Totalize import energy %d : %.3f kwh\n", meterIndex, ShmSysConfigAndInfo->SysInfo.DcMeterInfo[meterIndex].totlizeImportEnergy);
+								#endif
+								ShmSysConfigAndInfo->SysInfo.DcMeterInfo[meterIndex].totlizeExportEnergy = meter_info[meterIndex].totlizeExportEnergy;
+								#ifdef DEBUG_STANDALONG
+								DEBUG_INFO("shm Totalize export energy %d : %.3f kwh\n", meterIndex, ShmSysConfigAndInfo->SysInfo.DcMeterInfo[meterIndex].totlizeExportEnergy);
+								#endif
+								#else
+								DEBUG_INFO("Totalize import energy %d : %.3f kwh\n", meterIndex, meter_info[meterIndex].totlizeImportEnergy);
+								DEBUG_INFO("Totalize export energy %d : %.3f kwh\n", meterIndex, meter_info[meterIndex].totlizeExportEnergy);
+								#endif//DEBUG_STANDALONG
+								//pollingIndex++;
+								failCount[meterIndex] = 0;
+							}
+							else
+							{
+								if(failCount[meterIndex] < 10)
+									failCount[meterIndex]++;
+							}
+							break;
+						default:
+							pollingIndex = 0;
+							break;
+					}
 				}
 
-				meterIndex++;
+				//meterIndex++;
 			}
 
-			if(failCount >= 10)
+			if(failCount[meterIndex] >= 10)
 			{
 				#ifndef DEBUG_STANDALONG
 				if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.MeterCommTimeout)
 				{
 					DEBUG_ERROR("Meter communication timeout");
-					ShmStatusCodeData->AlarmCode.AlarmEvents.bits.MeterCommTimeout = ON;
+					ShmSysConfigAndInfo->SysInfo.DcMeterInfo[meterIndex].LinkStatus = 2;
+					//ShmStatusCodeData->AlarmCode.AlarmEvents.bits.MeterCommTimeout = ON;
 				}
 				#endif//DEBUG_STANDALONG
 			}
 			else
 			{
 				#ifndef DEBUG_STANDALONG
-				ShmStatusCodeData->AlarmCode.AlarmEvents.bits.MeterCommTimeout = OFF;
+				ShmSysConfigAndInfo->SysInfo.DcMeterInfo[meterIndex].LinkStatus = 1;
+				//ShmStatusCodeData->AlarmCode.AlarmEvents.bits.MeterCommTimeout = OFF;
 				#endif//DEBUG_STANDALONG
 			}
-			usleep(500000);
+			usleep(200000); 
 		}
 	}
 

+ 2 - 1
EVSE/Modularization/DcMeter/Module_DcMeter.h

@@ -39,7 +39,8 @@
 #include	"define.h"
 #include 	"SystemLogMessage.h"
 
-#define	DEBUG_STANDALONG
+//#define	DEBUG_STANDALONG
+//#define DEBUG_SHAREMEM_LOG
 
 #define ARRAY_SIZE(A)				(sizeof(A) / sizeof(A[0]))
 #define PASS						1

+ 5 - 2
EVSE/Modularization/DcMeter/meterComm.c

@@ -38,8 +38,9 @@ void meterApiAssign(uint8_t meterIndex)
 			 * TODO:
 			 * 	1. Check meter actual API address.
 			 */
-			//sprintf(meterApiAddress, "http://192.168.0.%d/livemeasure", (31 + meterIndex));
-			sprintf(meterApiAddress, "https://foluswen.com/tmate/livemeasure.php"); // Simulator by web server
+			sprintf(meterApiAddress, "http://192.168.0.%d/v1/livemeasure", (31 + meterIndex));
+			//sprintf(meterApiAddress, "http://192.168.0.31/livemeasure");
+			//sprintf(meterApiAddress, "https://foluswen.com/tmate/livemeasure.php"); // Simulator by web server
 
 			break;
 	}
@@ -62,6 +63,8 @@ int readVoltage(Meter_Info *meter_info)
 		default:
 			if(httpGet((uint8_t*)meterApiAddress, data))
 			{
+				//printf("data: %s\n", data);
+				//printf("meterApiAddress: %s\n", meterApiAddress);
 				json_object *livemeasure;
 				livemeasure = json_tokener_parse((char*)data);
 				if(!is_error(livemeasure))

+ 6 - 5
EVSE/Modularization/DcMeter/meterComm.h

@@ -39,11 +39,12 @@
 
 typedef struct METER_INFO
 {
-	double presetVoltage;		// resolution: 1v
-	double presentCurrent;		// resolution: 1a
-	double presentPower;		// resolution: 1kw
-	double totlizeImportEnergy;	// resolution: 1kwh
-	double totlizeExportEnergy;	// resolution: 1kwh
+	double presetVoltage;						// resolution: 1.000v
+	double presentCurrent;					// resolution: 1.000a
+	double presentPower;						// resolution: 1.000kw
+	double totlizeImportEnergy;			// resolution: 1.000kwh
+	double totlizeExportEnergy;			// resolution: 1.000kwh
+	uint8_t LinkStatus;								// 0 = unknow ,1 = link , 2 miss link
 }Meter_Info;
 
 enum METER_MODEL

+ 13 - 0
EVSE/Projects/define.h

@@ -798,6 +798,18 @@ typedef struct
     unsigned int SoftwareRestart;               // 1: SoftwareRestart, Other value: no effect
 }CabinetMiscCommand;
 
+
+typedef struct DC_METER_INFO
+{
+	double presetVoltage;				// resolution: 1.000v
+	double presentCurrent;			// resolution: 1.000a
+	double presentPower;				// resolution: 1.000kw
+	double totlizeImportEnergy;	// resolution: 1.000kwh
+	double totlizeExportEnergy;	// resolution: 1.000kwh
+	unsigned char LinkStatus;		// 0 = unknow ,1 = link , 2 miss link
+}DC_Meter_Info;
+
+
 struct SysInfoData
 {
 	/**************System***************/
@@ -889,6 +901,7 @@ struct SysInfoData
     CabinetSettingFlag      CabinetSetting;
     CabinetMiscCommand      CabinetMicsStatus;
     struct LocalSharingInfo localSharingInfo;           // Local power sharing info structure
+    DC_Meter_Info DcMeterInfo[4];
 };
 
 struct SysConfigAndInfo