Dezimalzahl in Datenbaustein laden

Zuviel Werbung?
-> Hier kostenlos registrieren
Moin Alexus85,

jetzt kann man mit Deiner genauen Aufgabenbeschreibung in Beitrag #12 was anfangen.
Leider habe ich jetzt nicht die Zeit zum helfen, doch vielleicht hilft Dir mittlerweile jemand anders ...

Harald

als lösung für mehrere texte würde mir aufbauend auf der schleifenlösung ein meldungspuffer einfallen, der indirekt übers AR2 adressiert wird und alle geänderten zustände einträgt ... nach dem senden an den drucker wird der puffer dann wieder gelöscht...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zitat von Mordor_FRI
Sprünge wurden nicht sauber ausgeführt etc.

Hi,

#Offtopicmodus AN
Ja das ist dann der Fall wenn ein Bit querliegt und nicht sauber durch die Leitung geht. Oder das Bit hat den Signalzustand 0,5 angenommen.
#Offtopicmodus AUS

Gruß

PhilippL

@all: Sorry mußte einfach sein *ROFL*
 
@vierlagig

Code:
*
//Adressregister initialisieren
      LAR1  P#0.0
[COLOR=Red][B]      AUF   DB [#iDBNo][/B][/COLOR]
//Schleife vorbereiten
      L     200
next: T     #iLoopCounter
//Eingang Abfragen
      U     E [AR1,P#0.0]
      FP    [COLOR=red][B]DBX[/B][/COLOR][AR1,P#0.0]
      SPBN  nich
//Nummer berechnen und ausgeben
      L     -1
      L     #iLoopCounter
      *I    
      +     200
      T     #iNumber
//Adressregister erhöhen und solange Schleifenzähler > 0 zurück zu next
nich: +AR1  P#0.1
      L     #iLoopCounter
      LOOP  next

Also ich hab mal den quellcode eigegeben und versucht zu verstehen was da gemacht wird. Ganz bin ich nicht durchgestiegen, aber auf alle fälle hab ich nicht das gewünschte Ergebnis. -> Er zähl mir nämlich im OB die einzelnen Eingänge zusammen. Ich brauch ja eine Anzeige von genau dem Eingang der sich geändert hat.

Ich hab das auch schon mit folgendem versucht zu lösen:

Code:
L MW 0
L EW 0
XOW 
L EW 0
UW
T DB10.DBW0
Das ganze eig. mit DWORD. Damit kann ich sehen wo im EW 0 eine postive Flanke vorkam und mir das in den DB schreiben lassen.
ABER -> er rechnet ja von binär in dezimal um

E 0.1 : 0000 0001 = 1 -> passt!
E 0.2 : 0000 0010 = 2 -> passt!
E 0.3 : 0000 0100 = 4 -> game over!

Noch hab ich nix passendes gefunden. Ich hoffe ihr habt die entscheidende Idee für die Lösung meines Problems. :confused:
 
Also ich hab mal den quellcode eigegeben und versucht zu verstehen was da gemacht wird. Ganz bin ich nicht durchgestiegen, aber auf alle fälle hab ich nicht das gewünschte Ergebnis. -> Er zähl mir nämlich im OB die einzelnen Eingänge zusammen. Ich brauch ja eine Anzeige von genau dem Eingang der sich geändert hat.

Irgendwas machst Du falsch. Bei mir funktioniert's.

Hast Du vielleicht eine der Lokalvariablen verkehrt deklariert?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Irgendwas machst Du falsch. Bei mir funktioniert's.

Hast Du vielleicht eine der Lokalvariablen verkehrt deklariert?

Ich bin davon ausgegangen, dass " i# " für integervariable steht.
Da hat gleich garnichts funktioniert. Erst alls ich aus den Lokalvariablen allgemein gültige (MW...) gemacht hab hats wenigstens soweit funktioniert, dass er vernünftige Zahlen in den DB schrieb.
 
Code:
*
DATA_BLOCK DB 2
TITLE =
VERSION : 0.1


  STRUCT 	
   aFlag : ARRAY  [0 .. 119 ] OF BOOL ;	
  END_STRUCT ;	
BEGIN 
END_DATA_BLOCK

FUNCTION FC 6 : INT
TITLE =
VERSION : 0.1


VAR_INPUT
  iInDBNo : INT ;	
  iInFirstByte : INT ;	
  iNumberOfIns : INT ;	
END_VAR
VAR_TEMP
  iDbNo : INT ;	
  iLoopCounter : INT ;	
  iNumber : INT ;
  dAR1Temp : DWORD ;
  dAR2Temp : DWORD ;	
END_VAR
BEGIN
NETWORK
TITLE =

	  TAR1  #dAR1Temp
	  TAR2  #dAR2Temp

      L     #iInDBNo; 
      T     #iDbNo; 

//Adressregister initialisieren
      L     #iInFirstByte; 
      SLD   3; 
      LAR1  ; 
      LAR2  P#0.0; 
      AUF   DB [#iDbNo]; 
//Schleife vorbereiten
      L     #iNumberOfIns; 
next: T     #iLoopCounter; 
//Eingang Abfragen
      U     E [AR1,P#0.0]; 
      FP    DBX [AR2,P#0.0]; 
      SPBN  nich; 
//Nummer berechnen und ausgeben
      L     -1; 
      L     #iLoopCounter; 
      *I    ; 
      L     #iNumberOfIns; 
      +I    ; 
      T     #iNumber; 
//Adressregister erhöhen und solange Schleifenzähler > 0 zurück zu next
nich: +AR1  P#0.1; 
      +AR2  P#0.1; 
      L     #iLoopCounter; 
      LOOP  next; 
      
      LAR1  #dAR1Temp
	  LAR2  #dAR2Temp

      L     #iNumber; 
      T     #RET_VAL; 

END_FUNCTION

ORGANIZATION_BLOCK OB 1
TITLE = "Main Program Sweep (Cycle)"
VERSION : 0.1


VAR_TEMP
  OB1_EV_CLASS : BYTE ;	//Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
  OB1_SCAN_1 : BYTE ;	//1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
  OB1_PRIORITY : BYTE ;	//Priority of OB Execution
  OB1_OB_NUMBR : BYTE ;	//1 (Organization block 1, OB1)
  OB1_RESERVED_1 : BYTE ;	//Reserved for system
  OB1_RESERVED_2 : BYTE ;	//Reserved for system
  OB1_PREV_CYCLE : INT ;	//Cycle time of previous OB1 scan (milliseconds)
  OB1_MIN_CYCLE : INT ;	//Minimum cycle time of OB1 (milliseconds)
  OB1_MAX_CYCLE : INT ;	//Maximum cycle time of OB1 (milliseconds)
  OB1_DATE_TIME : DATE_AND_TIME ;	//Date and time OB1 started
  sTemp : STRING  [11 ];	
END_VAR
BEGIN
NETWORK
TITLE =

      CALL FC     6 (
           iInDBNo                  := 2,
           iInFirstByte             := 0,
           iNumberOfIns             := 120,
           RET_VAL                  := MW    10);
      NOP   0; 
END_ORGANIZATION_BLOCK

übersetz dir mal die quelle...
 

Anhänge

  • input1.JPG
    input1.JPG
    23,2 KB · Aufrufe: 13
  • input2.JPG
    input2.JPG
    22,7 KB · Aufrufe: 10
  • input3.JPG
    input3.JPG
    22,9 KB · Aufrufe: 8
Ok, ok, ich nehme alles zurück. Es funktioniert tatsächlich.

Hat wohl auch schon vorher funktioniert, aber eine Frage wäre da noch offen.

Ich hab das ganze über eine Variablentabelle simuliert und mir den DB anzeigen lassen. In dem steht aber immer die Summer der aktiven Eingänge. Aber drucken tut er anscheinend den richtigen. Deswegen dachte ich zunächst auch es funktioniert nicht.

Also
E0.1 kommt -> im DB steht die 1 -> gedruckt wird Meldung 1
E0.3 kommt danach -> Im DB steht die 5 -> gedruckt wird Meldung 3

Wie kommt das zu stande?

Seh ich das richtig, dass dieser Quellcode nun ausreicht für Meldungen weit über 100 Stück? Bzw. dass ich das mit #iNumberofIns festlegen muss?

Danke nochmals!!
 
Also
E0.1 kommt -> im DB steht die 1 -> gedruckt wird Meldung 1
E0.3 kommt danach -> Im DB steht die 5 -> gedruckt wird Meldung 3

Wie kommt das zu stande?

der DB stellt nur den flanken-puffer zur verfügung ... also die helpflags für die auswertung der positiven flankenauswertung der "1000" eingänge, für jeden eingang eine...

Seh ich das richtig, dass dieser Quellcode nun ausreicht für Meldungen weit über 100 Stück? Bzw. dass ich das mit #iNumberofIns festlegen muss?

Danke nochmals!!

ja, du kannst weit über 100 eingänge auswerten und gibst die anzahl über #iNumberOfIns an, das startbyte kannst du auch festlegen. einzig auf die arraygröße im db mußt du noch achten.

achtung: viele schleifendurchläufe verbraten natürlich viel zeit! du bekommst auch immer nur den höchsten (neu getriggerten) eingang angezeigt ... hier ist noch room for improvement siehe stichwort meldungspuffer oder schleife nach gefundenen eingang abbrechen, je nachdem was du willst...
 
Ich bins nochmal!

Nachdem das Programm auf meiner Test-CPU funktioniert hat, habe ich es jetzt auf die eigentliche CPU geschrieben.

Und sieh da, es funktioniert NICHT?!

Wenn ein Eingang von 0 auf 1 wechselt wird immer die 0 ausgewertet und nie die Nummer des Eingangs. Das heisst es kommt egal bei welchem Eingang immer die erste Meldung.

Ein zweites Phänomen dem ich auf der Spur bin wäre, dass ich eine Verzögerung von 4 Meldungen habe. Wo kann man das einstellen, dass die Meldungen in Echtzeit, also Meldung kommt -> Meldung wird sofort gedruckt, verarbeitet werden??

Ich hab so das gefühlt kurz vor der Ziellinie zu sein, und etz kleb ich auf der Laufbahn fest :rolleyes:
 
Alle verwendeten Merker, Merkerworte etc. sind frei und werden nicht beeinflusst.
Ich hab mir eine VAT-Tabelle angelegt und da kann ich manchmal sogar sehen wie er für einen Bruchteil einer Sekunde die richtige Dezimalzahl reinschreibt. Ich hab iwie das Gefühl dass es mit der Zykluszeit zusammenhängen könnte. Aber wissen tu ich es nicht.
 
Alle verwendeten Merker, Merkerworte etc. sind frei und werden nicht beeinflusst.
Ich hab mir eine VAT-Tabelle angelegt und da kann ich manchmal sogar sehen wie er für einen Bruchteil einer Sekunde die richtige Dezimalzahl reinschreibt. Ich hab iwie das Gefühl dass es mit der Zykluszeit zusammenhängen könnte. Aber wissen tu ich es nicht.

er schreibt die meldung ja auch nur in einem zyklus rein, wenn du sie danach oder vor der nächsten bearbeitung wieder ablöschst, is sie, öhm, WEG!
 
Da gibt es ein Anstoßbit. Wenn das Bit von 0 auf 1 wechselt wird der Drucker aktiviert.

Ich hab auf der Test-CPU es hier eingesetzt:


//Eingang Abfragen
U E [AR1,P#0.0];
FP DBX [AR2,P#0.0];
FP M1.0 <----- hier
SPBN nich;

Bei meinem Testprogramm hat das wunderbar funktioniert. Jetzt bei der eigentlichen CPU nicht mehr. Das Anstoßbit ist NICHT vergeben.

Zum Test hab ich es einmal manuell ansteuern lassen, sprich im OB 1:

U E0.3
FP M1.0

-> Dann hats geklappt, aber der Drucker hat Meldung 1 gedruckt
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn ich mir den Code von 4L genauer angucke fällt mir was auf:
Versuch mal, die Variable "iNumber" durch ein Merkerwort zu ersetzen.
Dann müsste jede Zahl solange anstehen, bis die nächste Flanke kommt.
Da "iNumber" in 4Ls Code nicht vorbelegt wird, kann sie sogar unter Umständen einen völlig falschen Wert ausgeben, anscheinend hast Du aber "Glück" und bekommst nur "0" zurück.
 
@M-Ott

So, ich ab das jetzt mal beherzigt und "iNumber" durch ein MW ersetzt.

Jetzt wenn ichs mir in der VAT-Tabelle ansehe bleibt es halt bestehen bis zum nächsten wechsel -> ok

Trotzdem druckt er immernoch die Meldung für 0 aus!!

Es ist mir echt unerklärlich warum?!?!

Genauso unerklärlich wieso auf der Test-CPU das mit dem Anstoßbit ...

//Eingang Abfragen
U E [AR1,P#0.0];
FP DBX [AR2,P#0.0];
FP M1.0 <----- hier
SPBN nich;

... funktioniert hat.

Falls das jetzt nicht gehen sollte, wie schreib ich am einfachsten, dass wenn einer der 350 Eingänge kommt, das Anstoßbit kurz auf 1 springt??
 
Zum Thema 'falsche Meldung':
Erhälst Du denn den richtigen Wert abhängig vom gesetzten Bit?

Zum Thema 'Anstoß-Bit'
FP ...
FP ...
funktioniert, ist aber ungewöhnlich.
FP ...
= ...
hat den gleichen Effekt.
Auf welche CPUs hast Du das Programm bisher aufgespielt?
Vieleicht sind auch die Zykluszeiten auf der Maschine so kurz, dass Dein Signal zu kurz ist, um den Drucker anzustoßen. In dem Fall müsstest Du Dein Anstoßbit verlängern, was aber (je nach Schalthäufigkeit Deiner Eingänge) dazu führen könnte, dass Dir Signale verloren gehen.
 
Zurück
Oben