Thyristor
Posted: Tue Jan 17, 2023 9:03 am
https://www.purebasic.fr/english/viewtopic.php?t=80003
When regulating the current in the motor with the help of thyristors, there is one constant half-wave of low voltage, and the second half-wave of high voltage, which is regulated. The area of the graph forms the power of the engine.
When regulating the current in the motor with the help of thyristors, there is one constant half-wave of low voltage, and the second half-wave of high voltage, which is regulated. The area of the graph forms the power of the engine.
Code: Select all
EnableExplicit
Enumeration
#Canvas_Graf
#btnStart
EndEnumeration
#Window = 0
#ImageLayer = 0
#Timer = 0
#cdvig = 105 ; сдвиг графика вниз
#nz = 30 ; угол задержки открытия нерегулируемого плеча
#kon = 80 ; конец регулирования высшего напряжения (всегда меньше #nz)
Global y_last.f = #cdvig
Global y.f
Global i, Event, Toggle
Declare _Draw(a)
Declare Events()
Declare TimerEvents()
If OpenWindow(#Window, 0, 0, 190, 180, "Thyristor", #PB_Window_ScreenCentered)
CanvasGadget(#Canvas_Graf, 5, 5, 180, 120)
ButtonGadget(#btnStart, 5, 130, 180, 37, "Start", #PB_Button_Toggle)
BindGadgetEvent(#btnStart, @Events(), #PB_EventType_LeftClick)
If CreateImage(#ImageLayer, 180, 120, 24, RGB(255, 255, 255)) And StartDrawing(ImageOutput(#ImageLayer))
For i = 0 To 180
y = -100 * Sin(Radian(i)) + #cdvig
LineXY(i-1, y_last, i, y, $cccccc)
y_last = y
Next
y_last =#cdvig
For i = 0 To 180
y = -50 * Sin(Radian(i)) + #cdvig
LineXY(i-1, y_last, i, y, $cccccc)
y_last = y
Next
LineXY(0, 105, 180, 105, $cccccc)
StopDrawing()
; ImageGadget(4, 40, 20, 530, 260, ImageID(#ImageLayer))
EndIf
_Draw(#kon)
BindEvent(#PB_Event_Timer, @TimerEvents())
EndIf
Procedure Events()
If Event() = #PB_Event_Gadget
Select EventGadget()
Case #btnStart
If Toggle
Toggle = 0
SetGadgetText(#btnStart, "Start")
RemoveWindowTimer(#Window, #Timer)
Else
Toggle = 1
SetGadgetText(#btnStart, "Stop")
AddWindowTimer(#Window, #Timer, 30)
EndIf
EndSelect
EndIf
EndProcedure
Procedure TimerEvents()
Static i
Select EventTimer()
Case #Timer
i - 1
If i < 30
i = 180
EndIf
_Draw(i)
EndSelect
EndProcedure
Procedure _Draw(a)
Protected i
If StartDrawing(CanvasOutput(#Canvas_Graf))
DrawImage(ImageID(#ImageLayer) , 0, 0) ; рисует фоновый
; горизонтальная линия, задержка открытия нерегулируемого плеча,
; чтобы дать закрыть открытые тиристоры
LineXY(0, #cdvig, #nz, #cdvig, $0000FF)
; Если i = #nz (первый шаг ,делаем ровно вертикально)
y = -50 * Sin(Radian(#nz)) + #cdvig
LineXY(#nz, #cdvig, #nz, y, $0000FF)
y_last = y
For i = #nz+1 To 180
If i = a ; граница перехода ровно вертикально
y = -100 * Sin(Radian(i)) + #cdvig
LineXY(i, y_last, i, y, $0000FF)
y_last = y
ElseIf i < a ; низшая полуволна напряжения
y = -50 * Sin(Radian(i)) + #cdvig
LineXY(i-1, y_last, i, y, $0000FF)
y_last = y
Else ; иначе высшая полуволна напряжения
y = -100 * Sin(Radian(i)) + #cdvig
LineXY(i-1, y_last, i, y, $0000FF)
y_last = y
EndIf
Next
StopDrawing()
EndIf
EndProcedure