Hallo erst mal Ich habe mal ein bisschen in freebasic rumprogrammiert und habe ein kleines steurungsprogramm für dos ohne grafische darstellung im schrittkettenmodus.
Da reicht mir allerdings nicht ich würde gerne ein windows programm mit grafischer dastellung und gleisbildsteuerung.
allerdings habe ich eine solche funktion in freebasic noch nicht gefunden.Kann mir jemand ein (am besten kostenloses) programmierprogramm empfhelen.
Allerdings hab ich schon visual basic 5 extreme edition alledings lässt sich das programm nicht auf meinem rechner installieren (Win 98). Am besten wäre ein mit basic verwantess programm z.b eine alter version von visual basic.(bitte mit link wenn möglich und legal)
Solltest Du eh umlernen müssen und vielleicht Deine Programme auch später mal in freien Betriebssystemen verwenden wollen (spätestens wenn es Windows nur noch zur Miete gibt, werde ich voll auf Pinguin (Linux) umsteigen), kann ich Dir zwei Dinge nahelegen
- Lazarus (Pascal mit graphischer Fensterprogrammierung (freies Delphi) - gratis und frei) - Netbeans (graphische Java Programmierumgebung - gratis)
Beides wird für Dich nicht wirklich geeignet sein, denn beides (Delphi und Java) sind objektorientierte Sprachen, Delphi allerdings nur eine visuelle, objektorientierte Erweiterung für Pascal. Es gibt für natives Basic meines Wissens nach kein GUI-Toolkit für Fensteranwendungen unter Windows. Diese Gui-Toolkits oder -Biblitheken sind eigentlich immer objektorientiert, da es sonst sehr schwierig wird, die Fenster im Zusammenspiel mit der Maus zu koordinieren und Threads werden fast unmöglich. Ich würde auf proprietären Quatsch wie Winzigweich-VisualBasic verzichten und gleich eine offene Sprache wie C++ (mit Qt oder GTK, evtl. auch gleich DirectX bzw. OpenGL) oder Java (mit SWT) lernen. Die so geschrieben Programme kannst du dann für alle Plattformen, ob Windows, Linux, Symbian oder whatever kompilieren.
Delphi war damals die erste IDE, mit der ich gearbeitet habe. Es ist recht einfach zu erlernen. Wenn du mal ein bissl auf www.borland.de oder www.inprise.com herumschaust, wirst du dort irgendwo eine einfache Delphi Version zum kostenlosen Download (email adresse etc. muss man halt angeben) finden. Die sollte ausreichen. Damit kannst du auch prozedural (wie bisher) programmieren), aber eben auch objektorientiert (ist m. E. sowieso besser, einfach mal ein kurzes Buch darüber in der Bibo lesen, oder so, das kriegt man eigentlich schnell gebacken). Ansonsten kannst du Lazarus verwenden - das ist eine Art abgespeckter Delphi-Klon, obwohl es da auch feine Unterschiede gibt. Die zugrundeliegende Sprache ist dann halt Pascal, aber das lernt man so schnell allein anhand der Beispiele ... das sollte nun nicht das Problem sein.
Jetzt muss ich meine Tipps aber noch ein wenig verteidigen: Wenn man man mit einer grafischen IDE programmiert, so wie sie Netbeans(Java) und Lazarus/Delphi darstellen, kann man ersteinmal getrost das objektorientierte Programmieren außerachtlassen, denn genau dass, was man zum Beispiel nach einem Doppelklick auf einen Drücker programmiert (was also nach Klick auf diesen Drücker dann passieren soll) kann ja ruhig streng prozedural vonstattengehen, ohne dass man von objektorientierter Programmierung Ahnung haben muss.
da stimme ich Dir zwar zu, aber man berührt dennoch OO-Mechanismen, die zu verstehen dann nicht ganz leicht ist. Objektorientierte Programmierung ist kein Hexenwerk und macht aus meiner Sicht das Programmieren wesentlich leichter und übersichtlicher (natürlich nicht für ein 'Hello World').
Ich verstehe nicht viel vom programmieren. zur zeit nutzte ich ein Dos programm zur steuerung was eigendlich nur eine endlosschleife der programmme digi1 und digi2 und digi3 ist.
kann ich ein programm schreiben welches die werte (die ich eigendlich über die tastatur eingeben müsste )eingibt??
ich will also nicht' das komplette programm neu schreiben sonmdern nur ein programm welches die variablen des dos-programms meinen eigaben ensprechend verändert
doch auch das dos-programm hat so seine macken: so lautet das orginal von märklin:
100 OPEN "COM1:2400,N,8,2,CS10000,DS" FOR RANDOM AS #1 110 CLS 200 INPUT " Byte1 (Geschw. 0-15) "; GE 210 INPUT " Byte2 (Loknr. 1-80) "; LN 290 IF LOF(1) < 512 THEN GOTO 290 300 PRINT #1, CHR$(GE); CHR$(LN); 310 GOTO 200
was meint er bei 290 mit LOF und warum muss dieser wet kleiner 512 sein. mein pc hängt sich dbei immer auf. wenn ich die zeile lösche so funzt das programm. doch kann ich nicht testen ob es funktioniert da ich noch kein interface habe.
Ich hab' zwar von Basic keine Ahnung, aber bei 300 sieht es so aus, als ob er einfach nur die oben eingegebenen Variablen / Werte wieder ausgibt. Und damit er sicherstellt, dass das auch Zahlen bleiben, macht er da eine Funktion drum - das ist aber absolute Spekulation. LOF bei 290 bedeutet Length of File im übertragenen Sinn. Er schaut, ob oben beim "OPEN ... AS 1" Daten kommen die kürzer sind als 512 Byte.
Da Dos kein Multitak-Betriebssystem ist, kann immer nur ein Programm ablaufen. Daher klapt das mit der werteübergabe im betrieb erst einmal so einfach nicht. Ich kenne die Struktur von Digit 1-3 nicht, aber wenn ich dich richtig verstanden habe, dann soll die bedienung des Programmes nicht mehr über die Tastatur erfolgen, sondern aus einer Wertetabelle, in der die befehle in ihrer Zeitlichen Abfolge stehne, und eventuell auch mit "ausführungszeiten". Dazu würde ich den Dos- oder Bios-Tastaturabfrageaufruf (Interrupt 16.xx oder 21.01/08) über einen im Speicher verbleibenden Treiber umleiten. Wenn dann das Programm die Taustatur abfragt, startet die Subroutine, läd den nächsten Befehl mit Zeitmarke aus deiner Liste, überprüft ob die Zeitmarke erreicht ist ünd wenn ja übergibt er den Befehl (Tastencode) an das laufende Program und schaltet auf den nächsten befehl weiter. Wenn nein, dann wird der orginaltastaturaufruf aufgerufen (das Programm muß ja weiter bediehnbar bleiben) und überprüft. Kommt ein "Beenden"-Befehl, wird der treibe selbst ebenfalls mit beendet (Tastaturabfrageumleitung auf gehoben), ansonsten werden befehle normal an das Programm weiter geleitet. Eventuell hast du ja zu Digit 1-3 auch den Quellkode zur verfügung, dann könntest du dort anstelle der Tastaturabfragen einen Subroutinenaufruf einfügen, der dann die Tastatur Simulieren kann. Andere Alternative währe eventuell, das Programm unter Windows in einem Dos-Fenster laufen zu lassen, und dann an das Fenster aus einem anderen Fenster die Befehle zu senden (Würde über Prophan relativ leicht realisierbar sein). Es währe auch noch zu überprüfen, inwieweit die Programme (du rufst sie ja immer wieder auf, so wie du schreibst) über Aufrufparameter zu steuern gehen. Dann könnte man ein "oberprogramm" schreiben, das die aufrufe ausführt, und dabei dann die befehle als Parameter jeweils übergibt.
So, hoffe, das es für dich verständlich war, wenn nich bitte nachfragen.
Bei Zeile 290 ist klar, das sich der Rechner aufhängt! Wenn LOF < 512 ist, springt das Programm wieder an die se Abfrage (GOTO 290), und ist damit in einer endlosschleife. Also da dürfte die Sprungadresse falsch sein oder LOF soll die bereitschaft von COM1 abfragen und auf bereitschaft warten! Wenn ich das richtig lese, dann sagt das Programm folgendes aus: 100 Offne Serielle Schnitstelle COM1 110 Bildschirm löschen 200 Eingabe Geschwindigkeit 210 eingabe Loknummer 290 Com1 bereit? wenn nein warte auf bereitschaft 300 Sende geschwindigkeit und loknummer an Com1 310 Gehe wider auf eingabe Geschwindigkeit.
Wenn das Programm immer wieder aufgerufen wird, könnte es passieren das du dir durch das fehlen einer ordendlichen Beendigung deinen Speicher zu machst, da das Serielle port COM1 nicht wieder ordendlich geschlossen wird. Auch könnte es zu Zugrifsproblemen kommen. Input dürfte hier eine Tastaturabfrage auslösen, und das könnte man durch eine Dateiabfrage ersetzen. Ausserdem würde ich folgendes einfügen (Syntax ist nicht korekt, müsstest du mal nachschlagen wie er richtig ist): 220 If GE > 15 goto 320 (Ist Geschwindigkeit größer 15 programm beenden) 320 Close #1 (Schließe Port Com1) 330 ende (ordentliches Programmende)
das, was Du suchst ist eigentlich ganz einfach, wenn man sich mit BASIC weiter und tiefer beschäftigt.
Du schreibst Dir ein kleines Programm, welches von Dir eingegebene Daten in eine Datendatei schreibt. Aus dieser liest Du mit Deinem eigentlichen Steuerprogramm diese Daten zeilen- oder schrittweise wieder aus (OPEN "Laufwerk:PfadDateiname.Dateiendung" FOR OUTPUT AS #2) und sendest sie zur Anlage (PRINT #1, CHR$(GE); CHR$(LN). Dazu bedarf es allerdings einiger Zeilen mehr in Deinem Hauptprogramm, da Du beachten musst, wann der nächste Befehl ausgeführt werden soll (WAIT XX). In Deiner Datendatei müsste dann etwa Folgendes stehen:
1. Geschwindigkeit der Lok (bei eingeschalteter Funktion übrigens +16) 2. Die Adresse der Lok 3. Zeitspanne XX in Sekunden, wie lange auf den nächsten Befehl gewartet werden soll.
Mithilfe dieser Datei hast Du dann die Möglichkeit, komplette Fahrpläne für bestimmte Betriebssituationen zu schreiben. Willst Du einen anderen Fahrplan benutzen, so öffnest Du einfach eine andere Datendatei und startest Dein Programm. Den Dateinamen kann man übrigens auch in eine Variable packen. Diese wird beim Programmstart jedesmal von Dir eingegeben.
ALS Märklin 1985 mit dem Digitalsystem rauskam, hatte mir auch mal so ein Programm mit GWBASIC geschrieben. Um eine Übersicht zu haben, welche Lok wie schnell fährt, ob die Funktion eingeschaltet ist und welche Weiche oder welches Signal welche Stellung hatte. War mein Programm wesentlich umfangreicher. Es bot eine Automatiksteuerung und die Möglichkeit des manuellen Betriebs an. Es funktionierte recht gut, bis meine Anlage zu groß wurde und das Programm hoffnungslos überfordert war. Außerdem kam ja dann Winodws auf den Markt. Da konnte mein Programm von der Bedienungsfreundlichkeit nicht mehr mithalten und wurde schlussendlich gelöscht.
ja das könnte weiterhelfen.Doch eine frage habe ich dennoch. Wenn der befahl erst mit dem print in zeile 300 gesendet wird so kann mann ja die vorherigen eingaben geschwindigkeit und Lokardrese auch verändern. um so zuerst die lokardresse und dann die geschwindigkeit einzustellen. mein programm muss nicht besonders schnell sein da es eh nur um eine 10qm anlage mit wenig verkehr geht.
wenn der pc in zeile 290 abfragt ob das interfce vorhanden ist so ist es klar das er abstürtzt da ich ja noch kein interface habe.
in welcher Reihenfolge Du die Variablen mit Inhalt füllst, ist völlig belanglos. Hauptsache ist, dass in allen Variablen Werte eingetragen sind, bevor diese per PRINT #1 an die Anlage geschickt werden.
Übrigens gibt es in BASIC einen Befehl namens INKEY$. Die Syntax sieht so aus:
XXX: Variable$ = INKEY$
Der Vorteil liegt darin, dass man sich das Bestätigen mit ENTER bei der Eingabe sparen kann. Wenn Du auch Magnetartikel schalten willst, dann übergibst Du dieser Variablen einfach einen Wert mit einem anderen Anfangsbuchstaben. Die Lokadresse muss immer zweistellig sein und ggf. führende Nullen besitzen (z.B. 03). Bei Magnetartikel muss die Adresse immer dreistellig sein und ggf. führende Nullen besitzen (z.B. 009 oder 056).
Eingabe für Loksteuerung: L1012 --> Lok mit Adresse 10 auf Geschwindigkeit 12 Eingabe für Magnetartikel: W4833 --> Weiche oder Signal mit Adresse 48 auf Abzweig oder Halt. Bei letzterem sollte automatisch noch ein Stopbefehl (PRINT #1, chr$(32)) gesendet werden, damit der Decoder auch wieder abschaltet.
Nach Eingabe dieser Werte verzweigst Du mittels Abfrage (IF...THEN) in entsprechende Subroutinen (Programmabschnitte) und zerlegst den Rest des Variableninhalts.
Für Loksteuerung:
Die ersten beiden Zeichen nach dem L sind die Lokadresse (bei Dir LN$) und die zweiten beiden Zeichen die Geschwindigkeit (GE$). Diese beiden Variablen beinhalten dann die Zeichenketten "10" und "12". Da es sich wegen INKEY$ um STRING-Variablen ( Variablen, deren Inhalt neben den Ziffern 0-9 auch Buchstaben und Sonderzeichen enthalten können) handelt, musst Du sie noch in nummerische Variablen (können neben den Ziffern 0-9 noch "-" und "e" enthalten) umwandeln. Das geschieht mit LN = VAL(LN$) und GE = VAL(GE$). Dann schickst du alles zur Anlage.
Für Magnetartikel:
Das Verfahren ist identisch. Es müssen lediglich die ersten drei Zeichen der Adresse zugewiesen werden. Auch hier muss die Val(x)-Funktion benutzt werden. Nach dem Absenden des Befehls an die Anlage, sollte automatisch noch der Stop-Befehl (Syntax siehe oben) gesendet werden. Damit wird ein Durchbrennen der Spulen in nicht endabgeschalteten Antrieben verhindert.
Nun folgt wieder die Hauptroutine. Diese löscht sicherheitshalber alle benutzten Variablen und springt zur Eingabe zurück.
Btw, meine letzten BASIC-Programme liegen nun ja schon 20 Jahre zurück. Wie doch die Zeit vergeht.
doch ich hatte neulich eine idee. Der 16 poolige anschluss der control unit könnte ja mann auch direckt mit dem parallel oder com-port verbinden(natürlich mit ein paar wiederständen) wenn mann nun sein programm so schreibt das es auf diese weise mit der CU komuniziert und ein HSI88 anschließt so hat mann ja quasi sofwaremäßig ein interface ersätzt. zur manuellen steuerung kann man ja dann seine 80f's benutzten und den computer als automatiklösung nutzten. ist es den prinzipell möglich den I²C-Bus direkt zu emulieren?? Und wenn ja wie?
Im prinzip ist der I²C-Bus recht einfach aufgebaut, und läst sich leicht realisieren. Du benötigst 2 Bidirektionale Ports (eventuell noch einen 3. eingang zur Kolisiomsüberwachung der gerade gesendeten daten). Beide stehen auf empfang, und werden erst zum senden umgeschaltet. Der "Master" sendet dann über Takt und Daten die info (Adresse, Daten, Befehle in 8-Bit-Blöcke), und wartet anschließend auf die Antwort des Empfängers. Diese kann ein Ackno sein, oder angeforderte Daten. Danach schaltet der Sender (Master) wieder auf empfang. Mit welcher Taktfrequenz der empfänger/Sender arbeiten kann, müßtest du aus dessen dessen Dokumentation entnehmen. Was noch ein Broblem in der Programierung ist, ist die "Kollisionsüberwachung", das heist das erkennen, das 2 sender gleichzeitig senden wollen. Dazu muß in der "High"-Zeit der sender überprüfen, ob auch wirklich High anligt, und nicht ein anderer Sender ein Low sendet. Das gesamte I²C-Bus-Protokoll steht sicherlich an verschiedenen stellen im Netz. Mit einem Atmel-Risc-Prossesor (Atmel.com) ließe sich auch ein einfacher COM-I²C-Bus-Adapter bauen.
Nächstes Problem wäre, dass ic eine DDW-ähnliche software-zentrale schreiben will die allerdings unter DOS laufen soll und die über einen boosterleseanschluss verfügt.
Damit ist gemeint:
1.Ein Booster wird an COM 1 angeschlossen und versorgt die anlage mit strom. 2. Der boosterausgang der CU 6021 wird an COM 2 angeschlossen angeschlossen und der computer ließt die eingehenden daten aus und sendet sie falls nötig an die COM 1. 3. Der Parrallel port wird wie gehabt verwendet um S88 rückmelder auszulesen. 4.An COM3 wird ein andere Windows-PC mit beispielsweise Railroad&CO angeschlossen. 5.Der Zentralen-PC kann wie ein 6050/6051 angesprochen werden.
ist das mit freebasic machbar oder brauche ich C++ und ist C++ kostenlos!!!
Ich weis ich nerve mitlerweile mit meinen immmer neue fragen allerdings was kann ich daür das ich so wenig selber weis???
Ich weiß zwar nicht, wie gut du dich in Programieren und Rechnerstrukturen auskennst, du mit dem Lötkolben umgehen kanst und englisch (lesen) kannst, aber schon mal über folgendes nach gedacht: Wenn der "Steuerrechner" sowieso nur die daten von einem gerät zum anderen hin und her schieben soll, und nur einige wenige dinge auswerten soll, warum nicht gleich einen Kontroler dafür einsetzen? Bei Atmel.com gibt es Prozessoren, die mehrere Schnittstellen haben, Ram, EProm, AD-Wandler und Timer integriert haben, und ihre Ports (4-64) frei programiert bekommen können. Für deine anwendung währe sicher einer der AT-MEGA-Risc-Prozessoren sinnvoll.
ich habe eigendlich fast keine ahnung vom programmieren und hab auch nie etwas mit einem prozessor ausprobiert allerdings haben wir noch ein parr 286, 386 und 486 rechner die ich am liebsten nutzten will.
außerdem soll das programm gratis seij sprich ein modelbahner soll sich nicht erst einen prozessor kaufen und diesen dann auch noch einstellen.
Ich schätzte es gibt viele die noch einen computer übrig haben. weniger allerdings einen prozessor.
daher sollte das programm rein softwaremäßig (mit ausnahe von ein parr wiederständen) die verbindung herstellen.