using Hanhe.iWCS.Business;
|
using Hanhe.iWCS.Common;
|
using Hanhe.iWCS.DeviceDriver;
|
using Hanhe.iWCS.Model;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
|
namespace Hanhe.iWCS.TaizhouGEMTwoProtocol
|
{
|
public class TSHelper
|
{
|
/// <summary>
|
/// AGV进入
|
/// </summary>
|
/// <param name="taskNo">任务号</param>
|
/// <param name="orderNo">序号</param>
|
/// <param name="param1">新的agv终点</param>
|
//public static bool GoToAGV(string taskNo, int orderNo, int param1 = 1) {
|
public static bool GoToAGV(string taskNo, int orderNo, int param1)
|
{
|
bool bResult = false;
|
//TN_I_TASK_DTL_ACTION GoToAction = WorkFlowAction.GetActionNode(taskNo, orderNo, 0);
|
//TN_I_TASK_DTL_ACTION GoToAction = WorkFlowAction.GetActionNode(taskNo, 1, 0);
|
//if (GoToAction != null) {
|
|
//HardwareAccessObject GoToAGVHao = HardwareAccessHelper.Instance.GetEquipmentsHAO(GoToAction.CN_S_PROGRAM_CODE);
|
HardwareAccessObject GoToAGVHao = HardwareAccessHelper.Instance.GetEquipmentsHAO("1");
|
if (GoToAGVHao != null) {
|
//发送行走指令 到AGV
|
CMMLog.Info($"【杭叉AGV】GoToAGVHao:{GoToAGVHao}");
|
Console.WriteLine($"【杭叉AGV】GoToAGVHao:{GoToAGVHao}");
|
StringBuilder sbMsg = new StringBuilder();
|
sbMsg.Append("<Req>");
|
sbMsg.Append("<Order No='" + taskNo + "_" + "1" + "' Param1='" + param1 + "' ParamNo='" + orderNo + "' />");
|
sbMsg.Append("</Req>");
|
try {
|
object[] args = new object[1];
|
args[0] = sbMsg.ToString();
|
object errObject = GoToAGVHao._WebServiceInstance.Invoke("ChangeOrder", args);
|
string errMsg = string.Empty;
|
int errCode = Hanhe.iWCS.AGVWebService.AGVHelper.Instance.AGVXmlResult((string)errObject, out errMsg);
|
if (errCode == 0) {
|
CMMLog.Info("【杭叉AGV】通知AGV行走成功!请求参数=" + sbMsg.ToString());
|
Console.WriteLine("【杭叉AGV】通知AGV行走成功!请求参数=" + sbMsg.ToString());
|
bResult = true;
|
}
|
else {
|
CMMLog.Info("【杭叉AGV】占用失败;通知AGV行走失败!errCode=" + errCode + ";请求参数=" + sbMsg.ToString());
|
Console.WriteLine("【杭叉AGV】占用失败;通知AGV行走失败!errCode=" + errCode + ";请求参数=" + sbMsg.ToString());
|
}
|
}
|
catch (Exception ex) {
|
CMMLog.Info("【杭叉AGV】通知AGV异常!Exception=" + ex.Message + ";请求参数=" + sbMsg.ToString());
|
Console.WriteLine("【杭叉AGV】通知AGV异常!Exception=" + ex.Message + ";请求参数=" + sbMsg.ToString());
|
}
|
}
|
else
|
{
|
CMMLog.Info($"【杭叉AGV】GoToAGVHao==null!");
|
Console.WriteLine($"【杭叉AGV】GoToAGVHao==null!");
|
}
|
//}
|
//else
|
//{
|
// CMMLog.Info($"【杭叉AGV】GoToAction==null!");
|
// Console.WriteLine($"【杭叉AGV】GoToAction==null!");
|
//}
|
return bResult;
|
}
|
|
//ams下发充电任务,TS99,参数0填写车号即可。
|
//当充电开始时,会发送s消息,带的三个参数分别为: 车号;81;99
|
//当充电结束或者任务被取消,会发送s消息,三个参数分别为: 车号,82,99
|
internal static int SendChargeTask(string agvNo, bool charge, bool full = false)
|
{
|
CMMLog.Info("推送充电任务:执行开始!");
|
Console.WriteLine("推送充电任务:执行开始!");
|
var command = charge ? "AddNewOrder" : "CancelOrder";
|
int code = -1;
|
try
|
{
|
CMMLog.Info("推送充电任务:full=" + full);
|
int to = full ? 1000 : 0;
|
StringBuilder sbMsg = new StringBuilder();
|
sbMsg.Append("<Req>");
|
if (charge)
|
{
|
sbMsg.Append("<Order TS='99' Pri='20' ExtDeviceNo='" + agvNo + "' FRow='' TRow='' No='" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff:ffffff") + "' />");
|
CMMLog.Info($"推送充电任务:{sbMsg}");
|
}
|
else
|
{
|
sbMsg.Append("<Order Pri='20' TS='101' IsForce='1' ExtDeviceNo='" + agvNo + "' IsForce='1' From='" + agvNo + "' To='4' />");
|
CMMLog.Info($"推送充电任务:{sbMsg}");
|
}
|
sbMsg.Append("</Req>");
|
HardwareAccessObject AGVHao = HardwareAccessHelper.Instance.GetEquipmentsHAO("1");
|
if (AGVHao != null)
|
{
|
object[] args = new object[1];
|
string errMsg = string.Empty;
|
args[0] = sbMsg.ToString();
|
object xmlData = AGVHao._WebServiceInstance.Invoke(command, args);
|
code = Hanhe.iWCS.AGVWebService.AGVHelper.Instance.AGVXmlResult((string)xmlData, out errMsg);
|
CMMLog.Info("推送充电任务:param=" + sbMsg.ToString() + ";cmd=" + command + ";code=" + code + ";errMsg=" + errMsg);
|
if (code == 60050)
|
{
|
code = 0;
|
}
|
}
|
}
|
catch (Exception ex)
|
{
|
CMMLog.Info("推送充电任务:异常:【agv=" + agvNo + ";cmd=" + command + "】charge task err:" + ex.Message.ToString());
|
}
|
CMMLog.Info("推送充电任务:执行结束!");
|
return code;
|
}
|
|
/// <summary>
|
/// 小车安全门交互
|
/// </summary>
|
/// <param name="lockNo"></param>
|
/// <returns></returns>
|
public static bool Traffic(string lockNo)
|
{
|
bool bResult = false;
|
HardwareAccessObject AGVhao = HardwareAccessHelper.Instance.GetEquipmentsHAO("1");
|
if (AGVhao != null)
|
{
|
//发送行走指令 到AGV
|
StringBuilder sbMsg = new StringBuilder();
|
sbMsg.Append("<Req>");
|
//sbMsg.Append("<Order TS='164' From='2' To='2' ExtDeviceNo='" + lockNo + "' No='" + DateTime.Now.Ticks.ToString() + "' />");
|
sbMsg.Append("<Order TS='164' ExtDeviceNo='" + lockNo + "' No='" + DateTime.Now.Ticks.ToString() + "' />");
|
sbMsg.Append("</Req>");
|
|
var msg = string.Empty;
|
try
|
{
|
object[] args = new object[1];
|
args[0] = sbMsg.ToString();
|
object errObject = AGVhao._WebServiceInstance.Invoke("StartNewOrderWithQCmd", args);
|
string errMsg = string.Empty;
|
int errCode = Hanhe.iWCS.AGVWebService.AGVHelper.Instance.AGVXmlResult((string)errObject, out errMsg);
|
if (errCode == 0)
|
{
|
bResult = true;
|
}
|
msg = string.Format($"【推送小车进入安全门】:" + "notice agv go errCode={0} errMsg={1} request={2}", errCode, errMsg, sbMsg.ToString());
|
//Console.WriteLine(msg);
|
CMMLog.Debug(msg);
|
}
|
catch (Exception ex)
|
{
|
msg = string.Format($"【推送小车进入安全门:异常】:" + "notice agv go errMsg={0} request={1}", ex.Message, sbMsg.ToString());
|
//Console.WriteLine(msg);
|
CMMLog.Debug(msg);
|
}
|
}
|
return bResult;
|
}
|
|
|
/// <summary>
|
/// 发送和取消充电任务
|
/// </summary>
|
/// <param name="taskNo">任务号</param>
|
/// <param name="agvNo">车号</param>
|
/// <param name="command">指令方法</param>
|
/// <returns></returns>
|
//internal static int SendChargeTask(string taskNo, string agvNo, bool charge, bool full = false) {
|
// Console.WriteLine("SendChargeTask");
|
// var command = charge ? "AddNewOrder" : "CancelOrder";
|
// // int code = SendAGVTaskInfo(taskNo, agvNo, "AddNewOrder");
|
// // int code = SendAGVTaskInfo(taskNo, agvNo, "CancelOrder");
|
// int code = -1;
|
// try {
|
// CMMLog.Info("full=" + full);
|
// int to = full ? 1000 : 0;
|
// StringBuilder sbMsg = new StringBuilder();
|
// sbMsg.Append("<Req>");
|
// if (charge) {
|
// sbMsg.Append("<Order Pri='15' TS='99' No='" + taskNo + "' From='" + agvNo + "' />");
|
// }
|
// else {
|
// sbMsg.Append("<Order Pri='15' TS='101' IsForce='1' No='" + taskNo + "' IsForce='1' From='" + agvNo + "' To='4' />");
|
// }
|
// sbMsg.Append("</Req>");
|
// HardwareAccessObject AGVHao = HardwareAccessHelper.Instance.GetEquipmentsHAO("1");
|
// if (AGVHao != null) {
|
// object[] args = new object[1];
|
// string errMsg = string.Empty;
|
// args[0] = sbMsg.ToString();
|
// object xmlData = AGVHao._WebServiceInstance.Invoke(command, args);
|
// code = Hanhe.iWCS.AGVWebService.AGVHelper.Instance.AGVXmlResult((string)xmlData, out errMsg);
|
// CMMLog.Info("send charge task:param=" + sbMsg.ToString() + ";cmd=" + command + ";code=" + code + ";errMsg=" + errMsg);
|
// if (code == 60050) {
|
// code = 0;
|
// }
|
// }
|
// }
|
// catch (Exception ex) {
|
// CMMLog.Info("【agv=" + agvNo + ";cmd=" + command + "】charge task err:" + ex.Message.ToString());
|
// }
|
// return code;
|
//}
|
|
public static bool ChangeParam(string taskNo, int paramNo, params int[] param) {
|
bool bResult = false;
|
TN_I_TASK_DTL_ACTION GoToAction = WorkFlowAction.GetActionNode(taskNo, 1, 0);
|
if (GoToAction != null) {
|
HardwareAccessObject GoToAGVHao = HardwareAccessHelper.Instance.GetEquipmentsHAO(GoToAction.CN_S_PROGRAM_CODE);
|
if (GoToAGVHao != null) {
|
//发送行走指令 到AGV
|
var req = $"<Req><Order No = '{taskNo}_1' ParamNo = '{paramNo}' Param1='{param[0]}'/></Req> ";
|
if (param.Length > 1) {
|
req = $"<Req><Order No = '{taskNo}_1' ParamNo = '{paramNo}' Param1='{param[0]}' Param2='{param[1]}'/></Req> ";
|
}
|
try
|
{
|
object[] args = new object[1];
|
args[0] = req;
|
object errObject = GoToAGVHao._WebServiceInstance.Invoke("ChangeOrder", args);
|
string errMsg = string.Empty;
|
int errCode = Hanhe.iWCS.AGVWebService.AGVHelper.Instance.AGVXmlResult((string)errObject, out errMsg);
|
if (errCode == 0) {
|
CMMLog.Info("【杭叉AGV】通知AGV行走成功!请求参数=" + req);
|
bResult = true;
|
}
|
else {
|
CMMLog.Info("【杭叉AGV】占用失败;通知AGV行走失败!errCode=" + errCode + ";请求参数=" + req);
|
}
|
}
|
catch (Exception ex) {
|
CMMLog.Info("【杭叉AGV】通知AGV异常!Exception=" + ex.Message + ";请求参数=" + req);
|
}
|
}
|
}
|
return bResult;
|
}
|
}
|
}
|