这是我的代码。在这段代码中,我每时每秒都在调用
错误comp端口访问被拒绝
我在5次通话后得到这个。
using (SerialPort port = new SerialPort(serialPortName))
{
if (port.IsOpen)
{
port.Close();
port.Dispose();
}
port.BaudRate = 19200;
port.DataBits = 8;
port.Parity = Parity.None;
port.StopBits = StopBits.Two;
port.Open();
// create modbus master
IModbusSerialMaster master = ModbusSerialMaster.CreateRtu(port);
byte slaveId = Convert.ToByte(txtSlaveId.Text.Trim());
ushort startAddress = Convert.ToUInt16(StartAddress);
ushort numRegisters = Convert.ToUInt16(NumberofRegisters);
SystemLog systemLog = new SystemLog();
systemLog.SlaveId = txtSlaveId.Text.Trim();
systemLog.VariableName = VariableName;
systemLog.ReadStartTime = DateTime.Now;
switch (Type)
{
case "CO":
bool[] status = master.ReadCoils(slaveId, startAddress, numRegisters);
for (int j = 0; j < numRegisters; j++)
{
systemLog.ReadEndTime = DateTime.Now;
systemLog.ReadAddress = Convert.ToString(Convert.ToInt32(StartAddress) + j);
systemLog.ReadType = (int)PLCReadType.COIL;
systemLog.ReadValue = Convert.ToString(status[j]);
}
break;
case "IR":
ushort[] inputRegister = master.ReadInputRegisters(slaveId, startAddress, numRegisters);
for (int j = 0; j < numRegisters; j++)
{
systemLog.ReadEndTime = DateTime.Now;
systemLog.ReadAddress = Convert.ToString(Convert.ToInt32(StartAddress) + j);
systemLog.ReadType = (int)PLCReadType.COIL;
systemLog.ReadValue = Convert.ToString(inputRegister[j]);
}
break;
case "HR":
ushort[] holdingRegister = master.ReadHoldingRegisters(slaveId, startAddress, numRegisters);
for (int j = 0; j < numRegisters; j++)
{
systemLog.ReadEndTime = DateTime.Now;
systemLog.ReadAddress = Convert.ToString(Convert.ToInt32(StartAddress) + j);
systemLog.ReadType = (int)PLCReadType.COIL;
systemLog.ReadValue = Convert.ToString(holdingRegister[j]);
}
break;
}
systemLogArray[i] = systemLog;
port.Close();
port.Dispose();
}
答案 0 :(得分:0)
您的问题听起来像是时间问题。似乎您的最后一个实例没有被处理,并且该端口尚未被释放以便再次使用。
我建议在循环之前打开端口。每秒钟完成所有必要的阅读,并在完成后再次关闭。 请删除使用块。港口不需要喂养,也不会在一分钟内摆脱60次,从而为您带来性能优势。
如果你看一下这段代码:
using (SerialPort port = new SerialPort(serialPortName))
{
if (port.IsOpen)
{
port.Close();
port.Dispose();
}
如果您创建新的SerialPort
,则默认关闭。 If子句变得过时,而不是使用using
块,而try/catch
更合适。
这一行:代码末尾的port.Dispose();
也是多余的(或者它使得使用块变得多余),因为using
块将在最后完成此操作。