C# Timer 读取Modbus 寄存器数值设置 C# timer 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 目前我可以通过button 链接到port,并且读取到寄存器数值。但是软件与PLC只链接一会就自动断开了。怎么会自动断开? 目前我可以通过button 链接到port,并且读取到寄存器数值。但是软件与PLC只链接一会就自动断开了。怎么会自动断开?我的01,02,03,04寄存器的值是分别4个datagridview里面的。我需要可以随时查看不同的tab.而且即使我不在不同tab之间转换,也是连接一会就断开了。我从虚拟端口处可以看见前面一位哥说需要用timer但是我不知道在哪个function设置timer或者你觉得还有其他方法吗。 PC连接RSXXX端口的, 只有一个呀,一个长连接就成了,会自动断。你是用什么方法接收的SeriePort? 方不方便,我把我的代码发给你看下—这里一下子也说不清。。 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(); 为什么不使用。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; } } 刚开始不知道.net里有,所以自己借用了NModbus library,之后是根据这个来写的程序。因为这个library里面有 read register 函数。我可以直接用。 现在我就想知道如何能让我的寄存器的值实时更新或者说隔一段时间更新一下。 自己其实根本没有编程经验,是不得不做啊。大家帮帮忙,有没有什么好的材料什么的 我也知道这个tick事件。但是tick里要实现什么...还有我需要在读取寄存器值之后关闭timer ,关闭port 吗。不知道你可明白.. 你要取寄存器里面的东西,是要发送某指令给他吧Send(xxx)主定时发送一个就成 可以在button 的click事件里>打开串口,打开timer。之后再在timer tick时间里读取寄存器的值,读完之后关闭timer, 关闭端口。用teimer或者线程thread都可以。打开timer后,只要你不主动禁用timer,它会一直运行。 多谢 dxd0128,这正是我想要的。但是我按照您的指示做了之后,一运行就得到port is closed 的错误。请问这个您知道是为什么吗。还有我需要在public FOrm()包含这个吗... timer1.Tick += new EventHandler(timer1_Tick_1); GC.KeepAlive(timer1);还是要在form_load 函数里需要些什么呢...万分感谢您的帮助。 请问dxd0128,是否看到我的问题了呢...我还没有解决这个问题,请问您能否帮忙看下。多谢了 Modbus通信模式就是在接收到命令后根据命令发送一串数据。你要想一直接收到数据,就需要一直对Modbus设置的串口发送命令。 求简单方法 自己创建的类layer,如果我想在别的地方使用,using 怎么写 多路视频数据还原 线程池问题 线程问题。。。出错后重启。。。。。会的进来。。。。 求救:创建事件源问题 诚请各位高手进来看看,思归,孟老大等星星高手该出手时就要出手啊!!! 关于win32和.net 过程或函数 'StoredProcedure1' 需要参数 '@starttime',但未提供该参数。 请教 对于异步更新UI wpf与winform的区别 技术请求。如果您有空闲时间 帮忙指教下。(我分数不是很多了希望能指点下)
目前我可以通过button 链接到port,并且读取到寄存器数值。但是软件与PLC只链接一会就自动断开了。怎么会自动断开?
目前我可以通过button 链接到port,并且读取到寄存器数值。但是软件与PLC只链接一会就自动断开了。怎么会自动断开?
我的01,02,03,04寄存器的值是分别4个datagridview里面的。我需要可以随时查看不同的tab.而且即使我不在不同tab之间转换,也是连接一会就断开了。我从虚拟端口处可以看见
前面一位哥说需要用timer但是我不知道在哪个function设置timer
或者你觉得还有其他方法吗。
方不方便,我把我的代码发给你看下—这里一下子也说不清。。 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();
/// <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;
}
}
刚开始不知道.net里有,所以自己借用了NModbus library,之后是根据这个来写的程序。因为这个library里面有 read register 函数。我可以直接用。
现在我就想知道如何能让我的寄存器的值实时更新或者说隔一段时间更新一下。 自己其实根本没有编程经验,是不得不做啊。大家帮帮忙,有没有什么好的材料什么的
我也知道这个tick事件。但是tick里要实现什么...还有我需要在读取寄存器值之后关闭timer ,关闭port 吗。不知道你可明白..
Send(xxx)
主定时发送一个就成
用teimer或者线程thread都可以。打开timer后,只要你不主动禁用timer,它会一直运行。
多谢 dxd0128,这正是我想要的。但是我按照您的指示做了之后,一运行就得到port is closed 的错误。请问这个您知道是为什么吗。还有我需要在public FOrm()包含这个吗...
timer1.Tick += new EventHandler(timer1_Tick_1);
GC.KeepAlive(timer1);还是要在form_load 函数里需要些什么呢...
万分感谢您的帮助。