问题描述
我正在尝试搜索连接到设备上串行端口的Modbus,并对它运行一些命令。但是,似乎在读取保持寄存器方面并不一致。我正在使用NModbus4
库。
我有一个每秒运行的线程,用于检查可用的串行端口并尝试建立连接:
// === Check if port is open,start connecting procedure if closed
if (!(serialPort.IsOpen))
{
List<string> portnames = new List<string>();
foreach (string s in SerialPort.GetPortNames())
{
portnames.Add(s); // COM3
}
// === Loop through the listed ports and try to connect
foreach (string portname in portnames)
{
if (!(serialPort.IsOpen))
{
try
{
serialPort.PortName = portname;
serialPort.Baudrate = 57600;
serialPort.DataBits = 8;
serialPort.Parity = Parity.None;
serialPort.StopBits = StopBits.Two;
serialPort.open();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
// === Check again after connecting procedure if the port is open
if (serialPort.IsOpen)
{
// === Check number of open ports
if (SerialPort.GetPortNames().Count() != 0)
{
// === Check if master is defined
if (master == null)
{
// === Define master
master = ModbusSerialMaster.CreateRtu(serialPort);
}
// === If master is already defined
if (master != null)
{
int parameterID = this.readParameterSetID();
if (parameterID != 0)
{
if (!desk_devices.Contains(parameterID))
{
desk_devices.Add(parameterID);
newDevice = true;
}
}
}
} else
{
// === No serial ports available,close the opened serial port
serialPort.Close();
}
}
private int readParameterSetID()
{
int parameterSetID = 0;
if (mutex)
{
Console.WriteLine("---Poll overrun----");
}
mutex = true;
if (serialPort.IsOpen)
{
if (master != null)
{
try
{
ushort[] holding_register = master.ReadHoldingRegisters(1,107,1); // Fails here
for (int i = 0; i < 1; i++)
{
int tmpStart = Convert.ToInt32(107 + i);
String tempStart = Convert.ToString(tmpStart,16);
int tmpReg = Convert.ToInt32(holding_register[i]);
String tempReg = Convert.ToString(tmpReg,16);
parameterSetID = holding_register[i];
}
} catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
mutex = false;
return parameterSetID;
}
现在,这里发生的奇怪的事情是readParameterSetID
函数在正确执行时应该返回7或0。但是有时,它在读取保持寄存器后才停止。 mutex
将保持为真,并且不会返回任何内容。当我重新启动应用程序时,它要么起作用,要么再次发生相同的事情。
我不知道为什么它在50%的情况下都能正常工作,而其他50%的情况却什么也没有返回。如果函数master
失败,我曾尝试重新定义readParameterSetID
,但是我注意到,每隔几秒钟,主机将被重置,导致该命令无法发送。
我想知道为什么会这样,或者想办法解决这一问题,并在通信失败的情况下读取保持寄存器。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)