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