Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 2 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 11 bis 20 von 34

Thema: PC WorX und erster Versuch eines FB in ST

  1. #11
    Registriert seit
    25.06.2008
    Ort
    Blomberg/Lippe
    Beiträge
    1.293
    Danke
    51
    Erhielt 130 Danke für 124 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Mach doch das Array so groß wie das größte Datenpaket groß sein kann. Dann wartest du bis BUFFER_NOT_EMPTY True ist, weil dann weißt du ja das was im Empfangsspeicher steht. Dann füllt er den Speicher und du wartest dann bis sich an RECEIVE_BUFFER_COUNT nix mehr ändert, also 500 ms zum Beispiel. Und dann kannste den Speicher auslesen mit Request.
    Gruß
    Mobi


    „Das Einfache kompliziert zu machen ist alltäglich. Das Komplizierte einfach zu machen –
    das ist Kreativität“ (Charles Mingus).

  2. #12
    Portisch ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    07.09.2011
    Beiträge
    145
    Danke
    0
    Erhielt 3 Danke für 3 Beiträge

    Standard

    Habe es jetzt einmal auf die schnelle versucht:
    Code:
    IF NOT RS232_INIT_DONE THEN
     uart_status := INT#0;
     data_len := BYTE#0;
     RETURN;
    END_IF;
    
    RS232_RECEIVE_1(REQUEST:=RS232_RECEIVE_1.BUFFER_NOT_EMPTY,DATA:=Receive_Buffer);
    Receive_Buffer:=RS232_RECEIVE_1.DATA;
    
    IF RS232_RECEIVE_1.ERROR THEN
     uart_status := INT#0;
     data_len := BYTE#0;
     RETURN;
    END_IF;
    
    IF RS232_RECEIVE_1.DONE THEN
     CASE uart_status OF
     0: IF (Receive_Buffer[0] = BYTE#0) THEN
        uart_status := uart_status + INT#1;
      END_IF;
     1: IF( Receive_Buffer[0] = BYTE#16#55) THEN
       uart_status := uart_status + INT#1;
      END_IF;
     2: IF data_len = BYTE#0 THEN
       data_len := Receive_Buffer[0];
      ELSE
       (* read all data bytes *)
       uart_status := INT#0;   
      END_IF;
     END_CASE;
    END_IF;
    Ich schicke nun per RS232 0x00, 0x55, 0x02 an die SPS.
    Leider wird aber nur das erste Byte empfangen. Die restlichen scheinen verloren zu gehen.

    Receive_Buffer : Array[0..0] of BYTE;

  3. #13
    Registriert seit
    25.06.2008
    Ort
    Blomberg/Lippe
    Beiträge
    1.293
    Danke
    51
    Erhielt 130 Danke für 124 Beiträge

    Standard

    Receive_Buffer : Array[0..0] of BYTE; ?????????????????
    Gruß
    Mobi


    „Das Einfache kompliziert zu machen ist alltäglich. Das Komplizierte einfach zu machen –
    das ist Kreativität“ (Charles Mingus).

  4. #14
    Registriert seit
    25.06.2008
    Ort
    Blomberg/Lippe
    Beiträge
    1.293
    Danke
    51
    Erhielt 130 Danke für 124 Beiträge

    Standard

    Ich hab nochwas gefunden. Vielleicht hilft es dir ja.
    Angehängte Dateien Angehängte Dateien
    Gruß
    Mobi


    „Das Einfache kompliziert zu machen ist alltäglich. Das Komplizierte einfach zu machen –
    das ist Kreativität“ (Charles Mingus).

  5. #15
    Portisch ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    07.09.2011
    Beiträge
    145
    Danke
    0
    Erhielt 3 Danke für 3 Beiträge

    Standard

    Ja, ich weiß das Array [0..0] ist eigentlich ein (in Delphi zumindest) Dynamisches Array.
    Aber es gibt halt kein Array mit der Länge 1 da es dann ja einfach ein Byte ist.
    Das kann man aber als Data beim Receive nicht anhängen.

    Aber ich habe das mit dem Tipp mit der Zeit umgesetzt:
    Code:
    IF NOT RS232_INIT_DONE THEN
     init := FALSE;
     ReadBuffer := FALSE;
     RETURN;
    END_IF;
    
    (* make sure the first cycle works correctly *)
    IF NOT init THEN
     init := TRUE;
     last_count := INT#0;
     data_len := BYTE#0;
     ms := UDINT#0;
    END_IF;
    
    RS232_RECEIVE(REQUEST:=ReadBuffer ,DATA:=Receive_Buffer);
    Receive_Buffer:=RS232_RECEIVE.DATA;
    
    IF RS232_RECEIVE.DONE THEN 
     ReadBuffer := FALSE;
     data_len := INT_TO_BYTE(last_count);
     last_count := INT#0;
     ms := UDINT#0; 
    END_IF;
    
    IF last_count <> RS232_RECEIVE.RECEIVE_BUFFER_COUNT THEN
     (* buffer count changed, reset timeout *)
     last_count := RS232_RECEIVE.RECEIVE_BUFFER_COUNT;
     ms := UDINT#0;
    ELSE
     IF last_count <> INT#0 THEN
      (* read system time *)
      T_PLC_MS();
      tx:= T_PLC_MS.T_PLC_MS;
      (* add the current milliseconds *)
      ms := (tx - last) + ms;
      IF ms >= UDINT#50 THEN
       ReadBuffer := TRUE;  
      END_IF;
      last := tx;
     END_IF; 
    END_IF;
    RS232_RECEIVE RS232_RECEIVE VAR 0 0 0 0 0 0
    tx UDINT VAR 0 0 0 0 0 0
    last UDINT VAR 0 0 0 0 0 0
    init BOOL VAR 0 0 0 0 0 0
    ms UDINT VAR 0 0 0 0 0 0
    Receive_Buffer PND_IO_512 VAR 0 0 0 0 0 0
    data_len BYTE VAR_OUTPUT 0 0 0 0 0 0
    T_PLC_MS T_PLC_MS VAR 0 0 0 0 0 0
    last_count INT VAR 0 0 0 0 0 0
    ReadBuffer BOOL VAR 0 0 0 0 0 0
    RS232_INIT_DONE BOOL VAR_EXTERNAL 0 0 0 0 0 0
    Ist noch nicht ganz sauber - geht aber!!
    Wenn sich der Buffer Count 50ms nicht mehr ändert werden die Daten aus dem Buffer geholt.

    Danach kann der Receive_Buffer abgearbeitet werden...
    Geändert von Portisch (18.01.2012 um 08:43 Uhr)

  6. #16
    Portisch ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    07.09.2011
    Beiträge
    145
    Danke
    0
    Erhielt 3 Danke für 3 Beiträge

    Standard

    Da ich somit gerade an der Auswertung der RS232 Daten arbeite ist mir was aufgefallen:

    Es scheint das PC WorX kein ADR und SIZEOF kennt.
    Das scheinen aber Standard Operatoren von CodeSys zu sein:
    http://www.3s-software.com/index.sht...operator_gloss

    Wie bekomme ich die nun für PC WorX?

  7. #17
    Portisch ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    07.09.2011
    Beiträge
    145
    Danke
    0
    Erhielt 3 Danke für 3 Beiträge

    Standard

    Mit den Temperaturauswertungen über RS232 bin ich dann schon fast fertig!
    Anbei die 3 Funktionsblöcke.
    Diese Empfangen die Bytes und Werten das CMD_TSENSOR_TEMP aus.

    Die OneWire Devices haben diese Struct:
    Code:
    TYPE
    T_TEMPSENSOR : STRUCT
     Name : STRING;
     Temperature : REAL;
     Family : BYTE;
     Serial : STRING;
    END_STRUCT;
    END_TYPE
    
    TYPE
    T_TEMPSENSOR_ARRAY : ARRAY[0..1] OF T_TEMPSENSOR;
    T_ONEWIRE : STRUCT
     OneWireDevice : T_TEMPSENSOR_ARRAY;
     DeviceCount : INT;
    END_STRUCT;  
    END_TYPE
    Mann muss halt hier die Länge des Arrays anpassen damit es mit den Sensoren zusammen passt.

    In der OneWireDevices.ST kann man dann die Devices mit einer String-Serial einen Namen zuweisen.
    z.B. Raum 1, Raum 2,....

    OneWire.jpg


    Für diese Daten wurde dies an die SPS geschickt:
    00 55 0B 30 28 21 39 BB 03 00 00 09 D5 00 00 55 0B 30 28 A8 38 BB 03 00 00 B8 05 FF
    (HEX Format - eh klar)
    -25,1°C wegen Kältespray

    Aber der Code muss noch aufgeräumt werden!

    OneWire_Web.jpg

    Anzeige mit WebVisit im IE9 geht dann auch recht leicht
    Exports_FB.zip
    Geändert von Portisch (18.01.2012 um 17:03 Uhr)

  8. #18
    Registriert seit
    25.06.2008
    Ort
    Blomberg/Lippe
    Beiträge
    1.293
    Danke
    51
    Erhielt 130 Danke für 124 Beiträge

    Standard

    Hallo,

    also dynamische Arrays gibts schonmal nicht in PC WorX. Und Codesys hat mit PC WorX auch nichts zutun.
    Bei PC WorX gibts auch keine Pointer und somit auch kein ADR und SIZEOF. Aber du weißt ja sowieso wie groß das Array ist, da es ja statisch ist.


    Könntest du mal dein Projekt schicken, würde mir das gerne mal im Zusammenhang ansehen.

    Ich muss mir dann nur noch die Hardware zusammenstricken. Dann kann ich es auch mal testen.


    Hast du schon probiert mit den IR-Signalen?


    Aber sonst super, dass es läuft.
    Gruß
    Mobi


    „Das Einfache kompliziert zu machen ist alltäglich. Das Komplizierte einfach zu machen –
    das ist Kreativität“ (Charles Mingus).

  9. #19
    Portisch ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    07.09.2011
    Beiträge
    145
    Danke
    0
    Erhielt 3 Danke für 3 Beiträge

    Standard

    Zitat Zitat von Mobi Beitrag anzeigen
    Hallo,

    also dynamische Arrays gibts schonmal nicht in PC WorX. Und Codesys hat mit PC WorX auch nichts zutun.
    Bei PC WorX gibts auch keine Pointer und somit auch kein ADR und SIZEOF. Aber du weißt ja sowieso wie groß das Array ist, da es ja statisch ist.


    Könntest du mal dein Projekt schicken, würde mir das gerne mal im Zusammenhang ansehen.

    Ich muss mir dann nur noch die Hardware zusammenstricken. Dann kann ich es auch mal testen.


    Hast du schon probiert mit den IR-Signalen?


    Aber sonst super, dass es läuft.
    Das mit den Pointern habe ich dann schon feststellen müssen. Auch das bei PC WorX in Funktionen keine Arrays übergeben werden können. Dazu muss man einen Funktionsblock nehmen.

    Das mit dem IR funktioniert schon, ist nur noch nicht umgesetzt. Per IR können Commands 0x00-0xFF eingestellt werden.
    Auch kann man im AVR zwei verschiedenen IR-Befehlen (z.B. unterschiedliche Fernbedienungen) das gleiche Command zuweisen usw...

    Das µC Projekt ist noch nicht abgeschlossen da mir die Verbindung zwischen den µC noch nicht so gefällt. Wird wahrscheinlich CAN statt "OneWire".
    Auch das Programmieren der IR Codes für die Slaves, was derzeit über die RS232 gemacht wird, werde ich wahrscheinlich auf USB umstellen.
    Am PC ist die Programmierung der Slaves dann um einiges einfacher und komfortabler.

  10. #20
    Portisch ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    07.09.2011
    Beiträge
    145
    Danke
    0
    Erhielt 3 Danke für 3 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Nun hier einmal das RS232 Projekt.

    Also einfach mit 9600, 8E1 mit der SPS verbinden und dann z.B. diese Commandos probieren:

    2 Temperatur Sensoren:
    Hex:
    00 55 0B 30 28 21 39 BB 03 00 00 09 E5 00 00 55 0B 30 28 A8 38 BB 03 00 00 B8 EE 00
    DEC:
    000 085 011 048 040 033 057 187 003 000 000 009 229 000 000 085 011 048 040 168 056 187 003 000 000 184 229 000

    IR Command:
    Hex:
    00 55 02 10 11
    DEC:
    000 085 002 016 017

    (ich nehme HTerm von hier http://www.der-hammer.info/terminal/)

    Wenn ein neuer unbekannter Sensor angeschlossen wird, der nicht definiert ist wird er per Serial-String definiert.
    Das "IR_Changed" gibt einen Puls aus wenn ein neues IR_Command empfangen wurde.
    Danach kann man das IR_Command mit 265 Möglichkeiten verknüpfen.

    Testweise kann ich schon schön mit der Fernbedienung ein Toggle hin und her schalten


    Screen.jpg

    RS232_Test.zip
    Geändert von Portisch (19.01.2012 um 11:23 Uhr)

Ähnliche Themen

  1. 2ter versuch, cpu 314 ifm, diverse karten und netzteil
    Von AlterEgo im Forum Suche - Biete
    Antworten: 1
    Letzter Beitrag: 07.01.2011, 11:26
  2. Mein erster FB
    Von WL7001 im Forum Simatic
    Antworten: 16
    Letzter Beitrag: 15.03.2008, 15:44
  3. AB erster Zyklus, oder erster Aufruf des Task nach RUN
    Von MSB im Forum Sonstige Steuerungen
    Antworten: 2
    Letzter Beitrag: 22.02.2008, 10:09
  4. Erster!
    Von mariob im Forum Stammtisch
    Antworten: 29
    Letzter Beitrag: 10.01.2008, 10:04

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •