C#对象范围(easymodbus)
我试图在一个方法中初始化连接,在另一个方法中使用连接,但无论我做什么,都找不到对象 好吧,我听到了,改变我的方式:) 下面是最相关的代码 基本上我想用按钮连接并分配com端口 然后用另一个按钮或定时器读取寄存器 我理解为什么下面的代码不起作用,但我如何使它起作用C#对象范围(easymodbus),c#,object,scope,C#,Object,Scope,我试图在一个方法中初始化连接,在另一个方法中使用连接,但无论我做什么,都找不到对象 好吧,我听到了,改变我的方式:) 下面是最相关的代码 基本上我想用按钮连接并分配com端口 然后用另一个按钮或定时器读取寄存器 我理解为什么下面的代码不起作用,但我如何使它起作用 namespace WindowsFormsApplication7 { public partial class Form1 : Form { public void buttonConnect_
namespace WindowsFormsApplication7
{
public partial class Form1 : Form
{
public void buttonConnect_Click(object sender, EventArgs e)
{
ModbusClient modbusClient = new ModbusClient(comboBoxCOMPorts.SelectedItem.ToString());
modbusClient.Connect();
}
private void readRegister()
{
int[] register = modbusClient.ReadHoldingRegisters(Convert.ToInt32(textboxRegisterattlasa.Text), Convert.ToInt32(textboxAntalregister.Text)); //startadress, quantity of addresses
foreach (int name in register)
{
listBoxOutput.Items.Add("Register " + Convert.ToInt32(textboxRegisterattlasa.Text) + " = " + Convert.ToString(name));
}
}
我立刻发现了一些问题
modbusConnected
仅在if
块中设置为true
,该块仅在modbusConnected
已true
时执行,因此您的整个逻辑流都是错误的
如果你想得到更具体的帮助,你需要更具体地说明你的问题。发生了什么事?您希望发生什么情况?您正在
readRegister()
方法中声明第二个名为modbusClient
的局部变量:
private void readRegister()
{
if (modbusConnected == true)
{
/* Bad idea */
ModbusClient modbusClient = new ModbusClient(comboBoxCOMPorts.SelectedItem.ToString());
名为modbusClient
的变量的作用域是声明它的if
块。您没有为名为modbusClient
的字段赋值。您正在为恰好具有相同名称的完全不同的变量赋值。如果对modbusClient
的错误实例执行modbusClient
块中的modbusClient
所做的一切
我习惯用下划线前缀命名字段:
private ModbusClient _modbusClient = null;
和不带前缀的局部变量。这样,你总是知道你在看什么
解决方案
如果要分配给名为modbusClient
的字段,请不要声明隐藏该字段的新变量。只需分配给modbusClient
:
private void readRegister()
{
// Don't you want to do this if it's NOT connected?
if (!modbusConnected)
{
modbusClient = new ModbusClient(comboBoxCOMPorts.SelectedItem.ToString());
您不需要将布尔值与
true
(或者实际上false
,如果我正确理解了代码的意图)<代码>如果(!modbusConnected)将是编写该代码的惯用方法 虽然在某些情况下可以显示整个类,但仍然应该只显示相关代码。我不想读你的整个课程,因为大部分内容与所讨论的代码无关。此外,如果您遇到错误,您应该给出有关该错误的详细信息。您不应该在if中计算modbusconned==false
?您尝试在哪种方法中初始化以及在哪种方法中使用连接?请编辑您的问题以仅显示相关代码。@JeeyBee我将替换您正在加载组合框的所有foreach循环,并使用您声明的字符串[]
的Items.AddRange()
。在这里阅读-谢谢,一开始我没有得到它,但现在我得到了,它现在工作得很好,首先在开始时创建对象,然后在读取寄存器方法中仅使用modbusClient=new modbusClient(comboBoxCOMPorts.SelectedItem.ToString());