SCLS/SSWCS_JXDL(2019)/OPCClient/CSendDeviceOrder.cs
2025-05-19 09:45:29 +08:00

912 lines
45 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Text;
using ICommLayer;
using DBFactory;
using System.Data;
using Microsoft.VisualBasic;
namespace OPCClient
{
public class CSendDeviceOrder:ISendDeviceOrder
{
Model.MDevice devinfo;
string _commLayerError;
StringBuilder sql = new StringBuilder();
StringBuilder sss = new StringBuilder();
public string CommLayerError
{
get { return _commLayerError; }
set { _commLayerError = value; }
}
DBOperator dbo = CCommonOPCClient.dbo;
//Model.MDevice devinfo;
public CSendDeviceOrder()
{
dbo.Open();
}
/// <summary>
/// 发送堆垛机命令
/// </summary>
/// <param name="MessageIndex">消息编号</param>
/// <param name="TaskIndex">任务编号</param>
/// <param name="Order">堆垛机命令字</param>
///1-复位
///2-将取
///3-将送
///4-取货
///5-放货
///6-取放货
/// <param name="DeviceIndex">设备编号</param>
/// <param name="StartX">起始x坐标排-沿轨道方向</param>
/// <param name="StartY">起始y坐标层-高度方向</param>
/// <param name="StartZ">起始z坐标列-面向堆垛机操作面板1-左侧2-右侧</param>
/// <param name="EndX">目标x坐标列-沿轨道方向</param>
/// <param name="EndY">目标y坐标层-高度方向</param>
/// <param name="EndZ">目标z坐标排-面向堆垛机操作面板1-左侧2-右侧</param>
/// <returns>发送堆垛机命令是否成功</returns>
public bool SendDeviceOrder(int MessageIndex, int TaskIndex, int Order, int DeviceIndex, int StartX, int StartY, int StartZ, int EndX, int EndY, int EndZ)
{
string[] itemnames;
string[] itemvalues;
//if (MessageIndex == 2)//20101220
//{
// Order = 100;
//}
try
{
int StartZ1 = 0; int EndZ1 = 0;
int sn = 0; int UseAwayFork = 0; int UseAwayFork1 = 0;
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 (dv.Count == 0)
{
_commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误在设备表中没找到设备所引";
return false;
}
else
{
if ((dv[0]["F_DeviceKindIndex"].ToString() != "1"))
{//堆垛机使用此方法
_commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误堆垛机以外的设备使用此方法不正确!";
return false;
}
#region
if (dv[0]["F_DeviceKindIndex"].ToString() == "1")
{
devinfo = Model.CGetInfo.GetDeviceInfo(DeviceIndex);
if (devinfo.IfCorrelDoubleFork == "1")
{
//堆垛机的双叉取货指令在此决定分配货叉、同步还是异步发送20100323
if ((Order == 4) || (Order == 2))
{
#region
string[] rr = Model.CGeneralFunction.GetDoubleForkMonitorInfo(TaskIndex, DeviceIndex);
//如果不是双叉关联任务:根据货位奇偶和堆垛机号指定货叉
if (rr == null)
{
//如果F_UseAwayFork='-',分配货叉,否则已经分配好货叉无需再分配
if (Model.CGeneralFunction.GetUseAwayFork(TaskIndex) == "-")
{
switch (Model.CGeneralFunction.GetDoubleForkFromST_CELL(StartZ, StartX, StartY, Model.CGeneralFunction.GetWAREHOUSEFromSTCELL(DeviceIndex)))
{
case 1: // 指定近叉
UseAwayFork = 0;
break;
case 2: // 指定远叉
UseAwayFork = 1;
break;
case 0: // 没有指定货叉要看是11001-11005 还是11006-11010正好相反。
// 20120422 南昌
if (DeviceIndex > 11000 && DeviceIndex < 11006)
{
if ((StartX % 2) == 0 || StartX == 1) // 双数列,增加输送机1排 20120529
{
UseAwayFork = 1; // 远叉
}
else // 单数列
{
UseAwayFork = 0; // 近叉
}
}
else
{
if ((StartX % 2) == 0) // 双数列
{
UseAwayFork = 0; // 近叉
}
else // 单数列
{
UseAwayFork = 1; // 远叉
}
}
break;
}
//dbo.ExceSQL("UPDATE T_Monitor_Task SET F_UseAwayFork = '" + UseAwayFork + "' WHERE (F_ManageTaskIndex = " +
// Model.CGeneralFunction.GetManageTaskIndexfromMonitor(TaskIndex) + ") AND (F_ManageTASKKINDINDEX = " +
// Model.CGeneralFunction.GetManageTaskKindIndexFromMonitor(TaskIndex) + ")");//20101220
dbo.ExceSQL("UPDATE T_Monitor_Task SET F_UseAwayFork = '" + UseAwayFork + "' WHERE (F_ManageTaskIndex = " +
Model.CGeneralFunction.GetManageTaskIndexfromMonitor(TaskIndex) + ") AND (F_ManageTASKKINDINDEX = " +
Model.CGeneralFunction.GetManageTaskKindIndexFromMonitor(TaskIndex) + ") AND (F_DeviceIndex = " + DeviceIndex +")");//20120615 对开堆垛机只修改本机的货叉
}
else // 已经分配货叉,或者手工任务,按照指定的发送
{
UseAwayFork = Convert.ToInt32(Model.CGeneralFunction.GetUseAwayFork(TaskIndex));
}
// 印钞厂堆垛机X发送时候 X= X+1/2 换成大货格
//if (UseAwayFork == 1)//远货叉列数减一,因为近货叉是主货叉
//{
// if (DeviceIndex > 11000 && DeviceIndex < 11006)
// {
// if (StartX != 1)
// {
// StartX = StartX - 1;
// }
// }
// else
// {
// if (StartX != 1)
// {
// StartX = StartX + 1;
// }
// }
//}
}
// 双叉关联任务
else
{
if (Model.CGeneralFunction.GetUseAwayFork(TaskIndex) == "-")
{
//如果是双叉关联任务并且没有指定货叉:根据货位奇偶和堆垛机号来判断。
//UseAwayFork = Model.CGeneralFunction.GetUseAwayFork(TaskIndex, DeviceIndex, Order);
if (DeviceIndex > 11000 && DeviceIndex < 11006)
{
if (StartX % 2 == 1) // 奇数
{
UseAwayFork = 0;// 近叉
}
else
{
UseAwayFork = 1;// 远叉
}
}
else // 11006-11010 堆垛机
{
if (StartX % 2 == 0)// 偶数
{
UseAwayFork = 0;// 近叉
}
else
{
UseAwayFork = 1;// 远叉
}
}
//dbo.ExceSQL("UPDATE T_Monitor_Task SET F_UseAwayFork = '" + UseAwayFork + "' WHERE (F_ManageTaskIndex = " +
// Model.CGeneralFunction.GetManageTaskIndexfromMonitor(TaskIndex) + ") AND (F_ManageTASKKINDINDEX = " +
// Model.CGeneralFunction.GetManageTaskKindIndexFromMonitor(TaskIndex) + ")");//20101220
dbo.ExceSQL("UPDATE T_Monitor_Task SET F_UseAwayFork = '" + UseAwayFork + "' WHERE (F_ManageTaskIndex = " +
Model.CGeneralFunction.GetManageTaskIndexfromMonitor(TaskIndex) + ") AND (F_ManageTASKKINDINDEX = " +
Model.CGeneralFunction.GetManageTaskKindIndexFromMonitor(TaskIndex) + ") AND (F_DeviceIndex = " + DeviceIndex + ")");//20120615 对开堆垛机只修改本机的货叉
}
else
{
// 已经分配货叉的直接从任务获取
UseAwayFork = Convert.ToInt32(Model.CGeneralFunction.GetUseAwayFork(TaskIndex));
}
//关联任务分配货叉
int TaskIndex1 = Convert.ToInt32(rr[0]); // 关联任务号
if (UseAwayFork == 1)
{
UseAwayFork1 = 0;
//if (StartX != 1)
//{
// StartX = StartX - 1;
//}
}
else
{
UseAwayFork1 = 1;
}
// 设置关联任务的货叉
dbo.ExceSQL("UPDATE T_Monitor_Task SET F_UseAwayFork = '" + UseAwayFork1 + "' WHERE (F_ManageTaskIndex = " +
Model.CGeneralFunction.GetManageTaskIndexfromMonitor(TaskIndex1) + ") AND (F_ManageTASKKINDINDEX = " +
Model.CGeneralFunction.GetManageTaskKindIndexFromMonitor(TaskIndex1) + ") AND (F_DeviceIndex = " + DeviceIndex + ")");//20120615 对开堆垛机只修改本机的货叉
}
#endregion
#region
if (Model.CGeneralFunction.DoubleForkIfSync(TaskIndex, DeviceIndex, devinfo.DeviceKind) == true)
{
if (UseAwayFork == 1)//远货叉
{
StartZ = Model.CGeneralFunction.GetZCoorFromMonitor(TaskIndex, DeviceIndex, Order);//远货叉
EndZ = 0;//远货叉
StartZ1 = Model.CGeneralFunction.GetDoubleForkZ(Model.CGeneralFunction.GetManageTaskKindIndexFromMonitor(TaskIndex),
Model.CGeneralFunction.GetManageTaskIndexfromMonitor(TaskIndex), DeviceIndex, Order); //近货叉
EndZ1 = 0; //近货叉
}
else
{ //近货叉
StartZ1 = Model.CGeneralFunction.GetZCoorFromMonitor(TaskIndex, DeviceIndex, Order); //近货叉
EndZ1 = 0; //近货叉
StartZ = Model.CGeneralFunction.GetDoubleForkZ(Model.CGeneralFunction.GetManageTaskKindIndexFromMonitor(TaskIndex),
Model.CGeneralFunction.GetManageTaskIndexfromMonitor(TaskIndex), DeviceIndex, Order);//远货叉
EndZ = 0;//远货叉
}
}
else
{
if (UseAwayFork == 1)//远货叉
{
StartZ = Model.CGeneralFunction.GetZCoorFromMonitor(TaskIndex, DeviceIndex, Order);//远货叉
EndZ = 0;//远货叉
StartZ1 = 0; //近货叉
EndZ1 = 0; //近货叉
}
else
{ //近货叉
StartZ1 = Model.CGeneralFunction.GetZCoorFromMonitor(TaskIndex, DeviceIndex, Order); //近货叉
EndZ1 = 0; //近货叉
StartZ = 0;//远货叉
EndZ = 0;//远货叉
}
}
#endregion
}
//堆垛机的双叉送货指令取货时已经指定远近叉在此决定同步还是异步发送20100323
//if ((Order == 5) || (Order == 3)) // 20120527插入的避让指令将送不用区分远近叉
if (Order == 5)
{
UseAwayFork = Convert.ToInt32(Model.CGeneralFunction.GetUseAwayFork(TaskIndex));
#region
if (Model.CGeneralFunction.DoubleForkIfSync(TaskIndex, DeviceIndex, devinfo.DeviceKind) == true)
{
if (UseAwayFork == 1)//远货叉
{
EndZ = Model.CGeneralFunction.GetZCoorFromMonitor(TaskIndex, DeviceIndex, Order);//远货叉
StartZ = 0;//远货叉
EndZ1 = Model.CGeneralFunction.GetDoubleForkZ(Model.CGeneralFunction.GetManageTaskKindIndexFromMonitor(TaskIndex),
Model.CGeneralFunction.GetManageTaskIndexfromMonitor(TaskIndex), DeviceIndex, Order); //近货叉
StartZ1 = 0; //近货叉
}
else
{ //近货叉
EndZ1 = Model.CGeneralFunction.GetZCoorFromMonitor(TaskIndex, DeviceIndex, Order); //近货叉
StartZ1 = 0; //近货叉
EndZ = Model.CGeneralFunction.GetDoubleForkZ(Model.CGeneralFunction.GetManageTaskKindIndexFromMonitor(TaskIndex),
Model.CGeneralFunction.GetManageTaskIndexfromMonitor(TaskIndex), DeviceIndex, Order);//远货叉
StartZ = 0;//远货叉
}
}
else
{
if (UseAwayFork == 1)//远货叉
{
EndZ = Model.CGeneralFunction.GetZCoorFromMonitor(TaskIndex, DeviceIndex, Order);//远货叉
StartZ = 0;//远货叉
StartZ1 = 0; //近货叉
EndZ1 = 0; //近货叉
}
else
{ //近货叉
EndZ1 = Model.CGeneralFunction.GetZCoorFromMonitor(TaskIndex, DeviceIndex, Order); //近货叉
StartZ1 = 0; //近货叉
StartZ = 0;//远货叉
EndZ = 0;//远货叉
}
}
#endregion
//if (Model.CGeneralFunction.GetUseAwayFork(TaskIndex) == "1")//远货叉列数减一,因为近货叉是主货叉
//{
// if (EndX != 1)
// {
// EndX = EndX - 1;
// }
//}
}
}
itemnames = new string[11];//20101220
itemvalues = new string[11];
//byte0,byte1,byte2,byte3,byte4
// int1 int3
//int0(byte0,byte1);int1(byte1,byte2);int2(byte2,byte3);int3(byte3,byte4)
#region PLC能识别的坐标
#region Y
////01-29-23;01-30-23;01-24-23;01-23-23,[01-22-23,01-28-23]为三楼输送机保持不变1排的其余列的货位层数+12排23层都加+1
//if ((((StartZ == 1) || (StartZ1 == 1)) && (StartY == 23) && ((StartX != 23) && (StartX != 22) && (StartX != 24) && (StartX != 28) && (StartX != 29) && (StartX != 30)))
// || (((StartZ == 2) || (StartZ1 == 2)) && (StartY == 23)))
//{
// StartY++;
//}
//if ((((EndZ == 1) || (EndZ1 == 1)) && (EndY == 23) && ((EndX != 23) && (EndX != 22) && (EndX != 24) && (EndX != 28) && (EndX != 29) && (EndX != 30)))
// || (((EndZ == 2) || (EndZ1 == 2)) && (EndY == 23)))
//{
// EndY++;
//}
#endregion
#region Z
if (StartZ != 0)
{
if (StartZ % 2 == 0)
{
StartZ = 2;
}
else
{
StartZ = 1;
}
}
if (EndZ != 0)
{
if (EndZ % 2 == 0)
{
EndZ = 2;
}
else
{
EndZ = 1;
}
}
////////////////
if (StartZ1 != 0)
{
if (StartZ1 % 2 == 0)
{
StartZ1 = 2;
}
else
{
StartZ1 = 1;
}
}
if (EndZ1 != 0)
{
if (EndZ1 % 2 == 0)
{
EndZ1 = 2;
}
else
{
EndZ1 = 1;
}
}
#endregion
#endregion
sn = Convert.ToInt32(dv[0]["F_DBW1Address"]);
itemnames[0] = "DB1,byte" + Convert.ToString(sn + 0);//消息头
itemvalues[0] = "0";
itemnames[1] = "DB1,byte" + Convert.ToString(sn + 1);//命令
itemvalues[1] = Order.ToString();
itemnames[2] = "DB1,int" + Convert.ToString(sn + 2);//任务号
itemvalues[2] = TaskIndex.ToString();
itemnames[3] = "DB1,byte" + Convert.ToString(sn + 4);
itemvalues[3] = StartX.ToString();
itemnames[4] = "DB1,byte" + Convert.ToString(sn + 5);
itemvalues[4] = StartY.ToString();
itemnames[5] = "DB1,byte" + Convert.ToString(sn + 6);
itemvalues[5] = StartZ.ToString();//远货叉
itemnames[6] = "DB1,byte" + Convert.ToString(sn + 9);
itemvalues[6] = EndX.ToString();
itemnames[7] = "DB1,byte" + Convert.ToString(sn + 10);
itemvalues[7] = EndY.ToString();
itemnames[8] = "DB1,byte" + Convert.ToString(sn + 11);
itemvalues[8] = EndZ.ToString();//远货叉
//双叉关联的指令Z坐标
CCommonOPCClient.Hostname = CommonClassLib.AppSettings.GetValue("HostName");//20090922 devinfo.RemoteIP;
CCommonOPCClient.ProgID = CommonClassLib.AppSettings.GetValue("OPCProgID");
CCommonOPCClient.PlcConnectionID = devinfo.S7Connection;//20110216
if (CCommonOPCClient.SyncWriteAllItemValue(itemnames, itemvalues) == false)
{
return false;
}
itemnames[0] = "DB1,byte" + Convert.ToString(sn + 0);//消息头
itemvalues[0] = MessageIndex.ToString();
if (CCommonOPCClient.SyncWriteAllItemValue(itemnames, itemvalues) == false)
{
return false;
}
string sss = "";
for (int j = 0; j <= 10; j++)
{
sss += "***" + itemvalues[j];
}
CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "SendDeviceOrder", DeviceIndex.ToString(), sss);
if (WriteBarcode(DeviceIndex, TaskIndex) == false)
{
return false;
}
}
#endregion
#region RGV
//if (dv[0]["F_DeviceKindIndex"].ToString() == "4")
//{
// itemnames = new string[5];
// itemvalues = new string[5];
// //byte0,byte1,byte2,byte3,byte4
// // int1 int3
// //int0(byte0,byte1);int1(byte1,byte2);int2(byte2,byte3);int3(byte3,byte4)
// sn = Convert.ToInt32(dv[0]["F_DBW1Address"]);
// itemnames[0] = "DB1,byte" + Convert.ToString(sn + 1);
// itemvalues[0] = Order.ToString();
// itemnames[1] = "DB1,int" + Convert.ToString(sn + 2);
// itemvalues[1] = TaskIndex.ToString();
// itemnames[2] = "DB1,int" + Convert.ToString(sn + 4);
// itemvalues[2] = StartX.ToString();
// itemnames[3] = "DB1,byte" + Convert.ToString(sn + 0);
// itemvalues[3] = "0";
// CCommonOPCClient.Hostname = CommonClassLib.AppSettings.GetValue("HostName");//20090922 devinfo.RemoteIP;
// CCommonOPCClient.ProgID = CommonClassLib.AppSettings.GetValue("OPCProgID");
// if (CCommonOPCClient.SyncWriteAllItemValue(itemnames, itemvalues) == false)
// {
// _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误" + CCommonOPCClient.OpcError;
// return false;
// }
// itemnames[3] = "DB1,byte" + Convert.ToString(sn + 0);
// itemvalues[3] = MessageIndex.ToString();
// if (CCommonOPCClient.SyncWriteAllItemValue(itemnames, itemvalues) == false)
// {
// _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误" + CCommonOPCClient.OpcError;
// return false;
// }
// string sss = "";
// for (int j = 0; j <= 3; j++)
// {
// sss += "***" + itemvalues[j];
// }
// CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "SendDeviceOrder", DeviceIndex.ToString(), sss);
//}
#endregion
}
return true;
}
catch (Exception ex)
{
_commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误" + ex.Message;
return false;
}
finally
{
itemnames = null;
itemvalues = null;
}
}
/// <summary>
/// 发送穿梭车、输送机设备命令
/// </summary>
/// <param name="MessageIndex">消息编号</param>
/// <param name="TaskIndex">任务编号</param>
/// <param name="Order">命令字</param>
/// 穿梭车命令字:
///1-复位
///2-左接货
///3-左送货
///4-右接货
///5-右送货
///6-停止
///7-运动运动到第4、5字节指定的目标设备所引
///输送机命令字:
///1-入库(朝向库)
///2-出库(背向库)
///3-送货
///4-接货
///5-停止
/// <param name="DeviceIndex">设备编号</param>
///<param name="ArrowDeviceIndex">对于输送机、穿梭车代表目标设备所引,
/// 0-代表单一设备控制无目标设备所引1…65535代表目标设备所引终点输送机的设备所引</param>
/// <returns>发送穿梭车、输送机设备命令是否成功</returns>
public bool SendDeviceOrder(int MessageIndex, int TaskIndex, int Order, int DeviceIndex, int ArrowDeviceIndex)
{
StringBuilder[] itemnames;
StringBuilder[] itemvalues;
devinfo = Model.CGetInfo.GetDeviceInfo(DeviceIndex);
try
{
int[] sendmes = new int[5] { MessageIndex, TaskIndex, Order, DeviceIndex, ArrowDeviceIndex };
int boxtype = 0;// 箱型
int QUANTITY = 0; // 数量 20131203
int outtimes=0;
// devinfo.SendMessage = sendmes;
Model.CGetInfo.SetDeviceMessage(devinfo);
if (devinfo.UseCommonDB == "1")
{
itemnames = new StringBuilder[5] { new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder("") }; ;
itemvalues = new StringBuilder[5] { new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder("") }; ;
}
else if (12505 == ArrowDeviceIndex || 12116 == ArrowDeviceIndex)
{
itemnames = new StringBuilder[6] { new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder("") }; ;
itemvalues = new StringBuilder[6] { new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder("") , new StringBuilder("")}; ;
}
else
{
itemnames = new StringBuilder[4] { new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder("") }; ;
itemvalues = new StringBuilder[4] { new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder("") }; ;
}
int sn = 0;
if (devinfo == null)
{
_commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误设备索引不存在!";
return false;
}
else
{
if (12505 == ArrowDeviceIndex || 12116 == ArrowDeviceIndex)
{
#region
if (12505 == ArrowDeviceIndex || 12116 == ArrowDeviceIndex)
{
Model.CGeneralFunction.GetBoxTypeAndQUANTITYFromMonitor(TaskIndex, out boxtype, out QUANTITY);
}
#endregion
}
else
{
//itemnames = new StringBuilder[4];
//itemvalues = new StringBuilder[4];
//outtimes = 3;
}
if (devinfo.DeviceKind == 7)
{
return true;
}
if (devinfo.DeviceKind == 1)
{//堆垛机不允许使用此方法
_commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误堆垛机和RGV不允许使用此方法!";
return false;
}
//byte0,byte1,byte2,byte3,byte4
// int1 int3
//int0(byte0,byte1);int1(byte1,byte2);int2(byte2,byte3);int3(byte3,byte4)
sn = Convert.ToInt32(devinfo.Dbw1Address);
if (12505 == ArrowDeviceIndex || 12116 == ArrowDeviceIndex)
{//20110318
itemnames[0].Append(Model.CGeneralFunction.DBSend).Append(",byte").Append(Convert.ToString(sn + 1));
itemvalues[0].Append(Order.ToString());
itemnames[1].Append(Model.CGeneralFunction.DBSend).Append(",int").Append(Convert.ToString(sn + 2));
itemvalues[1].Append(TaskIndex.ToString());
itemnames[2].Append(Model.CGeneralFunction.DBSend).Append(",int").Append(Convert.ToString(sn + 4));
itemvalues[2].Append(ArrowDeviceIndex.ToString());
itemnames[3].Append(Model.CGeneralFunction.DBSend).Append(",byte").Append(Convert.ToString(sn + 0));
itemvalues[3].Append("0");
itemnames[4].Append(Model.CGeneralFunction.DBSend).Append(",byte").Append(Convert.ToString(sn + 6));
itemvalues[4].Append(boxtype);
itemnames[5].Append(Model.CGeneralFunction.DBSend).Append(",byte").Append(Convert.ToString(sn + 7));
itemvalues[5].Append(QUANTITY);
}
else
{
itemnames[0].Append(Model.CGeneralFunction.DBSend).Append(",byte").Append(Convert.ToString(sn + 1));
itemvalues[0].Append(Order.ToString());
itemnames[1].Append(Model.CGeneralFunction.DBSend).Append(",int").Append(Convert.ToString(sn + 2));
itemvalues[1].Append(TaskIndex.ToString());
itemnames[2].Append(Model.CGeneralFunction.DBSend).Append(",int").Append(Convert.ToString(sn + 4));
itemvalues[2].Append(ArrowDeviceIndex.ToString());
itemnames[3].Append(Model.CGeneralFunction.DBSend).Append(",byte").Append(Convert.ToString(sn + 0));
itemvalues[3].Append("0");
}
if (devinfo.UseCommonDB == "1")
{
itemnames[4].Append(Model.CGeneralFunction.DBSend).Append(",int").Append(Convert.ToString(sn + 6));
itemvalues[4].Append(DeviceIndex.ToString());
}
CCommonOPCClient.Hostname = CommonClassLib.AppSettings.GetValue("HostName");//20090922 devinfo.RemoteIP;
CCommonOPCClient.ProgID = CommonClassLib.AppSettings.GetValue("OPCProgID");
CCommonOPCClient.PlcConnectionID = devinfo.S7Connection;//20110216
if (CCommonOPCClient.SyncWriteAllItemValue(itemnames, itemvalues) == false)
{
return false;
}
itemnames[3].Remove(0, itemnames[3].Length);
itemnames[3].Append(Model.CGeneralFunction.DBSend).Append(",byte").Append(Convert.ToString(sn + 0));
itemvalues[3].Remove(0, itemvalues[3].Length);
itemvalues[3].Append(MessageIndex);
if (CCommonOPCClient.SyncWriteAllItemValue(itemnames, itemvalues) == false)
{
return false;
}
sss.Remove(0, sss.Length);
sss.Append("**写标志").Append(MessageIndex.ToString()).Append ("起始地址").Append(Model.CGeneralFunction.DBSend).Append(",byte").Append(Convert.ToString(sn + 0)). Append("**命令字" + Order.ToString()).Append("**任务号" + TaskIndex.ToString())
.Append("**目标位置" + ArrowDeviceIndex.ToString());
if (ArrowDeviceIndex == 12505 || 12116 == ArrowDeviceIndex)
{
sss.Append ("**箱型"+boxtype .ToString ()).Append ("**数量"+QUANTITY .ToString ());
}
CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送指令", DeviceIndex.ToString(), sss.ToString());
if (MessageIndex == 1)
{
if (WriteBarcode(DeviceIndex, TaskIndex) == false)
{
return false;
}
}
}
return true;
}
catch (Exception ex)
{
_commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误" + ex.Message;
return false;
}
finally
{
devinfo = null;
itemnames = null;
itemvalues = null;
}
}
/// <summary>
/// 上位机给下位机发送烟箱按品牌码分道信息共15字节,有数据时写入实际数据,否则全部写零
/// </summary>
/// <param name="DeviceIndex">码垛位设备号索引</param>
/// <param name="TobaccoCode">第3--15字节,烟箱码</param>
/// <param name="HaveFirstProjectCode">第1字节,1-有一号工程码,0-无一号工程码</param>
/// <param name="IfSmallTobacco">第2字节,1-异型烟箱,0-正常烟箱</param>
/// <returns>发送烟箱按品牌码分道信息是否成功</returns>
public bool SendDeviceOrder(int DeviceIndex, string TobaccoCode, bool HaveFirstProjectCode, bool IfSmallTobacco,int Count)
{
StringBuilder[] itemnames=new StringBuilder[16];
StringBuilder[] itemvalues = new StringBuilder[16];
devinfo = Model.CGetInfo.GetDeviceInfo(DeviceIndex);
try
{
int sn = 0;
if (devinfo==null )
{
_commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误设备所引不存在!";
return false;
}
else
{
sn = Convert.ToInt32(devinfo.Dbw1Address);
itemnames[0].Append(Model.CGeneralFunction.DBSend).Append(",byte").Append((sn + 0).ToString());
if (HaveFirstProjectCode == true)
{
itemvalues[0].Append( "1");
}
else
{
itemvalues[0] .Append( "0");
}
itemnames[1].Append(Model.CGeneralFunction.DBSend).Append(",byte").Append((sn + 1).ToString());
if (IfSmallTobacco == true)
{
itemvalues[1] .Append( "1");
}
else
{
itemvalues[1] .Append( "0");
}
for (int i = 2; i <= 14; i++)
{
itemnames[i].Append(Model.CGeneralFunction.DBSend).Append(",byte").Append((sn + i).ToString());
itemvalues[i] .Append( Strings.Asc(TobaccoCode.Substring(i - 2, 1)).ToString());
}
itemnames[15].Append(Model.CGeneralFunction.DBSend).Append(",byte").Append((sn + 15).ToString());
itemvalues[15] .Append( Count.ToString());
CCommonOPCClient.Hostname = CommonClassLib.AppSettings.GetValue("HostName");//20090922 devinfo.RemoteIP;
CCommonOPCClient.ProgID = CommonClassLib.AppSettings.GetValue("OPCProgID");
CCommonOPCClient.PlcConnectionID = devinfo.S7Connection;//20110216
if (CCommonOPCClient.SyncWriteAllItemValue(itemnames, itemvalues) == false)
{
return false;
}
}
return true;
}
catch (Exception ex)
{
_commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误" + ex.Message;
return false;
}
finally
{
devinfo = null;
itemnames = null;
itemvalues =null;
}
}
public bool WriteBarcode(int deviceindex,int taskindex)
{
Model.MDevice devinfo;
StringBuilder[] itemnames = new StringBuilder[11];
StringBuilder[] itemvalues = new StringBuilder[11];
int sn = 0;
try
{
devinfo = Model.CGetInfo.GetDeviceInfo(deviceindex);
sss.Remove(0, sss.Length);
sss.Append("SELECT F_MonitorIndex, 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)
{
sss.Remove(0, sss.Length);
sss.Append(dvb[0]["F_TxtParam"].ToString());
if ((sss.ToString() == "-") || (sss.ToString() == "")) return true;
}
else
{
_commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误写入附加条码时在调度任务表内没找到条码!";
return false;
}
if (devinfo.AppendBarcode > 0)
{
Model.MDevice devinfo1 = Model.CGetInfo.GetDeviceInfo(devinfo.AppendBarcode);
if (devinfo1.DeviceIndex == 0)
{
_commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误写入附加条码时设备索引不存在!";
return false;
}
else
{
//byte0,byte1,byte2,byte3,byte4
// int1 int3
//int0(byte0,byte1);int1(byte1,byte2);int2(byte2,byte3);int3(byte3,byte4)
sn = Convert.ToInt32(devinfo1.Dbw1Address);
// devinfo1 = null;
if (devinfo1.DeviceIndex == 61070)
{
}
for (int i = 0; i <= 9; i++)
{
itemnames[i].Append(Model.CGeneralFunction.DBSend).Append(",byte").Append(Convert.ToString(sn + i + 1));
itemvalues[i] .Append( Strings.Asc(sss.ToString().Substring((i), 1)).ToString());
}
itemnames[10].Append(Model.CGeneralFunction.DBSend).Append(",byte").Append(Convert.ToString(sn + 0));
itemvalues[10] .Append( "1");
CCommonOPCClient.Hostname = CommonClassLib.AppSettings.GetValue("HostName");//20090922 devinfo.RemoteIP;
CCommonOPCClient.ProgID = CommonClassLib.AppSettings.GetValue("OPCProgID");
CCommonOPCClient.PlcConnectionID = devinfo.S7Connection;//20110216
if (CCommonOPCClient.SyncWriteAllItemValue(itemnames, itemvalues) == false)
{
return false;
}
CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "SendDeviceOrder", deviceindex.ToString(), sss.ToString());
}
return true;
}
else
{
return true; ;
}
}
catch (Exception ex)
{
_commLayerError = "OPCClient.CSendDeviceOrder.WriteBarcode发生错误" + ex.Message;
return false;
}
finally
{
devinfo=null;
itemnames =null;
itemvalues =null;
}
}
/// <summary>
/// 向PLC的DB区写入数据
/// </summary>
/// <param name="ItemNames">标签变量名称数组</param>
/// <param name="ItemValues">标签值数组</param>
/// <returns></returns>
public bool WriteDBData(StringBuilder[] ItemNames, StringBuilder[] ItemValues ,int deviceindex)
{
try
{
devinfo = Model.CGetInfo.GetDeviceInfo(deviceindex);
CCommonOPCClient.PlcConnectionID = devinfo.S7Connection;//20110216
if (CCommonOPCClient.SyncWriteAllItemValue(ItemNames, ItemValues) == false)
{
return false;
}
else
{
sss.Remove(0, sss.Length);
sss.Append("**" + ItemNames[0].ToString() + "**" + ItemValues[0].ToString());
CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送应答标志", deviceindex.ToString (), sss.ToString());
return true;
}
}
catch (Exception ex)
{
_commLayerError = "OPCClient.CSendDeviceOrder.WriteDBData发生错误" + ex.Message;
return false;
}
finally
{
ItemNames = null;
ItemValues=null;
}
}
public bool SendDeviceOrder(int MessageIndex, int TaskIndex, int Order, int DeviceIndex, int StartX, int StartY, int StartZ, int EndX, int EndY, int EndZ, string DoubleFork)
{
return true;
}
}
}