/// <summary> /// バンクデータのBandkNoにBankDataで渡される(Type,ID,値)の構造体一覧を保存する。 /// BankNoが存在しない場合は、新規に追加し、存在している場合は、上書きを行います。 /// 正常に終了した場合は、BSPF_SUCCESSを返します。 /// </summary> /// <param name="BankNo">書き込むバンクナンバー</param> /// <param name="BankData[]">書き込むバンクデータを格納する構造体</param> /// <returns></returns> public int WriteBankData(int BankNo, BankDataStruct[] BankData) { //ロードチェック if (initFlag != true) { return SystemConstants.ERR_UNINITIALIZED; } // バンクナンバー範囲チェック bool BankNoCheck = Utility.CheckRange(BankNo, 0, SystemConstants.BANK_MAX - 1); // チェック結果がflaseだった場合 if (BankNoCheck == false) { // バンクナンバー範囲外のエラーを返す return SystemConstants.ERR_BANKNO_RANGE; } // バンクの番号 xmlAccessor.document.Element("bankdata").Attribute("selectedno").Value = SelectedNo.ToString(); // バンク番号からノードを見つける // XMLファイルを読む var nodes = from n in xmlAccessor.document.Elements("bankdata").Elements("bank") where n.Attribute("no").Value == BankNo.ToString() select n; XElement bank; // バンクがある場合 if (nodes.Count() >= 1) { // エントリを消す bank = nodes.First(); bank.RemoveNodes(); } // バンクがない場合 else { // バンクを作る bank = new XElement("bank"); bank.SetAttributeValue("no", BankNo); bank.SetAttributeValue("comment", ""); xmlAccessor.document.Element("bankdata").Add(bank); } // エントリを作る for (int i = 0; i < BankData.Length; i++) { var elem = new XElement("entry"); elem.SetAttributeValue("type", BankData[i].Type); elem.SetAttributeValue("workid", string.Format("0x{0:X4}", BankData[i].ID)); elem.SetAttributeValue("value", BankData[i].value); bank.Add(elem); } // XMLファイルにセーブする try { // XMLファイルを開く xmlAccessor.SaveXmlFile(xmlFileName); } catch (Exception) { return SystemConstants.ERR_BANK_FILE_ERROR; } finally { Utility.DeleteBackupFile(xmlFileName); } return SystemConstants.BSPF_SUCCESS; }
/// <summary> /// 加工値メモリから取得したデータをBankDataに入れて返す /// </summary> /// <param name="BankData"></param> public int GetArray(ref BankDataStruct[] BankData) { int i = 0; MemAllocStruct memAllocStruct = null; int[] btnWorkID = new int[0]; // BankDataがnullだった場合構造体を割り当てる if (BankData == null) { BankData = new BankDataStruct[0]; } foreach (WorkDataStruct bankdata in map.Values) { if (bankdata.Type == SystemConstants.WORKMEM_TYPE_WORKDATA) { // work idのメモリ割当データを取得する try { // メモリ割当データを使用し、WorkIDに対応する共有メモリのアドレスを取得 memAllocStruct = memAllocData.GetEntry(SystemConstants.WORKID_TYPE_WORKDATA, bankdata.WorkID); } // WorkIDがメモリ割当データに存在していない場合 catch (MemoryAllocationDataException) { // データがあるものとして処理する memAllocStruct = new MemAllocStruct(); memAllocStruct.BankStore = true; } // bank_storeが保存対象だった場合 if (memAllocStruct.BankStore == true) { // 配列の要素を1つ増やす Array.Resize(ref BankData, BankData.Length + 1); // BankDataに加工値メモリの値を設定 BankData[i].Type = bankdata.Type; BankData[i].ID = bankdata.WorkID; BankData[i].value = bankdata.Value; i++; } } else { // ボタンIDのバンク保存対象を取得 ButtonActionStruct btnBankStore = new ButtonActionStruct(); try { btnBankStore = buttonControl.Get(bankdata.WorkID); } catch { btnBankStore.BankStore = SystemConstants.BTN_BANK_UNSAVED; } if (btnBankStore.BankStore == SystemConstants.BTN_BANK_SAVED) { // 配列の要素を1つ増やす Array.Resize(ref BankData, BankData.Length + 1); // BankDataに加工値メモリの値を設定 BankData[i].Type = bankdata.Type; BankData[i].ID = bankdata.WorkID; BankData[i].value = bankdata.Value; i++; } } } return SystemConstants.DCPF_SUCCESS; }
/// <summary> /// バンクデータからBankNoに該当するデータをBankDataに構造体にして返します。 /// 正常に終了した場合、BSPF_SUCCESSを返します。 /// 該当バンクデータが無い場合、ERR_NO_BANK_DATAを返します。 /// </summary> /// <param name="BankNo">読出すバンクナンバー</param> /// <param name="BankData[]">読出したバンクデータを格納する構造体</param> /// <returns></returns> public int GetBankData(int BankNo, ref BankDataStruct[] BankData) { //ロードチェック if(initFlag !=true){ return SystemConstants.ERR_UNINITIALIZED; } // バンクナンバー範囲チェック bool BankNoCheck = Utility.CheckRange(BankNo, 0, SystemConstants.BANK_MAX - 1); // チェック結果がflaseだった場合 if (BankNoCheck == false) { // バンクナンバー範囲外のエラーを返す return SystemConstants.ERR_BANKNO_RANGE; } // XMLファイルを読む var nodes = from n in xmlAccessor.document.Elements("bankdata").Elements("bank") where n.Attribute("no").Value == BankNo.ToString() select n; // 見つかったノードが1でなければエラーを返す。 if (nodes.Count() != 1) { BankData = new BankDataStruct[0]; return SystemConstants.ERR_NO_BANK_DATA; } //昇順に並び変え nodes = from n in nodes.Elements("entry") orderby n.Attribute("type").Value, n.Attribute("workid").Value select n; int count = nodes.Count(); // 構造体を割り当てる BankData = new BankDataStruct[count]; // 構造体に読み込む int i = 0; foreach (var entry in nodes) { BankData[i].Type = Int32.Parse(entry.Attribute("type").Value); BankData[i].ID = Int32.Parse(entry.Attribute("workid").Value.Remove(0, 2), System.Globalization.NumberStyles.AllowHexSpecifier); BankData[i].value = entry.Attribute("value").Value; i++; } return SystemConstants.BSPF_SUCCESS; }
/// <summary> /// バンクデータをまるごと加工値メモリに設定する /// </summary> /// <param name="BankData"></param> public int SetArray(BankDataStruct[] BankData) { int[] groupID = null; int[] temp_workID = null; List<int> workID = new List<int>(); MemAllocStruct memAllocStruct = null; int[] btnWorkID = new int[0]; int result = SystemConstants.DCPF_SUCCESS; // 加工メモリをクリアする map.Clear(); // バンクデータ配列がnullの場合、長さ0の配列を作る if (BankData == null) { BankData = new BankDataStruct[0]; } // 受け取ったBankDataを全て加工値メモリに書く for (int i = 0; i < BankData.Length; i++) { Set(BankData[i].Type, BankData[i].ID, BankData[i].value); } // *メモリ割当データに存在するが、BankDataにないものは初期値で補填する // 加工値のgroup codeの一覧を取得 try { memAllocData.GetMemoryDataGroupList(SystemConstants.WORKID_TYPE_WORKDATA, SystemConstants.WORKGROUP_ROOT, ref groupID); } catch (MemoryAllocationDataException) { return SystemConstants.ERR_WORKID_RANGE; } // 一覧取得したgroup codeのwork idの一覧を取得 for (int i = 0; i < groupID.Length; i++) { try { memAllocData.GetMemoryDataGroupList(SystemConstants.WORKID_TYPE_WORKDATA, groupID[i], ref temp_workID); } catch (MemoryAllocationDataException) { return SystemConstants.ERR_WORKID_RANGE; } for (int j = 0; j < temp_workID.Length; j++) { // ArrayListにtemp_workID追加 workID.Add(temp_workID[j]); } } // メモリ割当にあって加工値メモリにない値を補う for (int i = 0; i < workID.Count; i++) { // work idのメモリ割当データを取得する try { // メモリ割当データを使用し、WorkIDに対応する共有メモリのアドレスを取得 memAllocStruct = memAllocData.GetEntry(SystemConstants.WORKID_TYPE_WORKDATA, workID[i]); } // WorkIDがメモリ割当データに存在していない場合 catch (MemoryAllocationDataException) { continue; } // 加工値メモリに存在しない場合は、デフォルト値で補う KeyStruct key = new KeyStruct(SystemConstants.WORKMEM_TYPE_WORKDATA, workID[i]); if (!map.ContainsKey(key)) { // 加工値メモリへ当該不足IDを、メモリ割当データの初期値で追加 Set(SystemConstants.WORKMEM_TYPE_WORKDATA, workID[i], memAllocStruct.DefaultValue.ToString()); // バンク保存ありの値が欠損していた場合は、ERR_BANK_PARTS_BREKEを返す。 if (memAllocStruct.BankStore) { result = SystemConstants.ERR_BANK_PARTS_BREAK; } } } // 全てのボタンIDを取得 buttonControl.GetAllBtnWorkID(ref btnWorkID); // ボタンIDの数だけループする for (int i = 0; i < btnWorkID.Length; i++) { // ボタンIDのバンク保存対象を取得 ButtonActionStruct btnBankStore = buttonControl.Get(btnWorkID[i]); KeyStruct key = new KeyStruct(SystemConstants.WORKMEM_TYPE_WORKBTN, btnWorkID[i]); // 加工値メモリに存在しない場合は、デフォルト値で補う if (!map.ContainsKey(key)) { Set(SystemConstants.WORKMEM_TYPE_WORKBTN, btnWorkID[i], btnBankStore.DefaultMode.ToString()); // バンク保存ありの値が欠損していた場合は、ERR_BANK_PARTS_BREKEを返す。 if (btnBankStore.BankStore == SystemConstants.BTN_BANK_SAVED) { result = SystemConstants.ERR_BANK_PARTS_BREAK; } } } return result; }
/// <summary> /// �������� /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void syncroprogressfrm_Shown(object sender, EventArgs e) { try { //�t�H�[�}�b�g�f�[�^�擾 Program.DataController.MemorySynchro(SystemConstants.ADDR_FORMAT_CHECK, SystemConstants.FORMAT_CHECK_COUNT); waitForQueue(false); // �t�H�[�}�b�g�`�F�b�N formatType = Program.DataController.FomatCheck(); // bankno int bankno = 0; // �w�K�f�[�^���ڃL�[��擾 int workmode = SystemConstants.WORKMODE_BANK; string[] itemkeys = new string[10]; if (Program.DataController.LearnItemKeysRead(ref itemkeys) == SystemConstants.DCPF_SUCCESS) { workmode = SystemConstants.WORKMODE_LEARN; } if (workmode == SystemConstants.WORKMODE_LEARN) { LearnDataStruct[] learndataStruct = new LearnDataStruct[0]; Program.DataController.LearnDataRead(itemkeys, ref learndataStruct); bankDataQueue = learndataStruct.Length; workDataQueue = learndataStruct.Length; } else { Program.DataController.BankNoRead(ref bankno); BankDataStruct[] bankdataStruct = new BankDataStruct[0]; Program.DataController.BankDataRead(bankno, ref bankdataStruct); bankDataQueue = bankdataStruct.Length; workDataQueue = bankdataStruct.Length; } //�t�H�[�}�b�g�ς݂̏ꍇ if (formatType == SystemConstants.FORMAT_DONE) { // ���M����l�̐�����߂� correctDataQueue = Program.DataController.CorrectDataRead(false); timingDataQueue = Program.DataController.TimingDataRead(false); statusDataQueue = Program.DataController.MachineStatusRead(false); workDataQueue = Program.DataController.WorkDataRead(false); allQueue = correctDataQueue + timingDataQueue + statusDataQueue + workDataQueue + bankDataQueue; // ��l�̎�M Program.DataController.CorrectDataRead(); waitForQueue(true, Phase.CorrectReading); // �^�C�~���O�l�̎�M Program.DataController.TimingDataRead(); waitForQueue(true, Phase.TimingReading); // �X�e�[�^�X�l�̎�M Program.DataController.MachineStatusRead(); waitForQueue(true, Phase.StatusReading); // ���H�l�̓��� Program.DataController.WorkDataRead(); waitForQueue(true, Phase.WorkdataReading); if (workmode == SystemConstants.WORKMODE_LEARN) { // �w�K�f�[�^���M mainfrm.LearnDataLoad(itemkeys); waitForQueue(true, Phase.BankWriting); } else { // �o���N�f�[�^�̑��M mainfrm.BankDataLoad(bankno); waitForQueue(true, Phase.BankWriting); } } // �t�H�[�}�b�g�ς݂łȂ��ꍇ else { // ���M����l�̐�����߂� correctDataQueue = Program.DataController.CorrectDataSend(false); timingDataQueue = Program.DataController.TimingDataSend(false); statusDataQueue = Program.DataController.MachineStatusRead(false); workDataQueue = Program.DataController.WorkDataRead(false); allQueue = correctDataQueue + timingDataQueue + statusDataQueue + workDataQueue + bankDataQueue; // �A�v���P�[�V�����̑��s�m�F if (!Utility.ShowConfirmMsg(SystemConstants.SYSTEM_MSG007)) { DialogResult = DialogResult.No; return; } // ��l�𑗂� try { Program.DataController.CorrectDataSend(); waitForQueue(true, Phase.CorrectWriting); Program.DataController.TimingDataSend(); waitForQueue(true, Phase.TimingWriting); } catch { Result = SystemConstants.ERR_CORRECT_FILE_ERROR; DialogResult = System.Windows.Forms.DialogResult.No; return; } // �X�e�[�^�X�l�̎�M Program.DataController.MachineStatusRead(); waitForQueue(true, Phase.StatusReading); // ���H�l�̓��� Program.DataController.WorkDataRead(); waitForQueue(true, Phase.WorkdataReading); if (workmode == SystemConstants.WORKMODE_LEARN) { // �w�K�f�[�^���M mainfrm.LearnDataLoad(itemkeys); waitForQueue(true, Phase.BankWriting); } else { // �o���N�f�[�^�̑��M mainfrm.BankDataLoad(bankno); waitForQueue(true, Phase.BankWriting); } // �t�H�[�}�b�g������������݂܂��B Program.DataController.FormatWrite(); } if (workmode == SystemConstants.WORKMODE_LEARN) { // �w�K�f�[�^��ۑ�����B mainfrm.LearnDataSave(itemkeys); } else { // �o���N�f�[�^��ۑ�����B mainfrm.BankDataSave(bankno); } // ��l��ۑ����� Program.DataController.CorrectDataSave(); } catch (TimeoutException) { /* �^�C���A�E�g�����������ꍇ�́A�����փW�����v */ DialogResult = DialogResult.No; Result = SystemConstants.ERR_SYNC_TIMEOUT; return; } //�v���O���X�o�[�t�H�[�������B DialogResult = DialogResult.OK; }
/// <summary> /// BankData[]の値をバンクデータ保存クラスの、WriteBankDataを使用して、バンクに保存します。 /// 正常に処理が行われた場合、DCPF_SUCCESSを返します。 /// </summary> /// <param name="BankNo">書き込むバンクナンバー</param> /// <param name="BankData">書き込むバンクデータ</param> /// <returns></returns> public int BankDataWrite(int BankNo, BankDataStruct[] BankData) { // BankData[]の値をバンクデータ保存クラスの、WriteBankDataを使用して、バンクに保存 int result = bankDataStorage.WriteBankData(BankNo, BankData); // 正常に処理が行われた場合 if (result == SystemConstants.BSPF_SUCCESS) { // DCPF_SUCCESSを返します return SystemConstants.DCPF_SUCCESS; } else { // WriteBankDataから、BSPF_SUCCESS以外を受取った場合、そのコードを返します return result; } }
/// <summary> /// メモリ割当データのバンク保存対象の現在の値を、BankDataWrite、 /// BankDataCommentWriteを使用して、バンクに保存します。 /// 正常に処理が行われた場合、DCPF_SUCCESSを返します。 /// </summary> /// <param name="BankNo">セーブするバンクナンバー</param> /// <returns></returns> public int BankDataSave(int BankNo) { BankDataStruct[] bankData = new BankDataStruct[0]; int result = 0; //加工値メモリからBankStoreがTrueのデータのみを取得する。 result = workDataMemory.GetArray(ref bankData); if (result != SystemConstants.DCPF_SUCCESS) { return result; } // メモリ割当データのバンク保存対象の現在の値を // BankDataWriteを使用してバンクに保存 result = BankDataWrite(BankNo, bankData); return result; }
/// <summary> /// バンクデータ保存クラスのGetBankDataを使用し、BankNoのバンクデータを取得し、 /// 構造体BankDataに入れて返します。BankDataは、(Type, ID, 値) の構造体です。 /// GetBankDataから受け取ったBankDataにメモリ割当データのバンク保存対象のIDの一部が不足していた場合、 /// BankDataへ当該不足IDを、メモリ割当データの初期値で追加を行い、ERR_BANK_PARTS_BREKEと一緒に返します。 /// GetBankDataから、ERR_NO_BANK_DATAを受取った場合、BankDataへメモリ割当データのバンク保存対象のIDを /// メモリ割当データの初期値で追加を行い、ERR_NO_BANK_DATAと一緒に返します。 /// 正常に処理が行われた場合、DCPF_SUCCESSを返します。 /// </summary> /// <param name="BankNo">読み込むバンクナンバー</param> /// <param name="BankData">読み込んだバンクデータを格納する構造体</param> /// <returns></returns> public int BankDataRead(int BankNo, ref BankDataStruct[] BankData) { // バンクデータ保存クラスのGetBankDataを使用し、BankNoのバンクデータを取得 int result = bankDataStorage.GetBankData(BankNo, ref BankData); // 正常に処理が行われた場合 if ((result != SystemConstants.BSPF_SUCCESS) && (result != SystemConstants.ERR_NO_BANK_DATA)) { return result; } // 補完処理を行う WorkDataMemory memory = new WorkDataMemory(); memory.Initialize(memalloc, buttonControl); result = memory.SetArray(BankData); BankData = new BankDataStruct[0]; memory.GetArray(ref BankData); return result; }