Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 233 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
233
Dung lượng
14,83 MB
Nội dung
BỘ GIÁO DỤC VÀ ĐÀO TẠO ĐẠI HỌC ĐÀ NẴNG PHẠM VĂN KIÊN NGHIÊNCỨUGIÁMSÁTỔNĐỊNHHỆTHỐNGĐIỆNTRONGTHỜIGIANTHỰC LUẬN ÁN TIẾN SĨ KỸ THUẬT Đà Nẵng - 2018 BỘ GIÁO DỤC VÀ ĐÀO TẠO ĐẠI HỌC ĐÀ NẴNG PHẠM VĂN KIÊN NGHIÊNCỨUGIÁMSÁTỔNĐỊNHHỆTHỐNGĐIỆNTRONGTHỜIGIANTHỰC CHUYÊN NGÀNH: KỸ THUẬT ĐIỆN MÃ SỐ: 62.52.02.02 LUẬN ÁN TIẾN SĨ KỸ THUẬT Người hướng dẫn khoa học: PGS.TS Ngô Văn Dưỡng GS TS Lê Kim Hùng Đà Nẵng - 2018 i LỜI CAM ĐOAN Tơi xin cam đoan cơng trình nghiêncứu riêng Những số liệu, kết nêu luận án trung thực chưa công bố cơng trình khác Tác giả luận án Phạm Văn Kiên ii MỤC LỤC LỜI CAM ĐOAN i MỤC LỤC ii DANH MỤC CÁC CHỮ VIẾT TẮT vi DANH MỤC CÁC HÌNH vii DANH MỤC CÁC BẢNG x TRANG THÔNG TIN VỀ LUẬN ÁN xi DISSERTATION INFORMATION xiii MỞ ĐẦU .1 Tính cấp thiết đề tài nghiêncứu .1 Mục đích nghiêncứu Đối tượng phạm vi nghiêncứu Cách tiếp cận phương pháp nghiêncứu .4 Nội dung nghiêncứu Ý nghĩa khoa học thực tiễn luận án .8 CHƯƠNG 10 TỔNG QUAN VỀ CÁC PHƯƠNG PHÁP TÍNH TỐN, PHÂN TÍCH VÀ ĐÁNH GIÁ ỔNĐỊNH CỦA HTĐ 10 1.1 Mở đầu .10 1.2 Các phương pháp tính tốn, phân tích đánh giá ổnđịnh HTĐ 12 1.2.1 Phương pháp tính tốn theo tiêu chuẩn lượng 13 1.2.2 Đánh giá ổnđịnh theo tiêu chuẩn Lyapunov 15 1.2.3 Phương pháp phân tích đường cong PV QV .17 1.2.4 Phương pháp phân tích độ nhạy VQ (VQ Sensitivity Analysis) phân tích trạng thái QV (QV Modal Analysis) 21 1.2.5 Phương pháp đánh giá theo số ổnđịnh .24 1.2.6 Các tiêu chuẩn thực dụng Markovits 28 1.3 Đề xuất phương pháp nghiêncứu 30 iii 1.4 Kết luận chương 36 CHƯƠNG 37 PHƯƠNG PHÁP XÂY DỰNG MIỀN LÀM VIỆC CHO PHÉP THEO ĐIỀU KIỆN GIỚI HẠN ỔNĐỊNHTRONG MẶT PHẲNG CÔNG SUẤT 37 2.1 Mở đầu .37 2.2 Phương pháp tính toán đẳng trị sơ đồ HTĐ .38 2.2.1 Hệ phương trình trạng thái HTĐ chế độ xác lập 38 2.2.2 Đề xuất phương pháp GMAT để tính tốn đẳng trị sơ đồ HTĐ 41 2.3 Chương trình tính toán đẳng trị sơ đồ sử dụng phương pháp GEMAT .44 2.3.1 Xây dựng lưu đồ thuật toán chương trình 44 2.3.2 Chương trình tính tốn đẳng trị sơ đồ HTĐ .46 2.4 Xây dựng miền làm việc ổnđịnh MPCS HTĐ phức tạp 50 2.5 Xây dựng chương trình miền làm việc cho phép theo điều kiện giới hạn ổnđịnhđiện áp mặt phẳng công suất 59 2.5.1 Xây dựng lưu đồ thuật tốn chương trình miền làm việc cho phép theo điều kiện giới hạn ổnđịnhđiện áp mặt phẳng công suất 59 2.5.2 Xây dựng chương trình miền làm việc cho phép theo điều kiện giới hạn ổnđịnhđiện áp mặt phẳng công suất 61 2.5.3 Đánh giá độ tin cậy chương trình .63 2.6 Kết luận chương 69 CHƯƠNG 71 PHƯƠNG PHÁP ĐÁNH GIÁ MỨC ĐỘ ỔNĐỊNH CỦA HỆTHỐNGĐIỆN THEO CÁC YẾU TỐ BẤT ĐỊNH 71 3.1 Mở đầu .71 3.2 Tính chất ngẫu nhiên thơng số vận hành cấu trúc HTĐ 73 3.2.1 Hàm phân phối nhị thức (Binomial Distribution) 74 3.2.2 Hàm phân phối Poisson (Poisson Distribution) 74 3.2.3 Hàm phân phối chuẩn (Normal Distribution) 75 3.2.4 Hàm Weibull 77 iv 3.3 Phương pháp xây dựng miền làm việc cho phép MPCS theo thông tin bất định HTĐ 77 3.3.1 Thuật toán xây dựng miền làm việc cho phép MPCS theo thông tin bất định HTĐ 77 3.3.2 Phương pháp xác định số điểm cắt đường đặc tính giới hạn 80 3.4 Xây dựng chương trình xác định vùng làm việc nguy hiểm MPCS công suất nút phụ tải 81 3.4.1 Xây dựng chương trình xác định vùng làm việc nguy hiểm 81 3.4.2 Áp dụng tính tốn cho sơ đồ IEEE 39 nút 84 3.5 Kết luận chương 90 CHƯƠNG 92 ÁP DỤNG XÂY DỰNG CHƯƠNG TRÌNH GIÁMSÁTỔNĐỊNH CHO HTĐ 500KV VIỆT NAM THEO CÁC YẾU TỐ BẤT ĐỊNH 92 4.1 Hiện trạng tổng thể quy hoạch HTĐ 500kV Việt Nam đến 2025 92 4.1.1 Hiện trạng vận hành HTĐ 500kV 92 4.1.2 Quy hoạch HTĐ 500kV đến 2025 94 4.2 Thông số vận hành TBA 500kV Việt Nam 96 4.2.1 Thực trạng Cung – Cầu điện 96 4.2.2 Thu thập, xử lý số liệu xác định qui luật ngẫu nhiên công suất nút phụ tải 98 4.3 Xây dựng số liệu ngẫu nhiên công suất P, Q cho nút phụ tải TBA 500kV 98 4.4 Áp dụng để tính tốn xác định vùng làm việc nguy hiểm công suất phụ tải MPCS cho HTĐ 500kV Việt Nam 100 4.4.1 Sơ đồ HTĐ 100 4.4.2 Thông số phần tử hệthống 100 4.4.3 Chọn chế độ vận hành 100 4.4.4 Áp dụng để tính tốn xác định vùng làm việc nguy hiểm công suất phụ tải MPCS cho HTĐ 500kV Việt Nam .102 v 4.5 Phân tích, đánh giá mức độ ổnđịnh HTĐ 500kV Việt Nam 105 4.6 Kết luận chương .109 KẾT LUẬN VÀ KIẾN NGHỊ 111 Kết luận .111 Kiến nghị .113 DANH MỤC CÁC CƠNG TRÌNH ĐÃ CƠNG BỐ DANH MỤC TÀI LIỆU THAM KHẢO PHỤ LỤC i Phụ lục 1: So sánh kết tính tốn, phân tích ổnđịnh cho sơ đồ IEEE39 nút i Phụ lục 2: Tổng trở nhánh đường dây máy biến áp sơ đồ IEEE39 nút v Phụ lục 3: Kết phân tích số liệu thống kê phụ tải TBA 500kV Việt Nam 2016 vi Phụ lục 4: Thông số HTĐ 500kV Việt Nam xxiii Phụ lục 5: Kết tính tốn phân tích áp dụng cho HTĐ 500kV Việt Nam đến 2025 xxx Phụ lục 6: Các mã code sử dụng luận án li vi DANH MỤC CÁC CHỮ VIẾT TẮT ĐTSĐ Đẳng trị sơ đồ ĐZ Đường dây EVNNPT Tổng công ty truyền tải điện quốc gia GDP Gross Domestic Product GIS Gas Insulation Switchgear HTĐ Hệthốngđiện MBA Máy biến áp MFĐ Máy phát điện MLVOĐ Miền làm việc ổnđịnh MPCS Mặt phẳng công suất NCKH Nghiêncứu khoa học NCSS Phần mềm thống kê hãng NCSS PS Power system PSS/ADEPT Power System Simulator / Advanced Distribution Engineering Productivity Tool PSSE Power System Simulator for Engineering R Phần mềm thống kê mã nguồn mở SAS Statistical Analysis Systems SCADA Supervisory Control and Data Acquisition SPSS Statistical Product and Services Solutions TBA Trạm biến áp TĐK Tự động điều chỉnh kích từ máy phát điện SCA Siêu cao áp vii DANH MỤC CÁC HÌNH Hình Các báo công bố quốc tế ổnđịnh HTĐ từ 1950-2017 (theo Google Scholar) Hình 1.1 Mơ hình HTĐ đơn giản (a) đặc tính cơng suất Tuabin-MFĐ (b) 13 Hình 1.2 Mơ hình HTĐ nút phụ tải (a) đặc tính cơng suất phản kháng máy phát phụ tải (b) 14 Hình 1.3 Sơ đồ thay HTĐ hình 1.1 17 Hình 1.4 Đường đặc tính PV xét với dạng tải cos2 khác [2] 18 Hình 1.5 Sơ đồ hệthốngđiện đơn giản (a) sơ đồ tính tốn phân tích (b) 19 Hình 1.6 Đường cong QV ứng với chế độ vận hành khác [2] 19 Hình 1.7 Mơ hình đường dây truyền tải 25 Hình 1.9 PVSM theo cơng suất phụ tải nút j xét cho sơ đồ IEEE 14 nút 27 Hình 1.8 Mơ hình HTĐ nối với nút j (a) sơ đồ thay tương đương (b) 27 Hình 1.10 Sơ đồ HTĐ có cấu trúc (a) sơ đồ đẳng trị hình tia (b) 31 Hình 1.11 Miền làm việc cho phép MPCS xét chế độ bình thường (a) chế độ nặng nề (b) 32 Hình 1.12 Miền làm việc cho phép MPCS xét đến yếu tố bất định HTĐ 34 Hình 2.1 Sơ đồ đẳng trị HTĐ (a) miền làm việc ổnđịnh công suất phụ tải MPCS (b) 38 Hình 2.2 Sơ đồ thay tương đương HTĐ IEEE nút (a) sơ đồ đẳng trị nút phụ tải cần quan tâm (b) Hình 2.3 Kết tính tốn đẳng trị sơ đồ HTĐ dùng phương pháp GEMAT 41 44 Hình 2.4 Lưu đồ thuật toán đẳng trị sơ đồ thay HTĐ dùng phương pháp GEMAT Hình 2.5 Giao diện chương trình tính đẳng trị sơ đồ 45 47 Hình 2.6 Giao diện nhập thông tin nút (a), nhánh ĐZ (b), MBA (c) thiết bị bù viii (d) 47 Hình 2.7 Mở sơ đồ HTĐ có sẵn sở liệu 48 Hình 2.8 Giao diện nhập Thơng tin phần tử HTĐ vào thư viện 49 Hình 2.9 Giao diện database (a) sơ đồ nguyên lý HTĐ(b) 49 Hình 2.10 Bảng kết tính đẳng trị HTĐ 50 Hình 2.11 Sơ đồ đẳng trị hình tia HTĐ có F nguồn cung cấp 51 Hình 2.12 Thuật tốn tính tốn xây dựng miền làm việc nguy hiểm 60 Hình 2.13 Giao diện chương trình (a) đường cong giới hạn ổnđịnh tĩnh (b) cho sơ đồ IEEE 39 nút 61 Hình 2.14 Kết tính tốn nút 25 sơ đồ IEEE 39 nút phụ tải làm việc vùng ổnđịnh (a) cách xác địnhhệ số dự trữ ổnđịnh tĩnh (b) 62 Hình 2.15 Sơ đồ HTĐ IEEE nút 63 Hình 2.16 Giao diện chương trình tính tốn cho sơ đồ IEEE nút 65 Hình 2.17 Bảng hiển thị hai khối chứa thiết bị mơ 67 Hình 2.18 Giao diện hình giámsát máy tính kết nối với mơ hình 67 Hình 2.19 Miền làm việc ổnđịnh MPCS P-Q xét nút 68 Hình 3.1 Miền làm việc cho phép MPCS theo tiêu chuẩn ổnđịnh dQ/dU then begin SimpleGraph.LoadFromFile(ParamStr(1)); SaveDialog.FileName := ExpandFileName(ParamStr(1)); Caption := SaveDialog.FileName + ' - ' + Application.Title; end; lxxxv end; procedure TMainForm.FileNewExecute(Sender: TObject); begin if IsGraphSaved then begin SimpleGraph.Clear; SimpleGraph.Zoom := 100; SimpleGraph.CommandMode := cmEdit; IsReadonly := False; SaveDialog.FileName := SUntitled; Caption := SaveDialog.FileName + ' - ' + Application.Title; end; end; procedure TMainForm.FileOpenExecute(Sender: TObject); begin OpenDialog.Options := OpenDialog.Options - [ofHideReadOnly]; if IsGraphSaved and OpenDialog.Execute then begin SimpleGraph.LoadFromFile(OpenDialog.FileName); SimpleGraph.Zoom := 100; IsReadonly := ofReadonly in OpenDialog.Options; if IsReadonly then SimpleGraph.CommandMode := cmViewOnly else SimpleGraph.CommandMode := cmEdit; SaveDialog.FileName := OpenDialog.FileName; Caption := SaveDialog.FileName + ' - ' + Application.Title; end; end; procedure TMainForm.FileMergeUpdate(Sender: TObject); begin FileMerge.Enabled := not IsReadonly and (SimpleGraph.Objects.Count > 0); end; procedure TMainForm.FileMergeExecute(Sender: TObject); begin OpenDialog.Options := OpenDialog.Options + [ofHideReadOnly]; if OpenDialog.Execute then with SimpleGraph MergeFromFile(OpenDialog.FileName, 0, GraphBounds.Bottom + * GridSize); end; procedure TMainForm.FileSaveUpdate(Sender: TObject); begin FileSave.Enabled := SimpleGraph.Modified; end; procedure TMainForm.FileSaveExecute(Sender: TObject); begin if SaveDialog.FileName SUntitled then begin SimpleGraph.SaveToFile(SaveDialog.FileName); Caption := SaveDialog.FileName + ' - ' + Application.Title; end else begin if SaveDialog.Execute then SimpleGraph.SaveToFile(SaveDialog.FileName); end; Caption := SaveDialog.FileName + ' - ' + Application.Title; end; procedure TMainForm.FileSaveAsUpdate(Sender: TObject); begin FileSaveAs.Enabled := (SimpleGraph.Objects.Count > 0); end; procedure TMainForm.FileSaveAsExecute(Sender: TObject); begin if SaveDialog.Execute then begin SimpleGraph.SaveToFile(SaveDialog.FileName); SimpleGraph.CommandMode := cmEdit; IsReadonly := False; lxxxvi Caption := SaveDialog.FileName + ' - ' + Application.Title; end; end; procedure TMainForm.ExportMetafileUpdate(Sender: TObject); begin ExportMetafile.Enabled := (SimpleGraph.Objects.Count > 0); end; procedure TMainForm.ExportMetafileExecute(Sender: TObject); begin SavePictureDialog.Filter := GraphicFilter(TMetafile); SavePictureDialog.DefaultExt := GraphicExtension(TMetafile); SavePictureDialog.FileName := ChangeFileExt(SaveDialog.FileName, '.' + SavePictureDialog.DefaultExt); if SavePictureDialog.Execute then SimpleGraph.SaveAsMetafile(SavePictureDialog.FileName); end; procedure TMainForm.ExportBitmapUpdate(Sender: TObject); begin ExportBitmap.Enabled := (SimpleGraph.Objects.Count > 0); end; procedure TMainForm.ExportBitmapExecute(Sender: TObject); begin SavePictureDialog.Filter := GraphicFilter(TBitmap); SavePictureDialog.DefaultExt := GraphicExtension(TBitmap); SavePictureDialog.FileName := ChangeFileExt(SaveDialog.FileName, '.' + SavePictureDialog.DefaultExt); if SavePictureDialog.Execute then SimpleGraph.SaveAsBitmap(SavePictureDialog.FileName); end; procedure TMainForm.FilePrintUpdate(Sender: TObject); begin FilePrint.Enabled :=(Printer.Printers.Count > 0) and (SimpleGraph.Objects.Count > 0); end; procedure TMainForm.FilePrintExecute(Sender: TObject); var Rect: TRect; begin if PrinterSetupDialog.Execute then begin SetRect(Rect, 0, 0, Printer.PageWidth, Printer.PageHeight); InflateRect(Rect, -50, -50); Printer.Title := Application.Title; Printer.BeginDoc; try SimpleGraph.Print(Printer.Canvas, Rect); finally Printer.EndDoc; end; end; end; procedure TMainForm.FileExitExecute(Sender: TObject); begin Close; end; procedure TMainForm.EditCutUpdate(Sender: TObject); begin EditCut.Enabled := not IsReadonly and (SimpleGraph.SelectedObjects.Count > 0); end; procedure TMainForm.EditCutExecute(Sender: TObject); begin EditCopy.Execute; EditDelete.Execute; end; procedure TMainForm.EditCopyUpdate(Sender: TObject); begin EditCopy.Enabled :=(SimpleGraph.SelectedObjects.Count > 0); end; procedure TMainForm.EditCopyExecute(Sender: TObject); lxxxvii begin SimpleGraph.CopyToClipboard(True); end; procedure TMainForm.EditPasteUpdate(Sender: TObject); begin EditPaste.Enabled := not IsReadonly and Clipboard.HasFormat(CF_SIMPLEGRAPH); end; procedure TMainForm.EditPasteExecute(Sender: TObject); begin SimpleGraph.PasteFromClipboard; end; procedure TMainForm.EditDeleteUpdate(Sender: TObject); begin EditDelete.Enabled := not IsReadonly and (SimpleGraph.SelectedObjects.Count > 0); end; procedure TMainForm.EditDeleteExecute(Sender: TObject); begin SimpleGraph.ForEachObject(ForEachCallback, FEO_DELETE, True); end; procedure TMainForm.EditSelectAllUpdate(Sender: TObject); begin EditSelectAll.Enabled := not IsReadonly and (SimpleGraph.Objects.Count > SimpleGraph.SelectedObjects.Count); end; procedure TMainForm.EditSelectAllExecute(Sender: TObject); begin SimpleGraph.ForEachObject(ForEachCallback, FEO_SELECT, False); end; procedure TMainForm.EditInvertSelectionUpdate(Sender: TObject); begin EditInvertSelection.Enabled := not IsReadonly and (SimpleGraph.Objects.Count > 0); end; procedure TMainForm.EditInvertSelectionExecute(Sender: TObject); begin SimpleGraph.ForEachObject(ForEachCallback, FEO_INVERTSELECTION, False); end; procedure TMainForm.EditMakeAllSelectableUpdate(Sender: TObject); begin EditMakeAllSelectable.Enabled := not IsReadonly and (SimpleGraph.Objects.Count > 0); end; procedure TMainForm.EditMakeAllSelectableExecute(Sender: TObject); begin SimpleGraph.ForEachObject(ForEachCallback, FEO_MAKESELECTABLE, False); end; procedure TMainForm.EditSendToBackUpdate(Sender: TObject); begin EditSendToBack.Enabled := not IsReadonly and (SimpleGraph.SelectedObjects.Count > 0); end; procedure TMainForm.EditSendToBackExecute(Sender: TObject); begin SimpleGraph.ForEachObject(ForEachCallback, FEO_SENDTOBACK, True); end; procedure TMainForm.EditBringToFrontUpdate(Sender: TObject); begin EditBringToFront.Enabled := not IsReadonly and (SimpleGraph.SelectedObjects.Count > 0); end; procedure TMainForm.EditBringToFrontExecute(Sender: TObject); begin SimpleGraph.ForEachObject(ForEachCallback, FEO_BRINGTOFRONT, True); end; procedure TMainForm.EditAlignUpdate(Sender: TObject); begin EditAlign.Enabled := (SimpleGraph.SelectedObjects.Count > 1); end; lxxxviii procedure TMainForm.EditAlignExecute(Sender: TObject); var H: THAlignOption; V: TVAlignOption; begin if TAlignDialog.Execute(H, V) then SimpleGraph.AlignSelection(H, V); end; procedure TMainForm.EditSizeUpdate(Sender: TObject); begin EditSize.Enabled := (SimpleGraph.SelectedObjects.Count > 1); end; procedure TMainForm.EditSizeExecute(Sender: TObject); var Horz, Vert: TResizeOption; begin if TSizeDialog.Execute(Horz, Vert) then SimpleGraph.ResizeSelection(Horz, Vert); end; procedure TMainForm.EditLockNodesUpdate(Sender: TObject); begin EditLockNodes.Checked := SimpleGraph.LockNodes; EditLockNodes.Enabled := not IsReadonly; end; procedure TMainForm.EditLockNodesExecute(Sender: TObject); begin SimpleGraph.LockNodes := not SimpleGraph.LockNodes; end; procedure TMainForm.EditLockLinksUpdate(Sender: TObject); begin EditLockLinks.Checked := SimpleGraph.LockLinks; EditLockLinks.Enabled := not IsReadonly; end; procedure TMainForm.EditLockLinksExecute(Sender: TObject); begin SimpleGraph.LockLinks := not SimpleGraph.LockLinks; end; procedure TMainForm.EditPropertiesExecute(Sender: TObject); var LinkCount: Integer; begin if SimpleGraph.SelectedObjects.Count = then TDesignerProperties.Execute(SimpleGraph) else begin LinkCount := SimpleGraph.SelectedObjectsCount(TGraphLink); if LinkCount = then TNodeProperties.Execute(SimpleGraph.SelectedObjects) else if LinkCount = SimpleGraph.SelectedObjects.Count then TLinkProperties.Execute(SimpleGraph.SelectedObjects) else TObjectProperties.Execute(SimpleGraph.SelectedObjects); end; end; procedure TMainForm.ClipboardNativeUpdate(Sender: TObject); begin ClipboardNative.Checked := cfNative in SimpleGraph.ClipboardFormats; end; procedure TMainForm.ClipboardNativeExecute(Sender: TObject); begin if cfNative in SimpleGraph.ClipboardFormats then SimpleGraph.ClipboardFormats := SimpleGraph.ClipboardFormats - [cfNative] else SimpleGraph.ClipboardFormats := SimpleGraph.ClipboardFormats + [cfNative]; end; procedure TMainForm.ClipboardBitmapUpdate(Sender: TObject); begin ClipboardBitmap.Checked := cfBitmap in SimpleGraph.ClipboardFormats; end; lxxxix procedure TMainForm.ClipboardBitmapExecute(Sender: TObject); begin if cfBitmap in SimpleGraph.ClipboardFormats then SimpleGraph.ClipboardFormats := SimpleGraph.ClipboardFormats - [cfBitmap] else SimpleGraph.ClipboardFormats := SimpleGraph.ClipboardFormats + [cfBitmap]; end; procedure TMainForm.ClipboardMetafileUpdate(Sender: TObject); begin ClipboardMetafile.Checked := cfMetafile in SimpleGraph.ClipboardFormats; end; procedure TMainForm.ClipboardMetafileExecute(Sender: TObject); begin if cfMetafile in SimpleGraph.ClipboardFormats then SimpleGraph.ClipboardFormats := SimpleGraph.ClipboardFormats - [cfMetafile] else SimpleGraph.ClipboardFormats := SimpleGraph.ClipboardFormats + [cfMetafile]; end; procedure TMainForm.FormatBoldExecute(Sender: TObject); begin FormatBold.Checked := not FormatBold.Checked; if FormatBold.Checked then SimpleGraph.ForEachObject(ForEachCallback, FEO_SETFONTBOLD, True) else SimpleGraph.ForEachObject(ForEachCallback, FEO_RESETFONTBOLD, True); end; procedure TMainForm.FormatItalicExecute(Sender: TObject); begin FormatItalic.Checked := not FormatItalic.Checked; if FormatItalic.Checked then SimpleGraph.ForEachObject(ForEachCallback, FEO_SETFONTITALIC, True) else SimpleGraph.ForEachObject(ForEachCallback, FEO_RESETFONTITALIC, True); end; procedure TMainForm.FormatUnderlineExecute(Sender: TObject); begin FormatUnderline.Checked := not FormatUnderline.Checked; if FormatUnderline.Checked then SimpleGraph.ForEachObject(ForEachCallback, FEO_SETFONTUNDERLINE, True) else SimpleGraph.ForEachObject(ForEachCallback, FEO_RESETFONTUNDERLINE, True); end; procedure TMainForm.FormatAlignLeftExecute(Sender: TObject); begin FormatAlignLeft.Checked := True; SimpleGraph.ForEachObject(ForEachCallback, FEO_SETALIGNMENTLEFT, True); end; procedure TMainForm.FormatCenterExecute(Sender: TObject); begin FormatCenter.Checked := True; SimpleGraph.ForEachObject(ForEachCallback, FEO_SETALIGNMENTCENTER, True); end; procedure TMainForm.FormatAlignRightExecute(Sender: TObject); begin FormatAlignRight.Checked := True; SimpleGraph.ForEachObject(ForEachCallback, FEO_SETALIGNMENTRIGHT, True); end; procedure TMainForm.FormatAlignTopExecute(Sender: TObject); begin FormatAlignTop.Checked := True; SimpleGraph.ForEachObject(ForEachCallback, FEO_SETLAYOUTTOP, True); end; procedure TMainForm.FormatVCenterExecute(Sender: TObject); begin FormatVCenter.Checked := True; SimpleGraph.ForEachObject(ForEachCallback, FEO_SETLAYOUTCENTER, True); end; procedure TMainForm.FormatAlignBottomExecute(Sender: TObject); begin xc FormatAlignBottom.Checked := True; SimpleGraph.ForEachObject(ForEachCallback, FEO_SETLAYOUTBOTTOM, True); end; procedure TMainForm.ObjectsNoneUpdate(Sender: TObject); begin ObjectsNone.Checked :=(SimpleGraph.CommandMode in [cmEdit, cmViewOnly]); end; procedure TMainForm.ObjectsNoneExecute(Sender: TObject); begin if IsReadonly then SimpleGraph.CommandMode := cmViewOnly else SimpleGraph.CommandMode := cmEdit; end; procedure TMainForm.ObjectsRectangleUpdate(Sender: TObject); begin ObjectsRectangle.Checked :=(SimpleGraph.CommandMode = cmInsertNode) and (SimpleGraph.DefaultNodeClass = TRectangularNode); ObjectsRectangle.Enabled := not IsReadonly; end; procedure TMainForm.ObjectsRectangleExecute(Sender: TObject); begin SimpleGraph.DefaultNodeClass := TRectangularNode; SimpleGraph.CommandMode := cmInsertNode; end; procedure TMainForm.ObjectsRoundRectUpdate(Sender: TObject); begin ObjectsRoundRect.Checked :=(SimpleGraph.CommandMode = cmInsertNode) and (SimpleGraph.DefaultNodeClass = TRoundRectangularNode); ObjectsRoundRect.Enabled := not IsReadonly; end; procedure TMainForm.ObjectsRoundRectExecute(Sender: TObject); begin SimpleGraph.DefaultNodeClass := TRoundRectangularNode; SimpleGraph.CommandMode := cmInsertNode; end; procedure TMainForm.ObjectsEllipseUpdate(Sender: TObject); begin ObjectsEllipse.Checked :=(SimpleGraph.CommandMode = cmInsertNode) and (SimpleGraph.DefaultNodeClass = TEllipticNode); ObjectsEllipse.Enabled := not IsReadonly; end; procedure TMainForm.ObjectsEllipseExecute(Sender: TObject); begin SimpleGraph.DefaultNodeClass := TEllipticNode; SimpleGraph.CommandMode := cmInsertNode; end; procedure TMainForm.ObjectsTriangleUpdate(Sender: TObject); begin ObjectsTriangle.Checked :=(SimpleGraph.CommandMode = cmInsertNode) and (SimpleGraph.DefaultNodeClass = TTriangularNode); ObjectsTriangle.Enabled := not IsReadonly; end; procedure TMainForm.ObjectsTriangleExecute(Sender: TObject); begin SimpleGraph.DefaultNodeClass := TTriangularNode; SimpleGraph.CommandMode := cmInsertNode; end; procedure TMainForm.ObjectsRhomboidUpdate(Sender: TObject); begin ObjectsRhomboid.Checked :=(SimpleGraph.CommandMode = cmInsertNode) and (SimpleGraph.DefaultNodeClass = TRhomboidalNode); ObjectsRhomboid.Enabled := not IsReadonly; end; procedure TMainForm.ObjectsRhomboidExecute(Sender: TObject); begin SimpleGraph.DefaultNodeClass := TRhomboidalNode; SimpleGraph.CommandMode := cmInsertNode; end; xci procedure TMainForm.ObjectsPentagonUpdate(Sender: TObject); begin ObjectsPentagon.Checked :=(SimpleGraph.CommandMode = cmInsertNode) and (SimpleGraph.DefaultNodeClass = TPentagonalNode); ObjectsPentagon.Enabled := not IsReadonly; end; procedure TMainForm.ObjectsPentagonExecute(Sender: TObject); begin SimpleGraph.DefaultNodeClass := TPentagonalNode; SimpleGraph.CommandMode := cmInsertNode; end; procedure TMainForm.ObjectsHexagonUpdate(Sender: TObject); begin ObjectsHexagon.Checked :=(SimpleGraph.CommandMode = cmInsertNode) and (SimpleGraph.DefaultNodeClass = THexagonalNode); ObjectsHexagon.Enabled := not IsReadonly; end; procedure TMainForm.ObjectsHexagonExecute(Sender: TObject); begin SimpleGraph.DefaultNodeClass := THexagonalNode; SimpleGraph.CommandMode := cmInsertNode; end; procedure TMainForm.ObjectsLinkUpdate(Sender: TObject); begin ObjectsLink.Checked :=(SimpleGraph.CommandMode = cmInsertLink); ObjectsLink.Enabled := not IsReadonly; end; procedure TMainForm.ObjectsLinkExecute(Sender: TObject); begin SimpleGraph.CommandMode := cmInsertLink; end; procedure TMainForm.ViewZoomInUpdate(Sender: TObject); begin ViewZoomIn.Enabled := (SimpleGraph.Zoom < High(TZoom)); end; procedure TMainForm.ViewZoomInExecute(Sender: TObject); begin SimpleGraph.ChangeZoomBy(+10, zoCenter); end; procedure TMainForm.ViewZoomOutUpdate(Sender: TObject); begin ViewZoomOut.Enabled := (SimpleGraph.Zoom > Low(TZoom)); end; procedure TMainForm.ViewZoomOutExecute(Sender: TObject); begin SimpleGraph.ChangeZoomBy(-10, zoCenter); end; procedure TMainForm.ViewActualSizeUpdate(Sender: TObject); begin ViewActualSize.Enabled := (SimpleGraph.Zoom 100); end; procedure TMainForm.ViewActualSizeExecute(Sender: TObject); begin SimpleGraph.ChangeZoom(100, zoTopLeft); end; procedure TMainForm.ViewWholeGraphUpdate(Sender: TObject); begin ViewWholeGraph.Enabled := (SimpleGraph.Objects.Count > 0); end; procedure TMainForm.ViewWholeGraphExecute(Sender: TObject); begin SimpleGraph.ZoomGraph; end; procedure TMainForm.ViewGridUpdate(Sender: TObject); begin ViewGrid.Checked := SimpleGraph.ShowGrid; end; procedure TMainForm.ViewGridExecute(Sender: TObject); begin xcii SimpleGraph.ShowGrid := not SimpleGraph.ShowGrid; end; procedure TMainForm.ViewFixScrollsUpdate(Sender: TObject); begin ViewFixScrolls.Checked := SimpleGraph.FixedScrollBars; end; procedure TMainForm.ViewFixScrollsExecute(Sender: TObject); begin SimpleGraph.FixedScrollBars := not SimpleGraph.FixedScrollBars; end; procedure TMainForm.ViewTransparentUpdate(Sender: TObject); begin ViewTransparent.Checked := SimpleGraph.Transparent; end; procedure TMainForm.ViewTransparentExecute(Sender: TObject); begin SimpleGraph.Transparent := not SimpleGraph.Transparent; end; procedure TMainForm.ViewPanUpdate(Sender: TObject); begin ViewPan.Checked := (SimpleGraph.CommandMode = cmPan); ViewPan.Enabled := (SimpleGraph.HorzScrollBar.IsScrollBarVisible or SimpleGraph.VertScrollBar.IsScrollBarVisible); end; procedure TMainForm.ViewPanExecute(Sender: TObject); begin SimpleGraph.CommandMode := cmPan; end; procedure TMainForm.HelpAboutExecute(Sender: TObject); begin with TAbout.Create(Application) try ShowModal; finally Free; end; end; procedure TMainForm.HelpUsageExecute(Sender: TObject); begin THelpOnActions.Execute; end; procedure TMainForm.OptionsConfirmHookLinkExecute(Sender: TObject); begin OptionsConfirmHookLink.Checked := not OptionsConfirmHookLink.Checked; end; procedure TMainForm.OptionsConfirmDeletionExecute(Sender: TObject); begin OptionsConfirmDeletion.Checked := not OptionsConfirmDeletion.Checked; end; procedure TMainForm.FormCloseQuery(Sender: TObject;var CanClose: Boolean); begin if IsGraphSaved then begin SimpleGraph.Clear; CanClose := True; end else CanClose := False; end; procedure TMainForm.cbxFontSizeChange(Sender: TObject); begin cbxFontSize.Tag := StrToIntDef(cbxFontSize.Text, cbxFontSize.Tag); SimpleGraph.ForEachObject(ForEachCallback, FEO_SETFONTSIZE, True); end; procedure TMainForm.cbxFontNameChange(Sender: TObject); begin cbxFontName.Text := cbxFontName.Items[cbxFontName.ItemIndex]; SimpleGraph.ForEachObject(ForEachCallback, FEO_SETFONTFACE, True); end; xciii procedure TMainForm.LinkRemovePointExecute(Sender: TObject); begin with TGraphLink(SimpleGraph.SelectedObjects[0]) RemovePoint(LinkRemovePoint.Tag); end; procedure TMainForm.LinkAddPointExecute(Sender: TObject); begin with TGraphLink(SimpleGraph.SelectedObjects[0]) AddBreakPoint(TargetPt); end; procedure TMainForm.LinkGrowExecute(Sender: TObject); begin SimpleGraph.ForEachObject(ForEachCallback, FEO_GROW25, True); end; procedure TMainForm.LinkShrinkExecute(Sender: TObject); begin SimpleGraph.ForEachObject(ForEachCallback, FEO_SHRINK25, True); end; procedure TMainForm.LinkRotateCWExecute(Sender: TObject); begin SimpleGraph.ForEachObject(ForEachCallback, FEO_ROTATE90CW, True); end; procedure TMainForm.LinkRotateCCWExecute(Sender: TObject); begin SimpleGraph.ForEachObject(ForEachCallback, FEO_ROTATE90CCW, True); end; procedure TMainForm.LinkReverseExecute(Sender: TObject); begin SimpleGraph.ForEachObject(ForEachCallback, FEO_REVERSEDIRECTION, True); end; procedure TMainForm.ObjectsPopupPopup(Sender: TObject); var HT: DWORD; Index: Integer; Link: TGraphLink; begin if (SimpleGraph.SelectedObjects.Count = 1) and (SimpleGraph.SelectedObjects[0] is TGraphLink) then begin LinkRemovePoint.Visible := True; LinkAddPoint.Visible := True; LinkGrow.Visible := True; LinkShrink.Visible := True; LinkRotateCW.Visible := True; LinkRotateCCW.Visible := True; LinkReverse.Visible := True; TargetPt := SimpleGraph.CursorPos; Link := TGraphLink(SimpleGraph.SelectedObjects[0]); HT := Link.HitTest(TargetPt); Index := HiWord(HT); LinkRemovePoint.Enabled := ((HT and GHT_POINT) 0) and not Link.IsFixedPoint(Index, False); LinkRemovePoint.Tag := Index; LinkAddPoint.Enabled := ((HT and GHT_LINE) 0) and not (gloFixedBreakPoints in Link.LinkOptions); LinkGrow.Enabled := Link.CanMove; LinkShrink.Enabled := Link.CanMove; LinkRotateCW.Enabled := Link.CanMove; LinkRotateCCW.Enabled := Link.CanMove; end else begin LinkRemovePoint.Visible := False; LinkAddPoint.Visible := False; LinkGrow.Visible := False; LinkShrink.Visible := False; LinkRotateCW.Visible := False; LinkRotateCCW.Visible := False; LinkReverse.Visible := False; xciv end; end; procedure TMainForm.SimpleGraphDblClick(Sender: TObject); begin EditProperties.Execute; end; procedure TMainForm.SimpleGraphNodeDblClick(Graph: TSimpleGraph; Node: TGraphNode); begin EditProperties.Execute; end; procedure TMainForm.SimpleGraphLinkDblClick(Graph: TSimpleGraph; Link: TGraphLink); begin EditProperties.Execute; end; procedure TMainForm.SimpleGraphObjectDblClick(Graph: TSimpleGraph; GraphObject: TGraphObject); begin EditProperties.Execute; end; procedure TMainForm.SimpleGraphGraphChange(Sender: TObject); begin if SimpleGraph.Modified then StatusBar.Panels[4].Text := SModified else StatusBar.Panels[4].Text := ''; end; procedure TMainForm.SimpleGraphZoomChange(Sender: TObject); begin StatusBar.Panels[5].Text := Format('%d%%', [SimpleGraph.Zoom]); end; procedure TMainForm.SimpleGraphCommandModeChange(Sender: TObject); begin case SimpleGraph.CommandMode of cmViewOnly: StatusBar.Panels[0].Text := SViewOnly; cmPan: StatusBar.Panels[0].Text := SPan; cmEdit: StatusBar.Panels[0].Text := SEditing; cmInsertLink: StatusBar.Panels[0].Text := SInsertingLink; cmInsertNode: StatusBar.Panels[0].Text := SInsertingNode; end; end; procedure TMainForm.SimpleGraphNodeMoveResize(Graph: TSimpleGraph; Node: TGraphNode); begin if Node.Selected and (SimpleGraph.SelectedObjects.Count = 1) then begin StatusBar.Panels[1].Text := Format('(%d, %d)', [Node.Left, Node.Top]); StatusBar.Panels[2].Text := Format('%d x %d', [Node.Width, Node.Height]); end; end; procedure TMainForm.SimpleGraphObjectSelect(Graph: TSimpleGraph; GraphObject: TGraphObject); begin if SimpleGraph.SelectedObjects.Count = then SimpleGraphObjectChange(Graph, SimpleGraph.SelectedObjects[0]) else begin StatusBar.Panels[1].Text := ''; StatusBar.Panels[2].Text := ''; if SimpleGraph.SelectedObjects.Count > then StatusBar.Panels[3].Text := Format(SMultiSelect, [SimpleGraph.SelectedObjects.Count]) else xcv StatusBar.Panels[3].Text := ''; end; end; procedure TMainForm.SimpleGraphInfoTip(Graph: TSimpleGraph; GraphObject: TGraphObject; var InfoTip: String); const Hooked: array[Boolean] of String = ('', SHooked); begin if GraphObject.IsLink then with TGraphLink(GraphObject) begin InfoTip := Format(SLinkInfo, [Text, Points[0].X, Points[0].Y, Hooked[Assigned(Source)], Points[PointCount - 1].X, Points[PointCount - 1].Y, Hooked[Assigned(Target)], PointCount - 2]); end else with TGraphNode(GraphObject) begin InfoTip := Format(SNodeInfo, [PrettyNodeClassName(ClassName), Text, Left, Top, Width, Height, TGraphNode(GraphObject).LinkInputCount, TGraphNode(GraphObject).LinkOutputCount]); end; end; procedure TMainForm.SimpleGraphCanHookLink(Graph: TSimpleGraph; GraphObject: TGraphObject; Link: TGraphLink; Index: Integer; var CanHook: Boolean); const StartEndPoints: array[Boolean] of String = (SStartPoint, SEndPoint); var MsgText: String; LinkName, ObjectName: String; begin if OptionsConfirmHookLink.Checked and not Link.Dragging and CanHook then begin LinkName := Link.Text; if LinkName = '' then LinkName := SNoName; ObjectName := GraphObject.Text; if ObjectName = '' then ObjectName := SNoName; MsgText := Format(SCanHook, [StartEndPoints[Index 0], LinkName, ObjectName]); CanHook := (MessageDlg(MsgText, mtConfirmation, [mbYes, mbNo], 0) = mrYes); end; end; procedure TMainForm.SimpleGraphCanLinkObjects(Graph: TSimpleGraph; Link: TGraphLink; Source, Target: TGraphObject; var CanLink: Boolean); var MsgText: String; LinkName, SourceName, TargetName: String; begin if OptionsConfirmHookLink.Checked and not Link.Dragging and CanLink then begin LinkName := Link.Text; if LinkName = '' then LinkName := SNoName; SourceName := Source.Text; if SourceName = '' then SourceName := SNoName; TargetName := Target.Text; if TargetName = '' then TargetName := SNoName; MsgText := Format(SCanLink, [SourceName, TargetName, LinkName]); CanLink := (MessageDlg(MsgText, mtConfirmation, [mbYes, mbNo], 0) = mrYes); end; end; procedure TMainForm.SimpleGraphObjectChange(Graph: TSimpleGraph; GraphObject: TGraphObject); var PosFirstLine: Integer; begin xcvi if (SimpleGraph.SelectedObjects.Count = 1) and (SimpleGraph.SelectedObjects[0] = GraphObject) then begin cbxFontName.Text := GraphObject.Font.Name; cbxFontSize.Text := IntToStr(GraphObject.Font.Size); FormatBold.Checked := (fsBold in GraphObject.Font.Style); FormatItalic.Checked := (fsItalic in GraphObject.Font.Style); FormatUnderline.Checked := (fsUnderline in GraphObject.Font.Style); if GraphObject is TGraphNode then with TGraphNode(GraphObject) begin FormatAlignLeft.Checked := (Alignment = taLeftJustify); FormatCenter.Checked := (Alignment = taCenter); FormatAlignRight.Checked := (Alignment = taRightJustify); FormatAlignTop.Checked := (Layout = tlTop); FormatVCenter.Checked := (Layout = tlCenter); FormatAlignBottom.Checked := (Layout = tlBottom); StatusBar.Panels[1].Text := Format('(%d, %d)', [Left, Top]); StatusBar.Panels[2].Text := Format('%d x %d', [Width, Height]); PosFirstLine := Pos(#$D#$A, Text); if PosFirstLine then StatusBar.Panels[3].Text := Copy(Text, 1, PosFirstLine) else StatusBar.Panels[3].Text := Text; end else with TGraphLink(GraphObject) begin StatusBar.Panels[1].Text := ''; StatusBar.Panels[2].Text := Format(SNumOfPoints, [PointCount]); StatusBar.Panels[3].Text := Text; end; end; end; procedure TMainForm.SimpleGraphObjectInitInstance(Graph: TSimpleGraph; GraphObject: TGraphObject); var FontStyle: TFontStyles; begin FontStyle := []; if FormatBold.Checked then Include(FontStyle, fsBold); if FormatItalic.Checked then Include(FontStyle, fsItalic); if FormatUnderline.Checked then Include(FontStyle, fsUnderline); with GraphObject.Font begin if cbxFontName.Text '' then Name := cbxFontName.Text; Size := cbxFontSize.Tag; Style := FontStyle; end; if GraphObject is TGraphNode then begin if FormatAlignLeft.Checked then TGraphNode(GraphObject).Alignment := taLeftJustify else if FormatAlignRight.Checked then TGraphNode(GraphObject).Alignment := taRightJustify else TGraphNode(GraphObject).Alignment := taCenter; if FormatAlignTop.Checked then TGraphNode(GraphObject).Layout := tlTop else if FormatAlignBottom.Checked then TGraphNode(GraphObject).Layout := tlBottom else TGraphNode(GraphObject).Layout := tlCenter; end; end; xcvii procedure TMainForm.SimpleGraphMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin with SimpleGraph.ClientToGraph(X, Y) StatusBar.Panels[6].Text := Format('(%d, %d)', [X, Y]); end; procedure TMainForm.SimpleGraphMouseWheelDown(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); var I: Integer; begin MousePos := SimpleGraph.ScreenToClient(MousePos); if PtInRect(SimpleGraph.ClientRect, MousePos) then begin for I := to begin SimpleGraph.ChangeZoomBy(-1, zoCursor); SimpleGraph.Update; end; Handled := True; end; end; procedure TMainForm.SimpleGraphMouseWheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); var I: Integer; begin MousePos := SimpleGraph.ScreenToClient(MousePos); if PtInRect(SimpleGraph.ClientRect, MousePos) then begin for I := to begin SimpleGraph.ChangeZoomBy(+1, zoCursor); SimpleGraph.Update; end; Handled := True; end; end; end i www.efg2.com/Lab/Mathematics/ComplexMath.htm ... MỚI CỦA LUẬN ÁN Trên sở mục đích nghiên cứu đặt ra, luận án Nghiên cứu giám sát ổn định hệ thống điện thời gian thực có đóng góp lĩnh vực nghiên cứu ổn định điện áp, cụ thể sau: - Đề xuất phương... THÔNG TIN VỀ LUẬN ÁN Tên đề tài luận án: Nghiên cứu giám sát ổn định hệ thống điện thời gian thực Chuyên ngành: Kỹ thuật điện Mã số: 62.52.02.02 Họ tên nghiên cứu sinh: Phạm Văn Kiên Khóa đào tạo:...BỘ GIÁO DỤC VÀ ĐÀO TẠO ĐẠI HỌC ĐÀ NẴNG PHẠM VĂN KIÊN NGHIÊN CỨU GIÁM SÁT ỔN ĐỊNH HỆ THỐNG ĐIỆN TRONG THỜI GIAN THỰC CHUYÊN NGÀNH: KỸ THUẬT ĐIỆN MÃ SỐ: 62.52.02.02 LUẬN ÁN TIẾN SĨ KỸ THUẬT Người