Commit 8aa8a5fe LN

伺服更新为新版本

1 个父辈 3e48b24a
...@@ -288,7 +288,7 @@ namespace OnlineStore.Common ...@@ -288,7 +288,7 @@ namespace OnlineStore.Common
if (_serialPort.IsOpen) if (_serialPort.IsOpen)
{ {
//lock (lockObj) //lock (lockObj)
if (Monitor.TryEnter(lockObj, 10)) if (Monitor.TryEnter(lockObj, Overtime + 50))
{ {
//Monitor.Enter(lockObj); //Monitor.Enter(lockObj);
try try
...@@ -339,7 +339,7 @@ namespace OnlineStore.Common ...@@ -339,7 +339,7 @@ namespace OnlineStore.Common
return -1; return -1;
} }
private byte PreSlvAddr = 0;
/// <summary> /// <summary>
/// 发送命令 /// 发送命令
/// </summary> /// </summary>
...@@ -358,10 +358,22 @@ namespace OnlineStore.Common ...@@ -358,10 +358,22 @@ namespace OnlineStore.Common
if (_serialPort.IsOpen) if (_serialPort.IsOpen)
{ {
if (Monitor.TryEnter(lockObj, 200)) if (Monitor.TryEnter(lockObj, Overtime + 80))
{ {
//Monitor.Enter(lockObj);
try try
{ {
//判断是否需要休眠
if (SendData != null && SendData.Length > 0)
{
if (!SendData[0].Equals(PreSlvAddr))
{
Thread.Sleep(50);
PreSlvAddr = SendData[0];
}
}
_serialPort.DiscardInBuffer(); //清空接收缓冲区 _serialPort.DiscardInBuffer(); //清空接收缓冲区
_serialPort.Write(SendData, 0, SendData.Length); _serialPort.Write(SendData, 0, SendData.Length);
int num = 0, ret = 0; int num = 0, ret = 0;
...@@ -372,7 +384,7 @@ namespace OnlineStore.Common ...@@ -372,7 +384,7 @@ namespace OnlineStore.Common
} }
while (num++ < Overtime) while (num++ < Overtime)
{ {
if (_serialPort.BytesToRead >= ReceiveLength) if (_serialPort.BytesToRead >= ReceiveData.Length)
break; break;
System.Threading.Thread.Sleep(1); System.Threading.Thread.Sleep(1);
} }
...@@ -380,10 +392,10 @@ namespace OnlineStore.Common ...@@ -380,10 +392,10 @@ namespace OnlineStore.Common
{ {
LogUtil.error(PortName + " 发送数据" + ByteToString(SendData) + "等待接受数据超时"); LogUtil.error(PortName + " 发送数据" + ByteToString(SendData) + "等待接受数据超时");
} }
if (_serialPort.BytesToRead >= ReceiveLength) if (_serialPort.BytesToRead >= ReceiveData.Length)
{ {
ret = _serialPort.Read(ReceiveData, 0, ReceiveLength); ret = _serialPort.Read(ReceiveData, 0, ReceiveData.Length);
} }
else else
{ {
......
...@@ -8,11 +8,14 @@ namespace OnlineStore.DeviceLibrary ...@@ -8,11 +8,14 @@ namespace OnlineStore.DeviceLibrary
public class ACCMDManager public class ACCMDManager
{ {
/// <summary> /// <summary>
/// 0130h 选通输入(STB) 状态 ReadOnly 0: 输入 OFF 1: 输入 ON
/// </summary>
internal static string STB_State = "0130";
/// <summary>
/// 0132h 原点接近传感器输入 (HOME) 状态 ReadOnly 0: 输入 OFF 1: 输入 ON /// 0132h 原点接近传感器输入 (HOME) 状态 ReadOnly 0: 输入 OFF 1: 输入 ON
/// </summary> /// </summary>
public static string Home_Single = "0132"; public static string Home_Single = "0132";
//
//
/// <summary> /// <summary>
/// 0022h 负方向驱动禁止输入(NOT) ReadOnly 0: 输入 OFF、 1: 输入 ON /// 0022h 负方向驱动禁止输入(NOT) ReadOnly 0: 输入 OFF、 1: 输入 ON
/// </summary> /// </summary>
......
...@@ -74,12 +74,6 @@ namespace OnlineStore.DeviceLibrary ...@@ -74,12 +74,6 @@ namespace OnlineStore.DeviceLibrary
} }
} }
public static void ClearSpeed()
{
LogUtil.info("清理之前设置保存的速度列表");
ComAddrValue = new Dictionary<string, Dictionary<string, int>>();
}
public static bool OpenPort(string portName) public static bool OpenPort(string portName)
{ {
if (serialBeanMap.ContainsKey(portName)) if (serialBeanMap.ContainsKey(portName))
...@@ -162,7 +156,8 @@ namespace OnlineStore.DeviceLibrary ...@@ -162,7 +156,8 @@ namespace OnlineStore.DeviceLibrary
public static bool IsHomeMoveEnd(string portName, int slvAddr) public static bool IsHomeMoveEnd(string portName, int slvAddr)
{ {
int status = GetHomeEndStatus(portName, slvAddr); int status = GetHomeEndStatus(portName, slvAddr);
if (status >= 1) bool isOk = ACServerManager.GetBusyStatus(portName, slvAddr).Equals(0);
if (status >= 1&&isOk)
{ {
return true; return true;
} return false; } return false;
...@@ -183,33 +178,33 @@ namespace OnlineStore.DeviceLibrary ...@@ -183,33 +178,33 @@ namespace OnlineStore.DeviceLibrary
{ {
LogUtil.info("开始初始化伺服【" + portName + "】【" + slvAddr + "】"); LogUtil.info("开始初始化伺服【" + portName + "】【" + slvAddr + "】");
//写入block //写入block
int sleep = 20; int sleep = 50;
string slvAddrStr = string.Format(strFromat, slvAddr); string slvAddrStr = string.Format(strFromat, slvAddr);
//block0=原点返回,正方向 ////block0=原点返回,正方向
string str0 = slvAddrStr + "104800 000408 00000420 00000000 ffff"; //string str0 = slvAddrStr + "104800 000408 00000420 00000000 ffff";
SendStrAndSleep(portName, str0, sleep); //SendStrAndSleep(portName, str0, sleep);
//block1=原点返回,反方向 ////block1=原点返回,反方向
string str1 = slvAddrStr + "104804 000408 04000420 00000000 ffff"; //string str1 = slvAddrStr + "104804 000408 04000420 00000000 ffff";
SendStrAndSleep(portName, str1, sleep); //SendStrAndSleep(portName, str1, sleep);
//block2=绝对位置运动 ////block2=绝对位置运动
string str2 = slvAddrStr + "104808 000408 10000211EC78FFFF ffff"; //string str2 = slvAddrStr + "104808 000408 10000211EC78FFFF ffff";
SendStrAndSleep(portName, str2, sleep); //SendStrAndSleep(portName, str2, sleep);
//block3=相对位置运动 ////block3=相对位置运动
string str3 = slvAddrStr + "10480C 000408 10000111EC78FFFF ffff"; //string str3 = slvAddrStr + "10480C 000408 10000111EC78FFFF ffff";
SendStrAndSleep(portName, str3, sleep); //SendStrAndSleep(portName, str3, sleep);
//block4=正方向匀速运动 ////block4=正方向匀速运动
string str4 = slvAddrStr + "104810 000408 10000311 00000000 ffff"; //string str4 = slvAddrStr + "104810 000408 10000311 00000000 ffff";
SendStrAndSleep(portName, str4, sleep); //SendStrAndSleep(portName, str4, sleep);
//block5=反方向匀速运动 ////block5=反方向匀速运动
string str5 = slvAddrStr + "104814 000408 14000311 00000000 ffff"; //string str5 = slvAddrStr + "104814 000408 14000311 00000000 ffff";
SendStrAndSleep(portName, str5, sleep); //SendStrAndSleep(portName, str5, sleep);
//block6=减速停止 ////block6=减速停止
string str6 = slvAddrStr + "104818 000408 00000500 00000000 ffff"; //string str6 = slvAddrStr + "104818 000408 00000500 00000000 ffff";
SendStrAndSleep(portName, str6, sleep); //SendStrAndSleep(portName, str6, sleep);
//block7=紧急停止 ////block7=紧急停止
string str7 = slvAddrStr + "10481c 000408 00000510 00000000 ffff"; //string str7 = slvAddrStr + "10481c 000408 00000510 00000000 ffff";
SendStrAndSleep(portName, str7, sleep); //SendStrAndSleep(portName, str7, sleep);
//0106460001009D12 //0106460001009D12
//速度 V1 =100 //速度 V1 =100
...@@ -324,7 +319,7 @@ namespace OnlineStore.DeviceLibrary ...@@ -324,7 +319,7 @@ namespace OnlineStore.DeviceLibrary
if (isHomeEnd.Equals(1)) if (isHomeEnd.Equals(1))
{ {
int value = 2000; int value = 2000;
LogUtil.info("轴【" + portName +"_"+slvAddr +"】原点返回时发现原点已亮且回过原点,需要先相对走" + value); LogUtil.info("轴【" + portName + "_" + slvAddr + "】原点返回时发现原点已亮且回过原点,需要先相对走" + value);
RelMove(portName, slvAddr, value); RelMove(portName, slvAddr, value);
bool isStop = false; bool isStop = false;
for (int i = 0; i <= 10; i++) for (int i = 0; i <= 10; i++)
...@@ -345,9 +340,9 @@ namespace OnlineStore.DeviceLibrary ...@@ -345,9 +340,9 @@ namespace OnlineStore.DeviceLibrary
} }
else else
{ {
int volSpeed =Math.Abs( speed / 5); int volSpeed = Math.Abs(speed / 5);
int time = 1500; int time = 1500;
LogUtil.info("轴【" + portName + "_" + slvAddr + "】原点返回时发现原点已亮但未回过原点,先匀速向上走"+time+",速度["+ volSpeed + "]" ); LogUtil.info("轴【" + portName + "_" + slvAddr + "】原点返回时发现原点已亮但未回过原点,先匀速向上走" + time + ",速度[" + volSpeed + "]");
//需要匀速向上走 //需要匀速向上走
ACServerManager.SpeedMove(portName, slvAddr, volSpeed); ACServerManager.SpeedMove(portName, slvAddr, volSpeed);
...@@ -357,7 +352,8 @@ namespace OnlineStore.DeviceLibrary ...@@ -357,7 +352,8 @@ namespace OnlineStore.DeviceLibrary
Thread.Sleep(100); Thread.Sleep(100);
} }
} }
}catch(Exception ex) }
catch (Exception ex)
{ {
LogUtil.error("轴【" + portName + "_" + slvAddr + "】原点返回前验证是否在原点出错:" + ex.StackTrace); LogUtil.error("轴【" + portName + "_" + slvAddr + "】原点返回前验证是否在原点出错:" + ex.StackTrace);
} }
...@@ -368,8 +364,9 @@ namespace OnlineStore.DeviceLibrary ...@@ -368,8 +364,9 @@ namespace OnlineStore.DeviceLibrary
} }
public static void SetSpeed(string portName, int slvAddr, int speed) public static void SetSpeed(string portName, int slvAddr, int speed)
{ {
speed = Math.Abs(speed);
int preSpeed = GetAddrValue(portName, slvAddr, ACCMDManager.Speed_Addr); int preSpeed = GetAddrValue(portName, slvAddr, ACCMDManager.Speed_Addr);
if ((preSpeed.Equals(-1)) || (!preSpeed.Equals(Math.Abs(speed)))) if ((preSpeed.Equals(-1)) || (!preSpeed.Equals(speed)))
{ {
string v1 = slvAddr + "064601 " + ACServerManager.SpeedToStr(speed, 4) + " ffff"; string v1 = slvAddr + "064601 " + ACServerManager.SpeedToStr(speed, 4) + " ffff";
LogUtil.debug("轴【" + portName + "_" + slvAddr + "】更新速度为【" + speed + "】,发送数据【" + v1 + "】"); LogUtil.debug("轴【" + portName + "_" + slvAddr + "】更新速度为【" + speed + "】,发送数据【" + v1 + "】");
...@@ -387,7 +384,7 @@ namespace OnlineStore.DeviceLibrary ...@@ -387,7 +384,7 @@ namespace OnlineStore.DeviceLibrary
Thread.Sleep(SleepMSendons); Thread.Sleep(SleepMSendons);
} }
} }
UpdateAddrValue(portName, slvAddr, ACCMDManager.Speed_Addr, Math.Abs(speed)); UpdateAddrValue(portName, slvAddr, ACCMDManager.Speed_Addr, speed);
Thread.Sleep(SleepMSendons); Thread.Sleep(SleepMSendons);
} }
} }
......
...@@ -152,9 +152,10 @@ namespace OnlineStore.DeviceLibrary ...@@ -152,9 +152,10 @@ namespace OnlineStore.DeviceLibrary
else else
{ {
int ret= bean.SendCommand(data, ref returnData, outTime, reviceLength); int ret= bean.SendCommand(data, ref returnData, outTime, reviceLength);
string rDataStr = AcSerialBean.ByteToString(returnData);
if (!ret.Equals(reviceLength)) if (!ret.Equals(reviceLength))
{ {
LogUtil.error("串口" + portName + " 写入数据:" + strSend + ",预计返回字节数【"+reviceLength+"】实际返回【"+ret+"】"); LogUtil.error("串口" + portName + " 写入数据:" + strSend + ",预计返回字节数【"+reviceLength+"】实际返回【"+ret+"】【"+rDataStr+"】");
} }
System.Threading.Thread.Sleep(2); System.Threading.Thread.Sleep(2);
} }
...@@ -172,7 +173,7 @@ namespace OnlineStore.DeviceLibrary ...@@ -172,7 +173,7 @@ namespace OnlineStore.DeviceLibrary
/// <param name="outTime">超时时间</param> /// <param name="outTime">超时时间</param>
/// <param name="result">返回结果,是否发送成功</param> /// <param name="result">返回结果,是否发送成功</param>
/// <returns>返回值的长度</returns> /// <returns>返回值的长度</returns>
public static byte[] SendCommand(string portName, byte[] data, int outTime, int reviceLength,out bool result) public static byte[] SendCommand(string portName, byte[] data, int outTime, int reviceLength, out bool result)
{ {
if (outTime < 100) if (outTime < 100)
{ {
...@@ -209,10 +210,12 @@ namespace OnlineStore.DeviceLibrary ...@@ -209,10 +210,12 @@ namespace OnlineStore.DeviceLibrary
int ret = bean.SendCommand(data, ref returnData, outTime, reviceLength); int ret = bean.SendCommand(data, ref returnData, outTime, reviceLength);
if (!ret.Equals(reviceLength)) if (!ret.Equals(reviceLength))
{ {
LogUtil.error("串口" + portName + " 写入数据:" + strSend + ",预计返回字节数【" + reviceLength + "】实际返回【" + ret + "】"); string datastr = AcSerialBean.ByteToString(returnData);
}else LogUtil.error("串口" + portName + " 写入数据:" + strSend + ",预计返回字节数【" + reviceLength + "】实际返回【" + ret + "】:"+ datastr);
}
else
{ {
result = true ; result = true;
} }
System.Threading.Thread.Sleep(2); System.Threading.Thread.Sleep(2);
} }
...@@ -270,15 +273,46 @@ namespace OnlineStore.DeviceLibrary ...@@ -270,15 +273,46 @@ namespace OnlineStore.DeviceLibrary
int length = 2; int length = 2;
byte[] dataArray = ACCMDManager.GetWriteData(slvAddr, ACCMDManager.CMD_WriteCoil, addr, data, length); byte[] dataArray = ACCMDManager.GetWriteData(slvAddr, ACCMDManager.CMD_WriteCoil, addr, data, length);
SendData(portName, dataArray);
for (int i = 1; i <= 3; i++)
{
bool result = SendData(portName, dataArray);
if (result)
{
System.Threading.Thread.Sleep(500); System.Threading.Thread.Sleep(500);
data = "0000"; data = "0000";
dataArray = ACCMDManager.GetWriteData(slvAddr, ACCMDManager.CMD_WriteCoil, addr, data, length); dataArray = ACCMDManager.GetWriteData(slvAddr, ACCMDManager.CMD_WriteCoil, addr, data, length);
SendData(portName, dataArray); result = SendData(portName, dataArray);
break;
}
else
{
LogUtil.error("【" + portName + "_" + slvAddr + "】 , 第" + i + "次,SuddenStop 发送数据失败");
Thread.Sleep(180);
}
}
} }
public static void OpenAndCloseSTB(string portName, int slvAddr) public static void OpenAndCloseSTB(string portName, int slvAddr)
{ {
if (GetBusyStatus(portName, slvAddr).Equals(1))
{
LogUtil.error("伺服【" + portName + "_" + slvAddr + "】OpenSTB时发现 busy=1,直接返回");
return;
}
System.Threading.Thread.Sleep(SleepMSendons);
if (GetSTBState(portName, slvAddr).Equals(1))
{
LogUtil.error("伺服【" + portName + "_" + slvAddr + "】OpenSTB时发现 STB=ON,先关闭STB");
CloseSTB(portName, slvAddr);
System.Threading.Thread.Sleep(SleepMSendons);
if (GetSTBState(portName, slvAddr).Equals(1))
{
LogUtil.error("伺服【" + portName + "_" + slvAddr + "】OpenSTB时发现 STB=ON,先关闭STB 后发现STB仍为ON,直接返回");
return;
}
}
OnlyOpenSTB(portName, slvAddr); OnlyOpenSTB(portName, slvAddr);
System.Threading.Thread.Sleep(200); System.Threading.Thread.Sleep(200);
CloseSTB(portName, slvAddr); CloseSTB(portName, slvAddr);
...@@ -382,7 +416,7 @@ namespace OnlineStore.DeviceLibrary ...@@ -382,7 +416,7 @@ namespace OnlineStore.DeviceLibrary
{ {
return GetActualtPosition(axis.DeviceName, axis.GetAxisValue()); return GetActualtPosition(axis.DeviceName, axis.GetAxisValue());
} }
public static int GetActualtPosition(string portName, int slvAddr) public static int GetActualtPosition(string portName, int slvAddr,int rGetCount=3)
{ {
PreReadAddr = ACCMDManager.ActualPosition; PreReadAddr = ACCMDManager.ActualPosition;
byte[] dataArray = ACCMDManager.GetWriteData(slvAddr, ACCMDManager.CMD_ReadRegisters, ACCMDManager.ActualPosition, "0000", 2); byte[] dataArray = ACCMDManager.GetWriteData(slvAddr, ACCMDManager.CMD_ReadRegisters, ACCMDManager.ActualPosition, "0000", 2);
...@@ -390,7 +424,7 @@ namespace OnlineStore.DeviceLibrary ...@@ -390,7 +424,7 @@ namespace OnlineStore.DeviceLibrary
byte[] reviceData = SendCommand(portName, dataArray, ReviceOutTimeMS, 9); byte[] reviceData = SendCommand(portName, dataArray, ReviceOutTimeMS, 9);
int result = -1; int result = -1;
for (int i = 1; i <= 3; i++) for (int i = 1; i <= rGetCount; i++)
{ {
result = GetRegisterData(portName, reviceData, ACCMDManager.ActualPosition); result = GetRegisterData(portName, reviceData, ACCMDManager.ActualPosition);
if (!result.Equals(-1)) if (!result.Equals(-1))
...@@ -401,6 +435,7 @@ namespace OnlineStore.DeviceLibrary ...@@ -401,6 +435,7 @@ namespace OnlineStore.DeviceLibrary
{ {
LogUtil.error("第" + i + "次获取" + portName + "_" + slvAddr + "的实时位置" + result); LogUtil.error("第" + i + "次获取" + portName + "_" + slvAddr + "的实时位置" + result);
} }
Thread.Sleep(180);
} }
return result; return result;
} }
...@@ -469,6 +504,19 @@ namespace OnlineStore.DeviceLibrary ...@@ -469,6 +504,19 @@ namespace OnlineStore.DeviceLibrary
return GetCoilData(portName, reviceData, ACCMDManager.Home_Single); return GetCoilData(portName, reviceData, ACCMDManager.Home_Single);
} }
/// <summary> /// <summary>
/// 获取STB信号值,1=On,0=OFF
/// </summary>
/// <param name="portName"></param>
/// <param name="slvAddr"></param>
/// <returns></returns>
public static int GetSTBState(string portName, int slvAddr)
{
PreReadCoilAddr = ACCMDManager.STB_State;
byte[] dataArray = ACCMDManager.GetWriteData(slvAddr, ACCMDManager.CMD_ReadCoil, ACCMDManager.STB_State, "0000", 1);
byte[] reviceData = SendCommand(portName, dataArray, ReviceOutTimeMS, 6);
return GetCoilData(portName, reviceData, ACCMDManager.STB_State);
}
/// <summary>
/// 负极限 /// 负极限
/// </summary> /// </summary>
public static int GetLimitNegativeSingle(string portName, int slvAddr) public static int GetLimitNegativeSingle(string portName, int slvAddr)
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!