Commit 481c737e authored by 潘栩锋's avatar 潘栩锋 🚴

添加 AD盒.B2 添加复位功能

parent b2135b2b
......@@ -211,14 +211,16 @@ namespace GeneralGommunication
if (tran.datas != null)
pack.AddRange(tran.datas);
//转为 7E格式
var buf = GetSendPack(pack);
//调试: 打印发送信息
if (tran.datasObj == null)
logger.Debug($"REQ {commReq.PrefixString}");
logger.Debug($"REQ {commReq.PrefixString} | {buf.ToString_Bytes2Hex()}");
else
logger.Debug($"REQ {commReq.PrefixString} {Newtonsoft.Json.JsonConvert.SerializeObject(tran.datasObj)}");
logger.Debug($"REQ {commReq.PrefixString} {Newtonsoft.Json.JsonConvert.SerializeObject(tran.datasObj)} | {buf.ToString_Bytes2Hex()}");
//转为 7E格式
var buf = GetSendPack(pack);
//开始计时
stopwatch_timeOut.Restart();
......@@ -258,9 +260,9 @@ namespace GeneralGommunication
//调试: 打印发送信息
if (tran.datasObj == null)
logger.Debug($"REQ multi {commReq.PrefixString}");
logger.Debug($"REQ multi {commReq.PrefixString} | {buf.ToString_Bytes2Hex()}");
else
logger.Debug($"REQ multi {commReq.PrefixString} {Newtonsoft.Json.JsonConvert.SerializeObject(tran.datasObj)}");
logger.Debug($"REQ multi {commReq.PrefixString} {Newtonsoft.Json.JsonConvert.SerializeObject(tran.datasObj)} | {buf.ToString_Bytes2Hex()}");
}
......@@ -358,7 +360,7 @@ namespace GeneralGommunication
if (commReq.ResponseTotalLen + PrefixIndex > pack.Count())
{
//失败,指令长度不对!!
logger.Error($"ACK expect:{commReq.PrefixString} len={commReq.ResponseTotalLen + 1}, but reponse len ={pack.Count()} reponse: {pack.ToString_Bytes2HexAndAscii()}");
logger.Error($"ACK expect:{commReq.PrefixString} len={commReq.ResponseTotalLen + 1}, but reponse len ={pack.Count()} | {pack.ToString_Bytes2HexAndAscii()}");
ErrCnt++;
return false;
}
......@@ -368,7 +370,7 @@ namespace GeneralGommunication
if (!commReq.IsMatch(commReq, pack, PrefixIndex, commReq.IsMatchContext, ref retData))
{
//回复对不上请求
logger.Error($"ACK expect:{commReq.PrefixString} len={commReq.ResponseTotalLen + 1}, but reponse len ={pack.Count()} reponse: {pack.ToString_Bytes2HexAndAscii()}");
logger.Error($"ACK expect:{commReq.PrefixString} len={commReq.ResponseTotalLen + 1}, but reponse len ={pack.Count()} | {pack.ToString_Bytes2HexAndAscii()}");
ErrCnt++;
return false;
}
......@@ -378,7 +380,7 @@ namespace GeneralGommunication
if (!IsMatch(commReq, pack))
{
//回复对不上请求
logger.Error($"ACK expect:{commReq.PrefixString} len={commReq.ResponseTotalLen + 1}, but reponse len ={pack.Count()} reponse: {pack.ToString_Bytes2HexAndAscii()}");
logger.Error($"ACK expect:{commReq.PrefixString} len={commReq.ResponseTotalLen + 1}, but reponse len ={pack.Count()} | {pack.ToString_Bytes2HexAndAscii()}");
ErrCnt++;
return false;
}
......@@ -392,9 +394,9 @@ namespace GeneralGommunication
tran.retData = retData;
if (retData == null)
logger.Debug($"ACK {commReq.PrefixString}");
logger.Debug($"ACK {commReq.PrefixString} | {pack.ToString_Bytes2Hex()}");
else
logger.Debug($"ACK {commReq.PrefixString} {Newtonsoft.Json.JsonConvert.SerializeObject(retData)}");
logger.Debug($"ACK {commReq.PrefixString} {Newtonsoft.Json.JsonConvert.SerializeObject(retData)} | {pack.ToString_Bytes2Hex()}");
//有很多指令是没有回复数据的, 回调只是通知 指令已经执行了而已
//调用回调
......@@ -432,7 +434,7 @@ namespace GeneralGommunication
if (commReq.ResponseTotalLen + PrefixIndex > pack.Count())
{
//失败,指令长度不对!!
//logger.Error($"ACK expect:{commReq.PrefixString} len={commReq.ReponseTotalLen + 1}, but reponse len ={pack.Count()} reponse: {bytes2hex(pack)}");
//logger.Error($"ACK expect:{commReq.PrefixString} len={commReq.ReponseTotalLen + 1}, but reponse len ={pack.Count()} | {bytes2hex(pack)}");
//ErrCnt++;
return false;
}
......@@ -443,7 +445,7 @@ namespace GeneralGommunication
if (!commReq.IsMatch(commReq, pack, PrefixIndex, commReq.IsMatchContext, ref retData))
{
//回复对不上请求
//logger.Error($"ACK expect:{commReq.PrefixString} ,but reponse: {bytes2hex(pack)}");
//logger.Error($"ACK expect:{commReq.PrefixString} ,but | {bytes2hex(pack)}");
return false;
}
}
......@@ -453,7 +455,7 @@ namespace GeneralGommunication
if (!IsMatch(commReq, pack))
{
//回复对不上请求
//logger.Error($"ACK expect:{commReq.PrefixString} ,but reponse: {bytes2hex(pack)}");
//logger.Error($"ACK expect:{commReq.PrefixString} ,but | {bytes2hex(pack)}");
return false;
}
......@@ -487,7 +489,7 @@ namespace GeneralGommunication
if (commReq == null) {
//不能解析
logger.Error($"ACK multi reponse len ={pack.Count()} reponse: {pack.ToString_Bytes2HexAndAscii()}");
logger.Error($"ACK multi reponse len ={pack.Count()} | {pack.ToString_Bytes2HexAndAscii()}");
ErrCnt++;
return false;
}
......@@ -496,9 +498,9 @@ namespace GeneralGommunication
tran.retData = retData;
//解析成功
if (retData == null)
logger.Debug($"ACK multi {commReq.PrefixString}");
logger.Debug($"ACK multi {commReq.PrefixString} | {pack.ToString_Bytes2Hex()}");
else
logger.Debug($"ACK multi {commReq.PrefixString} {Newtonsoft.Json.JsonConvert.SerializeObject(retData)}");
logger.Debug($"ACK multi {commReq.PrefixString} {Newtonsoft.Json.JsonConvert.SerializeObject(retData)} | {pack.ToString_Bytes2Hex()}");
//有很多指令是没有回复数据的, 回调只是通知 指令已经执行了而已
//调用回调
......
......@@ -97,14 +97,16 @@ namespace GeneralGommunication
void updatePrefixString()
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append('[');
for (int i = 0; i < Prefix.Count(); i++)
{
if (Prefix[i] >= 33 && Prefix[i] <= 126)
stringBuilder.Append((char)Prefix[i]);
else
stringBuilder.Append($" 0x{Prefix[i]:X2} ");
stringBuilder.Append($" {Prefix[i]:X2}");
}
PrefixString = stringBuilder.ToString();
stringBuilder.Append(']');
PrefixString = stringBuilder.ToString();
}
/// <summary>
/// 回复数据 长度, 不含前序
......
......@@ -11,6 +11,7 @@ using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Diagnostics;
using System.Diagnostics.SymbolStore;
using System.IO;
using System.Linq;
......@@ -119,6 +120,10 @@ namespace FlyADBase
/// </summary>
public int AD2 { get; private set; }
/// <summary>
/// 被重启了
/// </summary>
public bool IsReseted { get; private set; }
/// <summary>
/// AD值最大值 ,恒定返回65535
/// </summary>
......@@ -321,7 +326,7 @@ namespace FlyADBase
void constructor()
{
Now = DateTime.Now;
sysTickContext.BeReseted += () => BeResetTime = DateTime.Now;
//sysTickContext.BeReseted += () => BeResetTime = DateTime.Now;
......@@ -453,6 +458,7 @@ namespace FlyADBase
{
if (!IsConnected)
{
//没有连接上,停止 stopwatch
if (stopwatch_pushIntervalCheck.IsRunning)
stopwatch_pushIntervalCheck.Stop();
return;
......@@ -460,6 +466,7 @@ namespace FlyADBase
if (!stopwatch_pushIntervalCheck.IsRunning)
{
//启动 stopwatch
stopwatch_pushIntervalCheck.Restart();
}
else
......@@ -640,13 +647,18 @@ namespace FlyADBase
_core_PushRunResultEvent(e as PushRunResultEventArgs);
}
}
}
Stopwatch sw_reset = new Stopwatch();
void _core_PushDataEvent(PushDataEventArgs e) {
IsReseted = e.IsReseted;
Now = sysTickContext.ToDateTime(e.SysTick);
AD = e.AD;
AD2 = e.AD2;
Now = sysTickContext.ToDateTime(e.SysTick);
if (e.ENC1 != null)
{
......@@ -676,6 +688,24 @@ namespace FlyADBase
}
if (e.IsReseted)
{
//设备刚被重启,
//滞后1s后,检查
if (sw_reset.IsRunning && sw_reset.ElapsedMilliseconds < 1000)
{
//还没清空复位状态位
return;
}
sw_reset.Restart();
core.ClearResetBit(null, null);
AfterConnected();
return;
}
sw_reset.Reset();
//脉冲,输入,没准备好,不触发
if (!isReadyContext.isReadyGetPos1)
return;
......@@ -688,11 +718,20 @@ namespace FlyADBase
Now, e.AD, e.AD2);
}
/// <summary>
/// 连接后初始化
/// </summary>
void AfterConnected()
{
if (BeResetTime != DateTime.MinValue)
{
//1秒内,不能多次调用
double sec = (DateTime.Now - BeResetTime).TotalSeconds;
if (sec < 1)
return;
}
BeResetTime = DateTime.Now;
if (IsReadParamFromDev)
{
......@@ -763,7 +802,15 @@ namespace FlyADBase
//TODO
}
/// <summary>
/// 重启AD盒设备<para/>
/// N秒后停止"喂狗", 17ms不"喂狗",就会重启
/// </summary>
/// <param name="sec">N秒后停止"喂狗"</param>
public void Reset(byte sec)
{
core.Reset(sec, null, null);
}
......
......@@ -286,11 +286,11 @@ namespace FlyADBase
int[] ad1s = dataList.Select(d => d.ad).ToArray();
int[] ad2s = dataList.Select(d => d.ad2).ToArray();
int ad = (int)ad1s.Average();
AD = ad;
//int ad = (int)ad1s.Average();
//AD = ad;
int ad2 = (int)ad2s.Average();
AD2 = ad2;
//int ad2 = (int)ad2s.Average();
//AD2 = ad2;
//推送timegrid事件
TimeGridEvent?.Invoke(this,
......
using FlyADBase.Inc;
using FObjBase;
using GeneralGommunication;
using Misc;
using NLog;
using System;
using System.Collections.Generic;
......@@ -15,6 +16,9 @@ namespace FlyADBase
{
public class FlyAd2021B2Core : Dev7E, IFlyAd2021B2Core
{
/// <summary>
/// 参数列表的参数序号
/// </summary>
const UInt16 P_Saved_Index_Op_Mode = 0;
const UInt16 P_Saved_Index_Op_Motor = 1;
const UInt16 P_Saved_Index_Op_Encoder = 2;
......@@ -96,6 +100,7 @@ namespace FlyADBase
bool hasENC2 = Misc.MyBase.CHECKBIT(B1, 5);
bool hasOut = Misc.MyBase.CHECKBIT(B1, 4);
bool hasAd2 = Misc.MyBase.CHECKBIT(B1, 3);
bool hasReset = Misc.MyBase.CHECKBIT(B1, 0);
var buf = pack;
int index = 2;
......@@ -175,6 +180,11 @@ namespace FlyADBase
eventArgs.AD2 = BitConverter.ToUInt16(buf, index);
index += 2;
}
if (hasReset)
{
eventArgs.IsReseted = true;
}
PushDataEvent?.Invoke(this, eventArgs);
}
......@@ -184,7 +194,7 @@ namespace FlyADBase
/// <summary>
/// 功能包解析
/// </summary>
/// <param name="datas"></param>
/// <param name="pack"></param>
protected override void ParseFuncPack(byte[] pack)
{
//TODO 要处理 TimeOut / ParseFuncPack / GetSendMsg 线性同步问题
......@@ -839,32 +849,6 @@ namespace FlyADBase
}
#endregion
#region SysParamComm 系统参数指令
/// <summary>
/// 获取系统当前Tick
/// </summary>
[CallBack(typeof(UInt32))]
public void GetSysTick(CallBackHandler asyncDelegate, object asyncContext)
{
COMMREQ commReq = new COMMREQ()
{
Prefix = COMMREQ.ToPrefix("ST"),
ResponseLen = 4,
ParseFuncPack = (pack, dataIdx) => BitConverter.ToInt32(pack, dataIdx)
};
//放入 交易队列
AddTran(
new COMMREQ_Transaction()
{
commReq = commReq,
asyncDelegate = asyncDelegate,
asyncContext = asyncContext
});
}
#endregion
#region GetSysParam 读运行参数
[CallBack(typeof(MOTORTYPE))]
public void GetSysParam_MotorType(CallBackHandler asyncDelegate, object asyncContext)
......@@ -1112,5 +1096,81 @@ namespace FlyADBase
}
#endregion
/// <summary>
/// 获取系统当前Tick
/// </summary>
[CallBack(typeof(UInt32))]
public void GetSysTick(CallBackHandler asyncDelegate, object asyncContext)
{
COMMREQ commReq = new COMMREQ()
{
Prefix = COMMREQ.ToPrefix("ST"),
ResponseLen = 4,
ParseFuncPack = (pack, dataIdx) => BitConverter.ToInt32(pack, dataIdx)
};
//放入 交易队列
AddTran(
new COMMREQ_Transaction()
{
commReq = commReq,
asyncDelegate = asyncDelegate,
asyncContext = asyncContext
});
}
/// <summary>
/// 重启AD盒设备<para/>
/// N秒后停止"喂狗", 17ms不"喂狗",就会重启
/// </summary>
/// <param name="sec">N秒后停止"喂狗"</param>
/// <param name="asyncDelegate"></param>
/// <param name="asyncContext"></param>
public void Reset(byte sec, CallBackHandler asyncDelegate, object asyncContext)
{
List<byte> datas = new List<byte>();
datas.Add(sec);
var datasObj = new { sec };
COMMREQ commReq = new COMMREQ()
{
Prefix = COMMREQ.ToPrefix("PR")
};
//放入 交易队列
AddTran(
new COMMREQ_Transaction()
{
commReq = commReq,
asyncDelegate = asyncDelegate,
asyncContext = asyncContext,
datas = datas.ToArray(),
datasObj = datasObj
});
}
/// <summary>
/// 触发推送B0位 的 IsReseted =false
/// </summary>
/// <param name="asyncDelegate"></param>
/// <param name="asyncContext"></param>
public void ClearResetBit(CallBackHandler asyncDelegate, object asyncContext)
{
COMMREQ commReq = new COMMREQ()
{
Prefix = COMMREQ.ToPrefix("Pr")
};
//放入 交易队列
AddTran(
new COMMREQ_Transaction()
{
commReq = commReq,
asyncDelegate = asyncDelegate
});
}
}
}
......@@ -7,6 +7,8 @@ using System.ComponentModel;
using FObjBase;
using Misc;
using System.Collections.ObjectModel;
using GeneralGommunication;
namespace FlyADBase
{
/// <summary>
......@@ -65,6 +67,11 @@ namespace FlyADBase
/// </summary>
int AD2 { get; }
/// <summary>
/// 被重启了
/// </summary>
bool IsReseted { get; }
/// <summary>
/// AD值最大值 ,恒定返回65535
/// </summary>
......@@ -227,6 +234,13 @@ namespace FlyADBase
/// </summary>
DRIVE_MAN_STATUS DriveStatus { get; }
#endregion
/// <summary>
/// 重启AD盒设备<para/>
/// N秒后停止"喂狗", 17ms不"喂狗",就会重启
/// </summary>
/// <param name="sec">N秒后停止"喂狗"</param>
void Reset(byte sec);
}
......
......@@ -87,16 +87,6 @@ namespace FlyADBase.Inc
void EStop(CallBackHandler asyncDelegate, object asyncContext);
#endregion
#region SysParamComm 系统参数指令
/// <summary>
/// 获取系统当前Tick
/// </summary>
[CallBack(typeof(UInt32))]
void GetSysTick(CallBackHandler asyncDelegate, object asyncContext);
#endregion
#region GetSysParam 读运行参数
[CallBack(typeof(MOTORTYPE))]
void GetSysParam_MotorType(CallBackHandler asyncDelegate, object asyncContext);
......@@ -117,7 +107,6 @@ namespace FlyADBase.Inc
#region SetSysParam 设置运行参数
void SetSysParam_MotorType(MOTORTYPE motorType, CallBackHandler asyncDelegate, object asyncContext);
void SetSysParam_Ratio01(UInt16 ratio01, CallBackHandler asyncDelegate, object asyncContext);
void SetSysParam_Ratio02(UInt16 ratio02, CallBackHandler asyncDelegate, object asyncContext);
......@@ -127,7 +116,32 @@ namespace FlyADBase.Inc
void SetSysParam_Jog(UInt32 jog, CallBackHandler asyncDelegate, object asyncContext);
void SetSysParam_Apply(CallBackHandler asyncDelegate, object asyncContext);
#endregion
/// <summary>
/// 获取系统当前Tick
/// </summary>
[CallBack(typeof(UInt32))]
void GetSysTick(CallBackHandler asyncDelegate, object asyncContext);
/// <summary>
/// 重启AD盒设备<para/>
/// N秒后停止"喂狗", 17ms不"喂狗",就会重启
/// </summary>
/// <param name="sec">N秒后停止"喂狗"</param>
/// <param name="asyncDelegate"></param>
/// <param name="asyncContext"></param>
void Reset(byte sec, CallBackHandler asyncDelegate, object asyncContext);
/// <summary>
/// 触发推送B0位 的 IsReseted =false
/// </summary>
/// <param name="asyncDelegate"></param>
/// <param name="asyncContext"></param>
void ClearResetBit(CallBackHandler asyncDelegate, object asyncContext);
#endregion
}
......@@ -143,6 +157,11 @@ namespace FlyADBase.Inc
public UInt16? InChange { get; set; }
public UInt16? Out { get; set; }
/// <summary>
/// AD盒被重启了
/// </summary>
public bool IsReseted { get; set; }
public PushDataEventArgs()
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment