Commit 400de8f5 几米阳光

自动出入库改为先入库。485通信添加缓存节省写入时间。

1 个父辈 2e110c3e
......@@ -224,7 +224,7 @@ namespace ACServoDriveTest
private void btnUpdateBlock_Click(object sender, EventArgs e)
{
int num = Convert.ToInt32(txtNo.Text);
ACServerManager.UpdateBlock(GetPortName(), GetSlaveAddr(), num);
ACServerManager.UpdateBlock(GetPortName(), GetSlaveAddr(), num.ToString());
}
private void button4_Click(object sender, EventArgs e)
......
......@@ -153,6 +153,7 @@
this.groupBox6 = new System.Windows.Forms.GroupBox();
this.btnOpenWCF = new System.Windows.Forms.Button();
this.btnCloseWCF = new System.Windows.Forms.Button();
this.chbAutoRead = new System.Windows.Forms.CheckBox();
this.groupBox5.SuspendLayout();
this.groupBox1.SuspendLayout();
this.groupBox2.SuspendLayout();
......@@ -180,6 +181,7 @@
//
this.groupBox5.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.groupBox5.Controls.Add(this.chbAutoRead);
this.groupBox5.Controls.Add(this.label16);
this.groupBox5.Controls.Add(this.label15);
this.groupBox5.Controls.Add(this.label14);
......@@ -1768,6 +1770,16 @@
this.btnCloseWCF.UseVisualStyleBackColor = true;
this.btnCloseWCF.Click += new System.EventHandler(this.btnCloseWCF_Click);
//
// chbAutoRead
//
this.chbAutoRead.AutoSize = true;
this.chbAutoRead.Location = new System.Drawing.Point(47, 165);
this.chbAutoRead.Name = "chbAutoRead";
this.chbAutoRead.Size = new System.Drawing.Size(99, 21);
this.chbAutoRead.TabIndex = 296;
this.chbAutoRead.Text = "自动读取位置";
this.chbAutoRead.UseVisualStyleBackColor = true;
//
// FrmStoreBox
//
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
......@@ -1935,6 +1947,7 @@
private System.Windows.Forms.GroupBox groupBox6;
private System.Windows.Forms.Button btnOpenWCF;
private System.Windows.Forms.Button btnCloseWCF;
private System.Windows.Forms.CheckBox chbAutoRead;
}
}
......@@ -113,8 +113,15 @@ namespace OnlineStore.ACSingleStore
LogUtil.error(LOGGER, "出错:" + ex.StackTrace);
}
}
private bool preOpen = false;
public void StoreOpenStatus(bool isOpen)
{
if (preOpen.Equals(isOpen))
{
return;
}
preOpen = isOpen;
btnOutStore.Enabled = isOpen;
btnInStore.Enabled = isOpen;
......@@ -127,6 +134,7 @@ namespace OnlineStore.ACSingleStore
启动ToolStripMenuItem.Enabled = !isOpen;
停止ToolStripMenuItem.Enabled = isOpen;
复位ToolStripMenuItem.Enabled = isOpen;
}
private void FrmTest_Load(object sender, EventArgs e)
{
......@@ -143,21 +151,24 @@ namespace OnlineStore.ACSingleStore
//忙碌状态不读取状态
if (!store.storeRunStatus.Equals(StoreRunStatus.Busy))
{
string portName = GetPortName();
int SlvAddr = GetSlaveAddr();
//判断私服是否打开、
if (ACServerManager.ServerOnStatus(portName, SlvAddr))
if (chbAutoRead.Checked)
{
lblServerOn.Text = "伺服ON";
int lOutPulse = ACServerManager.GetTargetPosition(portName, SlvAddr);
lblOutPulse.Text = string.Format("{0:d}", lOutPulse);
int lCountPulse = ACServerManager.GetActualtPosition(portName, SlvAddr);
lblCountPulse.Text = string.Format("{0:d}", lCountPulse);
}
else
{
lblServerOn.Text = "伺服OFF";
string portName = GetPortName();
int SlvAddr = GetSlaveAddr();
//判断私服是否打开、
if (ACServerManager.ServerOnStatus(portName, SlvAddr))
{
lblServerOn.Text = "伺服ON";
int lOutPulse = ACServerManager.GetTargetPosition(portName, SlvAddr);
lblOutPulse.Text = string.Format("{0:d}", lOutPulse);
int lCountPulse = ACServerManager.GetActualtPosition(portName, SlvAddr);
lblCountPulse.Text = string.Format("{0:d}", lCountPulse);
}
else
{
lblServerOn.Text = "伺服OFF";
}
}
}
......@@ -180,7 +191,10 @@ namespace OnlineStore.ACSingleStore
}
else
{
复位ToolStripMenuItem.Enabled = true;
if (复位ToolStripMenuItem.Enabled.Equals(false))
{
复位ToolStripMenuItem.Enabled = true;
}
}
}
else
......@@ -188,8 +202,11 @@ namespace OnlineStore.ACSingleStore
if ((store.storeRunStatus.Equals(StoreRunStatus.HomeMoving) || store.storeRunStatus.Equals(StoreRunStatus.Reset))
&& store.alarmType.Equals(StoreAlarmType.None))
{
启动ToolStripMenuItem.Enabled = false;
复位ToolStripMenuItem.Enabled = false;
if (启动ToolStripMenuItem.Enabled)
{
启动ToolStripMenuItem.Enabled = false;
复位ToolStripMenuItem.Enabled = false;
}
}
}
lblWarnMsg.Text = store.WarnMsg;
......@@ -783,8 +800,9 @@ namespace OnlineStore.ACSingleStore
store.autoPositionIndex = currIndex;
string poText = cmbPosition.Text;
store.autoMsg = "自动出库:" + poText;
LogUtil.info(LOGGER, store.StoreName + "开启自动出入库模式,开始位置【" + poText + "】(索引=" + currIndex + "),出入库间隔=" + jiange + ",出库开始!");
store.StartOutStoreMove(new InOutStoreParam("", poText));
LogUtil.info(LOGGER, store.StoreName + "开启自动出入库模式,开始位置【" + poText + "】(索引=" + currIndex + "),间隔=" + jiange + ",入库开始!");
//store.StartOutStoreMove(new InOutStoreParam("", poText));
store.StartInStoreMove(new InOutStoreParam("", poText));
}
btnStartAuTo.Text = "停止自动出入库";
}
......
......@@ -8,6 +8,10 @@ namespace OnlineStore.DeviceLibrary
public class ACCMDManager
{
/// <summary>
///速度 4601
/// </summary>
public static string Speed_Addr = "4601";
/// <summary>
/// 0060h 伺服 On 输入 (SRV-ON) 操作 R/W 0000h:输入 OFF、FF00h:输入 ON
/// </summary>
public static string ServerOn_Addr = "0060";
......
......@@ -15,6 +15,62 @@ namespace OnlineStore.DeviceLibrary
{
private static bool IsShowMsg = false ;
private static int SleepMSendons = 100;
private static Dictionary<string, Dictionary<string, int>> ComAddrValue = new Dictionary<string, Dictionary<string, int>>();
private static string mapObj = "";
private static int GetAddrValue(string portName, string addr)
{
int value = -1;
try
{
Dictionary<string, int> map = null;
ComAddrValue.TryGetValue(portName, out map);
if (map == null)
{
return -1;
}
if (map.ContainsKey(addr))
{
return map[addr];
}
}
catch (Exception ex)
{
LogUtil.error("UpdateAddrValue出错:" + ex.ToString());
}
return value;
}
private static void UpdateAddrValue(string portName, string addr, int value)
{
try
{
lock (mapObj)
{
Dictionary<string, int> map = null;
ComAddrValue.TryGetValue(portName, out map);
if (map == null)
{
map = new Dictionary<string, int>();
ComAddrValue.Add(portName, map);
}
if (map.ContainsKey(addr))
{
ComAddrValue[portName][addr] = value;
}
else
{
ComAddrValue[portName].Add(addr, value);
}
}
}
catch (Exception ex)
{
LogUtil.error("UpdateAddrValue出错:" + ex.ToString());
}
}
public static bool OpenPort(string portName)
{
if (serialBeanMap.ContainsKey(portName))
......@@ -228,49 +284,63 @@ namespace OnlineStore.DeviceLibrary
SendData(portName, data);
System.Threading.Thread.Sleep(SleepMSendons);
//运动
data = ACCMDManager.GetWriteData(slvAddr, 06, ACCMDManager.BlockNo, ACCMDManager.Block_RelMove, 2);
SendData(portName, data);
//data = ACCMDManager.GetWriteData(slvAddr, 06, ACCMDManager.BlockNo, ACCMDManager.Block_RelMove, 2);
//SendData(portName, data);
//Thread.Sleep(SleepMSendons);
UpdateBlock(portName, slvAddr, ACCMDManager.Block_RelMove);
Thread.Sleep(SleepMSendons);
OpenAndCloseSTB(portName, slvAddr);
}
public static void HomeMove(string portName, int slvAddr, int speed)
{
//默认负方向原点返回
byte[] data = ACCMDManager.GetWriteData(slvAddr, ACCMDManager.CMD_WriteRegisters, ACCMDManager.BlockNo, ACCMDManager.Block_HomeMove1, 2);
SendData(portName, data);
//byte[] data = ACCMDManager.GetWriteData(slvAddr, ACCMDManager.CMD_WriteRegisters, ACCMDManager.BlockNo, ACCMDManager.Block_HomeMove1, 2);
//SendData(portName, data);
UpdateBlock(portName, slvAddr, ACCMDManager.Block_HomeMove1);
Thread.Sleep(SleepMSendons);
OpenAndCloseSTB(portName, slvAddr);
}
public static void SpeedMove(string portName, int slvAddr, int speed)
{
byte[] data = ACCMDManager.GetWriteData(slvAddr, ACCMDManager.CMD_WriteRegisters, "4601", string.Format("{0:X2}", Math.Abs(speed)), 2);
SendData(portName, data);
Thread.Sleep(SleepMSendons);
if (speed > 0)
int preSpeed = GetAddrValue(portName, ACCMDManager.Speed_Addr);
if ((preSpeed.Equals(-1)) || (!preSpeed.Equals(Math.Abs(speed))))
{
data = ACCMDManager.GetWriteData(slvAddr, ACCMDManager.CMD_WriteRegisters, ACCMDManager.BlockNo, ACCMDManager.Block_VolMove0, 2);
byte[] data = ACCMDManager.GetWriteData(slvAddr, ACCMDManager.CMD_WriteRegisters, "4601", string.Format("{0:X2}", Math.Abs(speed)), 2);
SendData(portName, data);
UpdateAddrValue(portName, ACCMDManager.Speed_Addr, Math.Abs(speed));
Thread.Sleep(SleepMSendons);
}
if (speed > 0)
{
//byte[] data = ACCMDManager.GetWriteData(slvAddr, ACCMDManager.CMD_WriteRegisters, ACCMDManager.BlockNo, ACCMDManager.Block_VolMove0, 2);
//SendData(portName, data);
UpdateBlock(portName, slvAddr, ACCMDManager.Block_VolMove0);
}
else
{
data = ACCMDManager.GetWriteData(slvAddr, ACCMDManager.CMD_WriteRegisters, ACCMDManager.BlockNo, ACCMDManager.Block_VolMove1, 2);
SendData(portName, data);
//byte[] data = ACCMDManager.GetWriteData(slvAddr, ACCMDManager.CMD_WriteRegisters, ACCMDManager.BlockNo, ACCMDManager.Block_VolMove1, 2);
//SendData(portName, data);
UpdateBlock(portName, slvAddr, ACCMDManager.Block_VolMove1);
}
Thread.Sleep(SleepMSendons);
//Thread.Sleep(SleepMSendons);
OpenAndCloseSTB(portName, slvAddr);
}
public static void AbsMove(string portName, int slvAddr, int targetPosition, int targetSpeed)
{
//先更新速度
string slvAddrStr = string.Format(strFromat, slvAddr);
//0106460001009D12
//速度 V1 =100
string v1 = slvAddrStr + "064601 " + SpeedToStr(targetSpeed, 4) + " ffff";
SendStrAndSleep(portName, v1,SleepMSendons);
int preSpeed = GetAddrValue(portName, ACCMDManager.Speed_Addr);
if ((preSpeed.Equals(-1)) || (!preSpeed.Equals(targetSpeed)))
{
//速度 V1 =100
string v1 = slvAddrStr + "064601 " + SpeedToStr(targetSpeed, 4) + " ffff";
SendStrAndSleep(portName, v1, SleepMSendons);
UpdateAddrValue(portName, ACCMDManager.Speed_Addr, targetSpeed);
}
//绝对运动
AbsMove(portName, slvAddr, targetPosition);
}
......@@ -314,9 +384,10 @@ namespace OnlineStore.DeviceLibrary
data = ACCMDManager.buildCheckData(data, data.Length - 2);
SendData(portName, data);
Thread.Sleep(SleepMSendons);
data = ACCMDManager.GetWriteData(slvAddr, ACCMDManager.CMD_WriteRegisters, ACCMDManager.BlockNo, ACCMDManager.Block_AbsMove, 2);
SendData(portName, data);
Thread.Sleep(SleepMSendons);
UpdateBlock(portName, slvAddr, ACCMDManager.Block_AbsMove);
//data = ACCMDManager.GetWriteData(slvAddr, ACCMDManager.CMD_WriteRegisters, ACCMDManager.BlockNo, ACCMDManager.Block_AbsMove, 2);
//SendData(portName, data);
//Thread.Sleep(SleepMSendons);
OpenAndCloseSTB(portName, slvAddr);
}
}
......
......@@ -28,16 +28,16 @@ namespace OnlineStore.DeviceLibrary
}
public static void RunBlock(string portName, int slvAddr, int index)
{
//运动
byte[] data = ACCMDManager.GetWriteData(slvAddr, ACCMDManager.CMD_WriteRegisters, ACCMDManager.BlockNo, index.ToString(), 2);
SendData(portName, data);
Thread.Sleep(100);
CloseSTB(portName, slvAddr);
Thread.Sleep(100);
OnlyOpenSTB(portName, slvAddr);
}
//public static void RunBlock(string portName, int slvAddr, int index)
//{
// //运动
// byte[] data = ACCMDManager.GetWriteData(slvAddr, ACCMDManager.CMD_WriteRegisters, ACCMDManager.BlockNo, index.ToString(), 2);
// SendData(portName, data);
// Thread.Sleep(100);
// CloseSTB(portName, slvAddr);
// Thread.Sleep(100);
// OnlyOpenSTB(portName, slvAddr);
//}
public static void SendStrAndSleep(string portName, string str, int sleepS)
{
byte[] data = SerialBean.StringToByte(str);
......@@ -342,10 +342,17 @@ namespace OnlineStore.DeviceLibrary
SendData(portName, dataArray);
}
public static void UpdateBlock(string portName, int slvAddr, int blockNum)
public static void UpdateBlock(string portName, int slvAddr, string blockNum)
{
byte[] data = ACCMDManager.GetWriteData(01, 06, ACCMDManager.BlockNo, blockNum.ToString(), 2);
SendData(portName, data);
int preNum = GetAddrValue(portName, ACCMDManager.BlockNo);
if (preNum.Equals(-1) || (!preNum.ToString().Equals(blockNum)))
{
byte[] data = ACCMDManager.GetWriteData(slvAddr, ACCMDManager.CMD_WriteRegisters, ACCMDManager.BlockNo, blockNum , 2);
SendData(portName, data);
int value = Convert.ToInt16(blockNum);
UpdateAddrValue(portName, ACCMDManager.BlockNo, value);
Thread.Sleep(SleepMSendons);
}
}
public static void AlarmClear(string portName, int slvAddr)
......
......@@ -758,15 +758,25 @@ namespace OnlineStore.DeviceLibrary
}
}
private bool InProcess = false;
private DateTime preProcessTime = DateTime.Now;
protected override void timersTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if (InProcess)
{
return;
TimeSpan span = DateTime.Now - preProcessTime;
if (span.TotalMinutes < 1)
{
return;
}
else
{
LogUtil.error("主定时器:InProcess已等待"+span.ToString()+"重新处理");
}
}
try
{
InProcess = true;
preProcessTime = DateTime.Now;
IoCheckProcess();
TimerProcess();
}
......@@ -882,16 +892,7 @@ namespace OnlineStore.DeviceLibrary
//急停按钮
if (suddenBtn.Equals(IO_VALUE.LOW))
{
//if (isInSuddenDown.Equals(false))
//{
// isInSuddenDown = true;
// LogUtil.error(LOGGER, StoreName + "收到急停信号,报警急停");
// WarnMsg = StoreName + "收到急停信号,报警急停";
// //报警时会关闭所有轴
// Alarm(StoreAlarmType.SuddenStop, "1", WarnMsg, StoreMoveType.None);
//}
{
}
else if (resetBtn.Equals(IO_VALUE.HIGH))
{
......@@ -918,39 +919,7 @@ namespace OnlineStore.DeviceLibrary
}
}
}
//IO_VALUE airCheck = KNDIOValue(IO_Type.Airpressure_Check);
////气压检测按钮灭三秒以上才算关闭
//if (airCheck == IO_VALUE.LOW && (!isInSuddenDown))
//{
// int checkSenconds = Config.AirCheckSeconds;
// LogUtil.info(LOGGER, StoreName + "未检测到气压信号,判断未检测到信号持续的时间是否" + checkSenconds + "以上!");
// //判断是否持续
// if (lastAirValue == IO_VALUE.LOW)
// {
// if ((!isNoAirCheck) && (DateTime.Now - lastAirCloseTime).TotalSeconds > checkSenconds)
// {
// isNoAirCheck = true;
// //没有了气压检测信号
// LogUtil.error(LOGGER, StoreName + " 未检测到气压信号!");
// WarnMsg = StoreName + " 未检测到气压信号";
// //报警时会关闭所有轴
// Alarm(StoreAlarmType.NoAirCheck, "2", WarnMsg, StoreMoveType.None);
// }
// }
// else
// {
// lastAirValue = airCheck;
// lastAirCloseTime = DateTime.Now;
// isNoAirCheck = false;
// }
//}
//else
//{
// lastAirValue = airCheck;
// lastAirCloseTime = DateTime.Now;
// isNoAirCheck = false;
//}
//检查运动轴报警
if (storeRunStatus > StoreRunStatus.Wait && (!isInSuddenDown))
{
......
......@@ -138,31 +138,37 @@ namespace OnlineStore.DeviceLibrary
protected bool isInPro = false;
protected virtual void BusyMoveProcess()
{
if (isInPro)
{
return;
}
//if (isInPro)
//{
// return;
//}
isInPro = true;
switch (StoreMove.MoveType)
try
{
case StoreMoveType.InStore:
InStoreProcess();
isInPro = false;
break;
case StoreMoveType.OutStore:
OutStoreProcess();
isInPro = false;
break;
case StoreMoveType.ReturnHome:
ReturnHomeProcess();
isInPro = false;
break;
case StoreMoveType.StoreReset:
ResetProcess();
isInPro = false;
break;
default: break;
}
switch (StoreMove.MoveType)
{
case StoreMoveType.InStore:
InStoreProcess();
isInPro = false;
break;
case StoreMoveType.OutStore:
OutStoreProcess();
isInPro = false;
break;
case StoreMoveType.ReturnHome:
ReturnHomeProcess();
isInPro = false;
break;
case StoreMoveType.StoreReset:
ResetProcess();
isInPro = false;
break;
default: break;
}
}catch(Exception ex)
{
LogUtil.error("BusyMoveProcess出错:"+ex.ToString());
}
isInPro = false;
}
protected void SaveAlarmInfo(StoreAlarmType alarmType, string alarmDetial, string alarmMsg, StoreMoveType storeMoveType)
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!