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

Ergebnis 1 bis 6 von 6

Thema: Intouch 9.5 - Variblenaktualisierung in Skripten

  1. #1
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.334
    Danke
    448
    Erhielt 688 Danke für 513 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Habe hier ein Intouch v9.5 Project das mittels DASSIDirect-Server an eine 317PN/DP angebunden ist.

    Ich lasse Intouch dabei ein paar StoredProcedures aus einer SQL-Datenbank ausführen.
    Die SPS bereitet dafür in einem Schnittellen-DB die Parameter vor und setzt dann ein Flag-Bit.

    Das Flag-Bit wird mittel Konditinal-Skript überwacht, wenn es 1 ist wird eine die StoredProcedure mit den Parametern aus dem Datenbaustein ausgerufen.
    Jetzt hab ich ein hochsporadisch das Problem das wenn das Flag gesetzt und das Konditional-Skript aufgerufen wird, dieses dann beim Zugriff
    auf die Dateinbaustein-Variablen alte Werte verwendet.

    Am schnellsten ist dieses ersichtlich wenn man einen Auszug aus dem Logfile ansieht das ich nebenbei mitschreibe
    Code:
    -----------------------------------------------------------------------------------------------------------------------------------
    
    17.03.2015/16:22:48 : Informationen über Einzelmischungsdurchläufe an CMTS senden
    Verbinde zu CMTS: Provider=SQLOLEDB.1;User ID=+++; Password=+++;Initial Catalog=+++;Data Source=+++;
    Stored Procedure 'PROCESS_SETBCWEIGHING' vorbereiten
    4821   /   1   /   1   /   0 -> Der Eintrag hier ist OK
    SQLEXEC PROCESS_SETBCWEIGHING: 
    -----------------------------------------------------------------------------------------------------------------------------------
    17.03.2015/16:24:00 : Informationen über Einzel-DOSIERUNGEN an CMTS senden
    Verbinde zu CMTS: Provider=SQLOLEDB.1;User ID=+++; Password=+++;Initial Catalog=+++;Data Source=+++;
    Stored Procedure 'PROCESS_SETBCPERWEIGHING' vorbereiten
    4821   /   1   /   31   /   1   /   105   /   437
    PROCESS_SETBCPERWEIGHING: 
    -----------------------------------------------------------------------------------------------------------------------------------
    17.03.2015/16:26:43 : Informationen über Einzelmischubngsdurchläufe an CMTS senden
    Verbinde zu CMTS: Provider=SQLOLEDB.1;User ID=+++; Password=+++;Initial Catalog=+++;Data Source=+++;
    Stored Procedure 'PROCESS_SETBCWEIGHING' vorbereiten
    4821   /   1   /   1   /   0 -> Ab hier steht im Datenbaustein schon 4821   /   1   /   2   /   60
    SQLEXEC PROCESS_SETBCWEIGHING: 
    -----------------------------------------------------------------------------------------------------------------------------------
    17.03.2015/16:28:32 : Informationen über Einzelmischubngsdurchläufe an CMTS senden
    Verbinde zu CMTS: Provider=SQLOLEDB.1;User ID=+++; Password=+++;Initial Catalog=+++;Data Source=+++;
    Stored Procedure 'PROCESS_SETBCWEIGHING' vorbereiten
    4821   /   1   /   1   /   0 -> Hier steht im DB eigentlich 4821   /   2   /   1   /   0
    SQLEXEC PROCESS_SETBCWEIGHING:
    Wie man sieht wurden die Werte beim 2. rot markierten Event die DB-Werte des ersten und beim 3. die Werte vom 2. verwendet.
    Wenn ich beim Skript die Parameter mittels SQLSetParam setze, scheine ich hin und wieder nicht die aktuellen Werte zu haben

    Bei WinCC weiß ich ja dass dies problematisch ist. Bei WinCC gabs aber auch GetTagWait.
    Gibt es in Intouch auch einen Weg wie man sicherstellen kann dass man aktuelle Werte im Skript hat?

    Hier noch das Konditionalskript in Frage
    Code:
    DIM bOK AS INTEGER;
    DIM Itmp AS INTEGER;
    DIM sqlResult AS INTEGER;
    DIM MsgStr AS MESSAGE;
    DIM PcName AS MESSAGE;
    
    
    bOK = 1;
    sql_StatementID = 0;
    sql_ConnectionID = 0;
    
    
    { Informationen über Einzelmischungsdurchläufe an CMTS senden }
    {---------------------------------------------------------------------------------------------------------------------------------------------------}
    GetNodeName(PcName, 32);
    IF PcName <> "++++" THEN bOK = 0; ENDIF;                                                          { Nur ++++ }
    IF ChMi_dbRez_ChgID == 0 THEN bOK = 0; ENDIF;                                                     { Nur für Chargen die von CMTS kommen und eine gültige ID haben }
    
    
    IF bOK == 1 THEN
    
    
        CALL WriteTextLog( "CMTS_CMI_Batch_RUN", "-----------------------------------------------------------------------------------------------------------------------------------");
        CALL WriteTextLog( "CMTS_CMI_Batch_RUN", $DateString + "/" + $TimeString + " : Informationen über Einzelmischungsdurchläufe an CMTS senden");
    
    
    {--------------------------------------------------------------------------------------------------------------------------------------------------- Verbindung aufbauen }
        CALL WriteTextLog( "CMTS_CMI_Batch_RUN", "Verbinde zu CMTS: " + sql_CMTSConnectionString);
        sqlResult = SQLConnect( sql_ConnectionID, sql_CMTSConnectionString );
    
    
        IF sqlResult <> 0 THEN 
            MsgStr = "Fehler: " + SQLErrorMsg(sqlResult);
            CALL WriteTextLog( "CMTS_CMI_Batch_RUN", MsgStr);
            bOK = 0;
        ENDIF;
    ENDIF;
    
    
    {--------------------------------------------------------------------------------------------------------------------------------------------------- RUN Erzeugen/Fertigstellen }
    IF bOK == 1 THEN
        Itmp = CommCMTS_SetBCW_BatchID;        {<--------- Hier hatte ich mal versucht die Werte vorher schon mal zu lesen }
        Itmp = CommCMTS_SetBCW_Run;
        Itmp = CommCMTS_SetBCW_State;
        Itmp = CommCMTS_SetBCW_MxTime;
    
    
        CALL WriteTextLog( "CMTS_CMI_Batch_RUN",  "Stored Procedure 'PROCESS_SETBCWEIGHING' vorbereiten");
        SQLSetStatement(sql_ConnectionID, "EXEC PROCESS_SETBCWEIGHING ?,?,?,?" );
        SQLPrepareStatement(sql_ConnectionID, sql_StatementID);
        SQLSetParamLong(sql_StatementID, 1, CommCMTS_SetBCW_BatchID);        {<--------- Hier ensteht dann das Problem}
        SQLSetParamInt(sql_StatementID, 2, CommCMTS_SetBCW_Run);
        SQLSetParamInt(sql_StatementID, 3, CommCMTS_SetBCW_State);
        SQLSetParamInt(sql_StatementID, 4, CommCMTS_SetBCW_MxTime);
    
    
        CALL WriteTextLog("CMTS_CMI_Batch_RUN", Text(CommCMTS_SetBCW_BatchID, "#") + "   /   " + Text(CommCMTS_SetBCW_Run, "#")  + "   /   " + Text(CommCMTS_SetBCW_State, "#")    + "   /   " + Text(CommCMTS_SetBCW_MxTime, "#")  );
        CALL WriteTextLog("CMTS_CMI_Batch_RUN", "SQLEXEC PROCESS_SETBCWEIGHING: " + MsgStr);
        sqlResult = SQLExecute( sql_ConnectionID, "NULL", sql_StatementID );
    
    
        IF (sqlResult <> 0) THEN
            CALL WriteTextLog("CMTS_CMI_Batch_RUN", "Fehler:" +  SQLErrorMsg(sqlResult));
            bOK = 0;
        ENDIF;
    
    
        CommCMTS_SetBCW_Flag = 0;
    ENDIF;
    
    
    {--------------------------------------------------------------------------------------------------------------------------------------------------- SQL-Zugriff beenden - Verbindung schließen }
    IF sql_StatementID  <> 0 THEN SQLClearStatement(sql_ConnectionID, sql_StatementID); ENDIF;
    
    
    IF sql_ConnectionID <> 0 THEN
        SQLEnd(sql_ConnectionID);
        SQLDisconnect(sql_ConnectionID);
    ENDIF;
    Geändert von RONIN (18.03.2015 um 07:07 Uhr)
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!
    Zitieren Zitieren Intouch 9.5 - Variblenaktualisierung in Skripten  

  2. #2
    Registriert seit
    29.03.2004
    Beiträge
    5.731
    Danke
    143
    Erhielt 1.685 Danke für 1.225 Beiträge

    Standard

    Es gibt da noch einige spezielle Items mit denen sich der Zustand der Variablenaktualisierungen abfragen und auch teilweise steuern lässt. Da musst du mal im Handbuch schauen ob man damit etwas anfangen kann. Ich habe die selber noch nicht genutzt.

    Zumindest lässt dich damit abfragen, ob alle Items einer Gruppe aktualisiert wurden, bzw. auch ein neues Aktualisieren (z.B. $SYS$PollNow) anfordern.

    Ansonsten wäre es je nach Größe des Datensatzes eine Möglichkeit, den Datensatz wie auch das Flag in einen separaten DB in hintereinanderfolgendem Speicherbereichen zu legen. Da der DASSIDirect seine Variablen zwecks Optimierung gepackt abfragt, wird dann womöglich Datensatz und Flag in eine PDU gepackt, und du bekommst alles zusammen. Die Variablengruppen die der DASSIDirect-Server anlegt kann man imho in der Management Console einsehen. Ob das dann garantiert immer funktioniert ist eine andere Frage.

  3. Folgender Benutzer sagt Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    RONIN (17.03.2015)

  4. #3
    Avatar von RONIN
    RONIN ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.334
    Danke
    448
    Erhielt 688 Danke für 513 Beiträge

    Standard

    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    Es gibt da noch einige spezielle Items mit denen sich der Zustand der Variablenaktualisierungen abfragen und auch teilweise steuern lässt. Da musst du mal im Handbuch schauen ob man damit etwas anfangen kann. Ich habe die selber noch nicht genutzt.
    Sowas wie Akualisierungszeiten hab ich in den Intouch-Handbüchern noch nicht gesehen. Werd mir aber nochmal das Handbung zum DASSIDirect anschauen.

    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    Zumindest lässt dich damit abfragen, ob alle Items einer Gruppe aktualisiert wurden, bzw. auch ein neues Aktualisieren (z.B. $SYS$PollNow) anfordern.
    Klingt interessant. Werd mal Google zum Thema $SYS$PollNow anwerfen.

    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    Ansonsten wäre es je nach Größe des Datensatzes eine Möglichkeit, den Datensatz wie auch das Flag in einen separaten DB in hintereinanderfolgendem Speicherbereichen zu legen.
    Ist genauso angelegt.

    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    Da der DASSIDirect seine Variablen zwecks Optimierung gepackt abfragt, wird dann womöglich Datensatz und Flag in eine PDU gepackt, und du bekommst alles zusammen. Die Variablengruppen die der DASSIDirect-Server anlegt kann man imho in der Management Console einsehen. Ob das dann garantiert immer funktioniert ist eine andere Frage.
    Könnte versuchen eine eigene Gruppe/Topic für die Variablen zu machen, vielleicht hilft's.

    Danke schon mal für den Denkanstoss.
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  5. #4
    Registriert seit
    29.03.2004
    Beiträge
    5.731
    Danke
    143
    Erhielt 1.685 Danke für 1.225 Beiträge

    Standard

    Wobei die Verzögerung durchaus auch auf der Strecke DAServer - Intouch liegen kann. Da weiß man überhaupt nicht wie dort die Datenaktualisierung organisiert ist.

    Wenn es zeitlich möglich ist, könntest du bei Anstehen des Flags einen Timer starten, der sagen wir mal das 1,5 fache der eingestellten Pollzeit läuft, und dann das eigentliche Skript anstößt.

  6. #5
    Avatar von RONIN
    RONIN ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.334
    Danke
    448
    Erhielt 688 Danke für 513 Beiträge

    Standard

    Hab die Werte (13 Stück) mal als eigene Topic am DA-Server gelegt.
    Da diese hintereinander im DB liegen und in einer Topic sind, ist zumindest mal die Chance recht hoch dass diese in der selben PDU daherkommen.

    Ich habe beim Suchen auch herausgefunden das die Topic die ich bisher verwendet hatte mit der Option "Nur aktive Items anmelden" erstellt wurde.
    Was ja für eine Gruppe in der alle möglichen Anzeigewerte liegen ja nicht falsch ist, aber sicherlich auch zu meinen Problem beträgt.
    Das Bit-Flag ist schließlich aktiv (Es wird ja vom Konditionalskript geprüft), die Werte im Skript sind es aber wahrscheinlich nicht.

    Die neue Topic hab ich dann mit "Alle Items anmelden" erstellt. Zusätzlich noch ein $SYS$PollNow auf diese kleine Topic am Beginn des Sktiptes angefordert.
    Mal schauen ob das Problem über die nächsten Tage wieder auftritt.

    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    könntest du bei Anstehen des Flags einen Timer starten, der sagen wir mal das 1,5 fache der eingestellten Pollzeit läuft, und dann das eigentliche Skript anstößt.
    Sollte das nicht hinhauen werd ich die Variante nehmen, ich will nur nicht gleich mit irgendwelchen Verzögerungszeiten um mich werfen, wenn's vielleicht eleganter geht.
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  7. #6
    Avatar von RONIN
    RONIN ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.334
    Danke
    448
    Erhielt 688 Danke für 513 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von RONIN Beitrag anzeigen
    Hab die Werte (13 Stück) mal als eigene Topic am DA-Server gelegt.
    Da diese hintereinander im DB liegen und in einer Topic sind, ist zumindest mal die Chance recht hoch dass diese in der selben PDU daherkommen.

    Die neue Topic hab ich dann mit "Alle Items anmelden" erstellt. Zusätzlich noch ein $SYS$PollNow auf diese kleine Topic am Beginn des Sktiptes angefordert.
    Hat gewirkt, weiß zwar nicht ob das $SYS$PollNow nötig ist, ich denke mal der wichtigste Punkt ist die "Alle Items anmelden"-Einstellung und die separate Topic.
    Problem tritt jedenfalls nicht mehr auf. Danke.
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

Ähnliche Themen

  1. Antworten: 1
    Letzter Beitrag: 13.02.2013, 00:13
  2. InTouch ??
    Von Alkinoos im Forum HMI
    Antworten: 1
    Letzter Beitrag: 06.07.2012, 14:22
  3. Antworten: 4
    Letzter Beitrag: 09.04.2008, 14:04
  4. Antworten: 4
    Letzter Beitrag: 06.02.2006, 10:02
  5. intouch...
    Von Jochen Kühner im Forum HMI
    Antworten: 3
    Letzter Beitrag: 20.07.2004, 18:58

Lesezeichen

Berechtigungen

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