|
//測試代碼,打5003,會強制故意換成各種錯誤資料,測完移除二個function
|
|
public int QueryCurrentVID(int requestedVID, ref Dictionary<SecsItem.SecsIndexType, object> QueryList, object arg = null)
|
|
{
|
|
if (requestedVID == 5003) // Special handling for VID 5003 (Control_Mode)
|
|
{
|
|
// Cycle through test cases: 1, 2, ..., TOTAL_TEST_CASES_FOR_5003, then back to 1
|
|
testCaseCounterFor5003 = (testCaseCounterFor5003 % TOTAL_TEST_CASES_FOR_5003) + 1;
|
|
|
|
object valueToSet = null;
|
|
string testDescription = "";
|
|
|
|
switch (testCaseCounterFor5003)
|
|
{
|
|
case 1:
|
|
valueToSet = 300; // int, will cause overflow for U1
|
|
testDescription = "Integer Overflow (300)";
|
|
break;
|
|
case 2:
|
|
valueToSet = -1; // int, will cause overflow for U1
|
|
testDescription = "Integer Out of Range (-1)";
|
|
break;
|
|
case 3:
|
|
valueToSet = 256L; // long, will cause overflow for U1
|
|
testDescription = "Long Overflow (256L)";
|
|
break;
|
|
case 4:
|
|
valueToSet = 1000u; // uint, will cause overflow for U1
|
|
testDescription = "UInt Overflow (1000u)";
|
|
break;
|
|
case 5:
|
|
valueToSet = "ABC"; // string, cannot be parsed to byte
|
|
testDescription = "String Conversion Error (ABC)";
|
|
break;
|
|
case 6:
|
|
valueToSet = "280"; // string, numeric but out of byte range
|
|
testDescription = "String Numeric Out of Range (280)";
|
|
break;
|
|
case 7:
|
|
valueToSet = 123.45; // double, unsupported type for direct U1 conversion
|
|
testDescription = "Unsupported Type (double 123.45)";
|
|
break;
|
|
case 8:
|
|
valueToSet = null; // null value
|
|
testDescription = "Null Value Injection";
|
|
break;
|
|
case TOTAL_TEST_CASES_FOR_5003: // This should be 9 for the 9th case
|
|
default: // Default to a normal, valid case
|
|
valueToSet = (byte)1; // A valid byte value for U1 (e.g., "Online" or "Local")
|
|
testDescription = "Normal Valid Value (byte 1)";
|
|
if (testCaseCounterFor5003 != TOTAL_TEST_CASES_FOR_5003)
|
|
{
|
|
// If counter was unexpected, log it but still provide a normal value.
|
|
logger_SystemError.Error($"[QueryCurrentVID] TEST MODE FOR VID 5003: Unexpected counter value {testCaseCounterFor5003}. Defaulting to normal case.");
|
|
}
|
|
// No need to reset testCaseCounterFor5003 here, it will cycle naturally.
|
|
break;
|
|
}
|
|
|
|
// Using Warn level for test case injection logging to differentiate from actual system errors.
|
|
// This ensures these test-specific logs are noticeable but don't get mixed up with genuine errors
|
|
// if you filter logs by level.
|
|
logger_SystemError.Warn($"[QueryCurrentVID] TEST MODE FOR VID 5003: Injecting Case {testCaseCounterFor5003}/{TOTAL_TEST_CASES_FOR_5003} - {testDescription}. Value: '{TruncateValueForLog(valueToSet)}' (Type: {valueToSet?.GetType().FullName})");
|
|
|
|
// For VID 5003 (Control_Mode), the SECS type is U1 according to DefineValueList.json
|
|
QueryList[SecsItem.SecsIndexType.U1] = valueToSet;
|
|
return 0; // Return 0 to indicate success for the (test) query
|
|
}
|
|
else
|
|
{
|
|
// Original logic for all other VIDs
|
|
return OriginalQueryVIDLogic(requestedVID, ref QueryList, arg);
|
|
}
|
|
}
|
|
private int OriginalQueryVIDLogic(int requestedVID, ref Dictionary<SecsItem.SecsIndexType, object> QueryList, object arg)
|
|
{
|
|
Dictionary<int, VID> vidFile; // Ensure 'VID' is the correct type name for your VID definition objects
|
|
try
|
|
{
|
|
vidFile = jSecs.Read_VID(); // Method to read your VID definitions
|
|
if (vidFile == null)
|
|
{
|
|
logger_SystemError.Error($"[OriginalQueryVIDLogic] jSecs.Read_VID() returned null. Cannot process VID: {requestedVID}");
|
|
return -2; // Error code: Failed to load VID definitions
|
|
}
|
|
}
|
|
catch (Exception exReadVid)
|
|
{
|
|
logger_SystemError.Error($"[OriginalQueryVIDLogic] Exception while reading VID definitions (jSecs.Read_VID()) when querying for VID: {requestedVID}. Exception: {exReadVid.ToString()}", exReadVid);
|
|
return -2;
|
|
}
|
|
|
|
if (vidFile.TryGetValue(requestedVID, out VID vidDefinition)) // Use TryGetValue for safer access
|
|
{
|
|
// Ensure vidDefinition.Name and vidDefinition.ValueType are valid properties of your VID object
|
|
if (jSecs.QueryVidTable.TryGetValue(vidDefinition.Name, out var vidFunctionContainer)) // Replace 'var' with the specific type if known
|
|
{
|
|
try
|
|
{
|
|
// Ensure jSecs.Str2SecsIndexType dictionary and vidDefinition.ValueType are correct
|
|
if (jSecs.Str2SecsIndexType.TryGetValue(vidDefinition.ValueType, out SecsItem.SecsIndexType secsType))
|
|
{
|
|
// Ensure vidFunctionContainer.ReturnVidFunction is the correct way to invoke the function
|
|
// and that it's compatible with 'arg'
|
|
QueryList[secsType] = vidFunctionContainer.ReturnVidFunction.Invoke(arg);
|
|
logger.Debug($"[OriginalQueryVIDLogic] Successfully queried VID: {requestedVID} (Name: {vidDefinition.Name}), ValueType: {vidDefinition.ValueType}, SECSType: {secsType}, Value: '{TruncateValueForLog(QueryList[secsType])}'");
|
|
return 0; // Success
|
|
}
|
|
else
|
|
{
|
|
logger_SystemError.Error($"[OriginalQueryVIDLogic] Could not find SECS type mapping for ValueType '{vidDefinition.ValueType}' associated with VID {requestedVID} (Name: {vidDefinition.Name}).");
|
|
return -4; // Error code: SECS type mapping not found
|
|
}
|
|
}
|
|
catch (Exception exInvoke)
|
|
{
|
|
logger_SystemError.Error($"[OriginalQueryVIDLogic] Exception invoking ReturnVidFunction for VID {requestedVID} (Name: {vidDefinition.Name}, ValueType: {vidDefinition.ValueType}). Exception: {exInvoke.ToString()}", exInvoke);
|
|
return -5; // Error code: Exception during value retrieval function invocation
|
|
}
|
|
}
|
|
else
|
|
{
|
|
logger_SystemError.Warn($"[OriginalQueryVIDLogic] VID Name '{vidDefinition.Name}' (from VID {requestedVID}) was not found in jSecs.QueryVidTable.");
|
|
return -3; // Error code: VID name not registered in QueryVidTable
|
|
}
|
|
}
|
|
else
|
|
{
|
|
logger_SystemError.Warn($"[OriginalQueryVIDLogic] Requested VID {requestedVID} was not found in the loaded VID definitions (vidFile).");
|
|
return -1; // Error code: VID not defined
|
|
}
|
|
}
|