C# 在for循环之后无法访问va relisport的值
我现在正在做一个项目,使用UI从windows服务打开中继。例如,如果选择继电器1,则继电器1应工作;如果选择继电器2,则继电器1应工作。由于代码对我来说是新的,我试图通过附加一个进程来调试它。在调试期间,我可以看到totalrelais计数为2C# 在for循环之后无法访问va relisport的值,c#,loops,for-loop,C#,Loops,For Loop,我现在正在做一个项目,使用UI从windows服务打开中继。例如,如果选择继电器1,则继电器1应工作;如果选择继电器2,则继电器1应工作。由于代码对我来说是新的,我试图通过附加一个进程来调试它。在调试期间,我可以看到totalrelais计数为2 var totalrelais = currentRelaisCard.Relais.Count(); private void setRelaisStatus() { 长相对运动=0; 如果(_relais==null | | u relais.
var totalrelais = currentRelaisCard.Relais.Count();
private void setRelaisStatus()
{
长相对运动=0;
如果(_relais==null | | u relais.Count==0)
返回;
尝试
{
var managedRelaisCardIDs=_relais.Where(r=>r.RelaisCard!=null)。选择(r=>r.RelaisCard.RelaisCardID)。Distinct().ToList();
foreach(在ManagedRelaidCardDS中输入var managedRelaidCardId)
{
List finishedRelais=新列表();
#区域获取当前控制器每个继电器的状态
string debugText=string.Empty;
var currentRelaisCard=\u relaisCards.FirstOrDefault(r=>r.RelaisCardID==managedRelaidCardId);
var relaisOfCurrentCard=\u relais.Where(r=>r.RelaisCard.RelaisCardID==managedRelaidCardId);
var totalrelais=currentRelaisCard.Relais.Count();
for(int i=1;i r.Relais.RelaisNumber==i);
//此继电器不可用或处于活动状态
if(matchingRelais==null)
{
debugText++=“Relais”+i.ToString()+”:0“+Environment.NewLine;
继续;
}
//此relais的活动期已结束
如果(!matchingRelais.Relais.IsBusy)
{
finishedRelais.Add(_relais.First(r=>r.relais.RelaisID==matchingRelais.relais.RelaisID).relais.RelaisID);
//_relais.Remove(_relais.First(r=>r.relais.RelaisID==matchingRelais.relais.RelaisID));
debugText++=“Relais”+i.ToString()+”:0“+Environment.NewLine;
继续;
}
if(matchingRelais.Relais.MainPeriodStart-DateTime.Now)
{
relaisPorts+=(long)Math.Pow(2,(i-1));
debugText++=“Relais”+i.ToString()+”:1(“+(int)(matchingRelais.Relais.mainpiordend-DateTime.Now).TotalSeconds+“seconds left)”+Environment.NewLine;
}
}
如果(relisport==1)
{
如果(!string.IsNullOrEmpty(debugText))
debugText+=Environment.NewLine;
#端区
var relaicommand=buildrelaicommand(relaicommandtype.SetRelais,relaicommandtype.EnableRelayOne);
//如果relais状态未更改,且最后一个发送命令的时间不超过8秒(relais安全性)…则不需要重新发送
如果(currentRelaisCard.LastSendCommand==null||
BitConverter.ToString(CurrentRelaiCard.LastSendCommand)!=BitConverter.ToString(RelaiCommand)||
(DateTime.Now-CurrentRelaiCard.LastSendCommandTime).TotalSeconds>=8)
{
sendRelaisCommand(relaisCommand,currentRelaisCard);
如果(!string.IsNullOrEmpty(debugText))
debugText+=Environment.NewLine+DateTime.Now.ToLongTimeString()+“向控制器发送命令:”+(BitConverter.ToString(RelaiCommand)+Environment.NewLine);
}
我创建了一个变量relisport并存储了I的值,因为第一个变量I是1。relisport也应该等于1。因此我创建了一个if循环,它表示if(relisport==1)然后中继一个应该工作。但在运行时测试控制台无法访问该值。是我的逻辑错误,还是我缺少一些东西,因为我是编程界的新手,请帮助我
谢谢,
Kushagra Rathi任何要在两个for循环外部访问的变量都必须在循环之前移动声明。
private void setRelaisStatus()
{
long relaisPorts = 0;
if (_relais == null || _relais.Count == 0)
return;
try
{
var managedRelaisCardIDs = _relais.Where(r => r.RelaisCard != null).Select(r => r.RelaisCard.RelaisCardID).Distinct().ToList();
foreach (var managedRelaidCardId in managedRelaisCardIDs)
{
List<Guid> finishedRelais = new List<Guid>();
#region Get status for each relais of the current controller
string debugText = string.Empty;
var currentRelaisCard = _relaisCards.FirstOrDefault(r => r.RelaisCardID == managedRelaidCardId);
var relaisOfCurrentCard = _relais.Where(r => r.RelaisCard.RelaisCardID == managedRelaidCardId);
var totalrelais = currentRelaisCard.Relais.Count();
for (int i = 1; i <= totalrelais; i++)
{
if (string.IsNullOrEmpty(debugText))
{
debugText += Environment.NewLine + DateTime.Now.ToLongTimeString() + " Setting up relais-status for controller on " + currentRelaisCard.SerialPortName + Environment.NewLine;
}
var matchingRelais = relaisOfCurrentCard.FirstOrDefault(r => r.Relais.RelaisNumber == i);
// This relais is not available or active
if (matchingRelais == null)
{
debugText += "Relais " + i.ToString() + ": 0" + Environment.NewLine;
continue;
}
// This relais's active period is over
if (!matchingRelais.Relais.IsBusy)
{
finishedRelais.Add(_relais.First(r => r.Relais.RelaisID == matchingRelais.Relais.RelaisID).Relais.RelaisID);
//_relais.Remove(_relais.First(r => r.Relais.RelaisID == matchingRelais.Relais.RelaisID));
debugText += "Relais " + i.ToString() + ": 0" + Environment.NewLine;
continue;
}
if (matchingRelais.Relais.MainPeriodStart <= DateTime.Now &&
matchingRelais.Relais.MainPeriodEnd > DateTime.Now)
{
relaisPorts += (long)Math.Pow(2, (i - 1));
debugText += "Relais " + i.ToString() + ": 1 (" + (int)(matchingRelais.Relais.MainPeriodEnd - DateTime.Now).TotalSeconds + " seconds left)" + Environment.NewLine;
}
}
if (relaisPorts == 1)
{
if (!string.IsNullOrEmpty(debugText))
debugText += Environment.NewLine;
#endregion
var relaisCommand = buildRelaisCommand(RelaisCommandType.SetRelais, RelaisCommandType.EnableRelayOne);
// If relais status didn't change and the last send command is not older than 8 seconds (relais security)... a new sending is not required
if (currentRelaisCard.LastSendCommand == null ||
BitConverter.ToString(currentRelaisCard.LastSendCommand) != BitConverter.ToString(relaisCommand) ||
(DateTime.Now - currentRelaisCard.LastSendCommandTime).TotalSeconds >= 8)
{
sendRelaisCommand(relaisCommand, currentRelaisCard);
if (!string.IsNullOrEmpty(debugText))
debugText += Environment.NewLine + DateTime.Now.ToLongTimeString() + " Sending command to controller: " + (BitConverter.ToString(relaisCommand) + Environment.NewLine);
}