Thyristor

Everything else that doesn't fall into one of the other categories.
AZJIO
Posts: 73
Joined: Wed Dec 14, 2022 1:13 pm

Thyristor

Post by AZJIO »

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.

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

User avatar
Peter
Posts: 1086
Joined: Mon Feb 24, 2014 10:17 pm
Location: 127.0.0.1:9080
Contact:

Re: Thyristor

Post by Peter »

What is the question?
plouf
Posts: 194
Joined: Tue Feb 25, 2014 6:01 pm
Location: Athens,Greece

Re: Thyristor

Post by plouf »

looks like a code sniped.
probably is not a Question but a demostration

however PB sniped and SB sniped have different behaviour, SB stop in the middle while PB goes though all wave
Christos
AZJIO
Posts: 73
Joined: Wed Dec 14, 2022 1:13 pm

Re: Thyristor

Post by AZJIO »

A new toy and I'm passionate. But there are no ideas yet. The discussion section, not the questions, so I decided to go here
.
I made an optimization for the phone so that the window scales.

Code: Select all

EnableExplicit

Enumeration
	#Canvas_Graf
	#btnStart
EndEnumeration

#DspWidthMax = 400
#Window = 0
#ImageLayer = 0
#Timer = 0
#nz = 30	 ; угол задержки открытия нерегулируемого плеча


Global DspWidth, DspHeight
ExamineDesktops()
DspWidth = DesktopWidth(0)
DspHeight = DesktopHeight(0)
If DspWidth > DspHeight
	DspWidth = DspHeight
EndIf
If DspWidth > #DspWidthMax
	DspWidth = #DspWidthMax
EndIf


Global i, Event, Toggle
Global pr.f = DspWidth / 182
Global m = 50 * pr
Global cdvig = 108 * pr ; сдвиг графика вниз
Global y_last.f = cdvig
Global y.f
Global kon = 90	 ; конец регулирования высшего напряжения (всегда меньше #nz)

Declare _Draw(a)
Declare Events()
Declare TimerEvents()

;- Lang
Global lang0$
Global Dim Lng.s(23)
Lng(1) = "Thyristor"
Lng(2) = "Start"
Lng(3) = "Stop"

; Поддержка русского языка
! v_lang0$ = navigator.language;
If lang0$ = "ru-RU"
	Lng(1) = "Тиристор"
	Lng(2) = "Старт"
	Lng(3) = "Стоп"
EndIf



;- GUI
If OpenWindow(#Window, 0, 0, 182 * pr, 120 * pr + 90, Lng(1), #PB_Window_ScreenCentered)

	CanvasGadget(#Canvas_Graf, 0, 0, 182 * pr, 120 * pr)
	ButtonGadget(#btnStart, 5, 120 * pr + 5, 182 * pr - 10, 77, Lng(2), #PB_Button_Toggle)

	BindGadgetEvent(#btnStart, @Events(), #PB_EventType_LeftClick)

	If CreateImage(#ImageLayer, 182 * pr, 120 * pr, 24, RGB(255, 255, 255)) And StartDrawing(ImageOutput(#ImageLayer))

		For i = 0 To 180
			y =  -m * 2 * Sin(Radian(i)) + cdvig
			LineXY(i * pr-1, y_last, i * pr, y, $cccccc)
			y_last = y
		Next
		y_last =cdvig
		For i = 0 To 180
			y = -m * Sin(Radian(i)) + cdvig
			LineXY(i * pr-1, y_last, i * pr, y, $cccccc)
			y_last = y
		Next
		LineXY(0, cdvig, 180 * pr, cdvig, $cccccc)

		StopDrawing()
	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, Lng(2))
					RemoveWindowTimer(#Window, #Timer)
				Else
					Toggle = 1
					SetGadgetText(#btnStart, Lng(3))
					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 * pr, cdvig, $0000FF)
		; Если i = #nz (первый шаг ,делаем ровно вертикально)
		y = -m * Sin(Radian(#nz)) + cdvig
		LineXY(#nz * pr , cdvig, #nz * pr, y, $0000FF)
		y_last = y
		For i = #nz+1 To 180
			If i = a ; граница перехода ровно вертикально
				y = -m * 2* Sin(Radian(i)) + cdvig
				LineXY(i * pr, y_last, i * pr, y, $0000FF)
				y_last = y
			ElseIf i < a ; низшая полуволна напряжения
				y = -m * Sin(Radian(i)) + cdvig
				LineXY(i * pr-1, y_last, i * pr, y, $0000FF)
				y_last = y
			Else ; иначе высшая полуволна напряжения
				y =  -m * 2 * Sin(Radian(i)) + cdvig
				LineXY(i * pr-1, y_last, i * pr, y, $0000FF)
				y_last = y
			EndIf
		Next
		StopDrawing()
	EndIf
EndProcedure
Post Reply