Commit 8e192785 几米阳光

0515调试修改。

1 个父辈 22f5946d
......@@ -4,11 +4,6 @@
<name>Asa.IOModule.AIOBOX</name>
</assembly>
<members>
<member name="T:Asa.IOModule.AIOBOX1">
<summary>
AIOBOX操作类
</summary>
</member>
<member name="T:Asa.IOModule.AIOBOX">
<summary>
AIOBOX操作类
......@@ -59,7 +54,20 @@
</member>
<member name="E:Asa.IOModule.AIOBOX.Log_RxTx_Event">
<summary>
日志输出事件
日志输出事件,发送命令的标识减去接收命令的标识
</summary>
</member>
<member name="T:Asa.IOModule.AIOBOX.Reconnect">
<summary>
断开重连
</summary>
<param name="box"></param>
<param name="times">断开次数</param>
<param name="conn"></param>
</member>
<member name="E:Asa.IOModule.AIOBOX.Reconnect_Event">
<summary>
断开重连事件
</summary>
</member>
<member name="M:Asa.IOModule.AIOBOX.#ctor">
......@@ -87,16 +95,6 @@
错误信息
</summary>
</member>
<member name="P:Asa.IOModule.AIOBOX.AutoReadDI">
<summary>
自动读取DI状态,触发DI_Changed_Event
</summary>
</member>
<member name="P:Asa.IOModule.AIOBOX.AutoReadDO">
<summary>
自动读取DO状态,触发DO_Changed_Event
</summary>
</member>
<member name="P:Asa.IOModule.AIOBOX.LogOut">
<summary>
日志输出
......@@ -118,6 +116,20 @@
关闭连接
</summary>
</member>
<member name="M:Asa.IOModule.AIOBOX.AutoReadDI(System.Boolean,System.Int32)">
<summary>
自动读取DI状态,触发DI_Changed_Event
</summary>
<param name="read">是否自动读取</param>
<param name="sleep">间隔,必须大于10ms</param>
</member>
<member name="M:Asa.IOModule.AIOBOX.AutoReadDO(System.Boolean,System.Int32)">
<summary>
自动读取DO状态,触发DO_Changed_Event
</summary>
<param name="read">是否自动读取</param>
<param name="sleep">间隔,必须大于10ms</param>
</member>
<member name="M:Asa.IOModule.AIOBOX.ReverseStatus(Asa.IOModule.Box_Sta)">
<summary>
相反状态
......@@ -163,6 +175,35 @@
<param name="sta"></param>
<returns></returns>
</member>
<member name="M:Asa.IOModule.AIOBOX.GetLocalIP">
<summary>
获取本地IPv4地址
</summary>
<returns></returns>
</member>
<member name="M:Asa.IOModule.AIOBOX.Send">
<summary>
发送命令
</summary>
</member>
<member name="M:Asa.IOModule.AIOBOX.Receive">
<summary>
接收命令
</summary>
</member>
<member name="M:Asa.IOModule.AIOBOX.ReadSingle(System.Byte[])">
<summary>
读取单个DO
</summary>
<param name="buff"></param>
</member>
<member name="M:Asa.IOModule.AIOBOX.ReadDO(System.Byte[])">
<summary>
读取所有DO状态
</summary>
<param name="buff"></param>
<returns></returns>
</member>
<member name="M:Asa.IOModule.AIOBOX.ReadDI(System.Byte[])">
<summary>
读取所有DI状态
......@@ -175,7 +216,7 @@
</summary>
<returns></returns>
</member>
<member name="M:Asa.IOModule.AIOBOX.Trigger_DIO">
<member name="M:Asa.IOModule.AIOBOX.TriggerDIO">
<summary>
触发DIO改变事件
</summary>
......@@ -185,7 +226,12 @@
日志输出线程
</summary>
</member>
<member name="M:Asa.IOModule.AIOBOX.Auto_Read_DIO">
<member name="M:Asa.IOModule.AIOBOX.AutoReadDI">
<summary>
自动读取DIO线程
</summary>
</member>
<member name="M:Asa.IOModule.AIOBOX.AutoReadDO">
<summary>
自动读取DIO线程
</summary>
......@@ -201,6 +247,16 @@
</summary>
<param name="args"></param>
</member>
<member name="M:Asa.IOModule.AIOBOX.Reconn">
<summary>
断开重连
</summary>
</member>
<member name="M:Asa.IOModule.AIOBOX.CloseConn">
<summary>
关闭连接
</summary>
</member>
<member name="T:Asa.IOModule.Reg">
<summary>
IO模块寄存器
......@@ -449,6 +505,11 @@
32位,16DI + 16DO
</summary>
</member>
<member name="F:Asa.IOModule.Box_Type.DO_16">
<summary>
16位DO
</summary>
</member>
<member name="T:Asa.IOModule.Box_Sta">
<summary>
IO模块寄存器状态
......
......@@ -42,7 +42,9 @@
<add key="HasDisableDoorControl" value="1" />
<add key="ACBaudRate" value="115200" />
<add key="Default_Language" value="zh-CN" />
<add key ="UseAIOBOX" value ="1"/>
<add key ="UseAIOBOX" value ="1"/>
<add key ="DIMS" value ="40"/>
<add key="DOMS" value="200"/>
</appSettings>
<log4net>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
......
......@@ -166,10 +166,15 @@ PRO,最后一盘料需要补充的高度,LastTrayAddHeight,10,,,,,,,,,
压紧轴需要运动一段时间自动回原点。
复位时自动出入库会清理
复位时自动出入库会清理
IO模块增加重连功能。
20190515
压紧轴计量检测改为20毫秒读一次。
吸盘上升下降增加重复写,批量轴匀速运动增加重写功能。
IO模块读取时间改为可配置。
......
......@@ -19,7 +19,7 @@ namespace OnlineStore.DeviceLibrary
public readonly ILog LOGGER = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
public Dictionary<string, AIOBOX> AIOMap = new Dictionary<string, AIOBOX>();
public string DefaultIP = "";
public Dictionary<string, List<Box_Sta>> DIValueMap = new Dictionary<string, List<Box_Sta>>();
public Dictionary<string, List<Box_Sta>> DOValueMap = new Dictionary<string, List<Box_Sta>>();
private object DIMapLock = "";
......@@ -54,10 +54,21 @@ namespace OnlineStore.DeviceLibrary
// Create new modbus master and add event functions
aioBox = new AIOBOX();
aioBox.IP = ioIp;
DefaultIP = ioIp;
aioBox.AutoReadDI = true;
aioBox.AutoReadDO = true;
int DIMS = ConfigAppSettings.GetIntValue("DIMS");
if (DIMS < 20)
{
DIMS = 20;
}
int DOMS = ConfigAppSettings.GetIntValue("DOMS");
if (DOMS < 200)
{
DOMS = 200;
}
aioBox.AutoReadDI(true, DIMS);
aioBox.AutoReadDO (true, DOMS);
aioBox.LogOut = true;
aioBox.Reconnect_Event += AioBox_Reconnect_Event;
if (StoreManager.Config.GetDILength(ioIp).Equals(8))
{
aioBox.Type = Box_Type.DIO_16;
......@@ -69,8 +80,9 @@ namespace OnlineStore.DeviceLibrary
aioBox.DI_Changed_Event += AioBox_DI_Changed_Event; ;
aioBox.DO_Changed_Event += AioBox_DO_Changed_Event;
aioBox.Log_Out_Event += AioBox_Log_Out_Event;
aioBox.Log_RxTx_Event += AioBox_Log_RxTx_Event;
AIOMap.Add(ioIp, aioBox);
LogUtil.info("开始连接IO模块【" + ioIp + "】,尝试重连三次");
LogUtil.info("开始连接IO模块[" + ioIp + "["+DIMS+"]["+DOMS+"],尝试重连三次");
for (int i = 1; i <= 3; i++)
{
bool result = aioBox.Connect();
......@@ -103,14 +115,34 @@ namespace OnlineStore.DeviceLibrary
}
}
private void AioBox_Log_Out_Event(AIOBOX box, string[] s)
private void AioBox_Reconnect_Event(AIOBOX box, int times, ref bool conn)
{
foreach (string str in s)
conn = true;
LogUtil.error("重连AIO模块【" + box.IP + "】次数:" + times+"【"+box.ErrInfo+"】");
}
private DateTime lastLogTime = DateTime.Now;
private void AioBox_Log_RxTx_Event(AIOBOX box, string[] s)
{
TimeSpan span = DateTime.Now - lastLogTime;
if (span.TotalMinutes > 1)
{
LogUtil.AIOLog.Debug( "["+box.IP+"]"+ str);
lastLogTime = DateTime.Now;
foreach (string str in s)
{
LogUtil.AIOLog.Debug("[" + box.IP + "]" + str);
}
}
}
private void AioBox_Log_Out_Event(AIOBOX box, string[] s)
{
//foreach (string str in s)
//{
// LogUtil.AIOLog.Debug( "["+box.IP+"]"+ str);
//}
}
private void AioBox_DI_Changed_Event(AIOBOX box, Box_Sta[] sta)
{
try
......@@ -213,25 +245,25 @@ namespace OnlineStore.DeviceLibrary
try
{
List<string> list = new List<string>(AIOMap.Keys);
foreach (string io in list)
{
//判断是否连接,如果没有连接自动重连
AIOBOX client = AIOMap[io];
if (!client.IsConn)
{
//重连
bool result = client.Connect();
if (result)
{
LogUtil.info("重连O模块【" + client.IP + "】成功:" + client.ErrInfo);
}
else
{
LogUtil.error("重连O模块【" + client.IP + "】失败:" + client.ErrInfo);
}
}
}
//List<string> list = new List<string>(AIOMap.Keys);
//foreach (string io in list)
//{
// //判断是否连接,如果没有连接自动重连
// AIOBOX client = AIOMap[io];
// if (!client.IsConn)
// {
// //重连
// bool result = client.Connect();
// if (result)
// {
// LogUtil.info("重连O模块【" + client.IP + "】成功:" + client.ErrInfo);
// }
// else
// {
// LogUtil.error("重连O模块【" + client.IP + "】失败:" + client.ErrInfo);
// }
// }
//}
}
catch (Exception ex)
{
......
......@@ -57,6 +57,20 @@ namespace OnlineStore.DeviceLibrary
}
return ioValue;
}
public static IO_VALUE DOValue(string ioType)
{
IO_VALUE ioValue = IO_VALUE.LOW;
if (StoreManager.Config.StoreDOList.ContainsKey(ioType))
{
ConfigIO configIo = StoreManager.Config.StoreDOList[ioType];
ioValue = instance.GetDOValue(configIo.DeviceName, configIo.SlaveID, configIo.GetIOAddr());
}
else
{
LogUtil.error("没有DO=" + ioType);
}
return ioValue;
}
#endregion
public static void Init()
{
......
......@@ -18,7 +18,7 @@ namespace OnlineStore.DeviceLibrary
/// 信号变化次数
/// </summary>
public static int SignalChangeCount=0;
public static int TragetChangeCount = 0;
public static int TargetChangeCount = 0;
public static IO_VALUE PreSignalValue = IO_VALUE.LOW;
private static System.Timers.Timer timer = null;
public static void StartCheck(int targetPositon, int currPosition)
......@@ -32,16 +32,16 @@ namespace OnlineStore.DeviceLibrary
}
private static void StartCheck(int targetCount)
{
TragetChangeCount = targetCount;
TargetChangeCount = targetCount;
if (timer == null)
{
timer = new System.Timers.Timer();
timer.Interval = 50;
timer.Interval = 20;
timer.AutoReset = true;
timer.Elapsed += Timer_Elapsed;
timer.Enabled = false;
}
LogUtil.debug("开始压紧轴计量检测,预计变化" + TragetChangeCount + "次");
LogUtil.debug("开始压紧轴计量检测,预计变化" + TargetChangeCount + "次");
IsInProcess = false;
PreSignalValue = IO_VALUE.LOW;
SignalChangeCount = 0;
......@@ -53,7 +53,7 @@ namespace OnlineStore.DeviceLibrary
if (timer==null)
{ return; }
timer.Stop();
TragetChangeCount = 0;
TargetChangeCount = 0;
SignalChangeCount = 0;
}
private static bool IsInProcess = false;
......@@ -67,10 +67,10 @@ namespace OnlineStore.DeviceLibrary
if (value.Equals(IO_VALUE.HIGH) && PreSignalValue.Equals(IO_VALUE.LOW))
{
SignalChangeCount++;
LogUtil.debug("检测到信号变化,已经变化" + SignalChangeCount + "次");
LogUtil.info("MeteringSignal检测到信号变化,已经变化" + SignalChangeCount + "次(目标次数"+ TargetChangeCount + ")");
}
PreSignalValue = value;
if (TragetChangeCount <= SignalChangeCount)
if (TargetChangeCount <= SignalChangeCount)
{
timer.Stop();
}
......
......@@ -287,6 +287,7 @@ namespace OnlineStore.DeviceLibrary
#region 驱动器操作方法
public static ShuoKeInfo GetStatus(int slvAddr)
{
Thread.Sleep(SleepMS);
byte[] reviceData = SendData(slvAddr, ShuoKeCMD.SearchMoveStatus, 0x00, 0,10);
return DataToStatus(reviceData);
}
......
......@@ -257,15 +257,15 @@ namespace OnlineStore.DeviceLibrary
bool isend = ShuoKeControls.IsMoveEnd(wait.SlvAddr, wait.TargetPosition, StoreMove.LastSetpTime, out msg);
if (isend)
{
bool isCheckOk = (MeteringSignal.TragetChangeCount <= MeteringSignal.SignalChangeCount);
if (isCheckOk || MeteringSignal.TragetChangeCount <= 0)
bool isCheckOk = (MeteringSignal.TargetChangeCount <= MeteringSignal.SignalChangeCount);
if (isCheckOk || MeteringSignal.TargetChangeCount <= 0)
{
MeteringSignal.StopCheck();
return true;
}
else
{
msg = "压紧轴计量检测目标【" + MeteringSignal.TragetChangeCount + "】实际【" + MeteringSignal.SignalChangeCount + "】";
msg = "压紧轴计量检测目标【" + MeteringSignal.TargetChangeCount + "】实际【" + MeteringSignal.SignalChangeCount + "】";
LogUtil.error("压紧轴已经停止运动,但是 " + msg,110);
return false;
}
......
......@@ -49,19 +49,19 @@ namespace OnlineStore.DeviceLibrary
int errorCount = Math.Abs(outCount);
if (errorCount > moveAxis.CanErrorCountMax)
{
////判断是否需要重新运动
//if (StoreMove.CanWhileCount > 0)
//{
// LogUtil.error(Name+ moveAxis.DisplayStr + "收到原点完成信号,当前位置[" + outCount + "],重新回原点,剩余[" + StoreMove.CanWhileCount + "]次");
// ACServerManager.HomeMove(moveAxis.DeviceName, moveAxis.GetAxisValue(), moveAxis.HomeHighSpeed);
// StoreMove.CanWhileCount--;
//}
//else
//{
msg = Name + " storeMoveStep=" + StoreMove.MoveStep + moveAxis.DisplayStr + "收到原点完成信号,当前位置[" + outCount + "],误差过大,需要报警";
LogUtil.error(msg,100);
return false;
//}
//判断是否需要重新运动
if (StoreMove.CanWhileCount > 0)
{
LogUtil.error(Name + moveAxis.DisplayStr + "收到原点完成信号,当前位置[" + outCount + "],重新回原点,剩余[" + StoreMove.CanWhileCount + "]次");
ACServerManager.HomeMove(moveAxis.DeviceName, moveAxis.GetAxisValue(), moveAxis.HomeHighSpeed);
StoreMove.CanWhileCount--;
}
else
{
msg = Name + " storeMoveStep=" + StoreMove.MoveStep + moveAxis.DisplayStr + "收到原点完成信号,当前位置[" + outCount + "],误差过大,需要报警";
LogUtil.error(msg, 100);
return false;
}
}
return true;
}
......@@ -111,6 +111,16 @@ namespace OnlineStore.DeviceLibrary
// isOk = false;
// break;
//}
//如果是气缸动作,若Do未输出,重新写一遍
if (!wait.IsEnd&&span.TotalSeconds>1 && (wait.IoType.Equals(IO_Type.SuckingDisc_Down) || wait.IoType.Equals(IO_Type.SuckingDisc_Up)))
{
IO_VALUE doValue = IOManager.DOValue(wait.IoType);
if (!doValue.Equals(wait.IoValue))
{
LogUtil.error("等待[" + NotOkMsg + "],重写DO(" + wait.IoType + "=" + wait.IoValue + ")");
IOManager.IOMove(wait.IoType, wait.IoValue);
}
}
}
else if (wait.WaitType == (int)Wait_Type.Time_3)
{
......@@ -235,20 +245,34 @@ namespace OnlineStore.DeviceLibrary
{
bool result = false;
if (IOManager.IOValue(wait.IoType).Equals(IO_VALUE.HIGH))
{
LogUtil.debug(wait.ToStr() + " 检测到【" + wait.IoType + "】信号,可以停止运动");
{
LogUtil.debug(wait.ToStr() + " 检测到【" + wait.IoType + "】信号,可以停止运动");
result = true;
}
else if (IOManager.IOValue(IO_Type.BatchAxis_Limit).Equals(IO_VALUE.HIGH))
else if (IOManager.IOValue(IO_Type.BatchAxis_Limit).Equals(IO_VALUE.HIGH))
{
LogUtil.debug(wait.ToStr() + " 检测到正极限信号,可以停止运动");
LogUtil.debug(wait.ToStr() + " 检测到正极限信号,可以停止运动");
result = true;
}
if (result)
{
{
LogUtil.debug(wait.ToStr() + " 停止运动");
ACServerManager.SuddenStop(wait.AxisInfo);
}
else
{
if (AutoBaitingStatus.Equals(StoreRunStatus.Busy) && StoreMove.CanWhileCount > 0)
{
//如果批量轴已经停止运动,重新开始
bool isEnd = ACServerManager.GetBusyStatus(wait.AxisInfo.DeviceName, wait.AxisInfo.GetAxisValue()).Equals(0);
if (isEnd)
{ //判断是否需要重新运动
StoreMove.CanWhileCount--;
LogUtil.error(wait.ToStr() + "未收到信号且停止运动,重新匀速"+ StoreManager.Config.BatchAxis_SlowSpeed + "运动,剩余[" + StoreMove.CanWhileCount + "]次");
ACServerManager.SpeedMove(wait.AxisInfo.DeviceName, wait.AxisInfo.GetAxisValue(), StoreManager.Config.BatchAxis_SlowSpeed);
}
}
}
return result;
}
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!