Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#对象范围(easymodbus)_C#_Object_Scope - Fatal编程技术网

C#对象范围(easymodbus)

C#对象范围(easymodbus),c#,object,scope,C#,Object,Scope,我试图在一个方法中初始化连接,在另一个方法中使用连接,但无论我做什么,都找不到对象 好吧,我听到了,改变我的方式:) 下面是最相关的代码 基本上我想用按钮连接并分配com端口 然后用另一个按钮或定时器读取寄存器 我理解为什么下面的代码不起作用,但我如何使它起作用 namespace WindowsFormsApplication7 { public partial class Form1 : Form { public void buttonConnect_

我试图在一个方法中初始化连接,在另一个方法中使用连接,但无论我做什么,都找不到对象

好吧,我听到了,改变我的方式:) 下面是最相关的代码

基本上我想用按钮连接并分配com端口 然后用另一个按钮或定时器读取寄存器

我理解为什么下面的代码不起作用,但我如何使它起作用

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());