/// <summary> /// 发送任务 /// </summary> public int sendTask(TaskRecord tr) { int result = 0; Console.WriteLine("ready to send task: " + tr.singleTask.taskName + "forklist stat:" + getForkLift().taskStep + "forklift finished:" + getForkLift().finishStatus); string cmd = "cmd=set task by name;name=" + tr.taskRecordName; //发送命令格式,如果有多个对应值用;隔开,如果后面没有命令了,不需要再加;号 Console.WriteLine("send msg :" + cmd + "to " + getForkLift().forklift_number); lock (getAGVSocketClient().clientLock) { try { getAGVSocketClient().SendMessage(cmd); //确保发送成功 tr.taskRecordStat = TASKSTAT_T.TASK_SEND; tr.singleTask.taskStat = TASKSTAT_T.TASK_SEND; FormController.getFormController().getMainFrm().updateFrm(); //设置更新界面 tr.forkLiftWrapper = this; getForkLift().taskStep = TASK_STEP.TASK_SENDED; getForkLift().currentTask = tr.singleTask.taskText; DBDao.getDao().UpdateTaskRecord(tr); DBDao.getDao().updateForkLift(this); //更新车子状态 } catch (Exception ex) { Console.WriteLine(ex.ToString()); AGVLog.WriteError("发送" + tr.singleTask.taskText + " 任务到" + getForkLift().forklift_number + "号车 失败", new StackFrame(true)); result = -1; } AGVLog.WriteError("发送" + tr.singleTask.taskText + " 任务到" + getForkLift().forklift_number + "号车 成功", new StackFrame(true)); return(result); } }
public bool SendMessage(string sendMessage) { if (!sendMessage.Equals(lastMessage)) { AGVLog.WriteSendInfo(sendMessage, new StackFrame(true)); } else { } lastMessage = sendMessage; Socket msock; try { msock = getTcpClient().Client; byte[] data = Encoding.ASCII.GetBytes(sendMessage); DBDao.getDao().InsertConnectMsg(sendMessage, "SendMessage"); msock.Send(data); if (!"发送消息成功".Equals(lastMsgAboutSend)) { lastMsgAboutSend = "发送消息成功"; AGVLog.WriteConnectInfo(lastMsgAboutSend, new StackFrame(true)); } return(true); } catch (Exception se) { lastMsgAboutSend = "发送消息错误" + se.Message + ",系统稍后将重新连接AGV"; AGVLog.WriteConnectInfo(lastMsgAboutSend, new StackFrame(true)); Closeclient(); return(false); } }
public void SendMessage(string sendMessage) { Socket msock; Console.WriteLine("SendMessage ConnectStatus " + ConnectStatus); if (client == null || ConnectStatus == false) //检查连接状态 { Exception ex = new Exception("connect err"); throw (ex); } msock = client.Client; try { byte[] data = new byte[128]; data = Encoding.ASCII.GetBytes(sendMessage); msock.Send(data); } catch (Exception se) { AGVLog.WriteError("发送消息错误" + se.Message, new StackFrame(true)); Console.WriteLine("send message error" + se.Message); Closeclient(); } }
/// <summary> /// 重新与车子建立连接 /// </summary> public void reConnect() { Console.WriteLine("ConnectStatus: " + connectStatus); AGVLog.WriteInfo("ConnectStatus: " + connectStatus, new StackFrame(true)); while (forkLiftWrapper.getForkLift().isUsed == 1 && !connectStatus) { isConnectThread = true; //设置重连标志true Thread.Sleep(5000); //5秒钟重连一次 Console.WriteLine("start to reconnect"); AGVLog.WriteWarn("start to reconnect", new StackFrame(true)); TcpConnect(forkLiftWrapper.getForkLift().ip, forkLiftWrapper.getForkLift().port); if (connectStatus == true) { AGVLog.WriteInfo("reconnect ip: " + forkLiftWrapper.getForkLift().ip + " :" + forkLiftWrapper.getForkLift().port + "success", new StackFrame(true)); Console.WriteLine("reconnect ip: " + forkLiftWrapper.getForkLift().ip + ":" + forkLiftWrapper.getForkLift().port + "success"); AGVLog.WriteInfo("restart recv thread", new StackFrame(true)); //hrctCallback?.Invoke(forkLiftWrapper, true); if (hrctCallback != null) { hrctCallback(forkLiftWrapper, true); } } } isConnectThread = false; //重连成功 }
/// <summary> /// 插入任务记录 /// </summary> /// <param name="taskRecordStat"></param> /// <param name="st"></param> public void InsertTaskRecordBak(TaskRecord tr) { float now = DateTime.Now.Hour * 60 * 60 + DateTime.Now.Minute * 60 + DateTime.Now.Second; //当前时间的秒数 float excute_min = (now - (tr.updateTime.Hour * 60 * 60 + tr.updateTime.Minute * 60 + tr.updateTime.Second)) / 60; if (excute_min > 20 || excute_min < 3) { excute_min = 6; //过滤异常数据 } string sql = "INSERT INTO `agv`.`taskrecord_bak` (`taskRecordStat`, `forklift`, `singleTask`, `taskRecordExcuteMinute`) VALUES ( " + (int)tr.taskRecordStat + ", " + (int)tr.forkLift.id + ", " + tr.singleTask.taskID + ", " + excute_min + ");"; AGVLog.WriteInfo("InsertTaskRecordBak sql = " + sql, new StackFrame(true)); try { lock (lockDB) { if (this.OpenConnection() == true) { Console.WriteLine("sql = " + sql); MySqlCommand cmd = new MySqlCommand(sql, connection); cmd.ExecuteNonQuery(); this.CloseConnection(); } } } catch (Exception ex) { Console.WriteLine(ex.ToString()); this.CloseConnection(); } }
public void updateAlarm(int alarm) { Console.WriteLine(forkLift.forklift_number + "号车 alarm = " + alarm + "gAlarm =" + forkLift.gAlarm); if (alarm == 0) { forkLift.gAlarm++; } else if (alarm == 1) { forkLift.gAlarm = 0; } Console.WriteLine(forkLift.forklift_number + "号车 alarm = " + alarm + "gAlarm =" + forkLift.gAlarm); if (forkLift.gAlarm > AGVConstant.AGVALARM_TIME) //防撞信号 检测超过12次,弹出报警提示 { string msg = forkLift.forklift_number + "触发防撞,暂停所有AGV"; AGVLog.WriteError(msg, new StackFrame(true)); AGVMessage message = new AGVMessage(); message.setMessageType(AGVMessageHandler_TYPE_T.AGVMessageHandler_AGV_ALARM); message.setMessageStr(msg); TaskexeDao.getDao().InsertTaskexePause(""); TaskexeDao.getDao().InsertTaskexeSysInfo(msg); forkLift.gAlarm = 0; AGVMessageHandler.getMessageHandler().setMessage(message); } }
/// <summary> /// 更新任务记录 /// </summary> /// <param name="taskRecordStat">任务状态</param> /// <param name="st">对应的任务ID</param> public void UpdateTaskRecord(TaskRecord tr) { string sql; if (tr.forkLift == null) { sql = "update taskrecord set taskRecordStat = " + (int)tr.taskRecordStat + ", forklift = NULL , taskLevel = " + tr.taskLevel + " where taskRecordStat != 4 and singleTask = " + tr.singleTask.taskID; } else { sql = "update taskrecord set taskRecordStat = " + (int)tr.taskRecordStat + ", forklift = " + tr.forkLift.id + " , taskLevel = " + tr.taskLevel + " where taskRecordStat != 4 and singleTask = " + tr.singleTask.taskID;; } AGVLog.WriteInfo("UpdateTaskRecord sql = " + sql, new StackFrame(true)); try { lock (lockDB) { Console.WriteLine("UpdateTaskRecord sql = " + sql); if (this.OpenConnection() == true) { MySqlCommand cmd = new MySqlCommand(sql, connection); cmd.ExecuteNonQuery(); this.CloseConnection(); } } }catch (Exception ex) { Console.WriteLine(ex.ToString()); this.CloseConnection(); } }
/// <summary> /// 移除任务记录 /// </summary> /// <param name="taskRecordStat">任务状态</param> /// <param name="st">对应的任务ID</param> /// <param name="taskPalletType">托盘类型 默认托盘类型为0 表示忽略托盘类型这个条件</param> public void RemoveTaskRecord(SingleTask st, TASKSTAT_T taskRecordStat) { string sql = "delete from taskrecord where taskRecordStat = " + (int)taskRecordStat + " and singleTask = " + st.taskID; AGVLog.WriteInfo("RemoveTaskRecord sql = " + sql, new StackFrame(true)); try { lock (lockDB) { Console.WriteLine("removeTaskRecor sql = " + sql); if (this.OpenConnection() == true) { Console.WriteLine("sql = " + sql); MySqlCommand cmd = new MySqlCommand(sql, connection); cmd.ExecuteNonQuery(); this.CloseConnection(); } } }catch (Exception ex) { Console.WriteLine(ex.ToString()); this.CloseConnection(); } }
private void ServerService() { try { checkClientSocket(); while (true) { Console.WriteLine("read to send"); ForkLiftWrapper forklift = AGVCacheData.getForkLiftByID(3); StringBuilder sb = new StringBuilder(); sb.Append("battery_soc="); sb.Append(forklift.getBatteryInfo().getBatterySoc() + ";"); sb.Append("agvMessage="); sb.Append((int)AGVMessageHandler.getMessageHandler().getMessage().getMessageType()); Console.WriteLine(" send data = " + sb.ToString()); AGVLog.WriteError(" send data = " + sb.ToString(), new StackFrame(true)); byte[] byteData = Encoding.ASCII.GetBytes(sb.ToString()); DBDao.getDao().InsertConnectMsg(sb.ToString(), "ServerService"); clientSocket.Send(byteData); Thread.Sleep(10000); } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } serverFuncOK = true; turnToMainThread(); }
public void Closeclient() { try { ConnectStatus = false; if (client != null) { AGVLog.WriteInfo("关闭socket", new StackFrame(true)); client.Client.Close(); client.Close(); client = null; if (isConnectThread == false && t_forklift.isUsed == 1) //connect断开后开启与车子重连 { Console.WriteLine("Close to start reconnect" + isConnectThread); startReconnectThread(); } if (t_forklift.isUsed == 1) { if (hrctCallback != null) { hrctCallback(this, false); } } } } catch (Exception ex) { AGVLog.WriteError("关闭socket错误" + ex.Message, new StackFrame(true)); Console.WriteLine("close socket fail"); } Console.WriteLine("client is null now"); AGVLog.WriteWarn("client is null now", new StackFrame(true)); }
/// <summary> /// 解析车子反馈报文 /// </summary> private string parseForkLiftMsg(byte[] buffer, int length) { if (buffer.Length == 0) { AGVLog.WriteError("forklift buffer length is 0", new StackFrame(true)); Console.WriteLine("forklift buffer length is 0"); return(null); } return(Encoding.ASCII.GetString(buffer).Trim('\0').Trim()); }
private TcpClient getTcpClient() { while (client == null) { Console.WriteLine("client is null wait 1 second"); AGVLog.WriteWarn("client is null, wait 1 second", new StackFrame(true)); Thread.Sleep(1); } return(client); }
public void setMessage(AGVMessage message) { if (this.message.getMessageType() != message.getMessageType()) { this.message_next = message; //下一个要处理的message type与当前的message不一样 AGVLog.WriteInfo("AGVMessageHandler set message " + message.getMessageStr(), new StackFrame(true)); } else { AGVLog.WriteInfo("AGVMessageHandler set same message " + message.getMessageStr(), new StackFrame(true)); } }
public void DeleteWithSql(string sql) { string query = sql; AGVLog.WriteInfo("DeleteWithSql sql = " + sql, new StackFrame(true)); try { lock (lockDB) { dataReader = execNonQuery(sql); } } catch (Exception) { Console.WriteLine(" delete sql err : " + sql); } }
/// <summary> /// 移除任务记录 /// </summary> public void RemoveTaskRecord(TaskRecord tr) { string sql = "delete from taskrecord where taskRecordStat = " + (int)tr.taskRecordStat + " and forklift = " + tr.forkLiftWrapper.getForkLift().id + " and singleTask = " + tr.singleTask.taskID; AGVLog.WriteInfo("RemoveTaskRecord sql = " + sql, new StackFrame(true)); try { lock (lockDB) { dataReader = execNonQuery(sql); } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } }
/// <summary> /// 插入任务记录 /// </summary> public void InsertTaskRecord(TASKSTAT_T taskRecordStat, SingleTask st) { string sql = "INSERT INTO `taskrecord` (`taskRecordStat`, `singleTask`) VALUES ( " + (int)taskRecordStat + ", " + st.taskID + ");"; AGVLog.WriteInfo("InsertTaskRecord sql = " + sql, new StackFrame(true)); try { lock (lockDB) { dataReader = execNonQuery(sql); } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } }
public void agvInit() { AGVLog.WriteInfo("程序启动", new StackFrame(true)); forkLiftList = getAGVUtil().getForkLiftList(); singleTaskList = getSingleTaskList(); setForkliftStateFirst(); ENV_ERR_TYPE err = checkRunning(); handleCheckRunning(err); agvCom.startReadSerialPortThread(); }
/// <summary> /// 与叉车连接 /// </summary> public void connectForks() { foreach (ForkLiftWrapper fl in forkLiftWrapperList) { try { fl.setAGVSocketClient(new AGVSocketClient()); fl.getAGVSocketClient().registerRecvMessageCallback(handleForkLiftMsg); fl.getAGVSocketClient().startRecvMsg(); } catch (Exception ex) { AGVLog.WriteConnectInfo("连接到 ip: " + fl.getForkLift().ip + "port: " + fl.getForkLift().port + "失败!" + ex.Message, new StackFrame(true)); } } }
/// <summary> /// 更新车子状态 /// </summary> public void updateForkLift(ForkLiftWrapper fl) { string sql = "update forklift set currentTask = \"" + fl.getForkLift().currentTask + "\", taskStep = " + (int)fl.getForkLift().taskStep + " where id = " + fl.getForkLift().id; AGVLog.WriteInfo("updateForkLift sql = " + sql, new StackFrame(true)); try { lock (lockDB) { dataReader = execNonQuery(sql); } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } }
/// <summary> /// 移除任务记录 /// </summary> public void RemoveTaskRecord(SingleTask st, TASKSTAT_T taskRecordStat) { string sql = "delete from taskrecord where taskRecordStat = " + (int)taskRecordStat + " and singleTask = " + st.taskID; AGVLog.WriteInfo("RemoveTaskRecord sql = " + sql, new StackFrame(true)); try { lock (lockDB) { Console.WriteLine("removeTaskRecor sql = " + sql); dataReader = execNonQuery(sql); } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } }
// <summary> /// 判断字符串是否符合给定的标准 /// </summary> /// <param name="value">待判断的值</param> /// <param name="regex">正则表达式</param> /// <returns></returns> public static bool IsMatch(string value, string regex) { Match m = Regex.Match(value, regex); if (m.Success) { return(true); } else { AGVLog.WriteError("match err", new System.Diagnostics.StackFrame(true)); return(false); } }
private void Closeclient() { try { if (tcpClient != null) { tcpClient.Client.Close(); tcpClient.Close(); tcpClient = null; } Thread.Sleep(5000); } catch (Exception ex) { lastMsgAboutSend = "关闭socket错误" + ex.Message + ",系统稍后将重新连接AGV"; AGVLog.WriteConnectInfo(lastMsgAboutSend, new StackFrame(true)); } }
public void resolveTaskCommand() { try { while (true) { if (TaskexeService.getInstance().isSystemRunning()) { sendCommand(); } Thread.Sleep(1000); } } catch (Exception) { AGVLog.WriteSendInfo("循环器异常退出!", new StackFrame(true)); } }
public void click(object sender, EventArgs e) { string cmd = "cmd=set task by name;name=" + this.Name + ";"; AGVLog.WriteError("向AGV下达命令: " + cmd, new StackFrame(true)); Console.WriteLine("向AGV下达命令: " + cmd); if (AGVEngine.getInstance().isAgvReady()) { ForkLiftWrappersService.getInstance().getForkLiftByNunber(1).getAGVSocketClient().SendMessage(cmd); } else { MessageBox.Show("环境中AGV尚未准备妥当"); } }
public static void Send(Socket handler) { StringBuilder sb = new StringBuilder(); sb.Append("battery_soc="); sb.Append(forklift.getBatterySoc() + ";"); sb.Append("agvMessage="); sb.Append((int)AGVInitialize.getInitialize().getAGVMessage().getMessage().getMessageType()); Console.WriteLine(" send data = " + sb.ToString()); AGVLog.WriteError(" send data = " + sb.ToString(), new StackFrame(true)); byte[] byteData = Encoding.ASCII.GetBytes(sb.ToString()); handler.Send(byteData); }
private void receive(object fl) { //ForkLiftWrapper forklift = new ForkLiftWrapper(); //forklift.setForkLift((ForkLiftItem)fl); byte[] buffer = new byte[512]; Socket msock; TcpClient vClient = null; Console.WriteLine("receive ConnectStatus: " + connectStatus); if (connectStatus == false) //检查连接状态 { return; } while (isRecvMsgFlag) { try { vClient = getTcpClient(); msock = tcpClient.Client; Array.Clear(buffer, 0, buffer.Length); tcpClient.GetStream(); int bytes = msock.Receive(buffer); string receiveStr = Encoding.ASCII.GetString(buffer).Trim(); CommandService.getInstance().setLatestMsgFromClient(receiveStr); DBDao.getDao().InsertConnectMsg(receiveStr, "receive"); readTimeOutTimes = 0; //读取超时次数清零 if (hrmCallback != null) { hrmCallback(forkLiftWrapper.getForkLift().id, buffer, bytes); } } catch (SocketException ex) { if (ex.ErrorCode == 10060 && readTimeOutTimes < 10) //超时次数超过10次,关闭socket进行重连 { AGVLog.WriteWarn("read msg timeout", new StackFrame(true)); Console.WriteLine("read msg timeout"); readTimeOutTimes++; continue; } AGVLog.WriteError("读取消息错误" + ex.ErrorCode, new StackFrame(true)); Console.WriteLine("recv msg client close" + ex.ErrorCode); Closeclient(); } catch (Exception ex) { Closeclient(); } } }
/// <summary> /// /// </summary> /// <param name="needStart">需要启动的车</param> /// <param name="work"></param> /// <returns></returns> private bool check_start_state(ForkLiftWrapper needStart, ForkLiftWrapper work) { if (work.getPosition().getArea() == 1 && work.getForkLift().isUsed == 1) //只有下货阶段可以提前启动 { if (!ScheduleFactory.getSchedule().getDownDeliverPeriod() && work.getPosition().getPx() - needStart.getPosition().getPx() > 500) { return true; } ///上货的时候直接不给启动 Console.WriteLine("叉车 " + work.getForkLift().id + "在区域1,不能启动" + " 距离 " + (work.getPosition().getPx() - needStart.getPosition().getPx())); AGVLog.WriteInfo("叉车 " + work.getForkLift().id + "在区域1,不能启动" + " 距离 " + (work.getPosition().getPx() - needStart.getPosition().getPx()), new StackFrame(true)); return false; } return true; }
public void listenThread1() { while (true) { if (thread1 == null) { return; } else { AGVLog.WriteThreadInfo(thread1.Name + "的执行状态为:" + thread1.ThreadState + ",其托管线程id为" + thread1.ManagedThreadId, new StackFrame(true)); } Thread.Sleep(2000); } }
private void flReconnect(ForkLiftWrapper forkLiftWrapper, bool status) { if (status) //如果接收成功 { forkLiftWrapper.getAGVSocketClient().startRecvMsg(); //重新启动接收程序线程 } else { AGVLog.WriteError(forkLiftWrapper.getForkLift().forklift_number + "号车 连接错误", new StackFrame(true)); AGVMessage message = new AGVMessage(); message.setMessageType(AGVMessageHandler_TYPE_T.AGVMessageHandler_NET_ERR); message.setMessageStr(forkLiftWrapper.getForkLift().forklift_number + "号车 连接错误"); AGVMessageHandler.getMessageHandler().setMessage(message); } }
static void Main() { AGVLog agvLog = new AGVLog(); //List<SingleTask> sList = new List<SingleTask>(); agvLog.initAGVLog(); //初始化log Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); AGVInitialize.getInitialize().getLoginFrm().ShowDialog(); //agvTask.startConnectForkLift(); //开始与车子建立连接 //agvTask.startPLCRecv(); //开始采集PLC数据 //agvTask.startToHandleTaskList(); //开始处理任务发送 AGVInitialize.getInitialize().agvInit(); AGVInitialize.getInitialize().getAGVTcpServer().StartAccept(); AGVInitialize.getInitialize().getSchedule().startShedule(); AGVInitialize.getInitialize().getAGVMessage().setUsbGreenLed(); //default green led AGVInitialize.getInitialize().getAGVMessage().StartHandleMessage(); int i = 0; //while(i < 1) { i++; //AGVInitialize.getInitialize().getAGVCom().setDataCommand(LIFT_IN_COMMAND_T.LIFT_IN_COMMAND_UP); } AGVInitialize.getInitialize().getMainFrm().ShowDialog(); //Application.Run(AGVInitialize.getInitialize().getMainFrm()); //AGVTcpClient tcpClient = new AGVTcpClient(); //Thread.Sleep(1000); //tcpClient.SendMessage("cmd=set task by name;name=abing;"); //connectDB(); //AGVInitialize init = AGVInitialize.getInitialize(); //init.getAllForkLifts(false); // //while (!isExit) { Thread.Sleep(5); }; }