通过下面的代码,我从 PLC 控制器读取过程变量。该方法具有 var_result 和 var_result_float 等输出。我在最后一行收到错误 CS0177,因为这些输出参数未分配。在第二个 for 循环中,我已为所有条件分配了值。我找不到哪里出了问题。
错误 CS0177 在控制离开当前方法之前,必须将输出参数“var_result”分配给...
错误 CS0177 在控制离开当前方法之前,必须分配输出参数“var_result_float”...
public Int32 doReadMixEx2(Int32 connnr, Int32 timeout, string var_type, string var_format, UInt16 var_offset, UInt16 var_bit, UInt16 var_DB_no, out UInt32 var_result, out Single var_result_float)
{
Int32 result = AGL4.AGL40_PARAMETER_ERROR;
AGL4.DATA_RW40[] rwfield = new AGL4.DATA_RW40[1];
for (int j = 0; j <= 2; j++)
{
rwfield[j] = new AGL4.DATA_RW40();
rwfield[j].BitNr = var_bit;
rwfield[j].DBNr = var_DB_no;
rwfield[j].Offset = var_offset;
rwfield[j].OpAnz = 1;
rwfield[j].Result = 0;
switch (var_type)
{
case "M":
rwfield[j].OpArea = AGL4.AREA_FLAG;
break;
case "I":
rwfield[j].OpArea = AGL4.AREA_IN;
break;
case "O":
rwfield[j].OpArea = AGL4.AREA_OUT;
break;
}
PLC__VAR_vartype = var_type;
switch (var_format)
{
case "X":
rwfield[j].OpType = AGL4.TYP_BIT;
rwfield[j].B = new Byte[rwfield[0].OpAnz];
rwfield[j].B[0] = 0;
break;
case "B":
rwfield[j].OpType = AGL4.TYP_BYTE;
rwfield[j].B = new Byte[rwfield[0].OpAnz];
rwfield[j].B[0] = 0;
break;
}
}
result = AGL4.ReadMixEx(connnr, rwfield, rwfield.Length, timeout);
Return_ReadMixEx = result;
for (int j = 0; j <= 2; j++)
{
if (result != AGL4.AGL40_SUCCESS)
{
// Error happened.
String errormsg = "";
AGL4.GetErrorMsg(result, out Error_Message_ACCON);
var_result = 0;
var_result_float = 0;
}
else
{
switch (var_format)
{
case "X":
var_result = rwfield[j].B[0];
var_result_float = 0;
break;
case "B":
var_result = rwfield[j].B[0];
var_result_float = 0;
break;
}
}
}
return result; // Here I get the Error
}
您说的没错,您正在为变量赋值,但问题是在某些情况/分支中您不会为变量赋值。
例如: 如果
result == AGL4.AGL40_SUCCESS
,您将前往 else
。如果您的 var_format
变量不是 X 或 B,您将不会匹配任何切换条件,并且 var_result
永远不会被分配。
查看您提供的代码。
var_result
和 var_result_float
将始终为 0。因此,我建议您在方法开始时分配它们。
public Int32 doReadMixEx2(Int32 connnr, Int32 timeout, string var_type, string var_format, UInt16 var_offset, UInt16 var_bit, UInt16 var_DB_no, out UInt32 var_result, out Single var_result_float)
{
var_result = 0;
var_result_float = 0;
Int32 result = AGL4.AGL40_PARAMETER_ERROR;
AGL4.DATA_RW40[] rwfield = new AGL4.DATA_RW40[1];
//Rest of your code
return result;
}