家居強電電路模擬程式

Ccs星星远bird發表於2024-06-29

7-1 家居強電電路模擬程式-3

這次的大作業新增了一些內容,首先就是增加了一種開關,就是互斥開關,我們首先需要搞清楚互斥開關的性質和一些特點。

互斥開關有3個引腳:1個是彙總引腳,另兩個是分支引腳,1、2、3引腳均可以是輸入引腳,當1為輸入引腳時,2、3引腳為輸出引腳;1為輸出引腳時,2、3引腳為輸入引腳,互斥開關只有兩種狀態:開關接往上面的2號引腳、接往下面的3號引腳。開關每次只能接通其中一個分支引腳,而另一個分支引腳處於斷開狀態。

互斥開關的預設狀態為1、2引腳接通,1、3引腳斷開。為避免短路,互斥開關設定了限流電阻,12引腳之間預設電阻為5,13引腳之間預設電阻為10。那麼在互斥開關的類的設計上就要清晰表現,在我的程式碼中體現就是private final double resistancePin1To2 = 5;private final double resistancePin1To3 = 10;以及public double getResistance() {
return state == 0 ? resistancePin1To2 : resistancePin1To3;
}在獲取電阻上也要做出改變,後續的大部分內容都與正常開關一樣。

本次迭代也增加了一種受控窗簾,受控窗簾的電路符號為S,其最低工作電壓為50V,電壓達到或超過50V,窗簾即可正常工作,不考慮室外光照強度和室內空間大小等因素,窗簾受室內燈光的光照強度控制。

那麼我們就需要定義了一個名為ControlledCurtain的類,該類繼承自Device類,用於表示一個受控制的窗簾,private final double resistance = 15;定義好電阻,public void setInputVoltage(double voltage): 這個方法從父類Device中繼承並重寫(儘管它實際上並沒有做任何額外的操作,只是呼叫了父類的方法)。它允許設定窗簾的輸入電壓。public double getOpenPercentage(): 這是一個新方法,用於計算窗簾的開啟百分比。但計算方式與窗簾的輸入或輸出電壓無關,而是基於一個名為Main.deviceMap的外部對映(這在此程式碼段中未定義)中的其他裝置(如白熾燈和熒光燈)的總亮度。根據這些裝置的總亮度,窗簾的開啟百分比會發生變化,當電路中所有燈光的光照強度總和在[0,50)lux範圍內,窗簾全開;在[50,100)lux範圍內,窗簾開啟比例為0.8;在[100,200)lux範圍內,窗簾開啟比例為0.6;在[200,300)lux範圍內,窗簾開啟比例為0.4;在[300,400)lux範圍內,窗簾開啟比例為0.2;在400lux及以上範圍內,窗簾關閉。當電壓低於50V,窗簾不工作,預設為全開狀態。如果電路中沒有燈或者燈全部關閉,光照強度為0,窗簾處於全開狀態。

因為加入了互斥開關,開關的變化導致輸入變化,那麼電路連線間也有變化,輸出也有變化。

定義了一個名為SeriesCircuit的類,它繼承自Device類。SeriesCircuit類用於表示一個串聯電路,其中包含一個裝置列表(devices)和一個狀態標誌m,用於表示電路中開關的狀態(0代表開啟,1代表關閉)。m欄位:用於表示電路的狀態,0表示電路中的開關開啟(電路連通),1表示開關關閉(電路斷開)。建構函式:SeriesCircuit(List devices),接收一個裝置列表作為引數,初始化父類的Device建構函式,並將裝置列表儲存在devices欄位中。
getDevices()方法:返回裝置列表,用於訪問電路中的所有裝置。
setInputVoltage(double totalVoltage)方法:與Device類中的同名方法類似,但這裡是針對串聯電路的特殊情況。它計算總電阻,處理開關狀態,根據電路狀態調整輸入電壓,確保在開關斷開時,輸入電壓為0。getResistance()方法:計算串聯電路的總電阻。與Device類中的方法類似,遍歷裝置,根據開關狀態調整總電阻。getOutputVoltages()方法:與Device類中的方法相同,返回所有裝置的輸出電壓列表。這個SeriesCircuit類的主要作用是封裝串聯電路的邏輯,包括處理輸入電壓、計算總電阻和輸出電壓。當呼叫setInputVoltage方法時,會根據電路的開關狀態(m)動態調整輸入電壓,以反映電路的實際工作狀態。

再定義了一個名為ParallelCircuit的類,它繼承自Device類,用於表示並聯電路。與SeriesCircuit類不同,ParallelCircuit類包含一個SeriesCircuit列表(seriesCircuits),表示電路中由多個串聯電路組成的並聯結構。
isCircuitOpen(SeriesCircuit circuit)方法:檢查一個串聯電路是否斷開,與SeriesCircuit中的類似,透過檢查串聯電路中的開關狀態來判斷。
hasMultipleClosedSeriesCircuits()方法:檢查並聯電路中是否有多個閉合的串聯電路。如果找到兩個或更多閉合的串聯電路,則返回true,否則返回false。
getOutputVoltages()方法:返回一個列表的列表,外層列表儲存了每個串聯電路的輸出電壓列表,內層列表是每個串聯電路的getOutputVoltages()結果。
這個ParallelCircuit類的主要作用是封裝並聯電路的邏輯,包括設定輸入電壓、計算總電阻以及獲取每個串聯電路的輸出電壓列表。當呼叫setInputVoltage方法時,會將輸入電壓分配到所有串聯電路中。getResistance方法根據並聯電路的特性計算總電阻。

然後就是主電路輸入輸出處理方面需要改變,首先在private static List parseDevices中加入建立互斥開關和受控窗簾的步驟,再改變一點電路的處理方面,在處理開關時也要處理互斥開關,基於某些條件(與裝置device的M屬性和pin字串的內容有關)來建立一個新的ExclusiveSwitch物件,並修改其狀態,然後將其新增到一個名為seriesDevices的集合中。

再處理輸入資訊時,有else if (line.matches("#H\d+")) {
GlobalVariables.m=1;
String identifier = line.substring(1);
if (deviceMap.containsKey(identifier)) {
((ExclusiveSwitch) deviceMap.get(identifier)).toggleState();
deviceMap.get(identifier).setM(1);
}
}
後續輸出的時候也要加入互斥開關和受控窗簾的問題,程式碼體現就是else if (device instanceof ExclusiveSwitch) {
ExclusiveSwitch es = (ExclusiveSwitch) device;
System.out.printf("@%s:%s%n", getDeviceIdentifier(device), es.getState() == 0 ? "closed" : "turned on");
} else if (device instanceof ControlledCurtain) {
ControlledCurtain cc = (ControlledCurtain) device;
System.out.printf("@%s:%.0f%%%n", getDeviceIdentifier(device), cc.getOpenPercentage());
}
最後有一些需要多注意的點,只有一條線路,所有元件串聯,線路中包含一個並聯電路,線路中包含多個串聯起來的並聯電路,並聯電路之間可能出現包含關係,電路計算要包含電流、電阻等電路引數。

7-1 家居強電電路模擬程式-4

這次迭代新增了一個二極體的內容,首先要搞清楚二極體的性質等,增加二極體元件,其電路特性為:正向導通,反向截止;其電器符號如圖4所示,當電流從左至右流過時,二極體導通”conduction”,電阻為0;電流從右至左流動時,二極體截止”cutoff”,電阻無窮大,相當於開關開啟。二極體的識別符號為’P’,左側管腳編號為1,右側管腳編號為2。
二極體如果兩端電壓相等,沒有電流流過,分以下兩種情況輸出:
1、如果兩端電壓為0,二極體的導通/截止狀態由接入方向決定,1號引腳靠近電源則狀態為導通,反之為截止。
2、如果兩端電壓不為0,二極體導通。
這是二極體的規則,那麼在類裡面就需要這樣設計,
public double getResistance() {
if (inputVoltage > 0) {
return 0; // 正向導通
} else {
return Double.POSITIVE_INFINITY; // 反向截至
}
}這是其中設計的重點,其他的跟開關的一些性質都一樣。

在程式碼中加入GlobalVariables ,在一些點上可以起到標記作用:
class GlobalVariables {
// 定義靜態變數
public static int m = 0;
public static int n=0;
public static int k=0;
}

爭對一些迭代增加的點,我們需要做出以下的如何實現,增加管腳電壓的顯示
1.在輸出每個電器的狀態資訊後,需要遍歷電器的每個引腳並輸出其電壓值,for (Pin pin : device.getPins()) { // 假設getPinVoltage(pin)方法可以獲取引腳的電壓 System.out.print("Pin " + pin.getId() + ": " + getPinVoltage(pin) + " "); },在Device抽象類中增加protected double inputVoltage;protected double outputVoltage;
2.電流限制
3.在每個電器類中,我們需要增加一個欄位來儲存最大限定電流,並在模擬電流時檢查是否超過這個限制。如果超過,則在輸出資訊時新增提示。
短路檢測,在類比電路時,我們需要檢測任何可能導致無窮大電流的情況,並在發現時立即停止模擬並輸出“short circuit error”。if (detectShortCircuit()) { System.out.println("short circuit error"); // 停止類比電路 return; },應該遍歷電路並檢查是否有短路情況,短路情況具體有直接短路:當導線、元件的連線處接觸不良,或者金屬物體意外接觸到電源的正負極,電流沒有透過預期的路徑,而是直接從一個極到另一個極,形成一個低阻抗的通路,這就是直接短路。電源短路:當電源的正負極之間沒有經過任何負載就直接相連,或者負載電阻非常低,使得電流幾乎無阻礙地流過,這種情況也稱為電源短路。電機或變壓器短路:在電動機或變壓器中,如果繞組之間的絕緣損壞,電流會直接從一個繞組流到另一個繞組,形成短路。需要多方面考慮。
4.並聯電路中包含並聯,電路解析器能夠處理巢狀的電路結構。在解析電路時,需要遞迴地處理並聯和串聯關係。在解析並聯電路時,需要識別出哪些電路是串聯的,並且這些串聯電路內部可能還包含其他並聯電路。

輸出方面也要仔細修改,有規定限制的電流,那麼我們就需要在每個類中設定好每種元件的限制的最大電流,就跟每個元件的電阻是一個意思,然後再在輸出時判斷是否滿足超出限定電流,超出則輸出exceeding current limit error。實際體現就是if (device.getK()==1) {deviceStatus =" exceeding current limit error";}在最終的其他輸出也要修改,比如受控窗簾輸出百分比,具體體現就是else if (device instanceof ControlledCurtain) {
ControlledCurtain cc = (ControlledCurtain) device;
System.out.printf("@%s:%.0f%% ", getDeviceIdentifier(device), cc.getOpenPercentage());
},這裡的getOpenPercentage()方法就是在ControlledCurtain類中定義的方法。

具體分析就是這樣的。

相關文章