Ik heb voor mijn schoolproject een software programatje gescherven om de eerste 4 datalijnen van de paralele poort aan te stuuren.

Dit werkt via de comandline en parameters. Bijvoorbeeld al ik uitgang 3 wil inschakelen typ ik "bestandnaam.exe 3-aan" en als ik 1 uit wil hebben typ ik bestandnaam.exe 1-uit.Dit omdat ik de uitgang wil kunnen programeren in de windows taakplanner.

Dit werkt allemaal perfect, maar nu is der 1 probleem. Als ik uitgang 1 al aan heb staan en deze perongeluk nog een keer aanzet gaat uitgang 2 aan (1 + 1 = 2 :-)). Nu zou ik dit graag willen blokeren. Als je een uitgang inschakelt die al is ingeschakelt, zou ik graag een popup met een foutmelding willen hebben.
Met vbInp(888) kun je de waarde uitlezen die hij momenteel heeft.

Dit is de code die ik nu heb:


Private Declare Sub vbOut Lib "WIN95IO.DLL" (ByVal nPort As Integer, ByVal nData As Integer)
Private Declare Sub vbOutw Lib "WIN95IO.DLL" (ByVal nPort As Integer, ByVal nData As Integer)
Private Declare Function vbInp Lib "WIN95IO.DLL" (ByVal nPort As Integer) As Integer
Private Declare Function vbInpw Lib "WIN95IO.DLL" (ByVal nPort As Integer) As Integer

Sub OutPort(PortAddress%, OutNum%)

PortState% = vbInp(PortAddress%)
PortNum% = PortState% + OutNum%
vbOut PortAddress%, PortNum%

End Sub

Private Sub Form_Load()
 Dim cmdLine As String
 cmdLine = Command()
 If cmdLine = "" Then MsgBox "Er is geen geldige parameter ingevoert!"
 If cmdLine = "1-aan" Then OutPort 888, 1
 If cmdLine = "1-uit" Then OutPort 888, -1
 If cmdLine = "2-aan" Then OutPort 888, 2
 If cmdLine = "2-uit" Then OutPort 888, -2
 If cmdLine = "3-aan" Then OutPort 888, 4
 If cmdLine = "3-uit" Then OutPort 888, -4
 If cmdLine = "4-aan" Then OutPort 888, 8
 If cmdLine = "4-uit" Then OutPort 888, -8
 If cmdLine = "all-aan" Then OutPort 888, 15
 If cmdLine = "all-uit" Then OutPort 888, -15
 End
 End Sub

Voor meer informatie over de dll kan je kijken op http://www.manta-rays.com/downloads/manuals/win95io.pdf

Alvast bedankt voor de moeite, en ik hoop dat we ze met ze alleen uitkomen!

Waarom moet het via taakplanner?
Wat wil je gaan aansturen?

Zo zou ik het doen:


Private Sub Form_Load()

Dim X as integer
Dim cmdLine As String, Port , AnnUit As String
cmdLine = Command()
Port = UCase(split(cmdLine, "-")(0))
AanUit = UCase(split(cmdLine, "-")(1))

Select Case Port
	Case "1":
		If AanUit = "AAN" then
			If State(1) = true then Goto AlAan Else OutPort 888, 1
		Else
			If State(1) = false then Goto AlUit Else OutPort 888, -1
		End If
	Case "2":
		If AanUit = "AAN" then
			If State(2) = true then Goto AlAan Else OutPort 888, 2
		Else
			If State(2) = false then Goto AlUit Else OutPort 888, -2
		End If
	Case "3":
		If AanUit = "AAN" then
			If State(3) = true then Goto AlAan Else OutPort 888, 3
		Else
			If State(3) = false then Goto AlUit Else OutPort 888, -3
		End If
	Case "4":
		If AanUit = "AAN" then
			If State(4) = true then Goto AlAan Else OutPort 888, 1
		Else
			If State(4) = false then Goto AlUit Else OutPort 888, -1
		End If
	Case "ALL":
		If AanUit = "AAN" then
		
		For X = 1 to 4
			If State(X) = True then Goto AlAan Else Outport 888, X
		Next X

		Else
		
		For X = 1 to 4
			If State(X) = True then Goto AlUit Else Outport 888, 0-X
		Next X

		End if
End Select

Exit SUb
AlAan:
msgbox "Ingevoerde poort is al aan", vbcritical, "Al Aan"
Exit Sub
AlUit:
msgbox "Ingevoerde poort is al uit", vbcritical, "Al Uit"
End Sub


Public Function State(Port as integer) As Boolean
'Zorg ervoor dat de variabele State True wordt als de poort aan is en False als deze uit is
'State = True
'State = False
End Function

Hij haalt eerst de poort en of hij aan of uit moet uit elkaar, dan gaat hij kijken met welke poort er iets moet gebeuren.

Bij all gaat hij alle poorten af.

Op 31 oktober 2003 19:57:39 schreef Jeroen1983:
Waarom moet het via taakplanner?
Wat wil je gaan aansturen?

Ik stuur met de parallele poort relais aan die 230 schakelen. Deze schakelen weer lampen enzo, een soort tijdklok op de pc dus.

Op 31 oktober 2003 20:21:13 schreef jeroentje:
Zo zou ik het doen:


Private Sub Form_Load()

Dim X as integer
Dim cmdLine As String, Port , AnnUit As String
cmdLine = Command()
Port = UCase(split(cmdLine, "-")(0))
AanUit = UCase(split(cmdLine, "-")(1))

Select Case Port
	Case "1":
		If AanUit = "AAN" then
			If State(1) = true then Goto AlAan Else OutPort 888, 1
		Else
			If State(1) = false then Goto AlUit Else OutPort 888, -1
		End If
	Case "2":
		If AanUit = "AAN" then
			If State(2) = true then Goto AlAan Else OutPort 888, 2
		Else
			If State(2) = false then Goto AlUit Else OutPort 888, -2
		End If
	Case "3":
		If AanUit = "AAN" then
			If State(3) = true then Goto AlAan Else OutPort 888, 3
		Else
			If State(3) = false then Goto AlUit Else OutPort 888, -3
		End If
	Case "4":
		If AanUit = "AAN" then
			If State(4) = true then Goto AlAan Else OutPort 888, 1
		Else
			If State(4) = false then Goto AlUit Else OutPort 888, -1
		End If
	Case "ALL":
		If AanUit = "AAN" then
		
		For X = 1 to 4
			If State(X) = True then Goto AlAan Else Outport 888, X
		Next X

		Else
		
		For X = 1 to 4
			If State(X) = True then Goto AlUit Else Outport 888, 0-X
		Next X

		End if
End Select

Exit SUb
AlAan:
msgbox "Ingevoerde poort is al aan", vbcritical, "Al Aan"
Exit Sub
AlUit:
msgbox "Ingevoerde poort is al uit", vbcritical, "Al Uit"
End Sub


Public Function State(Port as integer) As Boolean
'Zorg ervoor dat de variabele State True wordt als de poort aan is en False als deze uit is
'State = True
'State = False
End Function

Hij haalt eerst de poort en of hij aan of uit moet uit elkaar, dan gaat hij kijken met welke poort er iets moet gebeuren.

Bij all gaat hij alle poorten af.

Heel erg bedankt, ik zal hem morgen even testen en kijken of het werkt, omdat ik nu geen tijd heb. Het ziet er iniedergeval veelbeloofend uit!

Op 31 oktober 2003 21:01:04 schreef BHZ-Robert:

[...]

Heel erg bedankt, ik zal hem morgen even testen en kijken of het werkt, omdat ik nu geen tijd heb. Het ziet er iniedergeval veelbeloofend uit!

Ik ben zelf geinterreseerd in zoiets, alleen dan niet dat de computer de lampen bestuurt maar ik met knopjes de computer kan besturen.

Je moet trouwens wel de andere dingen laten staan, en de Form_Load vervangen met deze en de functie erbij.

Ik ben hem even aan het testen, maar ik krijg op de volgede regel een Subscript out of range fout: Port = UCase(Split(cmdLine, "-")(0)). Ik kom der zelf niet uit, omdat ik dit comando nog niet zo goed ken.

Dan is er iets fout met de command line parameters die je hebt getypt, waarschijnlijk ben je het - streepje vergeten

de Split(String As String, Delimeter As String) functie splitst een string in meerdere delen.

bvb: X = Split("Hallo,Doei", ",")

dan is X(0) = "Hallo"
en X(1) = "Doei"

En het enige dat UCase(String As String) doet is alles in hoofdletters zetten

[Bericht gewijzigd door jeroentje op ]

Ik krijg nu geen fout meer, maar hij werkt nog niet zoals het moet. Ik kan een poort wel aanzetten, maar als ik hem uit wil zetten zeg hij dat die al uit staat. En ik kan hem ook meerdere keeren aanzeten. Dit komt denk opdat elke opdracht in een nieuwe verster wordt geopent, en dus niet naar de variabelen van de vorige venster kijkt. Is het misien ook mogelijk om deze dan in een tekstbestand op te slaan?

Op 1 november 2003 08:46:17 schreef BHZ-Robert:
Ik krijg nu geen fout meer, maar hij werkt nog niet zoals het moet. Ik kan een poort wel aanzetten, maar als ik hem uit wil zetten zeg hij dat die al uit staat. En ik kan hem ook meerdere keeren aanzeten. Dit komt denk opdat elke opdracht in een nieuwe verster wordt geopent, en dus niet naar de variabelen van de vorige venster kijkt. Is het misien ook mogelijk om deze dan in een tekstbestand op te slaan?


Public Function State(Port as integer) As Boolean
'Zorg ervoor dat de variabele State True wordt als de poort aan is en False als deze uit is
'State = True
'State = False
End Function

Werkt dat wel goed? Hij gebruikt ook geen info van andere variabelen maar kijkt telkens weer opnieuw of de poort aan of uit is. Misschien heb je True en False omgedraaid?

Nee, ik heb alles volgesmij goed staan. Ik heb mijn code even opline gezet, misien kan jij der nog fouten in ontdekken. Je moet die win95IO.dll even in je windows/systems map zeten (deze werkt alleen maar voor windows 98). En met lpt.exe kan je kijken welke poorten aan of uit staan. Hier staat het zooitje: http://members.chello.nl/w.wester/Test.zip

Edit: Typo's

Op 1 november 2003 09:10:11 schreef BHZ-Robert:
Nee, ik heb alles volgesmij goed staan. Ik heb mijn code even opline gezet, misien kan jij der nog fouten in ontdekken. Je moet die win95IO.dll even in je windows/systems map zeten (deze werkt alleen maar voor windows 98). En met lpt.exe kan je kijken welke poorten aan of uit staan. Hier staat het zooitje: http://members.chello.nl/w.wester/Test.zip

Edit: Typo's

Ik heb al rond zitten kijken naar die win95io.dll en programmeren ermee, maar ik heb alleen een XP computer.

Ik zie het probleem al zitten denk ik,
De werking van die DLL is anders als ik dacht.

Als je 1 aan wil, moet je 1 typen. Dan krijg je in binair dus 10000000

wil je 4 aan habben, typ je 8 (binair voor 00010000)

telkens als je iets intypt, wist hij alles en zet hij alleen alles aan wat gevraagd is.

Stel, 2 staat al aan (01000000), en je wilt 4 erbij. Dan moet je dus 10 intypen (01010000).

Ik ga nu (ook omdat ik het zelf handig vind) een programmatje maken die kijkt welke er aan zijn (niet erg moeilijk) en dan zorgt dat die samen met de veranderingen worden toegepast.

Edit:
Ik heb eens zitten werken, ik gebruik een andere DLL (eigenlijk is hij verwekt in een ActiveX Control) die werkt op alle windows-versies (ook NT en XP), en ik heb daar een werkend programmatje mee gemaakt. Ik ga nu nog even de command line opdrachten erin toevoegen en dan zet ik hem wel op internet.

[Bericht gewijzigd door jeroentje op ]

Als je dat zou willen doen, heel erg bedankt!

Ik heb het programma af.

Het werkt zo: Hij gebruikt een ActiveX Control die een binair getal op de paralelle poort kan sturen. Ik heb in het programma Subs verwerkt die dat vertalen naar gewoon 1,2,3,4, en je kan dus nu dmv knoppen de poorten los aan of uit zetten.

Ook kan dat met de commandline, dan typ je <poort><+,-of T>

dus, als je poort 3 hoog wilt hebben, typ je

Project1.exe +3

Wil je alle poorten laag, typ je

Project1.exe -5
(5 = alle poorten)

T is voor Toggle, dat wil zeggen als de poort hoog is wordt deze laag en andersom.

Dus, als 4 aan is, 3 uit, 2 aan en 1 uit
en je typt

Project1.exe T5

dan wordt 4 uit, 3 aan, 2 uit en 1 aan.

Hier is de link: http://www.expandctss.com/upload/index.php?page=download&file=PPort.zi…

Even het bestand hwinterface.ocx naar C:\windows\system32 kopieren

Succes!

Werkt het niet, moet je het even zeggen dan kan ik het veranderen.

Ik wil dit zelf ook nog maken, kan je mij het schema sturen?

Ook met de pinouts van de lpt poort zou ik heel blij zijn :D

-12V aan de onderkant ? dan blaas je je relais op weet je zeker dat het niet 0V is ? en bij de 230 ook onderaan 0 :) anders heb je geen potentiaalverschil

[Bericht gewijzigd door Aedolon op ]

Moet idd 0V zijn, ik heb het een beetje vaag getekent. Met 12V - bedoelde in de - :-).

Jeroentje, de .exe file die je in het zipbestand meegestuurt had werkte goed. Maar als ik het project open, en dat wil testen krijg ik de volgende fout:

424
Object required

in de volgede regel:
X = PP.InPort(888)

Hoe kan ik dit oplossen?

Zorgen dat de HWInterface OCX de naam PP heeft

je ziet dus dat cirkeltje, die moet de naam PP hebben.