Cum se concatenează variabile în numele tagurilor WinCC în C-Script

Pentru a citi sau a scrie dinamic un grup de taguri indexate într-un buclă în Siemens WinCC C-Script (cum ar fi POS1_Beem_LS până la POS81_Beem_LS), numele tagului trebuie formatat într-un buffer de text înainte de apelarea funcțiilor de acces. Spre deosebire de VBScript, unde concatenarea se face direct prin operatorul &, în C-Script se utilizează funcția standard de formatare snprintf (sau sprintf) pentru a construi șirul de caractere cu parametrul incrementat.

Tabel de conținut

Cerințe prealabile

  • Mediu de dezvoltare SIMATIC WinCC (Graphics Designer sau Global Script).
  • Taguri deja create în Tag Management care respectă o schemă de denumire structurată (de exemplu, POS1_Beem_LS, POS2_Beem_LS, etc.).
  • Drepturi de editare a scripturilor C în proiectul WinCC.

Metodă: Formatarea dinamică a numelui de tag cu snprintf

Această abordare utilizează o buclă for în care numele fiecărui tag este generat dinamic într-un array de caractere (char), după care se execută funcția de scriere sau citire WinCC C-API.

Procedură

  1. În editorul C-Script, declarați un buffer de caractere de dimensiune suficientă pentru a stoca cel mai lung nume de tag generat.
  2. Declarați variabila de contor pentru buclă și variabila pentru valoarea ce urmează a fi scrisă.
  3. Utilizați o buclă for pentru a itera prin domeniul de indecși dorit.
  4. Construiți numele tagului în buffer utilizând snprintf și specificatorul de format %d sau %i.
  5. Apelați funcția de scriere SetTagWait (sau funcția echivalentă SetTagXXX corespunzătoare tipului de date) utilizând bufferul ca nume de tag.

Exemplu de cod

C

int i;
char szTagName[32];
char szCustomText[32];
DWORD dwValueToWrite = 0;

// Citirea valorii de referință dintr-un tag fix (echivalentul Read din VBScript)
dwValueToWrite = GetTagDWord("BeemLOS");

for (i = 1; i <= 81; i++)
{
    // Formatarea numelui de tag dinamic: POS1_Beem_LS, POS2_Beem_LS, etc.
    int res1 = snprintf(szTagName, sizeof(szTagName), "POS%d_Beem_LS", i);
    if (res1 >= 0 && res1 < (int)sizeof(szTagName))
    {
        // Scrierea valorii citite în tagul generat dinamic
        SetTagDWordWait(szTagName, dwValueToWrite);
    }

    // Exemplu pentru scrierea unui șir de caractere dinamic (ex: P1, P2...)
    int res2 = snprintf(szTagName, sizeof(szTagName), "P%d", i);
    int res3 = snprintf(szCustomText, sizeof(szCustomText), "Custom %d", i);

    if (res2 >= 0 && res2 < (int)sizeof(szTagName) && res3 >= 0 && res3 < (int)sizeof(szCustomText))
    {
        SetTagCharWait(szTagName, szCustomText);
    }
}

Rezultat așteptat: Toate cele 81 de taguri din proces sunt actualizate secvențial într-un singur ciclu de executare a scriptului.

Verificare: Se poate urmări valoarea tagurilor actualizate în WinCC Runtime folosind opțiunea Tag Logging, WinCC Channel Diagnosis sau câmpuri I/O pe ecran.

Limitare: Formatarea dinamică a numelui în buclă generează solicitări individuale de acces la taguri. Executarea unui număr foarte mare de operații sincrone în Runtime poate influența performanța C-Script-ului.

Cauză tehnică: Diferențe de sintaxă între VBScript și C-Script

În VBScript, mediul de execuție evaluează tipul Variant și permite concatenarea directă a șirurilor de caractere cu numere întregi prin operatorul & (ex: "POS" & i & "_Beem_LS").

În C-Script (limbaj ANSI C):

  • Șirurile de caractere sunt tablouri fixe de memorie (char arrays sau char*).
  • Nu există un operator nativ de concatenare directă între un pointer de caracter și un întreg.
  • Este necesară o funcție de formatare de tip sprintf / snprintf pentru a converti valoarea numerică a contorului i în text și a o îmbina cu prefixul și sufixul numelui de tag.

Verificare

Procedura este executată cu succes dacă sunt îndeplinite următoarele condiții:

  • Numele generat în bufferul szTagName se potrivește exact cu numele tagului definit în Tag Management (se respectă majusculele și minusculele).
  • Funcțiile SetTagDWordWait sau SetTagCharWait returnează fără erori de sintaxă la compilare.
  • Valorile din Runtime ale tagurilor POS1_Beem_LS ... POS81_Beem_LS reflectă valoarea tagului BeemLOS.

Limitări și precauții operaționale

  • Dimensiunea bufferului: Asigurați-vă că tabloul char szTagName[...] este suficient de mare pentru a include toate caracterele numelui, plus caracterul de terminare \0. Un buffer prea mic poate duce la trunchierea numelui sau erori de memorie.
  • Utilizarea snprintf față de sprintf: Se recomandă utilizarea snprintf cu specificarea dimensiunii bufferului pentru a preveni depășirile de memorie (buffer overflow).
  • Tipul de date al tagului: Utilizați funcția SetTag specifică tipului de date configurat în WinCC (SetTagDWord, SetTagWord, SetTagDouble, SetTagChar).

Întrebări frecvente

Ce funcție C-Script înlocuiește HMIRuntime.Tags(...).Write din VBScript?

În C-Script se folosesc funcțiile din sistemul WinCC C-API, cum ar fi SetTagWait sau SetTagDWordWait, trecând numele tagului formatat în prealabil ca primul parametru.

De ce nu pot concatena direct "POS" + i + "_Beem_LS" în C-Script?

În C-Script, operatorul + nu efectuează concatenare de text. Încercarea de a adăuga un întreg la un pointer de șir va rezulta într-o operație de aritmetică a pointerilor incorectă sau eroare de compilare.

Care este diferența dintre SetTagDWord și SetTagDWordWait?

SetTagDWordWait scrie valoarea în proces și așteaptă confirmarea actualizării în subsistemul de taguri WinCC înainte de a trece la următoarea instrucțiune, garantând ordinea în bucle scurte.

Ce se întâmplă dacă numele tagului generat dinamic nu există în WinCC Tag Management?

Apelul funcției SetTag va eșua tăcut sau va genera un avertisment în fișierele de diagnoză WinCC (WinCC_Sys_01.log), fără a opri execuția buclei C.

Articole conexe

Etichete conexe

Code: C163

6 respuestas