Bräuchte Hilfe beim Nachfolziehen eines Beispielprojekts

Pneumatik

Level-2
Beiträge
46
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

ich bräuchte Hilfe beim Nachfolziehen eines Beispielprojekts.

Mein Problem ist, dass nicht bei jedem aufrufen des Bausteins "SEND" etwas gesendet wird.
Meist gehts beim ersten Mal immer und danach erst jeweils beim 4ten bis 5ten mal drücken des Schalters.

Woran könnte das liegen .. was übersehe ich relevantes in dem Code.
Den Anfangsteil mit dem Aufruf den Datenbank verstehe ich noch. Der Code danach ist mir leider nichtmehr klar.
Konkret gehts um die Teile:
Code:
// Generate edge P_SND_RK_REQ
und der darunterliegenden Programmteile.

Was davon könnte der Grund sein, das nicht immer beim Aufrufen von "SEND" etwas gesendet wird?
Eigendlich doch nur der Teil:
Code:
// Generate edge P_SND_RK_REQ
oder?

Falls irgendwelche weiteren Daten des Programms benötigt werden einfach fragen :)

Der Code des Projekts lautet:

OB100
__________________________________________________________________________________________________________
Code:
      L     B#16#0

      T     DB40.DBB    0               //P_SND_RK- Work-DB
      T     DB41.DBB    0               //P_RCV_RK-  Work-DB

// ---------------------------
// Reset counters/STATUS 
// ---------------------------
      T     "SEND WORK DB".P_SND_RK_WORK_LADDR    //P_SND_RK- Work -DB
      T     "SEND WORK DB".P_SND_RK_WORK_DB_NO
      T     "SEND WORK DB".P_SND_RK_WORK_DBB_NO
      T     "SEND WORK DB".P_SND_RK_WORK_LEN
      T     "SEND WORK DB".P_SND_RK_WORK_RES_1
      T     "SEND WORK DB".P_SND_RK_WORK_STATUS
      T     "SEND WORK DB".P_SND_RK_WORK_STATUS_SAV
      T     DB40.DBW   16

      T     "SEND SRC DB".P_SND_RK_COUNTER_OK    //Reset Counters
      T     "SEND SRC DB".P_SND_RK_COUNTER_ERR

      T     "RCV WORK DB".P_RCV_RK_WORK_LADDR    //P_RCV_RK-  Work-DB
      T     "RCV WORK DB".P_RCV_RK_WORK_DB_NO
      T     "RCV WORK DB".P_RCV_RK_WORK_DBB_NO
      T     "RCV WORK DB".P_RCV_RK_WORK_LEN
      T     "RCV WORK DB".P_RCV_RK_WORK_SAVE_LEN
      T     "RCV WORK DB".P_RCV_RK_WORK_STATUS
      T     "RCV WORK DB".P_RCV_RK_WORK_STATUS_SAV
      T     "RCV WORK DB".P_RCV_RK_WORK_RES_2
      T     "RCV WORK DB".P_RCV_RK_WORK_CNT_OK
      T     "RCV WORK DB".P_RCV_RK_WORK_CNT_ERR


FC21 bzw. "SEND"
__________________________________________________________________________________________________________
Code:
 L     256                         //LADDR
      T     "SEND WORK DB".P_SND_RK_WORK_LADDR

      L     42                          //DB_NO
      T     "SEND WORK DB".P_SND_RK_WORK_DB_NO
      T     "SEND SRC DB".P_SND_RK_DB_NO

      L     86                          //DBB_NO  0
      T     "SEND WORK DB".P_SND_RK_WORK_DBB_NO
      T     "SEND SRC DB".P_SND_RK_DBB_NO

      L     10                          //114
      T     "SEND WORK DB".P_SND_RK_WORK_LEN    //LEN
      T     "SEND SRC DB".P_SND_RK_LEN  //LEN

// ------------------------
// SEND with Instance-DB
// ------------------------
      CALL  "P_SND_RK" , "SEND IDB"
       SF      :='S'
       REQ     :="SEND WORK DB".P_SND_RK_REQ
       R       :="SEND WORK DB".P_SND_RK_R
       LADDR   :="SEND WORK DB".P_SND_RK_WORK_LADDR
       DB_NO   :="SEND WORK DB".P_SND_RK_WORK_DB_NO
       DBB_NO  :="SEND WORK DB".P_SND_RK_WORK_DBB_NO
       LEN     :="SEND WORK DB".P_SND_RK_WORK_LEN
       R_CPU_NO:=
       R_TYP   :=
       R_NO    :=
       R_OFFSET:=
       R_CF_BYT:=
       R_CF_BIT:=
       DONE    :="SEND WORK DB".P_SND_RK_DONE
       ERROR   :="SEND WORK DB".P_SND_RK_ERROR
       STATUS  :="SEND WORK DB".P_SND_RK_WORK_STATUS

// ------------------------
// Generate edge P_SND_RK_REQ
// ------------------------
      UN    "SEND WORK DB".P_SND_RK_REQ //P_SND_RK_REQ
      S     "SEND WORK DB".P_SND_RK_REQ //set P_SND_RK_REQ

      O     "SEND WORK DB".P_SND_RK_DONE    //P_SND_RK_DONE
      O     "SEND WORK DB".P_SND_RK_ERROR    //P_SND_RK_ERROR
      R     "SEND WORK DB".P_SND_RK_REQ //P_SND_RK_REQ

// -------------------------------
// Check "Complete without error"
// -------------------------------
      UN    "SEND WORK DB".P_SND_RK_DONE    //check P_SND_RK_DONE
      SPB   CHER                        //if P_SND_RK_DONE equals 0, jump to CHER
//and check P_SND_RK_ERROR

// -------------------------------
// "Complete without error"
//  P_SND_RK_DONE = 1
// -------------------------------
      L     "SEND SRC DB".P_SND_RK_COUNTER_OK    //"Complete without Error"
      +     1                           //increment counter
      T     "SEND SRC DB".P_SND_RK_COUNTER_OK

      NOP   0
      NOP   0                           //further user functions
      NOP   0

      BE    

// -------------------------------
// Check "Complete with error"
// P_SND_RK_ERROR = 1
// -------------------------------
CHER: UN    "SEND WORK DB".P_SND_RK_ERROR    //check P_SND_RK_ERROR
      BEB                               //if no error occured, jump to end

// -------------------------------
// "Complete with error"
// -------------------------------
      L     "SEND SRC DB".P_SND_RK_COUNTER_ERR    //"Complete with error"
      +     1                           //increment counter
      T     "SEND SRC DB".P_SND_RK_COUNTER_ERR

      L     "SEND WORK DB".P_SND_RK_WORK_STATUS
      T     "SEND WORK DB".P_SND_RK_WORK_STATUS_SAV    //save STATUS

      NOP   0
      NOP   0                           //Error-Handling
      NOP   0

      BE

Danke
 

Anhänge

  • DB40.pdf
    6 KB · Aufrufe: 2
  • DB41.pdf
    6,1 KB · Aufrufe: 2
  • DB21.pdf
    12,2 KB · Aufrufe: 5
  • DB22.pdf
    11,9 KB · Aufrufe: 2
Zuletzt bearbeitet:
Du darfst den Start nur ausgeben, wenn done bzw error da war.
Es ist doch an sich sehr einfach im send work DB.P_sndRK_work_status auszuwerten, was als Antwort ansteht.
Wie testest du die Kommunikation?

Mit Beispielen ohne Grundwissen kommst du vermutlich nicht ans Ziel.


bike
 
Du darfst den Start nur ausgeben, wenn done bzw error da war.
Es ist doch an sich sehr einfach im send work DB.P_sndRK_work_status auszuwerten, was als Antwort ansteht.
Wie testest du die Kommunikation?

Das war genau der Punkt, Start bzw. Error wird nicht jedesmals gesetzt.
Danke jetzt kann ich wenigstens die Ursache dafür suchen :)

Ich teste die Kommunikation indem ich als Empfänger einen PC mit Hyperterm habe und das aufrufen des Sendbausteins über eine LED sichtbar mache.
Und dank deines Hinweises habe ich jetzt im Debugger den Aktualwert der DB angeguckt.

Gibts noch andere Möglichkeiten zum testen ?
Mit Beispielen ohne Grundwissen kommst du vermutlich nicht ans Ziel.

bike

Und ja es wird hart .. ich lese mir ja parallel einiges an, aber es ist am Anfang halt extrem viel und ich habe niemanden (außer euch) der sich damit auch nur im geringsten auskennt. Dementsprechend muss ich bei euch meine blöden Fragen/Probleme posten :).
Aber ich muss sagen, dass ich langsam etwas mehr durchblick bekomme und beim lesen langsam beim interessanten Grundwissen ankommen.

@SoftMachine
Die Funktion "Send" wird einfach in einem extra Baustein aufgerufen, der wiederum durch den Schalter aufgerufen wird.
Das Aufrufen ist der der Impuls, oder ?
 
Hallo !
@SoftMachine
Die Funktion "Send" wird einfach in einem extra Baustein aufgerufen, der wiederum durch den Schalter aufgerufen wird.

Das Aufrufen ist der der Impuls, oder ?

Nein, der (Sende-)Impuls ist schon da und wird hier gemacht:

// ------------------------
// Generate edge P_SND_RK_REQ
// ------------------------
UN "SEND WORK DB".P_SND_RK_REQ //P_SND_RK_REQ
S "SEND WORK DB".P_SND_RK_REQ //set P_SND_RK_REQ <----- HIER
O "SEND WORK DB".P_SND_RK_DONE //P_SND_RK_DONE
O "SEND WORK DB".P_SND_RK_ERROR //P_SND_RK_ERROR
R "SEND WORK DB".P_SND_RK_REQ //P_SND_RK_REQ

Du darfst deinen "extra Baustein" und damit den Sendebaustein nicht bedingt durch das Betätigen des Schalters aufrufen, sondern absolut, er muss ständig bearbeitet werden.

Der Anstoss zum Senden erfolgt durch "SEND WORK DB".P_SND_RK_REQ.
Dies ist dein "Impuls", der hier in diesem Beispielprog. nach jedem erfolgten Senden immer erneut gesetzt wird (muss aber bei dir nicht so sein).


Den P_SND_RK_REQ solltest du mit deinem Schalter beeinflussen, um das Senden anzustossen.

Da Senden muss übrigens nicht zwingend in einem Zyklus fertig sein, kann auch länger dauern. Deswegen wird das DONE abgefragt.
Und der REQ muss vor erneutem Setzen mindestens einmal mit "0" am Sendebaustein bearbeitet werden.

Gruss
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Da Senden muss übrigens nicht zwingend in einem Zyklus fertig sein, kann auch länger dauern. Deswegen wird das DONE abgefragt.
Und der REQ muss vor erneutem Setzen mindestens einmal mit "0" am Sendebaustein bearbeitet werden.

Entweder done oder Error setzt das Startsignal zurück.
Aber du hast es richtig erkannt, es kommt nicht zuverlässig zu einem VKE 0 am REQ kommt.
Code:
UN "SEND WORK DB".P_SND_RK_REQ //P_SND_RK_REQ 
S "SEND WORK DB".P_SND_RK_REQ //set P_SND_RK_REQ [B]<----- [/B][U][B]HIER[/B][/U]
O "SEND WORK DB".P_SND_RK_DONE //P_SND_RK_DONE
O "SEND WORK DB".P_SND_RK_ERROR //P_SND_RK_ERROR
R "SEND WORK DB".P_SND_RK_REQ //P_SND_RK_REQ
An diesem Punkt würde ich nachschauen.


bike
 
Zurück
Oben