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
- Metodă: Formatarea dinamică a numelui de tag cu snprintf
- Cauză tehnică: Diferențe de sintaxă între VBScript și C-Script
- Verificare
- Limitări și precauții operaționale
- Întrebări frecvente
- Articole conexe
- Etichete conexe
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ă
- În editorul C-Script, declarați un buffer de caractere de dimensiune suficientă pentru a stoca cel mai lung nume de tag generat.
- Declarați variabila de contor pentru buclă și variabila pentru valoarea ce urmează a fi scrisă.
- Utilizați o buclă
forpentru a itera prin domeniul de indecși dorit. - Construiți numele tagului în buffer utilizând
snprintfși specificatorul de format%dsau%i. - Apelați funcția de scriere
SetTagWait(sau funcția echivalentăSetTagXXXcorespunză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 arrayssauchar*). - 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/snprintfpentru a converti valoarea numerică a contoruluiiî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
szTagNamese potrivește exact cu numele tagului definit în Tag Management (se respectă majusculele și minusculele). - Funcțiile
SetTagDWordWaitsauSetTagCharWaitreturnează fără erori de sintaxă la compilare. - Valorile din Runtime ale tagurilor
POS1_Beem_LS...POS81_Beem_LSreflectă valoarea taguluiBeemLOS.
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
snprintffață desprintf: Se recomandă utilizareasnprintfcu specificarea dimensiunii bufferului pentru a preveni depășirile de memorie (buffer overflow). - Tipul de date al tagului: Utilizați funcția
SetTagspecifică 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
- Cum se citesc și se scriu taguri în WinCC folosind C-Script
- Diferențe de performanță între VBScript și C-Script în SIMATIC WinCC
- Utilizarea corectă a funcțiilor snprintf în scripturile industriale ANSI C
Etichete conexe
Code: C163