Programmierproblem bei Semesterarbeit

patzau
2010-01-08
2010-01-11
  • patzau - 2010-01-08

    Hallo

    Für eine Semesterarbeit im Programmieren (Nebenfach) habe ich folgende Aufgabe raelisiert.

    1. Messwerte von einem Multimeter Socomec über RS485 auslesen.

    2. Die Messwerte werden in der Visu online angezeigt.

    3. Mittels der Visu kann der Bediener die Messdaten in einer csv Datei speichern. Die Daten werden auf dem Controller Wago 841 gespeichert.

    4. Zur lokalen Auswertung der Daten mit Excel kann das File über FTP an einen FTP Server gesendet werden.

    Alle Funktionen funktionieren, aber leider kann ich nur ein Messwert aus dem Messgerät lesen. Ich sollte aber zyklisch zwei Messwerte über RS485 nacheinander auslesen.

    Kann sich mal jemand den Programmteil DataExchange anschauen?

    Ich finde den richtigen weg nicht.

    Dabei ist StartAdresse 782 (Spannung) und StartAdresse 768 (Strom). Wenn ich nur eine Adresse anwähle erhalte ich jeweils den richtigen Messwert Siehe PLC_PRG letzte zwei Netzwerke.

    Programm liegt bei

    Besten Dank für eure Unterstützung

    Patzau

    Forum IBZ Case Study 20100108.pro [116.48 KiB]

     
  • Uwe - 2010-01-11

    Hallo Patzau,

    ich denke du hast ein wenig viel gestartet

    lösch mal in den Zeilen 27 und 50 das

    start := true;

    und verschieb die Parametrierung hinter das

    IF NOT start THEN

    also so

    CASE state OF
    0:
    (* Spannung Daten vom Slave lesen und in Array Slavedata speichern*)
       IF NOT start THEN        (*start=StartFunction: wird zurückgesetzt nach erfolgreichem Ablauf des Dienstes Master - Slave Seite 4*)
          SlaveAddress:=5;
          FunctionCode:=16#3;     (* Manual Bibliothek Seite 3*)
          StartAddress:=782;      (* Spannung U1 -782 Dez oder 30E Hex, Strom I1  768 Dez oder 300 HEX*)
          NumberOfPoints:= 2;  (* 0=Bitzugriff, > 0 = Registerzugriff (2 Register WORD) *)
          IF rec.Data[1]=FunctionCode AND rec.Data[0]=SlaveAddress AND NOT BYTE_TO_BOOL(Master.error) THEN (*check answer*)
             FOR i:=0 TO rec.Data[2] DO         (*Nutzerdaten in Nutz Array schreiben*)
                slavedata1[i]:=rec.Data[3+i];    (* Empfangene Daten vom Diris Multimeter in Array schreiben*)
             END_FOR
             state:=1;
          ELSE
             start:=TRUE;
          END_IF
       END_IF
    1:
    (* Strom Daten vom Slave lesen und in Array Slavedata speichern*)
       IF NOT start THEN        (*start=StartFunction: wird zurückgesetzt nach erfolgreichem Ablauf des Dienstes Master - Slave Seite 4*)
          SlaveAddress:=5;
          FunctionCode:=16#3;     (* Manual Bibliothek Seite 3*)
          StartAddress:=768;      (* Spannung U1 -782 Dez oder 30E Hex, Strom I1  768 Dez oder 300 HEX*)
          NumberOfPoints:= 2;  (* 0=Bitzugriff, > 0 = Registerzugriff (2 Register WORD) *)
          IF rec.Data[1]=FunctionCode AND rec.Data[0]=SlaveAddress AND NOT BYTE_TO_BOOL(Master.error) THEN (*check answer*)
             FOR i:=0 TO rec.Data[2] DO         (*Nutzerdaten in Nutz Array schreiben*)
                slavedata2[i]:=rec.Data[3+i];    (* Empfangene Daten vom Diris Multimeter in Array schreiben*)
             END_FOR
             state:=0;
          ELSE
             start:=TRUE;
          END_IF
       END_IF
    END_CASE
    (*RS485 Einstellungen*)
    (*Call function blco for communication with slave*)
    Master(SlaveAddress:=SlaveAddress ,
          FunctionCode:=FunctionCode ,
          StartAddress:=StartAddress ,
          NumberOfPoints:= NumberOfPoints,
           bCOM_PORT:=2 ,
          cbCOM_BAUDRATE:=960 ,
          cpCOM_PARITY:=0 ,
          csCOM_STOPBITS:=1 ,
          cbsCOM_BYTESIZE:=8 ,
          cfCOM_FLOW_CONTROL:=halfduplex,
          TimeOut:=t#250ms ,
           StartFunction:=start ,
          ReceiveBuffer:=rec ,
          SendData:=send);
    
     

    Related

    Talk.ru: 1
    Talk.ru: 2


Log in to post a comment.