【发布时间】:2020-02-11 00:29:53
【问题描述】:
当 EasyModbus TCP 计时器内的方法数量增加时,WinForms 应用程序会变慢。应该怎么做才能提高应用程序的速度?
我正在使用 Modbus TCP/IP 从 WinForms 应用程序连接从设备。 EasyModbus TCP/IP 库用于在 WinForms 应用程序和从设备之间建立通信, 数据(浮点数)应该不断地从客户端读取和写入,因此方法被写入用于 Modbus 通信的计时器中。当方法的数量增加时,整个应用程序就会变慢。
using EasyModbus;
ModbusClient modbusClient;
tmr_Modbus_Com.Enabled = false;
timer1.Enabled = false;
private void tmr_Modbus_Com_Tick(object sender, EventArgs e)
{
tmr_Modbus_Com.Enabled = false;
modbusClient.WriteMultipleRegisters(2, ModbusClient.ConvertFloatToRegisters((float)variable, ModbusClient.RegisterOrder.HighLow)); //writing float data in "variable" to client register 40001 and 40002
textbox1.Text = ModbusClient.ConvertRegistersToFloat(modbusClient.ReadHoldingRegisters(394, 2), ModbusClient.RegisterOrder.HighLow).ToString(); //reading data from two registers 393 and 394 and displays on a textbox, "textbox1"
tmr_Modbus_Com.Enabled = true
}
以上代码返回预期结果, 它将浮点数据从 WinForms 写入寄存器号 40001 此外,它还从客户端 ModBus 寄存器 40395 中读取数据并显示在文本框中。
当读取和写入数据的方法数量增加时,整个应用程序会变慢,因为需要同时访问来自多个寄存器的数据。
谁能帮我解决这个问题,如何一次访问多个寄存器而不减慢整个应用程序的速度?
【问题讨论】:
-
不要在 WinForms 应用程序的事件处理线程(又名主线程、UI 线程...)中执行 I/O。使用单独的线程或线程池,或者如果它支持异步。实际上,在执行(慢速)I/O 方法时,您的事件调度线程被阻塞,无法进行任何绘图、用户交互等。这就是使您的应用程序无响应(“减速”)的原因。
-
感谢菲尔多的建议。我正在努力
标签: c# winforms tcp easy-modbus