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

Seite 3 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 21 bis 30 von 40

Thema: VBscript. Was passiert wenn man 2 Skripte auf einmal auslöst ?

  1. #21
    Registriert seit
    19.09.2005
    Ort
    Freudenstadt
    Beiträge
    811
    Danke
    64
    Erhielt 101 Danke für 64 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von vierlagig Beitrag anzeigen
    in C# habe ich andere erfahrungen gemacht *grübel*
    Da trügt Dich bestimmt Deine Erinnerung ...


    Gruß Axel
    Man muß sparn wo mn knn!

  2. Folgender Benutzer sagt Danke zu afk für den nützlichen Beitrag:

    vierlagig (11.06.2008)

  3. #22
    Registriert seit
    19.09.2005
    Ort
    Freudenstadt
    Beiträge
    811
    Danke
    64
    Erhielt 101 Danke für 64 Beiträge

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    @afk und 4L :
    Es ist schön, wie ihr hier philosophiert ... das hat nur leider (aus miener Sicht) gar nichts mit dem "Fehler" zu tun.
    Ich philosophiere nicht, ich korrigiere nur eine falsche Aussage, die man IMHO so nicht stehen lassen kann.

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    Es ist auch kein Fehler sondern eher ein Ablauf-Problem. Das Script ist ja gar nicht fehlerhaft sondern es tritt eine Art Stau im Scripte-Stapel auf. Dieser rührt aus meiner Sicht von einer Überlastung die ursächlich aus dem Variablen-aktualsieren kommt.
    Da bin ich ganz Deiner Meinung, nur daß ich aufgrund Jespers Beschreibung einen anderen Grund für das Problem vermute als Du, wie ich hier auch zusammen mit einem mir bekannten Lösungsweg zu dem Problem aufgezeigt habe, wobei ich leider nicht weiß, ob das unter WinCC-Flexible auch funktioniert.

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    In diesem Sinne ...
    , ich bin auch auf die Auflösung gespannt ...


    Gruß Axel
    Man muß sparn wo mn knn!

  4. #23
    Avatar von JesperMP
    JesperMP ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.629
    Danke
    377
    Erhielt 801 Danke für 642 Beiträge

    Standard

    Zitat Zitat von afk Beitrag anzeigen
    Ich kenne WinCC-flex zwar überhaupt nicht, aber bei den ADO-Komponenten gibt es normalerweise jeweils eine Eigenschaft für den Connection-Timeout (beim Connection-Object, per Default 15 Sek.) und für den Command-Timeout (beim Recordset-Object und Command-Object, per Default 30 Sek.). Beide Timeouts werden in Sekunden angegeben, und besonders bei Verbindungen zu einer Datenbank auf dem gleichen PC oder im LAN kann man den Connect-Timeout meist problemlos verkürzen. Der Command-Timeout muß aber lange genug sein, damit die Abfrage innerhalb dieser Zeit auch in jedem Fall von der Datenbank verarbeitet werden kann.
    Das war sehr hilfreiche Informationen.
    Die 15-30 Sekunden Timeout kann genau erklären, warum ein Skript bufferüberlauf passiert, wenn das Skript alle 3 sekunden ausgelöst wird.
    Ich werde in diese ein bisschen mehr untersuchen.
    Jesper M. Pedersen

  5. #24
    Avatar von JesperMP
    JesperMP ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.629
    Danke
    377
    Erhielt 801 Danke für 642 Beiträge

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    Hallo Jesper,
    gibt es bei dir neue Erkenntnisse ...?
    Da ich ein ähnliches Problem habe würden mich deine Ergebnisse natürlich brennend interessieren.
    Ich tue die Fehlersuche und Änderungen per email (!).
    Der Kunde ist in Japan, und ist sehr, sehr vorsichtig.
    Leider ist der nächste "Fenster" für ein Programmänderung erst Freitag 20. Juni.


    Zitat Zitat von Larry Laffer Beitrag anzeigen
    Mein Augenmerk hier besonders die 0,4s-Tags.
    Ja, es gibt tags mit 0.4 sek aktualisierungs takt.
    Aber das skript wird mit 3 sekunden getriggert.
    Ich glaube nicht dass die 0.4 sekunden tags probleme verursachen.

    Es ist mir jetzt klar das es ist notwendig den ADODB timeout zeit von 15-30 sekunden auf 5-10 sekunden zu bringen.
    Ich habe jetzt folgendes eingefügt:
    conn.connectionTimeout 5
    conn.commandTimeout 5

    Dazu habe ich folgendes geändert:
    Skript wir nur gestartet wenn vorige skript erfolgreich beiendet ist plus 3 sekunden wartezeit, oder nach ein timeout von 10 sekunden.

    Ich bin überzeugt das die programmänderungen das problem mit Skript überlauf vermeiden will.
    Das ursprüngliche (und eigentliche) Problem hatte mit der Netzwerkverbindung zu der Datenbank oder der Datenbank selber zu tun. Dafür ist meine Kunde verantwortlich.
    Doch der Effekt war, dass mein Skript gestört wäre und nicht wieder automatisch wiederholen konnte.

    Von diesen thread habe ich viel gelernt.
    Danke an LL und AFK !
    Jesper M. Pedersen

  6. #25
    Registriert seit
    19.09.2005
    Ort
    Freudenstadt
    Beiträge
    811
    Danke
    64
    Erhielt 101 Danke für 64 Beiträge

    Standard

    Zitat Zitat von JesperMP Beitrag anzeigen
    Danke an LL und AFK !
    Gern geschehen.
    Laß mal hören, ob die Änderung den gewünschten Erfolg gebracht hat, sobald Du mehr weißt.


    Gruß Axel
    Man muß sparn wo mn knn!

  7. #26
    Avatar von JesperMP
    JesperMP ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.629
    Danke
    377
    Erhielt 801 Danke für 642 Beiträge

    Standard

    Ich kann voraussagen, dass wenn die Überlauf-Fehler wird gelöscht, dann beginnt die Jagd auf das eigentliche Problem.


    Ich möchte gerne eine bessere Fehlerdiagnose für die Endbenutzer.
    Es wäre gut zu wissen, ob das Problem mit der Datenbank, oder mit dem Netz liegt.
    Dafür spekuliere ich jetzt, ob ich ein "Ping"-SKript starten soll (nur einmal), in den Fall das es gibt ein Fehler mit ADODB.

    Code:
     dim strTarget, strPingResults, biPingDone
     
    On Error Resume Next
     
    strTarget = "10.1.0.7" 'IP address or hostname of server
    
    Set objShell = CreateObject("WScript.Shell")
    
    IF NOT biPingDone THEN 
      Set objExec = objShell.Exec("ping -n 2 -w 1000 " & strTarget)
      strPingResults = LCase(objExec.StdOut.ReadAll)
      IF NOT InStr(strPingResults, "reply from")  THEN 
        ShowSystemAlarm("There is no LAN connection to the database server !")
      END IF
      biPingDone = TRUE
    END IF
    Jesper M. Pedersen

  8. #27
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.728
    Danke
    398
    Erhielt 2.406 Danke für 2.002 Beiträge

    Standard

    Mir ist da noch etwas eingefallen - vielleicht bringt es was ...

    Wie gestaltet sich konkret dein Zugriff auf die Datenbank (Code-Beispiel) ?
    Ich hatte da vor sehr langer Zeit mal was (da ging es aber um Lesen). Dabei war der Zugriff auf die Datenbank das was Zeit gekostet hat. Hatte man dann den Zugriff, dann war es (fast) egal ob man 1 oder 100 Variablen gelesen hat. Vielleicht ist das bei dir so ähnlich. Wenn ja, dann könntest du doch die Datensätze in der Visu zunächst (lokal) puffern und irgendwann 5 oder 10 Datensätze schreiben. Ggf. bekommst du dann von der Überlast etwas weg ...

    Und noch etwas ...

    Wieviele Scripte werden denn noch so in deinem Projekt angestossen und welchen Zweck haben sie ?
    Vielleicht ist es möglich, da etwas zu optimieren ...

    Gruß
    LL

  9. #28
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    @larry: der ansatz klingt nicht schlecht... was ist wenn man die verbindung offen läßt? kommt das nicht aufs selbe?
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  10. #29
    Avatar von JesperMP
    JesperMP ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.629
    Danke
    377
    Erhielt 801 Danke für 642 Beiträge

    Standard

    Hallo LL

    Es gibt zwei Skripte.

    En "lese" skript, das ich leider immer zyklisch aufrufen muss, wegen das ich erkennen muss wenn ein neuen teil gefertigt ist in kundensitige maschine.
    Jetzt will ich es so ändern dass ich ein quittierung bekommt bevor ich das nächste lese-skript auslöst.

    Dann gibt es ein "rückmeldungs"-skript an den kunde, so das er verschiedene daten bekommt über den teil.

    Beide SQL operationen bestehen von nur 2 records (1 in jeder richtung). Die daten sind "fields" innerhalb diese records.
    Also, es ist so einfach und schnell wie möglich denke ich.

    Lese skript:
    Code:
    ' en: The script reads the indicated data record
    'Declaration of local tags
    Dim conn, rst, SQL_Table, strNameOfDatabase, strDSN, strNameOfTable, strConnect
    If SmartTags("ODBC\for_test_block_ODBC") Then Exit Sub
    If SmartTags("ODBC\strTableName_readDB") = "" Then SmartTags("ODBC\strTableName_readDB") = "disa.mw_cdr_mold_info" End If
    If SmartTags("ODBC\strDSN_connect") = "" Then SmartTags("ODBC\strDSN_connect") = "Driver={Microsoft ODBC for Oracle};Server=MWE1_MSYS;UID=DISA;PWD=DISA" End If
    On Error Resume Next
    Set conn = CreateObject("ADODB.Connection")
    Set rst = CreateObject("ADODB.Recordset")
    'Open data source
    conn.Open SmartTags("ODBC\strDSN_connect")
    If SmartTags("ODBC\debug_message_on") Then ShowSystemAlarm "conn.open " & SmartTags("ODBC\strDSN_connect")
    If Err.Number <> 0 Then
     ShowSystemAlarm "Error #" & Err.Number & " " & Err.Description
     Err.Clear 
     Exit Sub
    End If
     
    SQL_Table = "SELECT * FROM " & SmartTags("ODBC\strTableName_readDB")
    'Reads the data records of the SQL table
     If SmartTags("ODBC\debug_message_on") Then ShowSystemAlarm SQL_Table
    Set rst = conn.Execute(SQL_Table)
    'Error routine
    If Err.Number <> 0 Then
     ShowSystemAlarm "Error #" & Err.Number & " " & Err.Description
     Err.Clear 
     Exit Sub
    End If
    If SmartTags("ODBC\debug_message_on") Then ShowSystemAlarm SQL_Table
     
    If Not (rst.EOF And rst.BOF) Then 
     'Compare if "End of File" or "Begin of File" exists, if not the pointer will be reset to the first entry
     rst.MoveFirst 'reset to 1st entry 
     'read from DB values into HMI tags
     SmartTags("ODBC\FromDB\cdr_type") = rst.Fields(0).Value
     SmartTags("ODBC\FromDB\shift_date") = rst.Fields(1).Value
     SmartTags("ODBC\FromDB\mold_no") = rst.Fields(2).Value
     SmartTags("ODBC\FromDB\cool_time") = rst.Fields(3).Value
     SmartTags("ODBC\FromDB\into_frm_wt") = rst.Fields(4).Value
     SmartTags("ODBC\FromDB\into_sand_wt") = rst.Fields(5).Value
     SmartTags("ODBC\FromDB\flow_temp") = rst.Fields(6).Value
     SmartTags("ODBC\FromDB\frame_stat") = rst.Fields(7).Value
     SmartTags("ODBC\FromDB\updown_rate") = rst.Fields(8).Value
     'read from DB values into PLC tags
     SmartTags("ODBC\FromDB\arrayToCDR")(0) = rst.Fields(0).Value
     SmartTags("ODBC\FromDB\arrayToCDR")(1) = rst.Fields(1).Value
     SmartTags("ODBC\FromDB\arrayToCDR")(2) = rst.Fields(2).Value
     SmartTags("ODBC\FromDB\arrayToCDR")(3) = rst.Fields(3).Value
     SmartTags("ODBC\FromDB\arrayToCDR")(4) = rst.Fields(4).Value
     SmartTags("ODBC\FromDB\arrayToCDR")(5) = rst.Fields(5).Value
     SmartTags("ODBC\FromDB\arrayToCDR")(6) = rst.Fields(6).Value
     SmartTags("ODBC\FromDB\arrayToCDR")(7) = rst.Fields(7).Value
     SmartTags("ODBC\FromDB\arrayToCDR")(8) = rst.Fields(8).Value
     rst.close 
    Else
     ShowSystemAlarm "Dat_No. is not available"
    End If
     
    'Close data source
    conn.close
    Set rst = Nothing
    Set conn = Nothing
    Rückmeldungs-skript:
    ' en: The script wirtes the indicated data record into a table

    Dim conn, rst, SQL_Table, chDecPoint, strNameOfDatabase, strDSN, strNameOfTable
    If SmartTags("ODBC\for_test_block_ODBC") Then Exit Sub
    If SmartTags("ODBC\strTableName_writeDB") = "" Then SmartTags("ODBC\strTableName_writeDB") = "disa.mw_cdr_jnl" End If
    If SmartTags("ODBC\strDSN_connect") = "" Then SmartTags("ODBC\strDSN_connect") = "Driver={Microsoft ODBC for Oracle};Server=MWE1_MSYS;UID=DISA;PWD=DISA" End If
    On Error Resume Next
    chDecPoint = Mid(CStr(8.1), 2, 1)
    If SmartTags("ODBC\debug_message_on") And Not chDecPoint = "." Then ShowSystemAlarm "Decimal separator is wrong. Set to '.' in Windows Control Panel .. Regional settings."

    Set conn = CreateObject("ADODB.Connection")
    Set rst = CreateObject("ADODB.Recordset")
    'Open data source
    conn.Open SmartTags("ODBC\strDSN_connect")
    If SmartTags("ODBC\debug_message_on") Then ShowSystemAlarm "conn.open " & SmartTags("ODBC\strDSN_connect")
    'conn.Open "Provider=MSDASQL;Initial Catalog=" & strNameOfDatabase & ";" & strDSN

    If Err.Number <> 0 Then
    ShowSystemAlarm "Error #" & Err.Number & " " & Err.Description
    Err.Clear
    Exit Sub
    End If

    SQL_Table = "SELECT * FROM " & SmartTags("ODBC\strTableName_writeDB") 'no WHERE because there is only 1 record.
    'Writes a data record into a table
    Set rst = conn.Execute(SQL_Table)
    'Error routine - Fehler Routine
    If Err.Number <> 0 Then
    ShowSystemAlarm "Error #" & Err.Number & " " & Err.Description
    Err.Clear
    Exit Sub
    End If

    If Not (rst.EOF And rst.BOF) Then
    'Compare if "End of File" or "Begin of File" exists, if not the pointer will be reset to the first entry
    'Definition of data record
    SQL_Table = "INSERT INTO " & SmartTags("ODBC\strTableName_writeDB") & " (" & _
    "shift_date, " & _
    "mold_no, " & _
    "setpoint_vol_of_water, " & _
    "vol_of_water, " & _
    "mold_temp, " & _
    "sand_temp, " & _
    "cdr_stat1, " & _
    "cdr_stat2, " & _
    "cdr_stat3 " & ") VALUES (" & _
    SmartTags("ODBC\ToDB\arrayFromCDR")(0) & ", " & _
    SmartTags("ODBC\ToDB\arrayFromCDR")(1) & ", " & _
    SmartTags("ODBC\ToDB\arrayFromCDR")(2) & ", " & _
    SmartTags("ODBC\ToDB\arrayFromCDR")(3) & ", " & _
    SmartTags("ODBC\ToDB\arrayFromCDR")(4) & ", " & _
    SmartTags("ODBC\ToDB\arrayFromCDR")(5) & ", " & _
    SmartTags("ODBC\ToDB\arrayFromCDR")(6) & ", " & _
    SmartTags("ODBC\ToDB\arrayFromCDR")(7) & ", " & _
    SmartTags("ODBC\ToDB\arrayFromCDR")( & ")"
    If SmartTags("ODBC\debug_message_on") Then ShowSystemAlarm SQL_Table
    'Insert the data reacord of the table
    Set rst = conn.Execute(SQL_Table)
    End If

    'Close data source
    conn.close
    Set rst = Nothing
    Set conn = Nothing
    Geändert von JesperMP (15.06.2008 um 13:36 Uhr)
    Jesper M. Pedersen

  11. #30
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.728
    Danke
    398
    Erhielt 2.406 Danke für 2.002 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von vierlagig Beitrag anzeigen
    was ist wenn man die verbindung offen läßt? kommt das nicht aufs selbe?
    Daran hatte ich auch schon gedacht.
    Also statt CreateObject bei jedem Aufruf nur einmal CreateObject, sich merken, dass das Objekt existiert und bei jedem weiteren Aufruf mit GetObject den Handle holen. Ist auf jeden Fall einen Versuch wert. Bei meinen eigenen Excel-Zugriffen hat das enorm was gebracht.

    Gruß
    LL

Ähnliche Themen

  1. Antworten: 3
    Letzter Beitrag: 01.04.2011, 10:37
  2. Antworten: 18
    Letzter Beitrag: 25.01.2011, 10:33
  3. Was passiert Dienstag 8:00 ?
    Von JesperMP im Forum Simatic
    Antworten: 106
    Letzter Beitrag: 16.12.2010, 17:28
  4. RAM zu ROM, erforderlich/ was passiert dann?
    Von TommyG im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 27.04.2008, 14:36
  5. Was passiert mit dem Luftballon?
    Von 1schilcher im Forum Stammtisch
    Antworten: 11
    Letzter Beitrag: 30.03.2008, 14:46

Lesezeichen

Berechtigungen

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