/// <summary> /// 分配设备的DB1,DB2地址区 /// </summary> /// <returns></returns> protected bool AllocDevDBAddr() { try { if (devModel != null) { //配置DB1 AllocDevComAddrsDB1(); //配置DB2 AllocDevComAddrsDB2(); for (int i = 0; i < dicCommuDataDB1.Count(); i++) { int commuID = i + 1; DevCommDatatype commObj = dicCommuDataDB1[commuID]; if (commObj == null) { continue; } dicDataDB1Last[commObj.CommuID] = commObj.Val; } if (dicCommuDataDB2.Count() > 0) { foreach (KeyValuePair <int, DevCommDatatype> keyVal in dicCommuDataDB2) { if (keyVal.Value == null) { continue; } DevCommDatatype commObj = keyVal.Value; dicDataDB2Last[commObj.CommuID] = commObj.Val; } } return(true); } else { return(false); } } catch (System.Exception ex) { //触发错误日志,2004 int errorCode = 2004; string reStr = ""; if (!ECAMWCS.GetErrorContent(errorCode, ref reStr)) { AddLog("配置设备" + this.devModel.DeviceID + " 出现异常," + ex.Message + "," + ex.StackTrace, EnumLogType.错误); } else { reStr = "设备:" + this.devModel.DeviceID + reStr; reStr += (ex.Message + "," + ex.StackTrace); OnErrorHappen(errorCode, reStr, true); } return(false); } }
/// <summary> /// 分配DB1通信地址 /// </summary> /// <returns></returns> protected virtual void AllocDevComAddrsDB1() { dicCommuDataDB1.Clear(); int db1ID = 1; int plcAddrStart = int.Parse(this.devModel.DB1AddrStart.Substring(1)); string dbName = "D"; DevCommDatatype commData = null; //1.配置“开始写入”功能项 commData = new DevCommDatatype(); commData.CommuID = db1ID++; commData.CommuMethod = EnumCommMethod.PLC_MIT_COMMU; commData.DataByteLen = 2; commData.DataDescription = "2:开始写入,1:未开始写入"; commData.DataTypeDef = EnumCommuDataType.DEVCOM_short; commData.Val = 0; commData.DataAddr = dbName + plcAddrStart.ToString();//取值为:S7:[Connection_1]DB1,INT,数据类型可变,马天牧 plcAddrStart++; dicCommuDataDB1[commData.CommuID] = commData; //2.配置“写入完成”功能项 commData = new DevCommDatatype(); commData.CommuID = db1ID++; commData.CommuMethod = EnumCommMethod.PLC_MIT_COMMU; commData.DataByteLen = 2; commData.DataDescription = "2:参数写入完成,1:未完成"; commData.DataTypeDef = EnumCommuDataType.DEVCOM_short; commData.Val = 0; commData.DataAddr = dbName + plcAddrStart.ToString(); plcAddrStart++; dicCommuDataDB1[commData.CommuID] = commData; //3.配置"任务完成接收”功能项 commData = new DevCommDatatype(); commData.CommuID = db1ID++; commData.CommuMethod = EnumCommMethod.PLC_MIT_COMMU; commData.DataByteLen = 2; commData.DataDescription = "2:任务完成信息成功接收,1:未接收"; commData.DataTypeDef = EnumCommuDataType.DEVCOM_short; commData.Val = 0; commData.DataAddr = dbName + plcAddrStart.ToString(); plcAddrStart++; dicCommuDataDB1[commData.CommuID] = commData; //4.配置“任务类型号”功能项 commData = new DevCommDatatype(); commData.CommuID = db1ID++; commData.CommuMethod = EnumCommMethod.PLC_MIT_COMMU; commData.DataByteLen = 2; commData.DataDescription = "任务类型号,1:装箱组盘,2:一次分拣,3:二次分拣,5:A1库电芯入库" + "6:A1库分容后再入库,7:A1库分容出库,8:A1库出库至一次检测" + "9:B1库入库,10:B1库出库至二次检测,11:B1库空料框入库,12:B1库空料框出库"; commData.DataTypeDef = EnumCommuDataType.DEVCOM_short; commData.Val = 0; commData.DataAddr = dbName + plcAddrStart.ToString(); plcAddrStart++; dicCommuDataDB1[commData.CommuID] = commData; }
public void SaveLastLoopData() { //上拍数据初始化成和当前值相同 foreach (KeyValuePair <int, DevCommDatatype> keyVal in dicCommuDataDB2) { if (keyVal.Value == null) { continue; } DevCommDatatype commObj = keyVal.Value; dicDataDB2Last[commObj.CommuID] = commObj.Val; } }
public bool SetDB2ItemValue(int itemID, string valStr) { if (!dicCommuDataDB2.Keys.Contains(itemID)) { return(false); } DevCommDatatype commObj = dicCommuDataDB2[itemID]; if (commObj == null) { return(false); } commObj.Val = valStr; return(true); }
/// <summary> /// 如有更新,设备指令发送,写入DB1 /// </summary> /// <returns></returns> public bool DevCmdCommit() { if (plcRW == null) { return(false); } //把变量转换成通信数据 lock (lockDB1) { //把变量转换成通信数据 if (this.devModel.DeviceID == "1001") { plcRW.StationNumber = 0x01; } else if (this.devModel.DeviceID == "1002") { plcRW.StationNumber = 0x02; } CmdToCommuDataDB1(); foreach (KeyValuePair <int, DevCommDatatype> keyVal in dicCommuDataDB1) { if (keyVal.Value == null) { continue; } DevCommDatatype commObj = keyVal.Value; // if (commObj.Val.ToString() != dicDB1Read[commObj.CommuID].ToString()) if (commObj.Val.ToString() != dicDataDB1Last[commObj.CommuID].ToString()) { int val = int.Parse(commObj.Val.ToString()); if (!plcRW.WriteDB(commObj.DataAddr, val)) { AddLog(devName + "发送命令数据失败,通信可能中断", EnumLogType.错误); return(false); } dicDataDB1Last[commObj.CommuID] = commObj.Val; } } } return(true); }
//public IList<string> GetDB1Data() //{ // IList<string> commDataList = new List<string>(); // commDataList.Add(plcDataDb1[0].ToString()); // commDataList.Add(startWriteParam.ToString()); // commDataList.Add(writeCompleted.ToString()); // commDataList.Add(taskCompletedReq.ToString()); // commDataList.Add(taskTypeSnd.ToString()); // commDataList.Add(taskCodeSnd.ToString()); // for (int i = 7; i < devModel.BytesLenDB1; i++) // { // commDataList.Add(plcDataDb1[i].ToString()); // } // return commDataList; //} //public IList<string> GetDB2Data() //{ // IList<string> commDataList = new List<string>(); // commDataList.Add(plcDataDb2[0].ToString()); // commDataList.Add(devRunningStatus.ToString()); // commDataList.Add(recvTaskEnable.ToString()); // commDataList.Add(paramRecvOK.ToString()); // commDataList.Add(taskCompleted.ToString()); // commDataList.Add(taskCodeBack.ToString()); // for (int i = 7; i < plcDataDb2.Count(); i++) // { // commDataList.Add(plcDataDb2[i].ToString()); // } // return commDataList; //} public DataTable GetDB1DataDetail() { DataTable dt = new DataTable(); dt.Columns.Add("索引"); dt.Columns.Add("地址"); dt.Columns.Add("内容"); dt.Columns.Add("描述"); int index = 1; // lock (lockDB1) { for (int i = 0; i < dicCommuDataDB1.Count(); i++) { DevCommDatatype commObj = dicCommuDataDB1[i + 1]; dt.Rows.Add(index++, commObj.DataAddr, commObj.Val, commObj.DataDescription); } } return(dt); }
protected override void AllocDevComAddrsDB1() { int db1ID = 1; int plcAddrStart = int.Parse(this.devModel.DB1AddrStart.Substring(1)); string dbName = "D"; DevCommDatatype commData = null; if (devModel.DeviceID == "2002" || devModel.DeviceID == "2004" || devModel.DeviceID == "2006") { //1.配置“开始写入”功能项 commData = new DevCommDatatype(); commData.CommuID = db1ID++; commData.CommuMethod = EnumCommMethod.PLC_MIT_COMMU; commData.DataByteLen = 2; commData.DataDescription = "2:前后两筐同一个批次,1:不是同一批次"; commData.DataTypeDef = EnumCommuDataType.DEVCOM_short; commData.Val = 0; commData.DataAddr = dbName + plcAddrStart.ToString();//取值为:S7:[Connection_1]DB1,INT,数据类型可变,马天牧 plcAddrStart++; dicCommuDataDB1[commData.CommuID] = commData; commData = new DevCommDatatype(); commData.CommuID = db1ID++; commData.CommuMethod = EnumCommMethod.PLC_MIT_COMMU; commData.DataByteLen = 2; commData.DataDescription = "扫码状态,1:未完成,2:扫码完成,3: 扫码失败,4: 不可识别的托盘," + "5:批次信息不存在,6: 托盘电芯为空,7: 托盘ID重复读取,入口缓存已存在同样托盘ID,8:国轩数据库已经存在同样的托盘ID"; commData.DataTypeDef = EnumCommuDataType.DEVCOM_short; commData.Val = 0; commData.DataAddr = dbName + plcAddrStart.ToString();//取值为:S7:[Connection_1]DB1,INT,数据类型可变,马天牧 plcAddrStart++; dicCommuDataDB1[commData.CommuID] = commData; commData = new DevCommDatatype(); commData.CommuID = db1ID++; commData.CommuMethod = EnumCommMethod.PLC_MIT_COMMU; commData.DataByteLen = 2; commData.DataDescription = "入库请求,1:复位2:入库请求,3:入口处缓存为空,请人工处理"; commData.DataTypeDef = EnumCommuDataType.DEVCOM_short; commData.Val = 0; commData.DataAddr = dbName + plcAddrStart.ToString();//取值为:S7:[Connection_1]DB1,INT,数据类型可变,马天牧 plcAddrStart++; dicCommuDataDB1[commData.CommuID] = commData; } if (devModel.DeviceID == "2005" || devModel.DeviceID == "2007") { //1.配置“开始写入”功能项 commData = new DevCommDatatype(); commData.CommuID = db1ID++; commData.CommuMethod = EnumCommMethod.PLC_MIT_COMMU; commData.DataByteLen = 2; commData.DataDescription = "OCV检测区读卡,1:未完成,2:扫码完成,3: 扫码失败,4: 不可识别的托盘(数据库中不存在)"; commData.DataTypeDef = EnumCommuDataType.DEVCOM_short; commData.Val = 0; commData.DataAddr = dbName + plcAddrStart.ToString();//取值为:S7:[Connection_1]DB1,INT,数据类型可变,马天牧 plcAddrStart++; dicCommuDataDB1[commData.CommuID] = commData; } else if (devModel.DeviceID == "2008") { commData = new DevCommDatatype(); commData.CommuID = db1ID++; commData.CommuMethod = EnumCommMethod.PLC_MIT_COMMU; commData.DataByteLen = 2; commData.DataDescription = "入库请求,1:复位2:入库请求"; commData.DataTypeDef = EnumCommuDataType.DEVCOM_short; commData.Val = 0; commData.DataAddr = dbName + plcAddrStart.ToString();//取值为:S7:[Connection_1]DB1,INT,数据类型可变,马天牧 plcAddrStart++; dicCommuDataDB1[commData.CommuID] = commData; } return; }
protected override void AllocDevComAddrsDB2() { if (devModel.DeviceID == "2003" || devModel.DeviceID == "2005" || devModel.DeviceID == "2007" || devModel.DeviceID == "2009") { int db2ID = 1; int plcAddrStart = int.Parse(this.devModel.DB2AddrStart.Substring(1)); string dbName = "D"; DevCommDatatype commData = null; //1 配置故障码 commData = new DevCommDatatype(); commData.CommuID = db2ID++; commData.CommuMethod = EnumCommMethod.PLC_MIT_COMMU; commData.DataByteLen = 2; commData.DataDescription = "1:禁止出库2:允许出库"; commData.DataTypeDef = EnumCommuDataType.DEVCOM_short; commData.Val = 0; commData.DataAddr = dbName + plcAddrStart.ToString(); plcAddrStart++; dicCommuDataDB2[commData.CommuID] = commData; if (devModel.DeviceID == "2005" || devModel.DeviceID == "2007") { commData = new DevCommDatatype(); commData.CommuID = db2ID++; commData.CommuMethod = EnumCommMethod.PLC_MIT_COMMU; commData.DataByteLen = 2; commData.DataDescription = "2:OCV检测读卡完成,1:未完成"; commData.DataTypeDef = EnumCommuDataType.DEVCOM_short; commData.Val = 0; commData.DataAddr = dbName + plcAddrStart.ToString(); plcAddrStart++; dicCommuDataDB2[commData.CommuID] = commData; } } else { int db2ID = 1; int plcAddrStart = int.Parse(this.devModel.DB2AddrStart.Substring(1)); string dbName = "D"; DevCommDatatype commData = null; //1 配置故障码 commData = new DevCommDatatype(); commData.CommuID = db2ID++; commData.CommuMethod = EnumCommMethod.PLC_MIT_COMMU; commData.DataByteLen = 2; commData.DataDescription = "2:入库请求,1:无入库请求"; commData.DataTypeDef = EnumCommuDataType.DEVCOM_short; commData.Val = 0; commData.DataAddr = dbName + plcAddrStart.ToString(); plcAddrStart++; dicCommuDataDB2[commData.CommuID] = commData; commData = new DevCommDatatype(); commData.CommuID = db2ID++; commData.CommuMethod = EnumCommMethod.PLC_MIT_COMMU; commData.DataByteLen = 2; commData.DataDescription = "入口料框数量"; commData.DataTypeDef = EnumCommuDataType.DEVCOM_short; commData.Val = 0; commData.DataAddr = dbName + plcAddrStart.ToString(); plcAddrStart++; dicCommuDataDB2[commData.CommuID] = commData; commData = new DevCommDatatype(); commData.CommuID = db2ID++; commData.CommuMethod = EnumCommMethod.PLC_MIT_COMMU; commData.DataByteLen = 2; commData.DataDescription = "2:料框扫码请求,1:无请求"; commData.DataTypeDef = EnumCommuDataType.DEVCOM_short; commData.Val = 0; commData.DataAddr = dbName + plcAddrStart.ToString(); plcAddrStart++; dicCommuDataDB2[commData.CommuID] = commData; commData = new DevCommDatatype(); commData.CommuID = db2ID++; commData.CommuMethod = EnumCommMethod.PLC_MIT_COMMU; commData.DataByteLen = 2; commData.DataDescription = "2:收到成功扫码信息,1:没有收到(或已复位)"; commData.DataTypeDef = EnumCommuDataType.DEVCOM_short; commData.Val = 0; commData.DataAddr = dbName + plcAddrStart.ToString(); plcAddrStart++; dicCommuDataDB2[commData.CommuID] = commData; } return; }
//public string[] AddrDB1 //{ // get // { // return plcAddrDb1; // } // set // { // plcAddrDb1 = value; // } //} //public string[] AddrDB2 //{ // get // { // return plcAddrDb2; // } // set // { // plcAddrDb2 = value; // } //} //public byte[] DB1 //{ // get // { // return plcDataDb1; // } // private set { } //} //public byte[] DB2 //{ // get // { // return plcDataDb2; // } // private set { } //} #endregion #region 公共方法 public bool Init() { string reStr = ""; //分配地址 if (!AllocDevDBAddr()) { return(false); } //系统启动后,先把DB1数据读上来 if (this.devModel.DeviceID == "1001") { plcRW.StationNumber = 0x01; } else if (this.devModel.DeviceID == "1002") { plcRW.StationNumber = 0x02; } short[] db1Vals = null; if (dicCommuDataDB1.Count() > 0) { if (!plcRW.ReadMultiDB(devModel.DB1AddrStart, dicCommuDataDB1.Count(), ref db1Vals)) { AddLog("恢复设备命令失败", EnumLogType.错误); return(false); } for (int i = 0; i < dicCommuDataDB1.Count(); i++) { int commuID = i + 1; DevCommDatatype commObj = dicCommuDataDB1[commuID]; if (commObj == null) { continue; } commObj.Val = db1Vals[i]; dicDataDB1Last[commObj.CommuID] = commObj.Val; } } if (this.devModel.DeviceType == EnumDevType.堆垛机.ToString() || this.devModel.DeviceType == EnumDevType.机械手.ToString()) { byte val = byte.Parse(this.dicCommuDataDB1[1].Val.ToString()); if (val == 2) { startWriteParam = true; } else { startWriteParam = false; } val = byte.Parse(this.dicCommuDataDB1[2].Val.ToString()); if (val == 2) { writeCompleted = true; } else { writeCompleted = false; } val = byte.Parse(this.dicCommuDataDB1[3].Val.ToString()); taskCompletedReq = val; taskTypeSnd = int.Parse(this.dicCommuDataDB1[4].Val.ToString()); } if (!ReadDB2()) { AddLog(devName + " 读取设备状态数据失败", EnumLogType.错误); return(false); } //上拍数据初始化成和当前值相同 if (dicCommuDataDB2.Count() > 0) { foreach (KeyValuePair <int, DevCommDatatype> keyVal in dicCommuDataDB2) { if (keyVal.Value == null) { continue; } DevCommDatatype commObj = keyVal.Value; dicDataDB2Last[commObj.CommuID] = commObj.Val; } } if (!DevStatusRestore(ref reStr)) { string errStr = ""; int errCode = 2105; if (!ECAMWCS.GetErrorContent(errCode, ref errStr)) { AddLog(devName + " 恢复状态出现错误", EnumLogType.错误); } else { errStr = devName + reStr; OnErrorHappen(errCode, errStr, false); } return(false); } return(true); }
protected virtual void AllocDevComAddrsDB2() { dicCommuDataDB2.Clear(); int db2ID = 1; int plcAddrStart = int.Parse(this.devModel.DB2AddrStart.Substring(1)); string dbName = "D"; DevCommDatatype commData = null; //1 配置故障码 commData = new DevCommDatatype(); commData.CommuID = db2ID++; commData.CommuMethod = EnumCommMethod.PLC_MIT_COMMU; commData.DataByteLen = 2; commData.DataDescription = "设备故障码"; commData.DataTypeDef = EnumCommuDataType.DEVCOM_short; commData.Val = 0; commData.DataAddr = dbName + plcAddrStart.ToString(); plcAddrStart++; dicCommuDataDB2[commData.CommuID] = commData; //2 配置设备状态 commData = new DevCommDatatype(); commData.CommuID = db2ID++; commData.CommuMethod = EnumCommMethod.PLC_MIT_COMMU; commData.DataByteLen = 2; commData.DataDescription = "设备状态,1:空闲,2:工作中,3:故障"; commData.DataTypeDef = EnumCommuDataType.DEVCOM_short; commData.DataAddr = dbName + plcAddrStart.ToString(); plcAddrStart++; dicCommuDataDB2[commData.CommuID] = commData; if (ECAMWCS.SimMode) { commData.Val = 1; } else { commData.Val = 0; } //3 配置允许接收 commData = new DevCommDatatype(); commData.CommuID = db2ID++; commData.CommuMethod = EnumCommMethod.PLC_MIT_COMMU; commData.DataByteLen = 2; commData.DataDescription = "允许接收,1:禁止接收任务,2:允许接收"; commData.DataTypeDef = EnumCommuDataType.DEVCOM_short; commData.DataAddr = dbName + plcAddrStart.ToString(); plcAddrStart++; dicCommuDataDB2[commData.CommuID] = commData; commData.Val = 0; //4 配置取数据完成 commData = new DevCommDatatype(); commData.CommuID = db2ID++; commData.CommuMethod = EnumCommMethod.PLC_MIT_COMMU; commData.DataByteLen = 2; commData.DataDescription = "2:取数据完成,1:未完成"; commData.DataTypeDef = EnumCommuDataType.DEVCOM_short; commData.DataAddr = dbName + plcAddrStart.ToString(); plcAddrStart++; dicCommuDataDB2[commData.CommuID] = commData; commData.Val = 0; //5 配置任务完成 commData = new DevCommDatatype(); commData.CommuID = db2ID++; commData.CommuMethod = EnumCommMethod.PLC_MIT_COMMU; commData.DataByteLen = 2; commData.DataDescription = "1:任务未完成,2:任务完成,3:任务撤销"; commData.DataTypeDef = EnumCommuDataType.DEVCOM_short; commData.DataAddr = dbName + plcAddrStart.ToString(); plcAddrStart++; dicCommuDataDB2[commData.CommuID] = commData; commData.Val = 0; }