using System;
using System.Collections.Generic;
using System.Text;
using ICommLayer;
using DBFactory;
using System.Data;
using Microsoft.VisualBasic;
namespace SimensProdave6
{
public class CSendDeviceOrder:ISendDeviceOrder
{
string _commLayerError;
public string CommLayerError
{
get { return _commLayerError; }
set { _commLayerError = value; }
}
DBOperator dbo = CSimensProdave6_S7.dbo;
public CSendDeviceOrder()
{
dbo.Open();
}
///
/// 发送堆垛机命令
///
/// 消息编号
/// 任务编号
/// 堆垛机命令字
///1-复位
///2-将取
///3-将送
///4-取货
///5-放货
///6-取放货
/// 设备编号
/// 起始x坐标,排-沿轨道方向
/// 起始y坐标,层-高度方向
/// 起始z坐标,列-面向堆垛机操作面板,1-左侧,2-右侧
/// 目标x坐标,列-沿轨道方向
/// 目标y坐标,层-高度方向
/// 目标z坐标,排-面向堆垛机操作面板,1-左侧,2-右侧
/// 发送堆垛机命令是否成功
public bool SendDeviceOrder(int MessageIndex, int TaskIndex, int Order, int DeviceIndex, int StartX, int StartY, int StartZ, int EndX, int EndY, int EndZ)
{
try
{
int sn = 0;
Model.MDevice devinfo = Model.CGetInfo.GetDeviceInfo(DeviceIndex);
//DataView dv = dbo.ExceSQL("SELECT F_DBW1Address,F_DBWSendLength,F_DeviceIndex,F_DeviceKindIndex,F_OPCProgID, F_RemoteIP FROM T_Base_Device where F_DeviceIndex=" + DeviceIndex).Tables[0].DefaultView;
if (devinfo.DeviceIndex == 0)
{
_commLayerError = "SimensProdave6.CSendDeviceOrder.SendDeviceOrder发生错误:在设备表中没找到设备所引!";
return false;
}
else
{
if ((devinfo.DeviceKind.ToString() != "1") )
{//堆垛机使用此方法
_commLayerError = "SimensProdave6.CSendDeviceOrder.SendDeviceOrder发生错误:堆垛机和RGV以外的设备使用此方法不正确!";
return false;
}
#region 堆垛机
if (devinfo.DeviceKind.ToString() == "1")
{
byte[] wdata = new byte[10];
sn = Convert.ToInt32(devinfo.Dbw1Address);
wdata[0] =(byte) MessageIndex;
wdata[1] = (byte)Order;
wdata[2] = (byte)(TaskIndex>>8);
wdata[3] = (byte)(TaskIndex & 255);
if (MessageIndex == 1)
{
wdata[4] = (byte)(StartX + 1);
}
else
{
wdata[4] = (byte)StartX;
}
wdata[5] = (byte)StartY;
wdata[6] = (byte)StartZ;
if (MessageIndex == 1)
{
wdata[7] = (byte)(EndX + 1);
}
else
{
wdata[7] = (byte)EndX;
}
//wdata[7] = (byte)EndX;
wdata[8] = (byte)EndY;
wdata[9] = (byte)EndZ;
if (CSimensProdave6_S7.DB_Write_Prodave(0, 1, Convert.ToUInt16(sn), Convert.ToUInt32(devinfo.Dbw1SendLength), wdata) == false)
{
_commLayerError = "SimensProdave6.CSendDeviceOrder.SendDeviceOrder发生错误:" + CSimensProdave6_S7.ErrorsText;
return false;
}
if (WriteBarcode(DeviceIndex, TaskIndex) == false)
{
return false;
}
}
#endregion
}
return true;
}
catch (Exception ex)
{
_commLayerError = "SimensProdave6.CSendDeviceOrder.SendDeviceOrder发生错误:" + ex.Message;
return false;
}
}
///
/// 发送穿梭车、输送机设备命令
///
/// 消息编号
/// 任务编号
/// 命令字
/// 穿梭车命令字:
///1-复位
///2-左接货
///3-左送货
///4-右接货
///5-右送货
///6-停止
///7-运动(运动到第4、5字节指定的目标设备所引)
///输送机命令字:
///1-入库(朝向库)
///2-出库(背向库)
///3-送货
///4-接货
///5-停止
/// 设备编号
///对于输送机、穿梭车代表目标设备所引,
/// 0-代表单一设备控制,无目标设备所引;1…65535代表目标设备所引(终点输送机的设备所引)
/// 发送穿梭车、输送机设备命令是否成功
public bool SendDeviceOrder(int MessageIndex, int TaskIndex, int Order, int DeviceIndex, int ArrowDeviceIndex)
{
try
{
string[] itemnames = new string[4];
string[] itemvalues = new string[4];
int sn = 0;
Model.MDevice devinfo = Model.CGetInfo.GetDeviceInfo(DeviceIndex);
//DataView dv = dbo.ExceSQL("SELECT F_DBW1Address,F_DBWSendLength,F_DeviceIndex,F_DeviceKindIndex,F_OPCProgID, F_RemoteIP FROM T_Base_Device where F_DeviceIndex=" + DeviceIndex).Tables[0].DefaultView;
if (devinfo.DeviceIndex == 0)
{
_commLayerError = "SimensProdave6.CSendDeviceOrder.SendDeviceOrder发生错误:设备索引不存在!";
return false;
}
else
{
if (devinfo.DeviceKind.ToString() == "7")
{
return true;
}
if ((devinfo.DeviceKind.ToString() == "1") )
{//堆垛机不允许使用此方法
_commLayerError = "SimensProdave6.CSendDeviceOrder.SendDeviceOrder发生错误:堆垛机和RGV不允许使用此方法!";
return false;
}
byte[] wdata = new byte[6];
sn = Convert.ToInt32(devinfo.Dbw1Address);
wdata[0] = (byte)MessageIndex;
wdata[1] = (byte)Order;
wdata[2] = (byte)(TaskIndex >> 8);
wdata[3] = (byte)(TaskIndex & 255);
wdata[4] = (byte)(ArrowDeviceIndex >> 8);
wdata[5] = (byte)(ArrowDeviceIndex & 255);
if (CSimensProdave6_S7.DB_Write_Prodave(0, 1, Convert.ToUInt16(sn), Convert.ToUInt32(devinfo.Dbw1SendLength), wdata) == false)
{
_commLayerError = "SimensProdave6.CSendDeviceOrder.SendDeviceOrder发生错误:" + CSimensProdave6_S7.ErrorsText;
return false;
}
byte[] www = new byte[6];
Array.Copy(wdata, www, 6);
CommonClassLib.CCarryConvert.WriteDarkCasket("SimensProdave6", "SendDeviceOrder", DeviceIndex.ToString(), www);
if (WriteBarcode(DeviceIndex, TaskIndex) == false)
{
return false;
}
}
return true;
}
catch (Exception ex)
{
_commLayerError = "SimensProdave6.CSendDeviceOrder.SendDeviceOrder发生错误:" + ex.Message;
return false;
}
}
///
/// 上位机给下位机发送烟箱按品牌码分道信息共15字节,有数据时写入实际数据,否则全部写零
///
/// 码垛位设备号索引
/// 第1--13字节,烟箱码
/// 第14字节,1-有一号工程码,0-无一号工程码
/// 第15字节,1-小烟箱,0-正常烟箱
/// 发送烟箱按品牌码分道信息是否成功
public bool SendDeviceOrder(int DeviceIndex, string TobaccoCode, bool HaveFirstProjectCode, bool IfSmallTobacco,int Count)
{
try
{
byte[] wdata = new byte[15];
Model.MDevice devinfo = Model.CGetInfo.GetDeviceInfo(DeviceIndex);
//DataView dv = dbo.ExceSQL("SELECT F_DBW1Address,F_DBWSendLength,F_DeviceIndex,F_DeviceKindIndex,F_OPCProgID, F_RemoteIP FROM T_Base_Device where F_DeviceIndex=" + DeviceIndex).Tables[0].DefaultView;
if (devinfo.DeviceIndex == 0)
{
_commLayerError = "SimensProdave6.CSendDeviceOrder.SendDeviceOrder发生错误:设备所引不存在!";
return false;
}
else
{
for (int i = 0; i < 13; i++)
{
wdata[i]=(byte)Strings.Asc(TobaccoCode.Substring(i,1));
}
if (HaveFirstProjectCode == true)
{
wdata[13] = 1;
}
else
{
wdata[13] = 0;
}
if (IfSmallTobacco == true)
{
wdata[14] = 1;
}
else
{
wdata[14] = 1;
}
if (CSimensProdave6_S7.DB_Write_Prodave(0, 1, Convert.ToUInt16(devinfo.Dbw1Address), Convert.ToUInt32(devinfo.Dbw1SendLength), wdata) == false)
{
return false;
}
}
return true;
}
catch (Exception ex)
{
_commLayerError = "SimensProdave6.CSendDeviceOrder.SendDeviceOrder发生错误:" + ex.Message;
return false;
}
}
bool WriteBarcode(int deviceindex,int taskindex)
{
string barcode="";
byte[] wdata = new byte[11];
DataView dvb = dbo.ExceSQL("SELECT F_MonitorIndex, F_TxtParam FROM T_Monitor_Task WHERE (F_MonitorIndex = "+taskindex +")").Tables[0].DefaultView;
if (dvb.Count > 0)
{
barcode = dvb[0]["F_TxtParam"].ToString();
if (barcode == "-") return true;
}
else
{
_commLayerError = "SimensProdave6.CSendDeviceOrder.SendDeviceOrder发生错误:写入附加条码时在调度任务表内没找到条码!";
return false;
}
Model.MDevice devinfo = Model.CGetInfo.GetDeviceInfo(deviceindex);
//DataView dv0 = dbo.ExceSQL("SELECT F_AppendBarcode, F_DeviceIndex FROM T_Base_Device WHERE (F_AppendBarcode <>-1) AND (F_DeviceIndex = "+deviceindex +")").Tables[0].DefaultView;
if (devinfo.AppendBarcode > 0)
{
Model.MDevice devinfo1 = Model.CGetInfo.GetDeviceInfo(devinfo.AppendBarcode);
//DataView dv = dbo.ExceSQL("SELECT F_DBW1Address,F_DBWSendLength,F_DeviceIndex,F_DeviceKindIndex,F_OPCProgID, F_RemoteIP FROM T_Base_Device where F_DeviceIndex=" + Convert.ToInt32(dv0[0]["F_AppendBarcode"])).Tables[0].DefaultView;
if (devinfo1.DeviceIndex == 0)
{
_commLayerError = "SimensProdave6.CSendDeviceOrder.SendDeviceOrder发生错误:写入附加条码时设备索引不存在!";
return false;
}
else
{
wdata[0] = 1;
for (int i = 1; i <= barcode.Length; i++)
{
wdata[i] =(byte) Strings.Asc(barcode.Substring(i-1, 1));
}
if (CSimensProdave6_S7.DB_Write_Prodave(0, 1, Convert.ToUInt16(devinfo1.Dbw1Address), Convert.ToUInt32(devinfo1.Dbw1SendLength), wdata) == false)
{
_commLayerError = "SimensProdave6.CSendDeviceOrder.SendDeviceOrder发生错误:写入附加条码失败!";
return false;
}
}
return true;
}
else
{
return true; ;
}
}
///
/// 向PLC的DB区写入数据
///
/// 标签变量名称数组
/// 标签值数组
///
public bool WriteDBData(string[] ItemNames, string[] ItemValues)
{
return true;
}
}
}