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!
jeroentje
Hij was al kapot toen je em aan mij gaf!!!
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 FunctionHij 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!
jeroentje
Hij was al kapot toen je em aan mij gaf!!!
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.
jeroentje
Hij was al kapot toen je em aan mij gaf!!!
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?
jeroentje
Hij was al kapot toen je em aan mij gaf!!!
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
jeroentje
Hij was al kapot toen je em aan mij gaf!!!
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.zipEdit: Typo's
Ik heb al rond zitten kijken naar die win95io.dll en programmeren ermee, maar ik heb alleen een XP computer.
jeroentje
Hij was al kapot toen je em aan mij gaf!!!
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 ]
jeroentje
Hij was al kapot toen je em aan mij gaf!!!
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.
jeroentje
Hij was al kapot toen je em aan mij gaf!!!
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 
Ik heb even het schema getekent:
De Pinout kan je vinden op http://www.circuitsonline.net/circuits/view/34
Aedolon
Just face it: sometimes nobody envies you. There has to be a bottom and that bottom is probaly you. // http://www.amazon.com/o/registry/VWZ93N4Y6XQT
-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 ]
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?
jeroentje
Hij was al kapot toen je em aan mij gaf!!!
Zorgen dat de HWInterface OCX de naam PP heeft
je ziet dus dat cirkeltje, die moet de naam PP hebben.