You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1316 lines
60 KiB
1316 lines
60 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using System.Data;
|
|
using System.Threading;
|
|
using Microsoft.VisualBasic;
|
|
using DBFactory;
|
|
using ICommLayer;
|
|
|
|
namespace SocketsTCPIP
|
|
{
|
|
/// <summary>
|
|
/// 使用SocketsTCPIP的客户端进行通讯
|
|
/// 发送设备命令类
|
|
/// 创建者:Richard.Liu
|
|
/// 20110104升级与AGV控制台通讯协议
|
|
/// </summary>
|
|
public class CSendDeviceOrder : ISendDeviceOrder
|
|
{
|
|
string _commLayerError;
|
|
StringBuilder sql = new StringBuilder();
|
|
Model.MDevice devinfo;
|
|
public string CommLayerError
|
|
{
|
|
get { return _commLayerError; }
|
|
set { _commLayerError = value; }
|
|
}
|
|
|
|
DBOperator dbo = CClientTCPIP.dbo;
|
|
string AGVAllowSingleFork = CommonClassLib.AppSettings.GetValue("AGVAllowSingleFork");
|
|
public CSendDeviceOrder()
|
|
{
|
|
dbo.Open();
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
///序号 通讯种类 方向 通讯格式 格式说明
|
|
///1 监控调度通讯连接建立 监控调度->AGV控制台 10001
|
|
///2 监控调度通讯连接断开 监控调度->AGV控制台 10002
|
|
///3 下达任务 控调度->AGV控制台 10003[T1][T2][T][R][P][K][A][F][C][N1][N2]……[CK]
|
|
///T1为任务号(取值范围1000-65534)
|
|
///T2为任务步号(取值范围0-99)
|
|
///T为任务类型(TS编号); 0不指定类型,11演示流程
|
|
///R为产品类型; 0不指定类型
|
|
///P为优先级(取值范围1-8,越大优先级越高);2
|
|
///K为车辆类型; 0不指定类型(14001---〉1;15001---〉2)
|
|
///A为车辆编号; 0不指定编号
|
|
///F为后续任务标识(1-有后续任务,0-无后续任务);
|
|
///C为参数数量;
|
|
///N1、N2为具体参数;
|
|
///CK校验码(以上所有字段逐字节累加)
|
|
///4 下达任务确认 AGV控制台->监控调度 10003[T1][T2][CK] ///T1为任务号,T2为任务步号;
|
|
///5 AGV任务开始 AGV控制台->监控调度 10004[T1][T2][A][CK] ///A为车辆编号;
|
|
///6 任务开始确认 监控调度->AGV控制台 10004[T1][T2][CK]
|
|
///7 AGV任务完成 AGV控制台->监控调度 10005[T1][T2][A][CK]
|
|
///8 任务完成确认 监控调度->AGV控制台 10005[T1][T2][CK]
|
|
///9 监控申请删除任务 监控调度->AGV控制台 10006[T1][T2][CK]
|
|
///10 监控申请删除任务回复 AGV控制台->监控调度 10006[T1][T2][A][CK] ///A为允许状态(0-不允许,1-允许)
|
|
///11 控制台申请删除任务 AGV控制台->监控调度 10007[T1][T2][CK]
|
|
///12 控制台申请删除任务确认 监控调度->AGV控制台 10007[T1][T2][CK]
|
|
///13 监控查询AGV状态 监控调度->AGV控制台 10008[A][CK] ///A为车辆编号;(0-查询所有车辆)
|
|
///14 查询AGV状态确认 AGV控制台->监控调度 10008[A][C][CK] ///A为车辆编号;C为车辆数目;
|
|
///15 控制台上报AGV状态 AGV控制台->监控调度 10009[A][T1][S][E][W][C][B][N][O][CK]
|
|
///A为车辆编号;
|
|
///T1为任务号;
|
|
///S为当前路段起点;
|
|
///E为当前路段终点;
|
|
///W为工作状态;(0空闲,1运行,2暂停,3动态操作,4静态操作,5等待,6休眠,7逻辑离线,8物理离线)
|
|
///C为故障代码;
|
|
///B为电池状态;(0电量满,1电量正常2电量低)
|
|
///N为目标节点;
|
|
///O为操作码;
|
|
///16 确认AGV状态 监控调度->AGV控制台 10009[A][CK] ///A为车辆编号;
|
|
///17 监控发送信息 监控调度->AGV控制台 10010[R][C][I1][I2]…[CK]
|
|
///R为是否需要控制台回复确认
|
|
///(0-不需确认,1-需确认)
|
|
///C 为信息个数
|
|
///[I1]…为具体信息
|
|
///18 控制台回复信息确认 AGV控制台->监控调度 10010[R][C] [I1][I2]…[CK]
|
|
///19 控制台发送信息 AGV控制台->监控调度 10011[R][C][I1][I2]…[CK]
|
|
///R为是否需要控制台回复确认
|
|
///(0-不需确认,1-需确认)
|
|
///C 为信息个数
|
|
///[I1]…为具体信息
|
|
///20 上位机回复信息确认 监控调度->AGV控制台 10011[R][C][I1][I2]…[CK]
|
|
|
|
/// </summary>
|
|
/// <param name="MessageIndex">消息编号</param>
|
|
/// <param name="TaskIndex">任务编号</param>
|
|
/// <param name="Order">AGV命令字</param>
|
|
/// <param name="DeviceIndex">设备编号</param>
|
|
/// <param name="StartX">[N1]:取货点</param>
|
|
/// <param name="StartY"></param>
|
|
/// <param name="StartZ"></param>
|
|
/// <param name="EndX">[N2]:放货点</param>
|
|
/// <param name="EndY"></param>
|
|
/// <param name="EndZ"></param>
|
|
/// <returns>发送AGV命令是否成功</returns>
|
|
public bool SendDeviceOrder(int MessageIndex, int TaskIndex, int Order, int DeviceIndex, int StartX, int StartY, int StartZ, int EndX, int EndY, int EndZ)
|
|
{
|
|
|
|
if (Order == 0)//20170923
|
|
{
|
|
return false;
|
|
}
|
|
devinfo = Model.CGetInfo.GetDeviceInfo(DeviceIndex);
|
|
if (devinfo == null)
|
|
{
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
if (CClientTCPIP.IfInit[devinfo.RemoteIP] == false)
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
}
|
|
//StartX取设备索引 EndX送设备索引
|
|
//20100413根据StartX(取设备索引)获得前(距离车尾远)叉、后(距离车尾近)叉
|
|
//站在车尾沿着行进方向的左、右方向;
|
|
//判断关联双叉是否同步运行
|
|
char useAwayFork = '0';
|
|
char channelLeft = '0';
|
|
int AGVAddress = 0;
|
|
int dorder = 0;
|
|
byte Controlcode = 0;
|
|
int _device = GetAGVNoFromMonitor(TaskIndex);
|
|
int Fid = Model.CGeneralFunction.GetManageTaskIndexfromMonitor(TaskIndex);
|
|
//byte goodsID = GetGoodsIDfromManage(Fid); // 从管理任务得到产品类型
|
|
byte goodsID = 255; // 从管理任务得到产品类型
|
|
byte[] _Sdata;
|
|
string _Sdatastr;
|
|
int NextOrder = 0; // 下一个动作编码,运动时候给AGV发送; 0没有下一个动作;2取货,送货;
|
|
int HaveNextTask = IfHaveNextTask(TaskIndex, DeviceIndex, ref NextOrder);
|
|
int forkNo = 0; int ck = 0;
|
|
bool retvalue = false;
|
|
if (MessageIndex != 1)
|
|
{
|
|
return false;
|
|
|
|
}
|
|
try
|
|
{
|
|
|
|
|
|
switch (Order)
|
|
{
|
|
case 1://运动命令 StartX取设备索引
|
|
#region 运动命令
|
|
|
|
GetDeviceInfoFromAGVGate(StartX, ref channelLeft, ref useAwayFork, ref AGVAddress);// 运动命令按照起点设备查找AGV地标点
|
|
|
|
//_Sdata = new byte[52];
|
|
//_Sdata[0] = Convert.ToByte(10003 & 255); //帧头
|
|
//_Sdata[1] = Convert.ToByte((10003 >> 8) & 255);
|
|
//_Sdata[2] = Convert.ToByte((10003 >> 16) & 255);
|
|
//_Sdata[3] = Convert.ToByte((10003 >> 24) & 255);
|
|
//_Sdata[4] = Convert.ToByte(Fid & 255);//管理任务号
|
|
//_Sdata[5] = Convert.ToByte((Fid >> 8) & 255);
|
|
//_Sdata[6] = Convert.ToByte((Fid >> 16) & 255);
|
|
//_Sdata[7] = Convert.ToByte((Fid >> 24) & 255);
|
|
//_Sdata[8] = Convert.ToByte(TaskIndex & 255);//监控任务号
|
|
//_Sdata[9] = Convert.ToByte((TaskIndex >> 8) & 255);
|
|
//_Sdata[10] = Convert.ToByte((TaskIndex >> 16) & 255);
|
|
//_Sdata[11] = Convert.ToByte((TaskIndex >> 24) & 255);
|
|
//_Sdata[12] = Convert.ToByte(65535 & 255);//任务类型
|
|
//_Sdata[13] = Convert.ToByte((65535 >> 8) & 255);
|
|
//_Sdata[14] = Convert.ToByte((65535 >> 16) & 255);
|
|
//_Sdata[15] = Convert.ToByte((65535 >> 24) & 255);
|
|
//// 产品类型65535 AGV新加字段 20150115
|
|
//_Sdata[16] = Convert.ToByte(65535 & 255);
|
|
//_Sdata[17] = Convert.ToByte((65535 >> 8) & 255);
|
|
//_Sdata[18] = Convert.ToByte((65535 >> 16) & 255);
|
|
//_Sdata[19] = Convert.ToByte((65535 >> 24) & 255);
|
|
//// 产品类型
|
|
//_Sdata[20] = 2;//优先级
|
|
//_Sdata[21] = 0;
|
|
//_Sdata[22] = 0;
|
|
//_Sdata[23] = 0;
|
|
//_Sdata[24] = Convert.ToByte(65535 & 255);//车辆类型
|
|
//_Sdata[25] = Convert.ToByte((65535 >> 8) & 255);
|
|
//_Sdata[26] = Convert.ToByte((65535 >> 16) & 255);
|
|
//_Sdata[27] = Convert.ToByte((65535 >> 24) & 255);
|
|
//_Sdata[28] = Convert.ToByte(65535 & 255);//车辆编号
|
|
//_Sdata[29] = Convert.ToByte((65535 >> 8) & 255);
|
|
//_Sdata[30] = Convert.ToByte((65535 >> 16) & 255);
|
|
//_Sdata[31] = Convert.ToByte((65535 >> 24) & 255);
|
|
//_Sdata[32] = Convert.ToByte(HaveNextTask & 255);//后续任务标识
|
|
//_Sdata[33] = Convert.ToByte((HaveNextTask >> 8) & 255);
|
|
//_Sdata[34] = Convert.ToByte((HaveNextTask >> 16) & 255);
|
|
//_Sdata[35] = Convert.ToByte((HaveNextTask >> 24) & 255);
|
|
//_Sdata[36] = 1;//节点数量
|
|
//_Sdata[37] = 0;
|
|
//_Sdata[38] = 0;
|
|
//_Sdata[39] = 0;
|
|
//_Sdata[40] = Convert.ToByte(AGVAddress & 255);//节点号
|
|
//_Sdata[41] = Convert.ToByte((AGVAddress >> 8) & 255);
|
|
//_Sdata[42] = Convert.ToByte((AGVAddress >> 16) & 255);
|
|
//_Sdata[43] = Convert.ToByte((AGVAddress >> 24) & 255);
|
|
//_Sdata[44] = Convert.ToByte(Order & 255);//动作设备编号
|
|
//_Sdata[45] = Convert.ToByte((Order >> 8) & 255);
|
|
//_Sdata[46] = Convert.ToByte((Order >> 16) & 255);
|
|
//_Sdata[47] = Convert.ToByte((Order >> 24) & 255);
|
|
//ck = Convert.ToInt16(60003 + Fid + TaskIndex + 65535 + 65535 + 2 + 65535 + 65535 + HaveNextTask + 1 + AGVAddress + Order);
|
|
//_Sdata[48] = Convert.ToByte(ck & 255);//校验码(以上所有任务码按无符号作加法)
|
|
//_Sdata[49] = Convert.ToByte((ck >> 8) & 255);
|
|
//_Sdata[50] = Convert.ToByte((ck >> 16) & 255);
|
|
//_Sdata[51] = Convert.ToByte((ck >> 24) & 255);
|
|
|
|
|
|
_Sdata = new byte[28];
|
|
|
|
_Sdata[0] = Convert.ToByte(10003 & 255); //帧头
|
|
_Sdata[1] = Convert.ToByte((10003 >> 8) & 255);
|
|
|
|
_Sdata[2] = Convert.ToByte(Fid & 255);//管理任务号
|
|
_Sdata[3] = Convert.ToByte((Fid >> 8) & 255);
|
|
_Sdata[4] = Convert.ToByte((Fid >> 16) & 255);
|
|
_Sdata[5] = Convert.ToByte((Fid >> 24) & 255);
|
|
|
|
_Sdata[6] = Convert.ToByte(TaskIndex & 255);//调度任务号
|
|
_Sdata[7] = Convert.ToByte((TaskIndex >> 8) & 255);
|
|
|
|
_Sdata[8] = Convert.ToByte(65535 & 255);//任务类型
|
|
_Sdata[9] = Convert.ToByte((65535 >> 8) & 255);
|
|
|
|
if (StartX < 19000)//输送机编号小于19000
|
|
{
|
|
_Sdata[10] = 1;//产品类型,输送机1,地面2
|
|
_Sdata[11] = 0;
|
|
}
|
|
else
|
|
{
|
|
|
|
_Sdata[10] = 2;//产品类型,输送机1,地面2
|
|
_Sdata[11] = 0;
|
|
}
|
|
|
|
|
|
_Sdata[12] = 2;//优先级
|
|
_Sdata[13] = 0;
|
|
|
|
_Sdata[14] = goodsID;//车辆类型 -- 传入货物类型bba 13\14时空托盘
|
|
_Sdata[15] = 0;
|
|
|
|
_Sdata[16] = 0;//车辆编号
|
|
_Sdata[17] = 0;
|
|
|
|
_Sdata[18] = Convert.ToByte(HaveNextTask & 255);//后续任务标识
|
|
_Sdata[19] = Convert.ToByte((HaveNextTask >> 8) & 255);
|
|
|
|
_Sdata[20] = 2;//参数数量
|
|
_Sdata[21] = 0;
|
|
|
|
_Sdata[22] = Convert.ToByte(AGVAddress & 255);//取货节点号
|
|
_Sdata[23] = Convert.ToByte((AGVAddress >> 8) & 255);
|
|
|
|
dorder = 65535;
|
|
_Sdata[24] = Convert.ToByte(dorder & 255);//Convert.ToByte(Order & 255);//设备动作编号,无动作65535 --Convert.ToByte(NextOrder);
|
|
_Sdata[25] = Convert.ToByte((dorder >> 8) & 255); // 高位FF03
|
|
|
|
|
|
for (int i = 0; i <= 25; i++)
|
|
{
|
|
ck += Convert.ToInt32(_Sdata[i]);
|
|
}
|
|
_Sdata[26] = Convert.ToByte(ck & 255);//校验码(以上所有任务码按无符号作加法)
|
|
_Sdata[27] = Convert.ToByte((ck >> 8) & 255);
|
|
|
|
retvalue = SendData(DeviceIndex, _Sdata);
|
|
|
|
#endregion
|
|
break;
|
|
case 2://取货命令
|
|
#region 取货命令
|
|
|
|
GetDeviceInfoFromAGVGate(StartX, ref channelLeft, ref useAwayFork, ref AGVAddress);
|
|
dorder = 2;//取货命令
|
|
if ((Model.CGeneralFunction.MutiForkIfSync(TaskIndex, DeviceIndex, 6) == null) && (AGVAllowSingleFork == "1"))//20100710
|
|
{//不能同步
|
|
|
|
if (useAwayFork == '1')//前叉
|
|
{
|
|
|
|
forkNo = 1;
|
|
}
|
|
else//后叉
|
|
{
|
|
forkNo = 2;
|
|
}
|
|
|
|
}
|
|
else
|
|
{//同步
|
|
forkNo = 3;
|
|
|
|
}
|
|
//_Sdata = new byte[52];
|
|
//_Sdata[0] = Convert.ToByte(10003 & 255); //帧头
|
|
//_Sdata[1] = Convert.ToByte((10003 >> 8) & 255);
|
|
//_Sdata[2] = Convert.ToByte((10003 >> 16) & 255);
|
|
//_Sdata[3] = Convert.ToByte((10003 >> 24) & 255);
|
|
//_Sdata[4] = Convert.ToByte(Fid & 255);//管理任务号
|
|
//_Sdata[5] = Convert.ToByte((Fid >> 8) & 255);
|
|
//_Sdata[6] = Convert.ToByte((Fid >> 16) & 255);
|
|
//_Sdata[7] = Convert.ToByte((Fid >> 24) & 255);
|
|
//_Sdata[8] = Convert.ToByte(TaskIndex & 255);//监控任务号
|
|
//_Sdata[9] = Convert.ToByte((TaskIndex >> 8) & 255);
|
|
//_Sdata[10] = Convert.ToByte((TaskIndex >> 16) & 255);
|
|
//_Sdata[11] = Convert.ToByte((TaskIndex >> 24) & 255);
|
|
//_Sdata[12] = Convert.ToByte(65535 & 255);//任务类型
|
|
//_Sdata[13] = Convert.ToByte((65535 >> 8) & 255);
|
|
//_Sdata[14] = Convert.ToByte((65535 >> 16) & 255);
|
|
//_Sdata[15] = Convert.ToByte((65535 >> 24) & 255);
|
|
//// 产品类型65535 AGV新加字段 20150115
|
|
//_Sdata[16] = Convert.ToByte(65535 & 255);
|
|
//_Sdata[17] = Convert.ToByte((65535 >> 8) & 255);
|
|
//_Sdata[18] = Convert.ToByte((65535 >> 16) & 255);
|
|
//_Sdata[19] = Convert.ToByte((65535 >> 24) & 255);
|
|
//// 产品类型
|
|
//_Sdata[20] = 2;//优先级
|
|
//_Sdata[21] = 0;
|
|
//_Sdata[22] = 0;
|
|
//_Sdata[23] = 0;
|
|
//_Sdata[24] = Convert.ToByte(65535 & 255);//车辆类型
|
|
//_Sdata[25] = Convert.ToByte((65535 >> 8) & 255);
|
|
//_Sdata[26] = Convert.ToByte((65535 >> 16) & 255);
|
|
//_Sdata[27] = Convert.ToByte((65535 >> 24) & 255);
|
|
//_Sdata[28] = Convert.ToByte(65535 & 255);//车辆编号
|
|
//_Sdata[29] = Convert.ToByte((65535 >> 8) & 255);
|
|
//_Sdata[30] = Convert.ToByte((65535 >> 16) & 255);
|
|
//_Sdata[31] = Convert.ToByte((65535 >> 24) & 255);
|
|
//_Sdata[32] = Convert.ToByte(HaveNextTask & 255);//后续任务标识
|
|
//_Sdata[33] = Convert.ToByte((HaveNextTask >> 8) & 255);
|
|
//_Sdata[34] = Convert.ToByte((HaveNextTask >> 16) & 255);
|
|
//_Sdata[35] = Convert.ToByte((HaveNextTask >> 24) & 255);
|
|
//_Sdata[36] = 1;//节点数量
|
|
//_Sdata[37] = 0;
|
|
//_Sdata[38] = 0;
|
|
//_Sdata[39] = 0;
|
|
//_Sdata[40] = Convert.ToByte(AGVAddress & 255);//节点号
|
|
//_Sdata[41] = Convert.ToByte((AGVAddress >> 8) & 255);
|
|
//_Sdata[42] = Convert.ToByte((AGVAddress >> 16) & 255);
|
|
//_Sdata[43] = Convert.ToByte((AGVAddress >> 24) & 255);
|
|
//_Sdata[44] = Convert.ToByte(Order & 255);//动作设备编号
|
|
//_Sdata[45] = Convert.ToByte((Order >> 8) & 255);
|
|
//_Sdata[46] = Convert.ToByte((Order >> 16) & 255);
|
|
//_Sdata[47] = Convert.ToByte((Order >> 24) & 255);
|
|
//ck = Convert.ToInt32(10003 + Fid + TaskIndex + 65535 + 65535 + 2 + 65535 + 65535 + HaveNextTask + 1 + AGVAddress + Order);
|
|
//_Sdata[48] = Convert.ToByte(ck & 255);//校验码(以上所有任务码按无符号作加法)
|
|
//_Sdata[49] = Convert.ToByte((ck >> 8) & 255);
|
|
//_Sdata[50] = Convert.ToByte((ck >> 16) & 255);
|
|
//_Sdata[51] = Convert.ToByte((ck >> 24) & 255);
|
|
//writeDark(Fid, TaskIndex, DeviceIndex, dorder, AGVAddress);
|
|
|
|
|
|
|
|
_Sdata = new byte[28];
|
|
|
|
_Sdata[0] = Convert.ToByte(10003 & 255); //帧头
|
|
_Sdata[1] = Convert.ToByte((10003 >> 8) & 255);
|
|
|
|
_Sdata[2] = Convert.ToByte(Fid & 255);//管理任务号
|
|
_Sdata[3] = Convert.ToByte((Fid >> 8) & 255);
|
|
_Sdata[4] = Convert.ToByte((Fid >> 16) & 255);
|
|
_Sdata[5] = Convert.ToByte((Fid >> 24) & 255);
|
|
|
|
_Sdata[6] = Convert.ToByte(TaskIndex & 255);//调度任务号
|
|
_Sdata[7] = Convert.ToByte((TaskIndex >> 8) & 255);
|
|
|
|
_Sdata[8] = Convert.ToByte(65535 & 255);//任务类型
|
|
_Sdata[9] = Convert.ToByte((65535 >> 8) & 255);
|
|
|
|
if (StartX < 19000)//输送机编号小于19000
|
|
{
|
|
_Sdata[10] = 1;//产品类型,输送机1,地面2
|
|
_Sdata[11] = 0;
|
|
}
|
|
else
|
|
{
|
|
|
|
_Sdata[10] = 2;//产品类型,输送机1,地面2
|
|
_Sdata[11] = 0;
|
|
}
|
|
|
|
//青岛思锐卡蒂斯货位回库置个优先级
|
|
_Sdata[12] = 2;//优先级
|
|
_Sdata[13] = 0;
|
|
|
|
_Sdata[14] = goodsID;//车辆类型 -- 传入货物类型bba 13\14时空托盘
|
|
_Sdata[15] = 0;
|
|
|
|
_Sdata[16] = 0;//车辆编号
|
|
_Sdata[17] = 0;
|
|
|
|
_Sdata[18] = Convert.ToByte(HaveNextTask & 255);//后续任务标识
|
|
_Sdata[19] = Convert.ToByte((HaveNextTask >> 8) & 255);
|
|
|
|
_Sdata[20] = 2;//参数数量
|
|
_Sdata[21] = 0;
|
|
//T_Base_AGV_Gate
|
|
//DataView AGVPosition = new DataView();
|
|
//sql.Remove(0, sql.Length);
|
|
//sql.Append("SELECT F_Address FROM T_Base_AGV_Gate WHERE F_AGVGateDeviceIndex = ").Append(AGVAddress);
|
|
//AGVPosition = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
|
|
//if ( AGVAddress == 12026 || AGVAddress == 12030 || AGVAddress == 12019 || AGVAddress == 12022)
|
|
//{
|
|
//T_Base_AGV_Gate
|
|
//DataView AGVPosition = new DataView();
|
|
//sql.Remove(0, sql.Length);
|
|
//sql.Append("SELECT F_Address FROM T_Base_AGV_Gate WHERE F_AGVGateDeviceIndex = ").Append( AGVAddress );
|
|
//AGVPosition = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
|
|
//自己家物流线的站台
|
|
//int AGVSIASUNQH = Convert.ToInt32(AGVPosition[0]["F_Address"]);
|
|
//_Sdata[22] = Convert.ToByte(AGVSIASUNQH & 255);//取货节点号
|
|
//_Sdata[23] = Convert.ToByte((AGVSIASUNQH >> 8) & 255);
|
|
//writeDark(2, AGVSIASUNQH, DeviceIndex);
|
|
|
|
//}
|
|
//else
|
|
//{
|
|
_Sdata[22] = Convert.ToByte(AGVAddress & 255);//取货节点号
|
|
_Sdata[23] = Convert.ToByte((AGVAddress >> 8) & 255);
|
|
|
|
//}
|
|
|
|
//操作码
|
|
//Controlcode = ControlCode(TaskIndex, Order, AGVAddress);
|
|
////送一个1 送二个2
|
|
//_Sdata[24] = Controlcode;//Convert.ToByte(Order & 255);//设备动作编号,无动作65535 --Convert.ToByte(NextOrder);
|
|
//_Sdata[25] = 0; // 高位FF03 Convert.ToByte((dorder >> 8) & 255)
|
|
|
|
|
|
|
|
for (int i = 0; i <= 25; i++)
|
|
{
|
|
ck += Convert.ToInt32(_Sdata[i]);
|
|
}
|
|
_Sdata[26] = Convert.ToByte(ck & 255);//校验码(以上所有任务码按无符号作加法)
|
|
_Sdata[27] = Convert.ToByte((ck >> 8) & 255);
|
|
|
|
retvalue = SendData(DeviceIndex, _Sdata);
|
|
|
|
|
|
#endregion
|
|
break;
|
|
case 3://送货
|
|
#region 送货
|
|
|
|
GetDeviceInfoFromAGVGate(EndX, ref channelLeft, ref useAwayFork, ref AGVAddress);
|
|
dorder = 3;//送货
|
|
//if (channelLeft == '1')
|
|
//{
|
|
// dorder = 2;//左送
|
|
//}
|
|
//else
|
|
//{
|
|
// dorder = 4;//右送
|
|
//}
|
|
if ((Model.CGeneralFunction.MutiForkIfSync(TaskIndex, DeviceIndex, 6) == null) && (AGVAllowSingleFork == "1"))//20100710
|
|
{//不能同步
|
|
|
|
if (useAwayFork == '1')//前叉
|
|
{
|
|
|
|
forkNo = 1;
|
|
|
|
}
|
|
else//后叉
|
|
{
|
|
forkNo = 2;
|
|
}
|
|
|
|
}
|
|
else
|
|
{//同步
|
|
forkNo = 3;
|
|
|
|
}
|
|
//_Sdata = new byte[52];
|
|
//_Sdata[0] = Convert.ToByte(10003 & 255); //帧头
|
|
//_Sdata[1] = Convert.ToByte((10003 >> 8) & 255);
|
|
//_Sdata[2] = Convert.ToByte((10003 >> 16) & 255);
|
|
//_Sdata[3] = Convert.ToByte((10003 >> 24) & 255);
|
|
//_Sdata[4] = Convert.ToByte(Fid & 255);//管理任务号
|
|
//_Sdata[5] = Convert.ToByte((Fid >> 8) & 255);
|
|
//_Sdata[6] = Convert.ToByte((Fid >> 16) & 255);
|
|
//_Sdata[7] = Convert.ToByte((Fid >> 24) & 255);
|
|
//_Sdata[8] = Convert.ToByte(TaskIndex & 255);//监控任务号
|
|
//_Sdata[9] = Convert.ToByte((TaskIndex >> 8) & 255);
|
|
//_Sdata[10] = Convert.ToByte((TaskIndex >> 16) & 255);
|
|
//_Sdata[11] = Convert.ToByte((TaskIndex >> 24) & 255);
|
|
//_Sdata[12] = Convert.ToByte(65535 & 255);//任务类型
|
|
//_Sdata[13] = Convert.ToByte((65535 >> 8) & 255);
|
|
//_Sdata[14] = Convert.ToByte((65535 >> 16) & 255);
|
|
//_Sdata[15] = Convert.ToByte((65535 >> 24) & 255);
|
|
//// 产品类型65535 AGV新加字段 20150115
|
|
//_Sdata[16] = Convert.ToByte(65535 & 255);
|
|
//_Sdata[17] = Convert.ToByte((65535 >> 8) & 255);
|
|
//_Sdata[18] = Convert.ToByte((65535 >> 16) & 255);
|
|
//_Sdata[19] = Convert.ToByte((65535 >> 24) & 255);
|
|
//// 产品类型
|
|
//_Sdata[20] = 2;//优先级
|
|
//_Sdata[21] = 0;
|
|
//_Sdata[22] = 0;
|
|
//_Sdata[23] = 0;
|
|
//_Sdata[24] = Convert.ToByte(65535 & 255);//车辆类型
|
|
//_Sdata[25] = Convert.ToByte((65535 >> 8) & 255);
|
|
//_Sdata[26] = Convert.ToByte((65535 >> 16) & 255);
|
|
//_Sdata[27] = Convert.ToByte((65535 >> 24) & 255);
|
|
//_Sdata[28] = Convert.ToByte(65535 & 255);//车辆编号
|
|
//_Sdata[29] = Convert.ToByte((65535 >> 8) & 255);
|
|
//_Sdata[30] = Convert.ToByte((65535 >> 16) & 255);
|
|
//_Sdata[31] = Convert.ToByte((65535 >> 24) & 255);
|
|
//_Sdata[32] = Convert.ToByte(HaveNextTask & 255);//后续任务标识
|
|
//_Sdata[33] = Convert.ToByte((HaveNextTask >> 8) & 255);
|
|
//_Sdata[34] = Convert.ToByte((HaveNextTask >> 16) & 255);
|
|
//_Sdata[35] = Convert.ToByte((HaveNextTask >> 24) & 255);
|
|
//_Sdata[36] = 1;//节点数量
|
|
//_Sdata[37] = 0;
|
|
//_Sdata[38] = 0;
|
|
//_Sdata[39] = 0;
|
|
//_Sdata[40] = Convert.ToByte(AGVAddress & 255);//节点号
|
|
//_Sdata[41] = Convert.ToByte((AGVAddress >> 8) & 255);
|
|
//_Sdata[42] = Convert.ToByte((AGVAddress >> 16) & 255);
|
|
//_Sdata[43] = Convert.ToByte((AGVAddress >> 24) & 255);
|
|
//_Sdata[44] = Convert.ToByte(Order & 255);//动作设备编号
|
|
//_Sdata[45] = Convert.ToByte((Order >> 8) & 255);
|
|
//_Sdata[46] = Convert.ToByte((Order >> 16) & 255);
|
|
//_Sdata[47] = Convert.ToByte((Order >> 24) & 255);
|
|
//ck = Convert.ToInt32(10003 + Fid + TaskIndex + 65535 + 65535 + 2 + 65535 + 65535 + HaveNextTask + 1 + AGVAddress + Order);
|
|
//_Sdata[48] = Convert.ToByte(ck & 255);//校验码(以上所有任务码按无符号作加法)
|
|
//_Sdata[49] = Convert.ToByte((ck >> 8) & 255);
|
|
//_Sdata[50] = Convert.ToByte((ck >> 16) & 255);
|
|
//_Sdata[51] = Convert.ToByte((ck >> 24) & 255);
|
|
//writeDark(Fid, TaskIndex, DeviceIndex, dorder, AGVAddress);
|
|
|
|
|
|
|
|
|
|
_Sdata = new byte[28];
|
|
|
|
_Sdata[0] = Convert.ToByte(10003 & 255); //帧头
|
|
_Sdata[1] = Convert.ToByte((10003 >> 8) & 255);
|
|
|
|
_Sdata[2] = Convert.ToByte(Fid & 255);//管理任务号 订单号
|
|
_Sdata[3] = Convert.ToByte((Fid >> 8) & 255);
|
|
_Sdata[4] = Convert.ToByte((Fid >> 16) & 255);
|
|
_Sdata[5] = Convert.ToByte((Fid >> 24) & 255);
|
|
|
|
_Sdata[6] = Convert.ToByte(TaskIndex & 255);//调度任务号 订单步号
|
|
_Sdata[7] = Convert.ToByte((TaskIndex >> 8) & 255);
|
|
|
|
_Sdata[8] = Convert.ToByte(65535 & 255);//任务类型
|
|
_Sdata[9] = Convert.ToByte((65535 >> 8) & 255);
|
|
|
|
if (EndX < 19000)//输送机编号小于19000
|
|
{
|
|
_Sdata[10] = 1;//产品类型,输送机1,地面2
|
|
_Sdata[11] = 0;
|
|
}
|
|
else
|
|
{
|
|
|
|
_Sdata[10] = 2;//产品类型,输送机1,地面2
|
|
_Sdata[11] = 0;
|
|
}
|
|
|
|
|
|
_Sdata[12] = 2;//优先级
|
|
_Sdata[13] = 0;
|
|
|
|
_Sdata[14] = goodsID;//车辆类型 -- 传入货物类型bba 13\14时空托盘
|
|
_Sdata[15] = 0;
|
|
|
|
_Sdata[16] = 0;//车辆编号
|
|
_Sdata[17] = 0;
|
|
|
|
_Sdata[18] = Convert.ToByte(HaveNextTask & 255);//后续任务标识
|
|
_Sdata[19] = Convert.ToByte((HaveNextTask >> 8) & 255);
|
|
|
|
_Sdata[20] = 2;//参数数量
|
|
_Sdata[21] = 0;
|
|
|
|
//DataView AGVSHPosition = new DataView();
|
|
//sql.Remove(0, sql.Length);
|
|
//sql.Append("SELECT F_Address FROM T_Base_AGV_Gate WHERE F_AGVGateDeviceIndex = ").Append(AGVAddress);
|
|
//AGVSHPosition = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
|
|
//int AGVSIASUNSH = Convert.ToInt32(AGVSHPosition[0]["F_Address"]);
|
|
//给AGV转换得站台
|
|
//_Sdata[22] = Convert.ToByte(AGVSIASUNSH & 255);//取货节点号
|
|
//_Sdata[23] = Convert.ToByte((AGVSIASUNSH >> 8) & 255);
|
|
////记录黑匣子
|
|
//writeDark(3, AGVSIASUNSH, DeviceIndex);
|
|
_Sdata[22] = Convert.ToByte(AGVAddress & 255);//取货节点号
|
|
_Sdata[23] = Convert.ToByte((AGVAddress >> 8) & 255);
|
|
//AGV送货送一个11 送两个12
|
|
//Controlcode = ControlCode(TaskIndex, Order, AGVAddress);
|
|
//_Sdata[24] = Convert.ToByte(Controlcode & 255);//Convert.ToByte(Order & 255);//设备动作编号,无动作65535 --Convert.ToByte(NextOrder);
|
|
//_Sdata[25] = Convert.ToByte((Controlcode >> 8) & 255); // 高位FF03
|
|
|
|
|
|
|
|
for (int i = 0; i <= 25; i++)
|
|
{
|
|
ck += Convert.ToInt32(_Sdata[i]);
|
|
}
|
|
_Sdata[26] = Convert.ToByte(ck & 255);//校验码(以上所有任务码按无符号作加法)
|
|
_Sdata[27] = Convert.ToByte((ck >> 8) & 255);
|
|
|
|
retvalue = SendData(DeviceIndex, _Sdata);
|
|
|
|
#endregion
|
|
break;
|
|
case 4://搬运入库
|
|
#region 取送货
|
|
//取货
|
|
/*
|
|
GetDeviceInfoFromAGVGate(StartX, ref channelLeft, ref useAwayFork, ref AGVAddress);
|
|
|
|
dorder = 4;
|
|
|
|
if ((Model.CGeneralFunction.MutiForkIfSync(TaskIndex, DeviceIndex, 6) == null) && (AGVAllowSingleFork == "1"))//20100710
|
|
{//不能同步
|
|
|
|
if (useAwayFork == '1')//前叉
|
|
{
|
|
|
|
forkNo = 1;
|
|
}
|
|
else//后叉
|
|
{
|
|
forkNo = 2;
|
|
}
|
|
|
|
}
|
|
else
|
|
{//同步
|
|
forkNo = 3;
|
|
|
|
}
|
|
_Sdata = new byte[32];
|
|
|
|
_Sdata[0] = Convert.ToByte(10003 & 255); //帧头
|
|
_Sdata[1] = Convert.ToByte((10003 >> 8) & 255);
|
|
|
|
_Sdata[2] = Convert.ToByte(Fid & 255);//管理任务号
|
|
_Sdata[3] = Convert.ToByte((Fid >> 8) & 255);
|
|
_Sdata[4] = Convert.ToByte((Fid >> 16) & 255);
|
|
_Sdata[5] = Convert.ToByte((Fid >> 24) & 255);
|
|
|
|
_Sdata[6] = Convert.ToByte(TaskIndex & 255);//调度任务号
|
|
_Sdata[7] = Convert.ToByte((TaskIndex >> 8) & 255);
|
|
|
|
_Sdata[8] = Convert.ToByte(65535 & 255);//任务类型
|
|
_Sdata[9] = Convert.ToByte((65535 >> 8) & 255);
|
|
|
|
if (StartX < 19000)//输送机编号小于19000
|
|
{
|
|
_Sdata[10] = 1;//产品类型,输送机1,地面2
|
|
_Sdata[11] = 0;
|
|
}
|
|
else
|
|
{
|
|
|
|
_Sdata[10] = 2;//产品类型,输送机1,地面2
|
|
_Sdata[11] = 0;
|
|
}
|
|
|
|
|
|
_Sdata[12] = 2;//优先级
|
|
_Sdata[13] = 0;
|
|
|
|
_Sdata[14] = goodsID;//车辆类型 -- 传入货物类型bba 13\14时空托盘
|
|
_Sdata[15] = 0;
|
|
|
|
_Sdata[16] = 0;//车辆编号
|
|
_Sdata[17] = 0;
|
|
|
|
_Sdata[18] =Convert.ToByte(HaveNextTask & 255);//后续任务标识
|
|
_Sdata[19] =Convert.ToByte((HaveNextTask >> 8) & 255);
|
|
|
|
_Sdata[20] = 4;//参数数量
|
|
_Sdata[21] = 0;
|
|
|
|
_Sdata[22] = Convert.ToByte(AGVAddress & 255);//取货节点号
|
|
_Sdata[23] = Convert.ToByte((AGVAddress >> 8) & 255);
|
|
|
|
dorder = 2;
|
|
_Sdata[24] = Convert.ToByte(dorder & 255);//Convert.ToByte(Order & 255);//设备动作编号,无动作65535 --Convert.ToByte(NextOrder);
|
|
_Sdata[25] = Convert.ToByte((dorder >> 8) & 255); // 高位FF03
|
|
|
|
GetDeviceInfoFromAGVGate(EndX, ref channelLeft, ref useAwayFork, ref AGVAddress);
|
|
|
|
_Sdata[26] = Convert.ToByte(AGVAddress & 255);//送货节点号
|
|
_Sdata[27] = Convert.ToByte((AGVAddress >> 8) & 255);
|
|
|
|
dorder = 3;
|
|
_Sdata[28] = Convert.ToByte(dorder & 255);//Convert.ToByte(Order & 255);//设备动作编号,无动作65535 --Convert.ToByte(NextOrder);
|
|
_Sdata[29] = Convert.ToByte((dorder >> 8) & 255); //
|
|
|
|
for (int i = 0; i <= 29; i++)
|
|
{
|
|
ck += Convert.ToInt32(_Sdata[i]);
|
|
}
|
|
_Sdata[30] = Convert.ToByte(ck & 255);//校验码(以上所有任务码按无符号作加法)
|
|
_Sdata[31] = Convert.ToByte((ck >> 8) & 255);
|
|
|
|
retvalue= SendData(DeviceIndex, _Sdata);
|
|
*/
|
|
#endregion
|
|
|
|
_Sdatastr = string.Format("@{0};{1};{2};{3}!", 4, StartX, TaskIndex, EndX);//起始符 功能码 设备编号 任务号 目标设备编号 终止符
|
|
_Sdata = System.Text.Encoding.ASCII.GetBytes(_Sdatastr);
|
|
retvalue = SendData(DeviceIndex, _Sdata);
|
|
break;
|
|
//case 5://允许AGV移载,使用起始坐标作为允许AGV移载的坐标设备
|
|
// #region 允许AGV移载
|
|
|
|
// GetDeviceInfoFromAGVGate(StartX, ref channelLeft, ref useAwayFork, ref AGVAddress);
|
|
// //获得实际取货或者送货任务号F_AGVNextTask
|
|
// object ob = dbo.GetSingle("select F_AGVNextTask from T_Monitor_Task where F_MonitorIndex=" + TaskIndex);
|
|
// if (ob != null)
|
|
// {
|
|
// TaskIndex = Convert.ToInt32(ob);
|
|
// }
|
|
// _Sdata = new byte[12];
|
|
// _Sdata[0] = Convert.ToByte(60005 & 255); //帧头
|
|
// _Sdata[1] = Convert.ToByte(60005 >> 8);
|
|
// _Sdata[2] = Convert.ToByte(Fid & 255);//管理任务号
|
|
// _Sdata[3] = Convert.ToByte(Fid >> 8);
|
|
// _Sdata[4] = Convert.ToByte(TaskIndex & 255);//监控任务号
|
|
// _Sdata[5] = Convert.ToByte(TaskIndex >> 8);
|
|
// _Sdata[6] = Convert.ToByte(AGVAddress & 255);//节点
|
|
// _Sdata[7] = Convert.ToByte(AGVAddress >> 8);
|
|
// _Sdata[8] = Convert.ToByte(forkNo & 255);//动作设备编号
|
|
// _Sdata[9] = Convert.ToByte(forkNo >> 8);
|
|
// _Sdata[10] =Convert.ToByte(dorder & 255);//动作类型
|
|
// _Sdata[11] =Convert.ToByte(dorder >> 8);
|
|
|
|
// return SendData(DeviceIndex, _Sdata);
|
|
|
|
// #endregion
|
|
case 6://通知进入包装线
|
|
//获得数量信息
|
|
int Outcounts = 1;//出库任务数量,管理系统下达绿色通道的出库数量,或是立库出库数量
|
|
int startdevice = Convert.ToInt32(StartX.ToString().Substring(0, 5));//20160419出库升降站台的处理
|
|
if (startdevice == 12008)//绿色通道
|
|
{
|
|
Outcounts = GetGoodsCountFromManageTask(TaskIndex);
|
|
}
|
|
else//出库站台
|
|
{
|
|
Dictionary<int, string[]> rr = Model.CGeneralFunction.GetDoubleForkMonitorInfo(TaskIndex, DeviceIndex);
|
|
if (rr != null)
|
|
{
|
|
Outcounts = rr.Count;
|
|
}
|
|
}
|
|
_Sdatastr = string.Format("@{0};{1};{2};{3};{4}!", 6, startdevice, TaskIndex, EndX, Outcounts);//起始符 功能码 设备编号 任务号 目标设备编号 货物数量 终止符
|
|
_Sdata = System.Text.Encoding.ASCII.GetBytes(_Sdatastr);
|
|
retvalue = SendData(DeviceIndex, _Sdata);
|
|
break;
|
|
case 8://通知包装线对应的出库计划
|
|
//获得数量信息
|
|
int Plancounts = 1;//出库任务数量,管理系统下达绿色通道的出库数量,或是立库出库数量
|
|
string goodstype = "HAVE NO";
|
|
Plancounts = GetGoodsCountFromManageTask(TaskIndex);
|
|
goodstype = GetGoodsTypeFromManageTask(TaskIndex);
|
|
_Sdatastr = string.Format("@{0};{1};{2};{3};{4}!", 8, StartX, TaskIndex, Plancounts, goodstype.Trim());//起始符 功能码 设备编号 任务号 计划数量 类型编号 终止符
|
|
|
|
|
|
_Sdata = System.Text.Encoding.ASCII.GetBytes(_Sdatastr);
|
|
retvalue = SendData(DeviceIndex, _Sdata);
|
|
break;
|
|
case 10://通知出库申请结果
|
|
//获得数量信息
|
|
|
|
int flag = 1;
|
|
|
|
flag = GetControl_FlagFromManageTask(TaskIndex);
|
|
|
|
_Sdatastr = string.Format("@{0};{1};{2};{3}!", 10, StartX, TaskIndex, flag);//起始符 功能码 设备编号 任务号 申请结果 终止符
|
|
|
|
_Sdata = System.Text.Encoding.ASCII.GetBytes(_Sdatastr);
|
|
retvalue = SendData(DeviceIndex, _Sdata);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
|
|
return retvalue;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_commLayerError = this.ToString() + ":SendDeviceOrder---" + ex.Message;
|
|
return false;
|
|
}
|
|
finally
|
|
{
|
|
if (retvalue == true)
|
|
{
|
|
writeDark(Fid, TaskIndex, DeviceIndex, dorder, AGVAddress, Controlcode);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
// 从管理任务号得到物料类型,发送给AGV;物料类型管理下达任务时候在'GOODS_TEMPLATE_ID'字段,调度保存在 FREMARK 字段
|
|
public byte GetGoodsIDfromManage(int fid)
|
|
{
|
|
DataView dv;
|
|
try
|
|
{
|
|
sql.Remove(0, sql.Length);
|
|
sql.Append("SELECT GOODS_TEMPLATE_ID FROM T_MANAGE_TASK WHERE FID = ").Append(fid);
|
|
dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
|
|
if (dv.Count > 0)
|
|
{
|
|
if (dv[0][0] == DBNull.Value)
|
|
{
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
return Convert.ToByte(dv[0][0]);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
throw ex;
|
|
}
|
|
finally
|
|
{
|
|
dv = null;
|
|
}
|
|
}
|
|
//思锐新加Controlcode
|
|
public void writeDark(int Fid, int TaskIndex, int DeviceIndex, int dorder, int AGVAddress, byte Controlcode)
|
|
{
|
|
|
|
string barcode = string.Empty;
|
|
StringBuilder sss = new StringBuilder("");
|
|
sss.Remove(0, sss.Length);
|
|
sss.Append("SELECT F_TxtParam FROM T_Monitor_Task WHERE (F_MonitorIndex = ").Append(TaskIndex).Append(")");
|
|
DataView dvb = dbo.ExceSQL(sss.ToString()).Tables[0].DefaultView;
|
|
if (dvb.Count > 0)
|
|
{
|
|
barcode = dvb[0]["F_TxtParam"].ToString();
|
|
}
|
|
else
|
|
{
|
|
barcode = "-";
|
|
}
|
|
sss.Remove(0, sss.Length);
|
|
sss.Append("条码:").Append(barcode).Append("**写标志10003").Append("**管理任务:" + Fid.ToString()).Append("**设备指令索引:" + TaskIndex.ToString())
|
|
.Append("**命令字" + dorder.ToString()).Append("**位置" + AGVAddress.ToString()).Append("**AGV操作码" + Controlcode.ToString());
|
|
|
|
CommonClassLib.CCarryConvert.WriteDarkCasket(this.ToString(), "发送AGV指令", DeviceIndex.ToString(), sss.ToString());
|
|
|
|
}
|
|
//记录AGV转换后的去送货站台
|
|
public void writeDark(int Order,int zh,int DeviceIndex)
|
|
{
|
|
|
|
string barcode = string.Empty;
|
|
StringBuilder sss = new StringBuilder("");
|
|
sss.Remove(0, sss.Length);
|
|
DataView dvb = dbo.ExceSQL(sss.ToString()).Tables[0].DefaultView;
|
|
if (Order == 2)
|
|
{
|
|
sss.Remove(0, sss.Length);
|
|
sss.Append("**命令字" + Order.ToString()).Append("**AGV取货位置" + zh.ToString());
|
|
CommonClassLib.CCarryConvert.WriteDarkCasket(this.ToString(), "发送AGV指令", DeviceIndex.ToString(), sss.ToString());
|
|
}
|
|
else
|
|
{
|
|
sss.Remove(0, sss.Length);
|
|
sss.Append("**命令字" + Order.ToString()).Append("**AGV送货位置" + zh.ToString());
|
|
CommonClassLib.CCarryConvert.WriteDarkCasket(this.ToString(), "发送AGV指令", DeviceIndex.ToString(), sss.ToString());
|
|
}
|
|
|
|
|
|
}
|
|
/// <summary>
|
|
/// 发送AGV命令
|
|
/// </summary>
|
|
/// <param name="MessageIndex">消息编号</param>
|
|
/// <param name="TaskIndex">任务编号</param>
|
|
/// <param name="Order">AGV命令字 61:MAN通知LC通讯连接建立;62MAN通知LC通讯连接断开</param>
|
|
/// <param name="DeviceIndex">设备编号</param>
|
|
/// <returns>发送AGV设备命令是否成功</returns>
|
|
public bool SendDeviceOrder(int MessageIndex, int TaskIndex, int Order, int DeviceIndex, int ArrowDeviceIndex)
|
|
{
|
|
Model.MDevice devinfo = Model.CGetInfo.GetDeviceInfo(DeviceIndex);
|
|
try
|
|
{
|
|
byte[] _Sdata = new byte[2];
|
|
_Sdata[0] = Convert.ToByte(Order);
|
|
_Sdata[1] = 0;
|
|
_Sdata[2] = Convert.ToByte(TaskIndex & 255);//低八位
|
|
_Sdata[3] = Convert.ToByte(TaskIndex >> 8);//高八位
|
|
|
|
//根据DeviceIndex,得到Sockets通讯的初始设置
|
|
|
|
|
|
|
|
if (devinfo == null)
|
|
{
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
|
|
CClientTCPIP.Send(devinfo.RemoteIP, devinfo.RemotePort, _Sdata);
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_commLayerError = this.ToString() + ":SendDeviceOrder---" + ex.Message;
|
|
return false;
|
|
}
|
|
finally
|
|
{
|
|
devinfo = null;
|
|
}
|
|
|
|
}
|
|
/// <summary>
|
|
/// 上位机给下位机发送烟箱按品牌码分道信息共15字节,有数据时写入实际数据,否则全部写零
|
|
/// </summary>
|
|
/// <param name="DeviceIndex">码垛位设备号索引</param>
|
|
/// <param name="TobaccoCode">第1--13字节,烟箱码</param>
|
|
/// <param name="HaveFirstProjectCode">第14字节,1-有一号工程码,0-无一号工程码</param>
|
|
/// <param name="IfSmallTobacco">第15字节,1-小烟箱,0-正常烟箱</param>
|
|
/// <returns></returns>
|
|
public bool SendDeviceOrder(int DeviceIndex, string TobaccoCode, bool HaveFirstProjectCode, bool IfSmallTobacco, int Count)
|
|
{
|
|
return true;
|
|
}
|
|
bool SendData(int devID, byte[] _Sdata)
|
|
{
|
|
//根据DeviceIndex,得到Sockets通讯的初始设置
|
|
Model.MDevice devinfo = Model.CGetInfo.GetDeviceInfo(devID);
|
|
try
|
|
{
|
|
if (devinfo == null)
|
|
{
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
|
|
if (CClientTCPIP.Send(devinfo.RemoteIP, devinfo.RemotePort, _Sdata) == false)
|
|
{
|
|
if (CClientTCPIP.TcpError != null) _commLayerError = CClientTCPIP.TcpError;
|
|
return false;
|
|
}
|
|
return true;
|
|
|
|
}
|
|
}
|
|
finally
|
|
{
|
|
devinfo = null;
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// 向PLC的DB区写入数据
|
|
/// </summary>
|
|
/// <param name="ItemNames">标签变量名称数组</param>
|
|
/// <param name="ItemValues">标签值数组</param>
|
|
/// <returns></returns>
|
|
public bool WriteDBData(StringBuilder[] ItemNames, StringBuilder[] ItemValues)
|
|
{
|
|
return true;
|
|
}
|
|
public bool WriteDBData(StringBuilder[] ItemNames, StringBuilder[] ItemValues, string PLCconnectionID)
|
|
{
|
|
return true;
|
|
}
|
|
void GetDeviceInfoFromAGVGate(int agvGateDevice, ref char channelLeft, ref char useAwayFork, ref int AGVAddress)
|
|
{
|
|
DataView dv;
|
|
try
|
|
{
|
|
sql.Remove(0, sql.Length);
|
|
sql.Append("SELECT F_Address,F_IfChannelLeft,F_UseAwayFork FROM T_Base_AGV_Gate WHERE (F_AGVGateDeviceIndex = ").Append(agvGateDevice).Append(")");
|
|
dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
|
|
if (dv.Count > 0)
|
|
{
|
|
channelLeft = Convert.ToChar(dv[0]["F_IfChannelLeft"]);
|
|
useAwayFork = Convert.ToChar(dv[0]["F_UseAwayFork"]);
|
|
// AGVAddress = Convert.ToChar(dv[0]["F_Address"]);
|
|
AGVAddress = Convert.ToInt32(dv[0]["F_Address"]);
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
throw ex;
|
|
}
|
|
finally
|
|
{
|
|
dv = null;
|
|
}
|
|
}
|
|
int GetAGVNoFromMonitor(int taskIndex)
|
|
{
|
|
|
|
DataView dv;
|
|
try
|
|
{
|
|
sql.Remove(0, sql.Length);
|
|
sql.Append("SELECT F_AgvNo FROM T_Monitor_Task WHERE (F_MonitorIndex = ").Append(taskIndex).Append(") and (F_AgvNo is not null)");
|
|
dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
|
|
if (dv.Count > 0)
|
|
{
|
|
return Convert.ToInt32(dv[0][0]);
|
|
}
|
|
else
|
|
{
|
|
return 65535;
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
throw ex;
|
|
}
|
|
finally
|
|
{
|
|
dv = null;
|
|
}
|
|
}
|
|
int GetAGVTaskFromMonitor(int taskIndex)
|
|
{
|
|
|
|
DataView dv;
|
|
try
|
|
{
|
|
sql.Remove(0, sql.Length);
|
|
sql.Append("SELECT F_AgvTask FROM T_Monitor_Task WHERE (F_MonitorIndex = ").Append(taskIndex).Append(") and (F_AgvTask is not null)");
|
|
dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
|
|
if (dv.Count > 0)
|
|
{
|
|
return Convert.ToInt32(dv[0][0]);
|
|
}
|
|
else
|
|
{
|
|
return 65535;
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
throw ex;
|
|
}
|
|
finally
|
|
{
|
|
dv = null;
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// 是否有后续任务:1,有;0,无
|
|
/// <summary>
|
|
/// <param name="taskindex"></param>
|
|
/// <returns></returns>
|
|
int IfHaveNextTask(int taskindex, int deviceindex, ref int NextOrder)
|
|
{
|
|
int mankind = Model.CGeneralFunction.GetManageTaskKindIndexFromMonitor(taskindex);
|
|
int fid = Model.CGeneralFunction.GetManageTaskIndexfromMonitor(taskindex);
|
|
sql.Remove(0, sql.Length);
|
|
//从monitor 表里查 F_MonitorIndex 和 F_DEVICECOMMANDINDEX 这俩字段 条件是
|
|
sql.Append("SELECT F_MonitorIndex, F_DEVICECOMMANDINDEX FROM T_Monitor_Task WHERE ( F_DeviceCommandIndex <> 5 ) AND (F_DeviceIndex = ").Append(deviceindex).Append(") AND (F_MonitorIndex <> ").Append(taskindex).Append(") AND F_ManageTaskIndex = ").Append(fid).Append(" AND F_ManageTASKKINDINDEX=").Append(mankind).Append(" ORDER BY F_MonitorIndex asc");
|
|
DataView dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
|
|
if (dv.Count > 0)
|
|
{
|
|
NextOrder = Convert.ToInt32(dv[0]["F_DEVICECOMMANDINDEX"]);
|
|
dv = null;
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
dv = null;
|
|
return 0;
|
|
}
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// AGV双工位车取货 取1个货 发 1 取2个货取2 11代表送一个货,12代表送两个货
|
|
/// 操作码 数据库中新建了一个 T_Base_DoubleAGVPositon 表 存的是双叉AGV的取送货站台
|
|
/// <summary>
|
|
/// <param name="taskindex"></param>
|
|
/// <returns></returns>
|
|
public byte ControlCode(int taskindex, int Order,int AGVAddress)
|
|
{
|
|
int flag = 0;
|
|
int FAGVAddress = 0;
|
|
int mankind = Model.CGeneralFunction.GetManageTaskKindIndexFromMonitor(taskindex);
|
|
int fid = Model.CGeneralFunction.GetManageTaskIndexfromMonitor(taskindex);
|
|
//获取关联任务ID
|
|
int F_GOODMatchID = Model.CGeneralFunction.GetGoodMatchID(fid);
|
|
//获取关联任务的管理任务号
|
|
int MatchID = Model.CGeneralFunction.GetGoodMatchIDFid(fid, F_GOODMatchID);
|
|
|
|
//任务标识 写1 取1个盘 写2 取两个盘
|
|
/*
|
|
* 先判断是不是关联任务(不是返回1)
|
|
* 是: 判断AGVAddress 是不是 双工位AGV 的取送货站台
|
|
* 是: 查MAnage表关联任务号 是不是能查出两条大任务 能 去俩盘
|
|
* 查不出取1个
|
|
*
|
|
* **/
|
|
sql.Remove(0, sql.Length);
|
|
//sql.Append("SELECT * FROM T_Base_DoubleAGVPositon WHERE ( F_DeviceCommandIndex <> 5 ) AND (F_DeviceIndex = ").Append(deviceindex).Append(") AND (F_MonitorIndex <> ").Append(taskindex).Append(") AND F_ManageTaskIndex = ").Append(fid).Append(" AND F_ManageTASKKINDINDEX=").Append(mankind).Append(" ORDER BY F_MonitorIndex asc");
|
|
sql.Append("SELECT F_DoubleAGVGate FROM T_Base_DoubleAGVPositon ");
|
|
DataView dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
|
|
|
|
|
|
if (MatchID != -1)
|
|
{
|
|
//F_DoubleAGVGate
|
|
for (int i = 0; i < dv.Count; i++)
|
|
{
|
|
//此任务的送货站台
|
|
FAGVAddress = Convert.ToInt32(dv[i]["F_DoubleAGVGate"]);
|
|
if ( AGVAddress == FAGVAddress )
|
|
{
|
|
flag = 1;
|
|
break;
|
|
}
|
|
|
|
}
|
|
if ( flag == 1 )
|
|
{
|
|
if (Order == 2)
|
|
{
|
|
dv = null;
|
|
return 2;
|
|
}
|
|
else
|
|
{
|
|
dv = null;
|
|
return 12;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (Order == 2)
|
|
{
|
|
dv = null;
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
dv = null;
|
|
return 11;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (Order == 2)
|
|
{
|
|
dv = null;
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
dv = null;
|
|
return 11;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// 根据fid、设备id 和 AGV命令 返回对应的任务号
|
|
/// <summary>
|
|
int GetTaskFromDeviceOrder(int fid, int deviceIndx, int Order)
|
|
{
|
|
DataView dv;
|
|
try
|
|
{
|
|
sql.Remove(0, sql.Length);
|
|
sql.Append(string.Format("select F_MonitorIndex from t_monitor_task where F_ManageTaskindex = {0} and F_DeviceIndex = {1} and F_DeviceCommandIndex = {2} order by F_MonitorIndex", fid, deviceIndx, Order));
|
|
dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
|
|
if (dv.Count > 0)
|
|
{
|
|
return Convert.ToInt32(dv[0][0]);
|
|
}
|
|
else
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
throw ex;
|
|
}
|
|
finally
|
|
{
|
|
dv = null;
|
|
}
|
|
}
|
|
//获得出库数量信息
|
|
public int GetGoodsCountFromManageTask(int TaskIndex)//20130107
|
|
{
|
|
//20100108
|
|
string sql;
|
|
int type = 0;
|
|
try
|
|
{
|
|
int mti = Model.CGeneralFunction.GetManageTaskKindIndexFromMonitor(TaskIndex);
|
|
int fid = Model.CGeneralFunction.GetManageTaskIndexfromMonitor(TaskIndex);
|
|
//20100108
|
|
sql = string.Format("SELECT GOODS_COUNT FROM T_Manage_Task WHERE (FID = {0}) AND (F_ManageTaskKindIndex ={1})", fid, mti);
|
|
object ob = dbo.GetSingle(sql);
|
|
if (ob != null)
|
|
{
|
|
type = Convert.ToInt32(ob);
|
|
}
|
|
|
|
return type;
|
|
|
|
}
|
|
catch (Exception ex)
|
|
{//20100108
|
|
_commLayerError = "OPCClient.CSendDeviceOrder.GetGoodsCountFromManageTask时发生错误:" + ex.Message;
|
|
return 0;
|
|
}
|
|
finally
|
|
{//20100108
|
|
sql = null;
|
|
}
|
|
}
|
|
//获得申请任务的结果
|
|
public int GetControl_FlagFromManageTask(int TaskIndex)//20130107
|
|
{
|
|
//20100108
|
|
string sql;
|
|
int type = 0;
|
|
try
|
|
{
|
|
int mti = Model.CGeneralFunction.GetManageTaskKindIndexFromMonitor(TaskIndex);
|
|
int fid = Model.CGeneralFunction.GetManageTaskIndexfromMonitor(TaskIndex);
|
|
//20100108
|
|
sql = string.Format("SELECT CONTROL_FLAG FROM T_Manage_Task WHERE (FID = {0}) AND (F_ManageTaskKindIndex ={1})", fid, mti);
|
|
object ob = dbo.GetSingle(sql);
|
|
if (ob != null)
|
|
{
|
|
type = Convert.ToInt32(ob);
|
|
}
|
|
|
|
return type;
|
|
|
|
}
|
|
catch (Exception ex)
|
|
{//20100108
|
|
_commLayerError = "OPCClient.CSendDeviceOrder.GetControl_FlagFromManageTask时发生错误:" + ex.Message;
|
|
return 0;
|
|
}
|
|
finally
|
|
{//20100108
|
|
sql = null;
|
|
}
|
|
}
|
|
//获得出库任务对应的物料中型号
|
|
public string GetGoodsTypeFromManageTask(int TaskIndex)//20130107
|
|
{
|
|
//20100108
|
|
string sql;
|
|
string type = "HAVE NO";
|
|
try
|
|
{
|
|
int mti = Model.CGeneralFunction.GetManageTaskKindIndexFromMonitor(TaskIndex);
|
|
int fid = Model.CGeneralFunction.GetManageTaskIndexfromMonitor(TaskIndex);
|
|
//20100108
|
|
sql = string.Format("SELECT GOODS_PATTERN_CODE FROM T_Manage_Task WHERE (FID = {0}) AND (F_ManageTaskKindIndex ={1})", fid, mti);
|
|
object ob = dbo.GetSingle(sql);
|
|
if (ob != null)
|
|
{
|
|
type = Convert.ToString(ob);
|
|
}
|
|
|
|
return type;
|
|
|
|
}
|
|
catch (Exception ex)
|
|
{//20100108
|
|
_commLayerError = "OPCClient.CSendDeviceOrder.GetGoodsTypeFromManageTask时发生错误:" + ex.Message;
|
|
return type;
|
|
}
|
|
finally
|
|
{//20100108
|
|
sql = null;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|