使用EasyModbus函式庫讀取Modbus資料超慢的,是沒有錯啦,因為RS232本來通訊傳輸與回應本來就不高,慢是應該的,當然只有讀取一兩筆資料沒有感覺,但是當讀取愈來愈多呢?
鮑率(baudrate)是影響讀取快慢的原因,9600 vs 115200,當然調越高就越快,可以縮短反應時間,但真正影響快慢是讀取的次數。
分多次讀取會非常慢
Console.WriteLine("Value of #1: "+modbusClient.ReadHoldingRegisters(100,1)[0].ToString());
Console.WriteLine("Value of #2: "+modbusClient.ReadHoldingRegisters(101,1)[0].ToString());
Console.WriteLine("Value of #3: "+modbusClient.ReadHoldingRegisters(102,1)[0].ToString());
Console.WriteLine("Value of #4: "+modbusClient.ReadHoldingRegisters(103,1)[0].ToString());
Console.WriteLine("Value of #5: "+modbusClient.ReadHoldingRegisters(104,1)[0].ToString());
Console.WriteLine("Value of #6: "+modbusClient.ReadHoldingRegisters(105,1)[0].ToString());
Console.WriteLine("Value of #7: "+modbusClient.ReadHoldingRegisters(106,1)[0].ToString());
從上面的程式碼可以看到,我們想要讀取位置100號到106號,但是我們分了七次取讀取,那就慢到昏倒了,因為通訊中最慢的部分就是取資料的這段,如果可以一次讀取,那就一次抓,情況會大大改善。
一次就取完資料
int[] TempRead = modbusClient.ReadHoldingRegisters(100,7); // 第二個參數是取出的組數
Console.WriteLine("Value of #1: "+TempRead[0].ToString());
Console.WriteLine("Value of #2: "+TempRead[1].ToString());
Console.WriteLine("Value of #3: "+TempRead[2].ToString());
Console.WriteLine("Value of #4: "+TempRead[3].ToString());
Console.WriteLine("Value of #5: "+TempRead[4].ToString());
Console.WriteLine("Value of #6: "+TempRead[5].ToString());
Console.WriteLine("Value of #7: "+TempRead[6].ToString());
看出其中的貓膩了吧,所以當我們設計Modbus資料寫入到Server(Master)中,就記得要寫入連續的位置,這樣將來一次讀取就搞定,不然就慢到睡著了喔。