解决方案 »

  1.   


    目前我可以通过button 链接到port,并且读取到寄存器数值。但是软件与PLC只链接一会就自动断开了。怎么会自动断开?
      

  2.   


    目前我可以通过button 链接到port,并且读取到寄存器数值。但是软件与PLC只链接一会就自动断开了。怎么会自动断开?
    我的01,02,03,04寄存器的值是分别4个datagridview里面的。我需要可以随时查看不同的tab.而且即使我不在不同tab之间转换,也是连接一会就断开了。我从虚拟端口处可以看见
    前面一位哥说需要用timer但是我不知道在哪个function设置timer
    或者你觉得还有其他方法吗。
      

  3.   

    PC连接RSXXX端口的, 只有一个呀,一个长连接就成了,会自动断。你是用什么方法接收的SeriePort?
      

  4.   


    方不方便,我把我的代码发给你看下—这里一下子也说不清。。 Pc连接用RS485
     SerialPort port = new SerialPort(ComBox.Text);
                // configure serial port and open port 
                port.BaudRate = Convert.ToInt16(BaudBox.Text.ToString());
                port.DataBits = 8;
                port.Parity = Parity.None;
                port.StopBits = StopBits.One;
                Modbus.Device.ModbusSerialMaster master = Modbus.Device.ModbusSerialMaster.CreateRtu(port);
                byte slaveId = Convert.ToByte(SlaveID2.Text.ToString());
                            //timer1.Enabled = false; 
                port.Open();
      

  5.   

    为什么不使用。net自带的端口操作
            /// <summary>初始化操作器通讯串口
            /// </summary>
            /// <param name="portName"></param>
            /// <returns></returns>
            public bool InitPort(string portName)
            {
                _SerialPort = new SerialPort
                              {
                                  PortName = portName,
                                  BaudRate = 9600,
                                  DataBits = 8,
                                  ReadTimeout = 150,
                                  ReceivedBytesThreshold = 1,
                                  ReadBufferSize = 32,
                              };
               //串口接收事件
                _SerialPort.DataReceived += SerialPortDataReceived;
                _SerialPort.ErrorReceived += SerialPortErrorReceived;
                try
                {
                    if (_SerialPort.IsOpen)
                    {
                        _SerialPort.Close();
                        _SerialPort.Open();
                    }
                    else
                    {
                        _SerialPort.Open();
                    }
                    return _SerialPort.IsOpen;
                }
                catch (Exception e)
                {
                    return false;
                }
            }
      

  6.   


    刚开始不知道.net里有,所以自己借用了NModbus library,之后是根据这个来写的程序。因为这个library里面有 read register 函数。我可以直接用。 
    现在我就想知道如何能让我的寄存器的值实时更新或者说隔一段时间更新一下。 自己其实根本没有编程经验,是不得不做啊。大家帮帮忙,有没有什么好的材料什么的
      

  7.   


    我也知道这个tick事件。但是tick里要实现什么...还有我需要在读取寄存器值之后关闭timer ,关闭port 吗。不知道你可明白..
      

  8.   

    你要取寄存器里面的东西,是要发送某指令给他吧
    Send(xxx)
    主定时发送一个就成
      

  9.   

    可以在button 的click事件里>打开串口,打开timer。之后再在timer tick时间里读取寄存器的值,读完之后关闭timer, 关闭端口。
    用teimer或者线程thread都可以。打开timer后,只要你不主动禁用timer,它会一直运行。
      

  10.   


    多谢 dxd0128,这正是我想要的。但是我按照您的指示做了之后,一运行就得到port is closed 的错误。请问这个您知道是为什么吗。还有我需要在public FOrm()包含这个吗...
     timer1.Tick += new EventHandler(timer1_Tick_1);
                GC.KeepAlive(timer1);还是要在form_load 函数里需要些什么呢...
    万分感谢您的帮助。 
      

  11.   

    请问dxd0128,是否看到我的问题了呢...我还没有解决这个问题,请问您能否帮忙看下。多谢了
      

  12.   

    Modbus通信模式就是在接收到命令后根据命令发送一串数据。你要想一直接收到数据,就需要一直对Modbus设置的串口发送命令。