using System; using System.Collections.Generic; using System.Text; using System.Data; using ICommLayer; using DBFactory; namespace SimensSerialPort { /// /// 通过西门子无线电台的自由口方式的通讯接口派生类 /// 获得设备状态类 /// 创建者:Richard.Liu /// public class CGetDeviceState:IGetDeviceState { string _commLayerError; public string CommLayerError { get { return _commLayerError; } set { _commLayerError = value; } } DBOperator dbo = CommonClassLib.AppSettings.dbo;//20130510 public CGetDeviceState() { dbo.Open(); } //~CGetDeviceState() //{ // dbo.Close(); //} /// /// 如果返回空值就是没有成功获得上行消息(下位机->上位机) /// 第1字节: 序列号,由下位机产生,从0开始,每发送一条消息序列号加1, /// 但必须小于240(0XF0),循环使用。 /// 第2,3字节:任务号,即上位机下达任务时的任务号,下位机主动上报错误时则固定 /// 为:255(0XFF)和255(0XFF)。 /// 第4字节: 消息, 1-任务完成 /// 2-报告坐标(对于堆垛机) /// 3-检测开关状态(对于输送机等) /// 其他值-故障 /// 第5字节: 设备号,根据项目进行重新规划。 /// 第6字节: /// 堆垛机: /// x坐标,排-沿轨道方向。 /// 检测开关: /// 0-无货 /// 1-有货 /// 第7字节:y坐标,层-高度方向。 /// 6字节在输送机等报告检测开关状态时有实际值,6、7字节在堆垛机报告任务完成和报告坐标时有实际值,对于其他消息它们可以是任意值。 /// 第8-14字节:留用,可以是任意值。 /// /// 设备编号 /// 获得上行消息成功后,发送应答消息后返回14个字节型状态 public int[] GetDeviceState(int DeviceIndex, int TaskIndex) { Model.MDevice devinfo = Model.CGetInfo.GetDeviceInfo(DeviceIndex); try { //根据DeviceIndex,得到串口号和初始设置 CSimensSerialPort ssp; if (devinfo != null) { ssp = new CSimensSerialPort((short)devinfo.SerialPort, devinfo.CommSettings); } else { return null; } //ds.Dispose(); if (ssp.InitCom() == true) { byte[] _Senddata = new byte[8]; int[] _IntData = new int[6]; byte[] _GetData = ssp.ReadCom(16); //CommonClassLib.CCarryConvert.WriteDarkCasket(this.ToString(), "ReadCom", _GetData); if (_GetData != null) { if ((_GetData[5] == DeviceIndex) && ((_GetData[2] * Math.Pow(2, 8) + _GetData[3]) == TaskIndex) || ((_GetData[2] == 255) && (_GetData[3] == 255))) { byte GXor = _GetData[0]; for (int i = 1; i <= 14; i++) { GXor = Convert.ToByte(Convert.ToInt16(GXor) ^ Convert.ToInt16(_GetData[i])); } if (GXor == _GetData[15]) { //发送消息反馈 _Senddata[0] = 8; _Senddata[1] = 240; _Senddata[2] = _GetData[1]; _Senddata[3] = Convert.ToByte(TaskIndex >> 8); _Senddata[4] = Convert.ToByte(TaskIndex & 255); _Senddata[5] = Convert.ToByte(DeviceIndex); _Senddata[6] = 170; byte SXor = _Senddata[0]; for (int k = 1; k <= 6; k++) { SXor = Convert.ToByte(Convert.ToInt16(SXor) ^ Convert.ToInt16(_Senddata[k])); } _Senddata[7] = SXor; //CommonClassLib.CCarryConvert.WriteDarkCasket(this.ToString(), "WriteCom", _Senddata); if (ssp.WriteCom(_Senddata) == true) { //for (int j = 0; j <= 15; j++) //{ // _IntData[j] = Convert.ToInt16(_GetData[j]); //} if ((devinfo.DeviceKind == 14) || (devinfo.DeviceKind == 18))//确认按钮,检测开关 { _IntData[0] = Convert.ToInt16(_GetData[6]);//实际值 _IntData[1] = Convert.ToInt16(_GetData[4]);//消息:3-反馈检测开关状态(对于输送机等)其它值故障代码 _IntData[2] = TaskIndex;//任务号 _IntData[3] = 0;//堆垛机x坐标 _IntData[4] = 0;//堆垛机y坐标 _IntData[5] = DeviceIndex;// 设备号 } else if (devinfo.DeviceKind == 1)//堆垛机 { _IntData[0] = 0; _IntData[1] = Convert.ToInt16(_GetData[4]);//消息:1-任务完成 2-报告坐标(对于堆垛机)其它值故障代码 _IntData[2] = TaskIndex;//任务号 _IntData[3] = Convert.ToInt16(_GetData[6]);//堆垛机x坐标 _IntData[4] = Convert.ToInt16(_GetData[7]);//堆垛机y坐标 _IntData[5] = DeviceIndex;// 设备号 } else//其它设备 { _IntData[0] = Convert.ToInt16(_GetData[6]);//实际值 _IntData[1] = Convert.ToInt16(_GetData[4]);//消息:1-任务完成 2-报告坐标(对于堆垛机) 3-检测开关状态 其它值故障代码 _IntData[2] = TaskIndex;//任务号 _IntData[3] = Convert.ToInt16(_GetData[6]);//堆垛机x坐标 _IntData[4] = Convert.ToInt16(_GetData[7]);//堆垛机y坐标 _IntData[5] = DeviceIndex;// 设备号 } ssp.CloseCom(); return _IntData; } else { ssp.CloseCom(); _commLayerError = this.ToString() + ":GetDeviceState---" + ssp.ComError; return null; } } else { ssp.CloseCom(); return null; } } else { ssp.CloseCom(); return null; } } else { ssp.CloseCom(); _commLayerError = this.ToString() + ":GetDeviceState---" + ssp.ComError; return null; } } else { ssp.CloseCom(); return null; } } catch (Exception ex) { _commLayerError = this.ToString() + ":GetDeviceState---" + ex.Message; return null; } finally { devinfo = null; } } public string GetStringData(int DeviceIndex, int TaskIndex) { return ""; } } }