public bool BeginBoot() { BaseSession = new Session(); Session.BaseSession = BaseSession; Shell = new Bin.Bash(NewPid()); BaseSession.Shell = Shell; BaseSession.MainSystem = this; Shell.StdOut.WriteLine("Booting..."); MainDeviceManager = new Device.DeviceManager(this); RootDrive = new FileSystem.FileSystem(this); RootDrive.RootFolder = Path.Combine(Directory.GetCurrentDirectory(), "root"); Directory.CreateDirectory(RootDrive.RootFolder); ActivePrograms = new Dictionary <int, Bin.Program>(); BinPrograms = new Dictionary <string, Type>(); AddProgram("echo", typeof(Bin.Echo)); AddProgram("pwd", typeof(Bin.Pwd)); AddProgram("cd", typeof(Bin.Cd)); AddProgram("cp", typeof(Bin.Cp)); AddProgram("ls", typeof(Bin.Ls)); AddProgram("clear", typeof(Bin.Clear)); AddProgram("lua", typeof(Bin.RunLua)); AddProgram("cat", typeof(Bin.Cat)); AddProgram("mkdir", typeof(Bin.Mkdir)); AddProgram("mv", typeof(Bin.Mv)); AddProgram("rm", typeof(Bin.Rm)); AddProgram("ln", typeof(Bin.Ln)); AddProgram("mkdevice", typeof(Bin.MakeDevice)); RootDrive.MakeDirectory(new NixPath("/dev"), true); Device.CharacterDevice device = new Device.NullDevice(); MainDeviceManager.AddDevice(device); RootDrive.MakeCharacterDevice(new NixPath("/dev/null"), device.Id); device = new Device.ZeroDevice(); MainDeviceManager.AddDevice(device); RootDrive.MakeCharacterDevice(new NixPath("/dev/zero"), device.Id); device = new Device.TestDevice(); MainDeviceManager.AddDevice(device); RootDrive.MakeCharacterDevice(new NixPath("/dev/test"), device.Id); /* * Terminal term = GetComponent<Terminal>(); * if (term != null) * { * //term.Shell = Shell; * //term.CurrentSession = BaseSession; * } */ Shell.StdOut.WriteLine("Booting Complete..."); Shell.ExecuteAsync(this, BaseSession, new string[] { "" }); return(true); }
/// <summary> /// コンストラクタ /// </summary> /// <param name="cfg">設定クラス</param> /// <param name="_recipeNo">レシピ番号</param> /// <param name="_user">作業者</param> public ControllerInspection(Config.ConfigDataManager cfg, Device.DeviceManager dev, string _recipeNo, Operator _user) { m_recipeNo = _recipeNo; m_user = _user; m_devMgr = dev; m_cfg = cfg; }
/// <summary> /// Обновление дерева на основе текущих устройств проекта. /// </summary> /// <param name="deviceManager">Менеджер устройств проекта.</param> /// <param name="checkedDev">Выбранные устройства.</param> private void Refresh(Device.DeviceManager deviceManager, string checkedDev) { devicesTreeViewAdv.BeginUpdate(); devicesTreeViewAdv.Model = null; devicesTreeViewAdv.Refresh(); var treeModel = new TreeModel(); string mainNodeName = "Устройства проекта"; var root = new Node(mainNodeName); treeModel.Nodes.Add(root); // Подтипы, которые отдельно записываем в устройства var devicesSubTypesEnum = new string[] { "AI_VIRT", "AO_VIRT", "DI_VIRT", "DO_VIRT" }; object[] devicesArray = GenerateArrayObjectsForFill( devicesSubTypesEnum); FillMainDevicesInNode(root, devicesArray); Dictionary <string, int> countDev = MakeDevicesCounterDictionary( root.Nodes); foreach (Device.IODevice dev in deviceManager.Devices) { string deviceDescription = GenerateDeviceDescription(dev); string devSubType = dev.GetDeviceSubTypeStr(dev.DeviceType, dev.DeviceSubType); if (devicesSubTypesEnum.Contains(devSubType)) { FillSubTypeNode(dev, root, deviceDescription, countDev); } else { FillTypeNode(dev, root, deviceDescription, countDev, checkedDev); } } UpdateDevicesCountInHeaders(devicesArray, root, countDev); SortTreeView(treeModel); devicesTreeViewAdv.Model = treeModel; List <TreeNodeAdv> nodes = devicesTreeViewAdv.AllNodes.ToList(); TreeNodeAdv treeNode = nodes[0]; OnHideOperationTree.Execute(treeNode); devicesTreeViewAdv.ExpandAll(); devicesTreeViewAdv.Refresh(); devicesTreeViewAdv.EndUpdate(); }
virtual public void ModifyDevNames(int newTechObjectN, int oldTechObjectN, string techObjectName) { List <int> tmpIndex = new List <int>(); foreach (int index in deviceIndex) { tmpIndex.Add(index); } Device.DeviceManager deviceManager = Device.DeviceManager .GetInstance(); foreach (int index in deviceIndex) { var newDevName = string.Empty; Device.IODevice device = deviceManager.GetDeviceByIndex(index); int objNum = device.ObjectNumber; string objName = device.ObjectName; if (objNum > 0) { //Для устройств в пределах объекта меняем номер объекта. if (techObjectName == objName) { // COAG2V1 --> COAG1V1 if (objNum == newTechObjectN && oldTechObjectN != -1) { newDevName = objName + oldTechObjectN + device.DeviceType.ToString() + device. DeviceNumber; } if (oldTechObjectN == -1 || oldTechObjectN == objNum) { //COAG1V1 --> COAG2V1 newDevName = objName + newTechObjectN + device.DeviceType.ToString() + device .DeviceNumber; } } } if (newDevName != string.Empty) { int indexOfDeletingElement = tmpIndex.IndexOf(index); tmpIndex.Remove(index); int tmpDevInd = Device.DeviceManager.GetInstance() .GetDeviceIndex(newDevName); if (tmpDevInd >= 0) { tmpIndex.Insert(indexOfDeletingElement, tmpDevInd); } } } deviceIndex = tmpIndex; }
/// <summary> /// Сохранение в виде таблицы Lua. /// </summary> /// <param name="prefix">Префикс (для выравнивания).</param> /// <returns>Описание в виде таблицы Lua.</returns> public virtual string SaveAsLuaTable(string prefix) { if (deviceIndex.Count == 0) { return(""); } string res = prefix; if (LuaName != "") { res += LuaName + " = "; } res += "--" + name + "\n" + prefix + "\t{\n"; res += prefix + "\t"; Device.DeviceManager deviceManager = Device.DeviceManager. GetInstance(); int devicesCounter = 0; foreach (int index in deviceIndex) { if (deviceManager.GetDeviceByIndex(index).Name != StaticHelper.CommonConst.Cap) { devicesCounter++; res += "'" + deviceManager.GetDeviceByIndex(index).Name + "', "; } } if (devicesCounter == 0) { return(""); } res = res.Remove(res.Length - 2, 2); res += "\n"; res += prefix + "\t},\n"; return(res); }
virtual public void ModifyDevNames(string newTechObjectName, int newTechObjectNumber, string oldTechObjectName, int oldTechObjNumber) { List <int> tmpIndex = new List <int>(); foreach (int index in deviceIndex) { tmpIndex.Add(index); } Device.DeviceManager deviceManager = Device.DeviceManager .GetInstance(); foreach (int index in deviceIndex) { string newDevName = string.Empty; Device.IODevice device = deviceManager.GetDeviceByIndex(index); int objNum = newTechObjectNumber; string objName = device.ObjectName; if (objName == oldTechObjectName && device.ObjectNumber == oldTechObjNumber) { newDevName = newTechObjectName + objNum + device.DeviceType.ToString() + device.DeviceNumber; } if (newDevName != string.Empty) { int indexOfDeletingElement = tmpIndex.IndexOf(index); tmpIndex.Remove(index); int tmpDevInd = Device.DeviceManager.GetInstance() .GetDeviceIndex(newDevName); if (tmpDevInd >= 0) { tmpIndex.Insert(indexOfDeletingElement, tmpDevInd); } } } deviceIndex = tmpIndex; }
/// <summary> /// Получить индексы устройств /// </summary> /// <param name="values">Список значений</param> /// <returns></returns> private List <int> GetDevicesIndexes(ref List <string> values) { Device.DeviceManager deviceManager = Device.DeviceManager .GetInstance(); var indexes = new List <int>(); var copiedValues = new string[values.Count]; values.CopyTo(copiedValues); foreach (var copiedValue in copiedValues) { int index = deviceManager.GetDeviceIndex(copiedValue); if (index >= 0) { indexes.Add(index); values.Remove(copiedValue); } } return(indexes); }
/// <summary> /// Построение дерева на основе определенных устройств проекта. /// </summary> /// <param name="deviceManager">Менеджер устройств проекта.</param> /// <param name="devTypes">Показывать данные типы устройств.</param> /// /// <param name="devSubTypes">Показывать данные подтипы устройств. /// </param> public bool ShowDevices(Device.DeviceManager deviceManager, Device.DeviceType[] devTypes, Device.DeviceSubType[] devSubTypes, bool showChannels, bool showCheckboxes, string checkedDev, OnSetNewValue fn, bool isRebuiltTree = false) { prevShowChannels = showChannels; prevShowCheckboxes = showCheckboxes; if (fn != null) { functionAfterCheck = fn; } if (showCheckboxes) { devicesTreeViewAdv.NodeControls.Insert(0, nodeCheckBox); } else { devicesTreeViewAdv.NodeControls.Remove(nodeCheckBox); } //Проверяем на изменение типов отображаемых устройств. if (Equals(devTypes, devTypesLastSelected) && Equals(devSubTypes, devSubTypesLastSelected) && isRebuiltTree == false) { ShowDlg(); return(true); } devTypesLastSelected = devTypes; devSubTypesLastSelected = devSubTypes; Refresh(deviceManager, checkedDev); ShowDlg(); return(true); }
/// <summary> /// コンストラクタ /// </summary> /// <param name="cfg">設定クラス</param> /// <param name="dev">デバイス管理クラス</param> public ControllerDebug(Config.ConfigDataManager cfg, Device.DeviceManager dev) { m_cfg = cfg; m_devMgr = dev; }
/// <summary> /// Обновление дерева на основе текущих устройств проекта. /// </summary> /// /// <param name="deviceManager">Менеджер устройств проекта.</param> /// <param name="checkedDev">Выбранные устройства.</param> private void Refresh(Device.DeviceManager deviceManager, string checkedDev) { devicesTreeViewAdv.BeginUpdate(); devicesTreeViewAdv.Model = null; devicesTreeViewAdv.Refresh(); TreeModel treeModel = new TreeModel(); Node root = new Node("Устройства проекта"); treeModel.Nodes.Add(root); foreach (Device.DeviceType devType in Enum.GetValues(typeof(Device.DeviceType))) { Node r = new Node(devType.ToString()); r.Tag = devType; root.Nodes.Add(r); } int[] countDev = new int[Enum.GetValues(typeof(Device.DeviceType)).Length]; //Заполняем узлы дерева устройствами. foreach (Device.IODevice dev in deviceManager.Devices) { Node parent = null; Node devNode = null; foreach (Node node in root.Nodes) { if ((Device.DeviceType)node.Tag == dev.DeviceType) { parent = node; break; } } //Не найден тип устройства. if (parent == null) { break; } // Если есть символы переноса строки string result = ""; if (dev.Description.Contains('\n')) { string[] devDescr = dev.Description.Split('\n'); foreach (string str in devDescr) { result += str + " "; } } else { result = dev.Description; } if (dev.ObjectName != "") { string objectName = dev.ObjectName + dev.ObjectNumber; Node devParent = null; foreach (Node node in parent.Nodes) { if ((node.Tag is String) && (string)node.Tag == objectName) { devParent = node; break; } } if (devParent == null) { devParent = new Node(objectName); devParent.Tag = objectName; parent.Nodes.Add(devParent); } devNode = new Node(dev.DeviceType + dev.DeviceNumber.ToString() + "\t " + result); devNode.Tag = dev; devParent.Nodes.Add(devNode); } else { devNode = new Node(dev.name + "\t " + result); devNode.Tag = dev; parent.Nodes.Add(devNode); } //Check. checkedDev = ' ' + checkedDev + ' '; if (checkedDev != " " && checkedDev.Contains(' ' + dev.Name + ' ')) { devNode.CheckState = CheckState.Checked; } else { devNode.CheckState = CheckState.Unchecked; } bool isDevVisible = false; if (prevShowChannels) { Node newNodeCh = null; //Показываем каналы. foreach (Device.IODevice.IOChannel ch in dev.Channels) { if (!ch.IsEmpty()) { newNodeCh = new Node(ch.Name + " " + ch.Comment + $" (A{ch.FullModule}:" + ch.PhysicalClamp + ")"); newNodeCh.Tag = ch; devNode.Nodes.Add(newNodeCh); if (noAssigmentBtn.Checked) { newNodeCh.IsHidden = true; } else { isDevVisible = true; } } else { newNodeCh = new Node(ch.Name + " " + ch.Comment); newNodeCh.Tag = ch; devNode.Nodes.Add(newNodeCh); isDevVisible = true; } } } //Пропускаем устройства ненужных типов. if (devTypesLastSelected != null && !devTypesLastSelected.Contains(dev.DeviceType)) { devNode.IsHidden = true; } else { if (devSubTypesLastSelected != null && !devSubTypesLastSelected.Contains(dev.DeviceSubType)) { devNode.IsHidden = true; } else { if (prevShowChannels && !isDevVisible) { devNode.IsHidden = true; } else { countDev[(int)dev.DeviceType]++; } } } } //Обновляем названия строк (добавляем количество устройств). int idx = 0; int total = 0; foreach (Device.DeviceType devType in Enum.GetValues(typeof(Device.DeviceType))) { foreach (Node node in root.Nodes) { if ((Device.DeviceType)node.Tag == devType) { total += countDev[idx]; node.Text = devType.ToString() + " (" + countDev[idx++] + ") "; break; } } } root.Text = "Устройства проекта (" + total + ")"; // Сортировка узлов List <Node> rootNodes = treeModel.Nodes.ToList(); // [0] - узловой с названием проекта List <Node> nodeNodes = rootNodes[0].Nodes.ToList(); // Сортируем узлы внутри каждого устройства Device foreach (Node node in nodeNodes) { TreeSort(node.Nodes.ToList(), node); } devicesTreeViewAdv.Model = treeModel; List <TreeNodeAdv> nodes = devicesTreeViewAdv.AllNodes.ToList(); TreeNodeAdv treeNode = nodes[0]; OnHideOperationTree.Execute(treeNode); devicesTreeViewAdv.ExpandAll(); devicesTreeViewAdv.Refresh(); devicesTreeViewAdv.EndUpdate(); }
/// <summary> /// 主処理 /// </summary> public void MainProc() { // 機器設定ファイル if (!m_cfg.LoadDeviceConfigFiles()) { CommonUI.MsgBox.Error("機器設定ファイルリードエラー"); return; } // レシピファイルの一覧を取得 if (!m_cfg.GetRecipeFiles()) { CommonUI.MsgBox.Error("検査レシピファイル検索エラー"); return; } if (m_cfg.RecipeFileList.Count == 0) { CommonUI.MsgBox.Error("検査レシピファイルが1件も存在しません"); return; } log.Info("検査レシピ検出完了。 {0}件存在します : [{1}]", m_cfg.RecipeFileList.Count, string.Join(", ", m_cfg.RecipeFileList.Keys)); // 作業者リストファイルから作業者リストを取得 if (!m_cfg.ReadOperatorList()) { CommonUI.MsgBox.Error("作業者リストファイルリードエラー"); return; } // ユーザデータファイルの読み込み if (!m_cfg.LoadUserData()) { // LoadUserData内でエラーポップアップを表示しているので何もしない return; } // 機器管理クラス m_devMgr = new Device.DeviceManager(); // キー入力監視開始 m_devMgr.StartKeyInput(); m_devMgr.InputID += OnDeviceInputId; // 各機器のインスタンス作成 if (!m_devMgr.CreateDevices()) { CommonUI.MsgBox.Error("機器インスタンス生成エラー"); return; } Enum err_dev; // 各機器のパラメータ設定 if (!m_devMgr.SetParamAll(m_cfg, out err_dev)) { CommonUI.MsgBox.Error($"機器設定値エラー({err_dev})"); return; } // ライブラリ情報をログ出力 Util.GetDllInfos().ForEach(info => log.Info("ライブラリ情報 {0}", info)); var fmInput = new CommonUI.FormInputID(m_cfg.RecipeFileList.Keys, m_cfg.OperatorList); // ID入力画面表示 var fmtask = UITask(fmInput); // ID入力画面終了待ち fmtask.Wait(); if (m_user == null) { // ID入力画面で「終了」選択時 return; } bool ctrRet; if (m_cfg.Mode != Config.ConfigBase.AppMode.Debug && m_user.ID != "9999999999") { // 検査モード var ctrlIns = new ControllerInspection(m_cfg, m_devMgr, m_recipeNo, m_user); ctrRet = ctrlIns.MainProc(); string insErrorMsg = ctrlIns.GetErrorMsg(); if (ctrRet) { // エラー無し、正常にアプリを終了の場合 m_cfg.UnsendDataList = m_devMgr.CIM.GetUnsendDataList(); m_cfg.SaveUserData(); // 消灯 m_devMgr.PLC.SignalTower(Device.SigType.None); } else { Task cimTask = Task.Run(() => { // CIMにエラー報告 UploadEquipmentError(); // CIMから未送信データリストを取得、ユーザーデータ更新 m_cfg.UnsendDataList = m_devMgr.CIM.GetUnsendDataList(); m_cfg.SaveUserData(); }); // エラーメッセージが設定済みかどうか if (insErrorMsg != null) { // エラーメッセージボックス表示 Task msgboxTask = Task.Run(() => CommonUI.MsgBox.Error(insErrorMsg)); // 赤点灯 & ブザー音(連続音) m_devMgr.PLC.SignalTower(Device.SigType.Red | Device.SigType.BuzCont); // エラーメッセージボックスが閉じられるのを待機する msgboxTask.Wait(); } // CIMエラー送信タスクの終了を待機する cimTask.Wait(); // シグナルタワー赤(ブザー音無し) m_devMgr.PLC.SignalTower(Device.SigType.Red); } } else { // デバッグモード var ctrlDbg = new ControllerDebug(m_cfg, m_devMgr); ctrRet = ctrlDbg.MainProc(); } // 機器終了処理 m_devMgr.Exit(); // キー入力監視終了 m_devMgr.InputID -= OnDeviceInputId; m_devMgr.StopKeyInput(); }