Thyristor voltage regulation

Everything else that doesn't fall into one of the other PB categories.
AZJIO
Addict
Addict
Posts: 1312
Joined: Sun May 14, 2017 1:48 am

Thyristor voltage regulation

Post by AZJIO »

Code: Select all

EnableExplicit

Enumeration
	#Canvas_Graf
	#btnStart
	#btnClear
	#ImageLayer
EndEnumeration

#cdvig = 105 ; сдвиг графика вниз
#nz = 30 ; угол задержки открытия нерегулируемого плеча
#kon = 80 ; конец регулирования высшего напряжения (всегда меньше #nz)
Global y_last.f = #cdvig
Global y.f
Define i, Event

Declare _Draw(a)


If OpenWindow(0, 0, 0, 240, 200, "Thyristor control", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

	ButtonGadget(#btnStart, 60, 160, 70, 27, "Start")
	ButtonGadget(#btnClear, 140, 160, 70, 27, "Clear")
	CanvasGadget(#Canvas_Graf, 40, 20, 180, 120)
; 	CloseGadgetList()

    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)
	
	Repeat
		Event = WaitWindowEvent()
		
		If Event = #PB_Event_Gadget
			Select EventGadget()
					
				Case #btnStart
					For i = 180 To #kon Step -1
						_Draw(i)
						Delay(30)
					Next
				Case #btnClear
					If StartDrawing(CanvasOutput(#Canvas_Graf))
						Box(0, 0,  490, 240, #White)
						StopDrawing()
					EndIf
			EndSelect
		EndIf
		
	Until Event = #PB_Event_CloseWindow
EndIf



Procedure _Draw(a)
	Protected i
	If StartDrawing(CanvasOutput(#Canvas_Graf))
		DrawImage(ImageID(#ImageLayer) , 0, 0) ; рисует фоновый
; 		DrawImage(ImageID(#ImageLayer) , 180, 0) ; вариант если надо будет делать 2 полуволны
		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
; 			FillArea(90, 90, -1, $DDDDFF)
; 			FillArea(90, 90, $0000FF, $DDDDFF)
		Next
		StopDrawing()
	EndIf
EndProcedure